New Angular based web version #1
271
.editorconfig
Normal file
271
.editorconfig
Normal file
@@ -0,0 +1,271 @@
|
|||||||
|
# Remove the line below if you want to inherit .editorconfig settings from higher directories
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# C# files
|
||||||
|
[*.cs]
|
||||||
|
|
||||||
|
#### Core EditorConfig Options ####
|
||||||
|
|
||||||
|
# Indentation and spacing
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = tab
|
||||||
|
tab_width = 4
|
||||||
|
|
||||||
|
# New line preferences
|
||||||
|
end_of_line = crlf
|
||||||
|
insert_final_newline = false
|
||||||
|
|
||||||
|
#### .NET Coding Conventions ####
|
||||||
|
|
||||||
|
# Organize usings
|
||||||
|
dotnet_separate_import_directive_groups = false
|
||||||
|
dotnet_sort_system_directives_first = false
|
||||||
|
file_header_template = unset
|
||||||
|
|
||||||
|
# this. and Me. preferences
|
||||||
|
dotnet_style_qualification_for_event = false
|
||||||
|
dotnet_style_qualification_for_field = false
|
||||||
|
dotnet_style_qualification_for_method = false
|
||||||
|
dotnet_style_qualification_for_property = false
|
||||||
|
|
||||||
|
# Language keywords vs BCL types preferences
|
||||||
|
dotnet_style_predefined_type_for_locals_parameters_members = true
|
||||||
|
dotnet_style_predefined_type_for_member_access = true
|
||||||
|
|
||||||
|
# Parentheses preferences
|
||||||
|
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
|
||||||
|
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
|
||||||
|
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
|
||||||
|
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
|
||||||
|
|
||||||
|
# Modifier preferences
|
||||||
|
dotnet_style_require_accessibility_modifiers = for_non_interface_members
|
||||||
|
|
||||||
|
# Expression-level preferences
|
||||||
|
dotnet_style_coalesce_expression = true
|
||||||
|
dotnet_style_collection_initializer = true
|
||||||
|
dotnet_style_explicit_tuple_names = true
|
||||||
|
dotnet_style_namespace_match_folder = true
|
||||||
|
dotnet_style_null_propagation = true
|
||||||
|
dotnet_style_object_initializer = true
|
||||||
|
dotnet_style_operator_placement_when_wrapping = beginning_of_line
|
||||||
|
dotnet_style_prefer_auto_properties = true:suggestion
|
||||||
|
dotnet_style_prefer_collection_expression = when_types_loosely_match
|
||||||
|
dotnet_style_prefer_compound_assignment = true
|
||||||
|
dotnet_style_prefer_conditional_expression_over_assignment = true
|
||||||
|
dotnet_style_prefer_conditional_expression_over_return = true
|
||||||
|
dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
|
||||||
|
dotnet_style_prefer_inferred_anonymous_type_member_names = true
|
||||||
|
dotnet_style_prefer_inferred_tuple_names = true
|
||||||
|
dotnet_style_prefer_is_null_check_over_reference_equality_method = true
|
||||||
|
dotnet_style_prefer_simplified_boolean_expressions = true
|
||||||
|
dotnet_style_prefer_simplified_interpolation = true
|
||||||
|
|
||||||
|
# Field preferences
|
||||||
|
dotnet_style_readonly_field = true
|
||||||
|
|
||||||
|
# Parameter preferences
|
||||||
|
dotnet_code_quality_unused_parameters = all
|
||||||
|
|
||||||
|
# Suppression preferences
|
||||||
|
dotnet_remove_unnecessary_suppression_exclusions = none
|
||||||
|
|
||||||
|
# New line preferences
|
||||||
|
dotnet_style_allow_multiple_blank_lines_experimental = false:suggestion
|
||||||
|
dotnet_style_allow_statement_immediately_after_block_experimental = false:suggestion
|
||||||
|
|
||||||
|
#### C# Coding Conventions ####
|
||||||
|
|
||||||
|
# var preferences
|
||||||
|
csharp_style_var_elsewhere = false
|
||||||
|
csharp_style_var_for_built_in_types = false
|
||||||
|
csharp_style_var_when_type_is_apparent = false
|
||||||
|
|
||||||
|
# Expression-bodied members
|
||||||
|
csharp_style_expression_bodied_accessors = true:silent
|
||||||
|
csharp_style_expression_bodied_constructors = false:silent
|
||||||
|
csharp_style_expression_bodied_indexers = true:silent
|
||||||
|
csharp_style_expression_bodied_lambdas = true:silent
|
||||||
|
csharp_style_expression_bodied_local_functions = true:silent
|
||||||
|
csharp_style_expression_bodied_methods = false:silent
|
||||||
|
csharp_style_expression_bodied_operators = false:silent
|
||||||
|
csharp_style_expression_bodied_properties = true:silent
|
||||||
|
|
||||||
|
# Pattern matching preferences
|
||||||
|
csharp_style_pattern_matching_over_as_with_null_check = true
|
||||||
|
csharp_style_pattern_matching_over_is_with_cast_check = true
|
||||||
|
csharp_style_prefer_extended_property_pattern = true
|
||||||
|
csharp_style_prefer_not_pattern = true
|
||||||
|
csharp_style_prefer_pattern_matching = true
|
||||||
|
csharp_style_prefer_switch_expression = true
|
||||||
|
|
||||||
|
# Null-checking preferences
|
||||||
|
csharp_style_conditional_delegate_call = true
|
||||||
|
|
||||||
|
# Modifier preferences
|
||||||
|
csharp_prefer_static_local_function = true
|
||||||
|
csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
|
||||||
|
csharp_style_prefer_readonly_struct = true
|
||||||
|
csharp_style_prefer_readonly_struct_member = true
|
||||||
|
|
||||||
|
# Code-block preferences
|
||||||
|
csharp_prefer_braces = true:silent
|
||||||
|
csharp_prefer_simple_using_statement = true:suggestion
|
||||||
|
csharp_style_namespace_declarations = file_scoped:silent
|
||||||
|
csharp_style_prefer_method_group_conversion = true:silent
|
||||||
|
csharp_style_prefer_primary_constructors = true:suggestion
|
||||||
|
csharp_style_prefer_top_level_statements = true:silent
|
||||||
|
|
||||||
|
# Expression-level preferences
|
||||||
|
csharp_prefer_simple_default_expression = true
|
||||||
|
csharp_style_deconstructed_variable_declaration = true
|
||||||
|
csharp_style_implicit_object_creation_when_type_is_apparent = true
|
||||||
|
csharp_style_inlined_variable_declaration = true
|
||||||
|
csharp_style_prefer_index_operator = true
|
||||||
|
csharp_style_prefer_local_over_anonymous_function = true
|
||||||
|
csharp_style_prefer_null_check_over_type_check = true
|
||||||
|
csharp_style_prefer_range_operator = true
|
||||||
|
csharp_style_prefer_tuple_swap = true
|
||||||
|
csharp_style_prefer_utf8_string_literals = true
|
||||||
|
csharp_style_throw_expression = true
|
||||||
|
csharp_style_unused_value_assignment_preference = discard_variable
|
||||||
|
csharp_style_unused_value_expression_statement_preference = discard_variable
|
||||||
|
|
||||||
|
# 'using' directive preferences
|
||||||
|
csharp_using_directive_placement = outside_namespace:silent
|
||||||
|
|
||||||
|
# New line preferences
|
||||||
|
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
|
||||||
|
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true
|
||||||
|
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true
|
||||||
|
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false:suggestion
|
||||||
|
csharp_style_allow_embedded_statements_on_same_line_experimental = true
|
||||||
|
|
||||||
|
#### C# Formatting Rules ####
|
||||||
|
|
||||||
|
# New line preferences
|
||||||
|
csharp_new_line_before_catch = true
|
||||||
|
csharp_new_line_before_else = true
|
||||||
|
csharp_new_line_before_finally = true
|
||||||
|
csharp_new_line_before_members_in_anonymous_types = true
|
||||||
|
csharp_new_line_before_members_in_object_initializers = true
|
||||||
|
csharp_new_line_before_open_brace = all
|
||||||
|
csharp_new_line_between_query_expression_clauses = true
|
||||||
|
|
||||||
|
# Indentation preferences
|
||||||
|
csharp_indent_block_contents = true
|
||||||
|
csharp_indent_braces = false
|
||||||
|
csharp_indent_case_contents = true
|
||||||
|
csharp_indent_case_contents_when_block = true
|
||||||
|
csharp_indent_labels = one_less_than_current
|
||||||
|
csharp_indent_switch_labels = true
|
||||||
|
|
||||||
|
# Space preferences
|
||||||
|
csharp_space_after_cast = false
|
||||||
|
csharp_space_after_colon_in_inheritance_clause = true
|
||||||
|
csharp_space_after_comma = true
|
||||||
|
csharp_space_after_dot = false
|
||||||
|
csharp_space_after_keywords_in_control_flow_statements = true
|
||||||
|
csharp_space_after_semicolon_in_for_statement = true
|
||||||
|
csharp_space_around_binary_operators = before_and_after
|
||||||
|
csharp_space_around_declaration_statements = false
|
||||||
|
csharp_space_before_colon_in_inheritance_clause = true
|
||||||
|
csharp_space_before_comma = false
|
||||||
|
csharp_space_before_dot = false
|
||||||
|
csharp_space_before_open_square_brackets = false
|
||||||
|
csharp_space_before_semicolon_in_for_statement = false
|
||||||
|
csharp_space_between_empty_square_brackets = false
|
||||||
|
csharp_space_between_method_call_empty_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_call_name_and_opening_parenthesis = false
|
||||||
|
csharp_space_between_method_call_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_declaration_name_and_open_parenthesis = false
|
||||||
|
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_parentheses = false
|
||||||
|
csharp_space_between_square_brackets = false
|
||||||
|
|
||||||
|
# Wrapping preferences
|
||||||
|
csharp_preserve_single_line_blocks = true
|
||||||
|
csharp_preserve_single_line_statements = true
|
||||||
|
|
||||||
|
#### Naming styles ####
|
||||||
|
|
||||||
|
# Naming rules
|
||||||
|
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
|
||||||
|
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
|
||||||
|
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
|
||||||
|
|
||||||
|
dotnet_naming_rule.private_or_internal_field_should_be_underscore.severity = warning
|
||||||
|
dotnet_naming_rule.private_or_internal_field_should_be_underscore.symbols = private_or_internal_field
|
||||||
|
dotnet_naming_rule.private_or_internal_field_should_be_underscore.style = underscore
|
||||||
|
|
||||||
|
dotnet_naming_rule.private_or_internal_static_field_should_be_sunderscore.severity = warning
|
||||||
|
dotnet_naming_rule.private_or_internal_static_field_should_be_sunderscore.symbols = private_or_internal_static_field
|
||||||
|
dotnet_naming_rule.private_or_internal_static_field_should_be_sunderscore.style = sunderscore
|
||||||
|
|
||||||
|
# Symbol specifications
|
||||||
|
|
||||||
|
dotnet_naming_symbols.interface.applicable_kinds = interface
|
||||||
|
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.interface.required_modifiers =
|
||||||
|
|
||||||
|
dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
|
||||||
|
dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
|
||||||
|
dotnet_naming_symbols.private_or_internal_field.required_modifiers =
|
||||||
|
|
||||||
|
dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field
|
||||||
|
dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected
|
||||||
|
dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = static
|
||||||
|
|
||||||
|
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
|
||||||
|
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.types.required_modifiers =
|
||||||
|
|
||||||
|
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
|
||||||
|
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.non_field_members.required_modifiers =
|
||||||
|
|
||||||
|
# Naming styles
|
||||||
|
|
||||||
|
dotnet_naming_style.pascal_case.required_prefix =
|
||||||
|
dotnet_naming_style.pascal_case.required_suffix =
|
||||||
|
dotnet_naming_style.pascal_case.word_separator =
|
||||||
|
dotnet_naming_style.pascal_case.capitalization = pascal_case
|
||||||
|
|
||||||
|
dotnet_naming_style.begins_with_i.required_prefix = I
|
||||||
|
dotnet_naming_style.begins_with_i.required_suffix =
|
||||||
|
dotnet_naming_style.begins_with_i.word_separator =
|
||||||
|
dotnet_naming_style.begins_with_i.capitalization = pascal_case
|
||||||
|
|
||||||
|
dotnet_naming_style.underscore.required_prefix = _
|
||||||
|
dotnet_naming_style.underscore.required_suffix =
|
||||||
|
dotnet_naming_style.underscore.word_separator =
|
||||||
|
dotnet_naming_style.underscore.capitalization = camel_case
|
||||||
|
|
||||||
|
dotnet_naming_style.sunderscore.required_prefix = s_
|
||||||
|
dotnet_naming_style.sunderscore.required_suffix =
|
||||||
|
dotnet_naming_style.sunderscore.word_separator =
|
||||||
|
dotnet_naming_style.sunderscore.capitalization = camel_case
|
||||||
|
|
||||||
|
[*.{cs,vb}]
|
||||||
|
dotnet_style_coalesce_expression = true:suggestion
|
||||||
|
dotnet_style_null_propagation = true:suggestion
|
||||||
|
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
|
||||||
|
dotnet_style_prefer_auto_properties = true:suggestion
|
||||||
|
dotnet_style_object_initializer = true:suggestion
|
||||||
|
dotnet_style_collection_initializer = true:suggestion
|
||||||
|
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
|
||||||
|
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
|
||||||
|
dotnet_style_operator_placement_when_wrapping = beginning_of_line
|
||||||
|
tab_width = 4
|
||||||
|
indent_size = 4
|
||||||
|
end_of_line = crlf
|
||||||
@@ -3,9 +3,7 @@ using FluentValidation;
|
|||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Globalization;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Microsoft.AspNetCore.Localization;
|
|
||||||
using Vegasco.Server.Api.Authentication;
|
using Vegasco.Server.Api.Authentication;
|
||||||
using Vegasco.Server.Api.Common;
|
using Vegasco.Server.Api.Common;
|
||||||
using Vegasco.Server.Api.Persistence;
|
using Vegasco.Server.Api.Persistence;
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
using Microsoft.AspNetCore.Localization;
|
using Vegasco.Server.Api.Endpoints;
|
||||||
using System.Globalization;
|
|
||||||
using Vegasco.Server.Api.Endpoints;
|
|
||||||
using Vegasco.Server.ServiceDefaults;
|
using Vegasco.Server.ServiceDefaults;
|
||||||
|
|
||||||
namespace Vegasco.Server.Api.Common;
|
namespace Vegasco.Server.Api.Common;
|
||||||
|
|||||||
@@ -7,47 +7,47 @@ namespace Vegasco.Server.Api.Consumptions;
|
|||||||
|
|
||||||
public static class GetConsumptions
|
public static class GetConsumptions
|
||||||
{
|
{
|
||||||
public class ApiResponse
|
public class ApiResponse
|
||||||
{
|
{
|
||||||
public IEnumerable<ResponseDto> Consumptions { get; set; } = [];
|
public IEnumerable<ResponseDto> Consumptions { get; set; } = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
public record ResponseDto(
|
public record ResponseDto(
|
||||||
Guid Id,
|
Guid Id,
|
||||||
DateTimeOffset DateTime,
|
DateTimeOffset DateTime,
|
||||||
double Distance,
|
double Distance,
|
||||||
double Amount,
|
double Amount,
|
||||||
bool IgnoreInCalculation,
|
bool IgnoreInCalculation,
|
||||||
Guid CarId);
|
Guid CarId);
|
||||||
|
|
||||||
public class Request
|
public class Request
|
||||||
{
|
{
|
||||||
[FromQuery(Name = "page")] public int? Page { get; set; }
|
[FromQuery(Name = "page")] public int? Page { get; set; }
|
||||||
[FromQuery(Name = "pageSize")] public int? PageSize { get; set; }
|
[FromQuery(Name = "pageSize")] public int? PageSize { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||||
{
|
{
|
||||||
return builder
|
return builder
|
||||||
.MapGet("consumptions", Endpoint)
|
.MapGet("consumptions", Endpoint)
|
||||||
.WithDescription("Returns all consumption entries")
|
.WithDescription("Returns all consumption entries")
|
||||||
.WithTags("Consumptions");
|
.WithTags("Consumptions");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<Ok<ApiResponse>> Endpoint(
|
private static async Task<Ok<ApiResponse>> Endpoint(
|
||||||
[AsParameters] Request request,
|
[AsParameters] Request request,
|
||||||
ApplicationDbContext dbContext,
|
ApplicationDbContext dbContext,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
List<ResponseDto> consumptions = await dbContext.Consumptions
|
List<ResponseDto> consumptions = await dbContext.Consumptions
|
||||||
.Select(x =>
|
.Select(x =>
|
||||||
new ResponseDto(x.Id.Value, x.DateTime, x.Distance, x.Amount, x.IgnoreInCalculation, x.CarId.Value))
|
new ResponseDto(x.Id.Value, x.DateTime, x.Distance, x.Amount, x.IgnoreInCalculation, x.CarId.Value))
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
var apiResponse = new ApiResponse
|
var apiResponse = new ApiResponse
|
||||||
{
|
{
|
||||||
Consumptions = consumptions
|
Consumptions = consumptions
|
||||||
};
|
};
|
||||||
return TypedResults.Ok(apiResponse);
|
return TypedResults.Ok(apiResponse);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,26 +4,26 @@ namespace Vegasco.Server.Api.Info;
|
|||||||
|
|
||||||
public class GetServerInfo
|
public class GetServerInfo
|
||||||
{
|
{
|
||||||
public record Response(
|
public record Response(
|
||||||
string FullVersion,
|
string FullVersion,
|
||||||
string CommitId,
|
string CommitId,
|
||||||
DateTimeOffset CommitDate,
|
DateTimeOffset CommitDate,
|
||||||
string Environment);
|
string Environment);
|
||||||
|
|
||||||
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||||
{
|
{
|
||||||
return builder
|
return builder
|
||||||
.MapGet("info/server", Endpoint)
|
.MapGet("info/server", Endpoint)
|
||||||
.WithTags("Info");
|
.WithTags("Info");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Ok<Response> Endpoint(
|
private static Ok<Response> Endpoint(
|
||||||
IHostEnvironment environment)
|
IHostEnvironment environment)
|
||||||
{
|
{
|
||||||
return TypedResults.Ok(new Response(
|
return TypedResults.Ok(new Response(
|
||||||
ThisAssembly.AssemblyInformationalVersion,
|
ThisAssembly.AssemblyInformationalVersion,
|
||||||
ThisAssembly.GitCommitId,
|
ThisAssembly.GitCommitId,
|
||||||
new DateTimeOffset(ThisAssembly.GitCommitDate, TimeSpan.Zero),
|
new DateTimeOffset(ThisAssembly.GitCommitDate, TimeSpan.Zero),
|
||||||
environment.EnvironmentName));
|
environment.EnvironmentName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,86 +4,86 @@
|
|||||||
|
|
||||||
namespace Vegasco.Server.Api.Persistence.Migrations
|
namespace Vegasco.Server.Api.Persistence.Migrations
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public partial class Initial : Migration
|
public partial class Initial : Migration
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
{
|
{
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Users",
|
name: "Users",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
Id = table.Column<string>(type: "text", nullable: false)
|
Id = table.Column<string>(type: "text", nullable: false)
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Users", x => x.Id);
|
table.PrimaryKey("PK_Users", x => x.Id);
|
||||||
});
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Cars",
|
name: "Cars",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
Name = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
|
Name = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
|
||||||
UserId = table.Column<string>(type: "text", nullable: false)
|
UserId = table.Column<string>(type: "text", nullable: false)
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Cars", x => x.Id);
|
table.PrimaryKey("PK_Cars", x => x.Id);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_Cars_Users_UserId",
|
name: "FK_Cars_Users_UserId",
|
||||||
column: x => x.UserId,
|
column: x => x.UserId,
|
||||||
principalTable: "Users",
|
principalTable: "Users",
|
||||||
principalColumn: "Id",
|
principalColumn: "Id",
|
||||||
onDelete: ReferentialAction.Cascade);
|
onDelete: ReferentialAction.Cascade);
|
||||||
});
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Consumptions",
|
name: "Consumptions",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
DateTime = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
|
DateTime = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
|
||||||
Distance = table.Column<double>(type: "double precision", nullable: false),
|
Distance = table.Column<double>(type: "double precision", nullable: false),
|
||||||
Amount = table.Column<double>(type: "double precision", nullable: false),
|
Amount = table.Column<double>(type: "double precision", nullable: false),
|
||||||
IgnoreInCalculation = table.Column<bool>(type: "boolean", nullable: false),
|
IgnoreInCalculation = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
CarId = table.Column<Guid>(type: "uuid", nullable: false)
|
CarId = table.Column<Guid>(type: "uuid", nullable: false)
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Consumptions", x => x.Id);
|
table.PrimaryKey("PK_Consumptions", x => x.Id);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_Consumptions_Cars_CarId",
|
name: "FK_Consumptions_Cars_CarId",
|
||||||
column: x => x.CarId,
|
column: x => x.CarId,
|
||||||
principalTable: "Cars",
|
principalTable: "Cars",
|
||||||
principalColumn: "Id",
|
principalColumn: "Id",
|
||||||
onDelete: ReferentialAction.Cascade);
|
onDelete: ReferentialAction.Cascade);
|
||||||
});
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Cars_UserId",
|
name: "IX_Cars_UserId",
|
||||||
table: "Cars",
|
table: "Cars",
|
||||||
column: "UserId");
|
column: "UserId");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Consumptions_CarId",
|
name: "IX_Consumptions_CarId",
|
||||||
table: "Consumptions",
|
table: "Consumptions",
|
||||||
column: "CarId");
|
column: "CarId");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
{
|
{
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Consumptions");
|
name: "Consumptions");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Cars");
|
name: "Cars");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Users");
|
name: "Users");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ builder
|
|||||||
.AddNpmApp("Vegasco-Web", "../Vegasco-Web")
|
.AddNpmApp("Vegasco-Web", "../Vegasco-Web")
|
||||||
.WithReference(api)
|
.WithReference(api)
|
||||||
.WaitFor(api)
|
.WaitFor(api)
|
||||||
.WithHttpEndpoint(port: 44200, env: "PORT")
|
.WithHttpEndpoint(port: 44200, env: "PORT")
|
||||||
.WithExternalHttpEndpoints();
|
.WithExternalHttpEndpoints();
|
||||||
|
|
||||||
builder.Build().Run();
|
builder.Build().Run();
|
||||||
|
|||||||
@@ -15,105 +15,105 @@ namespace Vegasco.Server.ServiceDefaults;
|
|||||||
// To learn more about using this project, see https://aka.ms/dotnet/aspire/service-defaults
|
// To learn more about using this project, see https://aka.ms/dotnet/aspire/service-defaults
|
||||||
public static class Extensions
|
public static class Extensions
|
||||||
{
|
{
|
||||||
public static TBuilder AddServiceDefaults<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
|
public static TBuilder AddServiceDefaults<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
|
||||||
{
|
{
|
||||||
builder.ConfigureOpenTelemetry();
|
builder.ConfigureOpenTelemetry();
|
||||||
|
|
||||||
builder.AddDefaultHealthChecks();
|
builder.AddDefaultHealthChecks();
|
||||||
|
|
||||||
builder.Services.AddServiceDiscovery();
|
builder.Services.AddServiceDiscovery();
|
||||||
|
|
||||||
builder.Services.ConfigureHttpClientDefaults(http =>
|
builder.Services.ConfigureHttpClientDefaults(http =>
|
||||||
{
|
{
|
||||||
// Turn on resilience by default
|
// Turn on resilience by default
|
||||||
http.AddStandardResilienceHandler();
|
http.AddStandardResilienceHandler();
|
||||||
|
|
||||||
// Turn on service discovery by default
|
// Turn on service discovery by default
|
||||||
http.AddServiceDiscovery();
|
http.AddServiceDiscovery();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Uncomment the following to restrict the allowed schemes for service discovery.
|
// Uncomment the following to restrict the allowed schemes for service discovery.
|
||||||
// builder.Services.Configure<ServiceDiscoveryOptions>(options =>
|
// builder.Services.Configure<ServiceDiscoveryOptions>(options =>
|
||||||
// {
|
// {
|
||||||
// options.AllowedSchemes = ["https"];
|
// options.AllowedSchemes = ["https"];
|
||||||
// });
|
// });
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TBuilder ConfigureOpenTelemetry<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
|
public static TBuilder ConfigureOpenTelemetry<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
|
||||||
{
|
{
|
||||||
builder.Logging.AddOpenTelemetry(logging =>
|
builder.Logging.AddOpenTelemetry(logging =>
|
||||||
{
|
{
|
||||||
logging.IncludeFormattedMessage = true;
|
logging.IncludeFormattedMessage = true;
|
||||||
logging.IncludeScopes = true;
|
logging.IncludeScopes = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
builder.Services.AddOpenTelemetry()
|
builder.Services.AddOpenTelemetry()
|
||||||
.WithMetrics(metrics =>
|
.WithMetrics(metrics =>
|
||||||
{
|
{
|
||||||
metrics.AddAspNetCoreInstrumentation()
|
metrics.AddAspNetCoreInstrumentation()
|
||||||
.AddHttpClientInstrumentation()
|
.AddHttpClientInstrumentation()
|
||||||
.AddRuntimeInstrumentation();
|
.AddRuntimeInstrumentation();
|
||||||
})
|
})
|
||||||
.WithTracing(tracing =>
|
.WithTracing(tracing =>
|
||||||
{
|
{
|
||||||
tracing.AddSource(builder.Environment.ApplicationName)
|
tracing.AddSource(builder.Environment.ApplicationName)
|
||||||
.AddAspNetCoreInstrumentation()
|
.AddAspNetCoreInstrumentation()
|
||||||
// Uncomment the following line to enable gRPC instrumentation (requires the OpenTelemetry.Instrumentation.GrpcNetClient package)
|
// Uncomment the following line to enable gRPC instrumentation (requires the OpenTelemetry.Instrumentation.GrpcNetClient package)
|
||||||
//.AddGrpcClientInstrumentation()
|
//.AddGrpcClientInstrumentation()
|
||||||
.AddHttpClientInstrumentation();
|
.AddHttpClientInstrumentation();
|
||||||
});
|
});
|
||||||
|
|
||||||
builder.AddOpenTelemetryExporters();
|
builder.AddOpenTelemetryExporters();
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TBuilder AddOpenTelemetryExporters<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
|
private static TBuilder AddOpenTelemetryExporters<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
|
||||||
{
|
{
|
||||||
bool useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
|
bool useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
|
||||||
|
|
||||||
if (useOtlpExporter)
|
if (useOtlpExporter)
|
||||||
{
|
{
|
||||||
builder.Services.AddOpenTelemetry().UseOtlpExporter();
|
builder.Services.AddOpenTelemetry().UseOtlpExporter();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uncomment the following lines to enable the Azure Monitor exporter (requires the Azure.Monitor.OpenTelemetry.AspNetCore package)
|
// Uncomment the following lines to enable the Azure Monitor exporter (requires the Azure.Monitor.OpenTelemetry.AspNetCore package)
|
||||||
//if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
|
//if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
|
||||||
//{
|
//{
|
||||||
// builder.Services.AddOpenTelemetry()
|
// builder.Services.AddOpenTelemetry()
|
||||||
// .UseAzureMonitor();
|
// .UseAzureMonitor();
|
||||||
//}
|
//}
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TBuilder AddDefaultHealthChecks<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
|
public static TBuilder AddDefaultHealthChecks<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
|
||||||
{
|
{
|
||||||
builder.Services.AddHealthChecks()
|
builder.Services.AddHealthChecks()
|
||||||
// Add a default liveness check to ensure app is responsive
|
// Add a default liveness check to ensure app is responsive
|
||||||
.AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);
|
.AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static WebApplication MapDefaultEndpoints(this WebApplication app)
|
public static WebApplication MapDefaultEndpoints(this WebApplication app)
|
||||||
{
|
{
|
||||||
// Adding health checks endpoints to applications in non-development environments has security implications.
|
// Adding health checks endpoints to applications in non-development environments has security implications.
|
||||||
// See https://aka.ms/dotnet/aspire/healthchecks for details before enabling these endpoints in non-development environments.
|
// See https://aka.ms/dotnet/aspire/healthchecks for details before enabling these endpoints in non-development environments.
|
||||||
if (app.Environment.IsDevelopment())
|
if (app.Environment.IsDevelopment())
|
||||||
{
|
{
|
||||||
// All health checks must pass for app to be considered ready to accept traffic after starting
|
// All health checks must pass for app to be considered ready to accept traffic after starting
|
||||||
app.MapHealthChecks("/health");
|
app.MapHealthChecks("/health");
|
||||||
|
|
||||||
// Only health checks tagged with the "live" tag must pass for app to be considered alive
|
// Only health checks tagged with the "live" tag must pass for app to be considered alive
|
||||||
app.MapHealthChecks("/alive", new HealthCheckOptions
|
app.MapHealthChecks("/alive", new HealthCheckOptions
|
||||||
{
|
{
|
||||||
Predicate = r => r.Tags.Contains("live")
|
Predicate = r => r.Tags.Contains("live")
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return app;
|
return app;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using System.Net.Http.Json;
|
using FluentAssertions;
|
||||||
using FluentAssertions;
|
|
||||||
using FluentAssertions.Extensions;
|
using FluentAssertions.Extensions;
|
||||||
|
using System.Net.Http.Json;
|
||||||
using Vegasco.Server.Api.Info;
|
using Vegasco.Server.Api.Info;
|
||||||
|
|
||||||
namespace Vegasco.Server.Api.Tests.Integration.Info;
|
namespace Vegasco.Server.Api.Tests.Integration.Info;
|
||||||
@@ -8,28 +8,28 @@ namespace Vegasco.Server.Api.Tests.Integration.Info;
|
|||||||
[Collection(SharedTestCollection.Name)]
|
[Collection(SharedTestCollection.Name)]
|
||||||
public class GetServerInfoTests
|
public class GetServerInfoTests
|
||||||
{
|
{
|
||||||
private readonly WebAppFactory _factory;
|
private readonly WebAppFactory _factory;
|
||||||
|
|
||||||
public GetServerInfoTests(WebAppFactory factory)
|
public GetServerInfoTests(WebAppFactory factory)
|
||||||
{
|
{
|
||||||
_factory = factory;
|
_factory = factory;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task GetServerInfo_ShouldReturnServerInfo_WhenCalled()
|
public async Task GetServerInfo_ShouldReturnServerInfo_WhenCalled()
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
using HttpResponseMessage response = await _factory.HttpClient.GetAsync("/v1/info/server");
|
using HttpResponseMessage response = await _factory.HttpClient.GetAsync("/v1/info/server");
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response.IsSuccessStatusCode.Should().BeTrue();
|
response.IsSuccessStatusCode.Should().BeTrue();
|
||||||
var serverInfo = await response.Content.ReadFromJsonAsync<GetServerInfo.Response>();
|
var serverInfo = await response.Content.ReadFromJsonAsync<GetServerInfo.Response>();
|
||||||
serverInfo!.Environment.Should().NotBeEmpty();
|
serverInfo!.Environment.Should().NotBeEmpty();
|
||||||
serverInfo.CommitDate.Should().BeAfter(23.August(2024))
|
serverInfo.CommitDate.Should().BeAfter(23.August(2024))
|
||||||
.And.NotBeAfter(DateTime.Now);
|
.And.NotBeAfter(DateTime.Now);
|
||||||
serverInfo.CommitId.Should().MatchRegex(@"[0-9a-f]{40}");
|
serverInfo.CommitId.Should().MatchRegex(@"[0-9a-f]{40}");
|
||||||
serverInfo.FullVersion.Should().MatchRegex(@"\d\.\d\.\d(-[0-9a-zA-Z]+)?(\+g?[0-9a-f]{10})?");
|
serverInfo.FullVersion.Should().MatchRegex(@"\d\.\d\.\d(-[0-9a-zA-Z]+)?(\+g?[0-9a-f]{10})?");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user