Merge branch 'master' into TechMessageRework
This commit is contained in:
commit
49c433bf6c
273
.editorconfig
Normal file
273
.editorconfig
Normal file
@ -0,0 +1,273 @@
|
|||||||
|
# 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 = space
|
||||||
|
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
|
||||||
|
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 = true
|
||||||
|
dotnet_style_allow_statement_immediately_after_block_experimental = true
|
||||||
|
|
||||||
|
#### C# Coding Conventions ####
|
||||||
|
|
||||||
|
# var preferences
|
||||||
|
csharp_style_var_elsewhere = false:silent
|
||||||
|
csharp_style_var_for_built_in_types = false:silent
|
||||||
|
csharp_style_var_when_type_is_apparent = false:silent
|
||||||
|
|
||||||
|
# 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 = false: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:suggestion
|
||||||
|
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
|
||||||
|
csharp_style_prefer_extended_property_pattern = true:suggestion
|
||||||
|
csharp_style_prefer_not_pattern = true:suggestion
|
||||||
|
csharp_style_prefer_pattern_matching = true:silent
|
||||||
|
csharp_style_prefer_switch_expression = true:suggestion
|
||||||
|
|
||||||
|
# Null-checking preferences
|
||||||
|
csharp_style_conditional_delegate_call = true:suggestion
|
||||||
|
|
||||||
|
# Modifier preferences
|
||||||
|
csharp_prefer_static_local_function = true:suggestion
|
||||||
|
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:suggestion
|
||||||
|
csharp_style_prefer_readonly_struct_member = true:suggestion
|
||||||
|
|
||||||
|
# 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 = false:none
|
||||||
|
csharp_style_prefer_top_level_statements = true:silent
|
||||||
|
|
||||||
|
# Expression-level preferences
|
||||||
|
csharp_prefer_simple_default_expression = true:suggestion
|
||||||
|
csharp_style_deconstructed_variable_declaration = true:suggestion
|
||||||
|
csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
|
||||||
|
csharp_style_inlined_variable_declaration = true:suggestion
|
||||||
|
csharp_style_prefer_index_operator = true:suggestion
|
||||||
|
csharp_style_prefer_local_over_anonymous_function = true:suggestion
|
||||||
|
csharp_style_prefer_null_check_over_type_check = true:suggestion
|
||||||
|
csharp_style_prefer_range_operator = true:suggestion
|
||||||
|
csharp_style_prefer_tuple_swap = true:suggestion
|
||||||
|
csharp_style_prefer_utf8_string_literals = true:suggestion
|
||||||
|
csharp_style_throw_expression = true:suggestion
|
||||||
|
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
|
||||||
|
csharp_style_unused_value_expression_statement_preference = discard_variable:silent
|
||||||
|
|
||||||
|
# '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:silent
|
||||||
|
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent
|
||||||
|
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent
|
||||||
|
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent
|
||||||
|
csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent
|
||||||
|
|
||||||
|
#### 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 = suggestion
|
||||||
|
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 = suggestion
|
||||||
|
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 = suggestion
|
||||||
|
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
|
||||||
|
|
||||||
|
# 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.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
|
||||||
|
|
||||||
|
# Spell check
|
||||||
|
|
||||||
|
spelling_languages = en-us,ru-RU
|
||||||
|
spelling_exclusion_path = exclusion.dic
|
||||||
|
|
||||||
|
[*.{cs,vb}]
|
||||||
|
dotnet_style_operator_placement_when_wrapping = beginning_of_line
|
||||||
|
tab_width = 4
|
||||||
|
indent_size = 4
|
||||||
|
end_of_line = crlf
|
||||||
|
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:silent
|
||||||
|
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_prefer_conditional_expression_over_return = true:silent
|
||||||
|
dotnet_style_explicit_tuple_names = true:suggestion
|
||||||
|
dotnet_style_prefer_inferred_tuple_names = true:suggestion
|
||||||
|
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
|
||||||
|
dotnet_style_prefer_compound_assignment = true:suggestion
|
||||||
|
dotnet_style_prefer_simplified_interpolation = true:suggestion
|
||||||
|
dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
|
||||||
|
dotnet_style_namespace_match_folder = true:suggestion
|
||||||
|
dotnet_code_quality_unused_parameters = all:suggestion
|
||||||
|
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
|
||||||
|
dotnet_style_predefined_type_for_member_access = true:silent
|
||||||
|
dotnet_style_qualification_for_field = false:silent
|
||||||
|
dotnet_style_qualification_for_property = false:silent
|
||||||
|
dotnet_style_qualification_for_method = false:silent
|
||||||
|
dotnet_style_qualification_for_event = false:silent
|
||||||
|
dotnet_style_allow_multiple_blank_lines_experimental = true:silent
|
||||||
|
dotnet_style_allow_statement_immediately_after_block_experimental = true:silent
|
||||||
|
dotnet_style_readonly_field = true:suggestion
|
||||||
|
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
|
||||||
|
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
|
||||||
|
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
|
||||||
|
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
|
||||||
|
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
|
@ -12,7 +12,7 @@ namespace Persistence.API.Controllers;
|
|||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
public class ChangeLogController : ControllerBase, IChangeLogApi
|
public class ChangeLogController : ControllerBase, IChangeLogApi
|
||||||
{
|
{
|
||||||
private IChangeLogRepository repository;
|
private readonly IChangeLogRepository repository;
|
||||||
|
|
||||||
public ChangeLogController(IChangeLogRepository repository)
|
public ChangeLogController(IChangeLogRepository repository)
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Persistence.Models;
|
||||||
using Persistence.Repositories;
|
using Persistence.Repositories;
|
||||||
using Persistence.Repository.Data;
|
|
||||||
|
|
||||||
namespace Persistence.API.Controllers;
|
namespace Persistence.API.Controllers;
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
using System.Net;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
using Persistence.Repositories;
|
using Persistence.Repositories;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
namespace Persistence.API.Controllers;
|
namespace Persistence.API.Controllers;
|
||||||
|
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
using System.Net;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
using Persistence.Models.Requests;
|
using Persistence.Models.Requests;
|
||||||
using Persistence.Repositories;
|
using Persistence.Repositories;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
namespace Persistence.API.Controllers;
|
namespace Persistence.API.Controllers;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Работа с состояниями систем автобурения (АБ)
|
/// Работа с технологическими сообщениями систем автобурения (АБ)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
@ -16,7 +16,7 @@ namespace Persistence.API.Controllers;
|
|||||||
public class TechMessagesController : ControllerBase
|
public class TechMessagesController : ControllerBase
|
||||||
{
|
{
|
||||||
private readonly ITechMessagesRepository techMessagesRepository;
|
private readonly ITechMessagesRepository techMessagesRepository;
|
||||||
private static readonly Dictionary<int, string> categories = new Dictionary<int, string>()
|
private static readonly Dictionary<int, string> categories = new()
|
||||||
{
|
{
|
||||||
{ 0, "System" },
|
{ 0, "System" },
|
||||||
{ 1, "Авария" },
|
{ 1, "Авария" },
|
||||||
|
@ -11,7 +11,7 @@ namespace Persistence.API.Controllers;
|
|||||||
public class TimeSeriesController<TDto> : ControllerBase, ITimeSeriesDataApi<TDto>
|
public class TimeSeriesController<TDto> : ControllerBase, ITimeSeriesDataApi<TDto>
|
||||||
where TDto : class, ITimeSeriesAbstractDto, new()
|
where TDto : class, ITimeSeriesAbstractDto, new()
|
||||||
{
|
{
|
||||||
private ITimeSeriesDataRepository<TDto> timeSeriesDataRepository;
|
private readonly ITimeSeriesDataRepository<TDto> timeSeriesDataRepository;
|
||||||
|
|
||||||
public TimeSeriesController(ITimeSeriesDataRepository<TDto> timeSeriesDataRepository)
|
public TimeSeriesController(ITimeSeriesDataRepository<TDto> timeSeriesDataRepository)
|
||||||
{
|
{
|
||||||
@ -33,7 +33,7 @@ public class TimeSeriesController<TDto> : ControllerBase, ITimeSeriesDataApi<TDt
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить диапазон дат, для которых есть данные в репозиторие
|
/// Получить диапазон дат, для которых есть данные в репозитории
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
|
@ -32,7 +32,7 @@ public class TimestampedSetController : ControllerBase
|
|||||||
/// <returns>кол-во затронутых записей</returns>
|
/// <returns>кол-во затронутых записей</returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> AddRange([FromRoute]Guid idDiscriminator, [FromBody]IEnumerable<TimestampedSetDto> sets, CancellationToken token)
|
public async Task<IActionResult> AddRange([FromRoute] Guid idDiscriminator, [FromBody] IEnumerable<TimestampedSetDto> sets, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await repository.AddRange(idDiscriminator, sets, token);
|
var result = await repository.AddRange(idDiscriminator, sets, token);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
@ -50,7 +50,7 @@ public class TimestampedSetController : ControllerBase
|
|||||||
/// <returns>Фильтрованный набор данных с сортировкой по отметке времени</returns>
|
/// <returns>Фильтрованный набор данных с сортировкой по отметке времени</returns>
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[ProducesResponseType(typeof(IEnumerable<TimestampedSetDto>), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(IEnumerable<TimestampedSetDto>), (int)HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> Get(Guid idDiscriminator, DateTimeOffset? geTimestamp, [FromQuery]IEnumerable<string>? columnNames, int skip, int take, CancellationToken token)
|
public async Task<IActionResult> Get(Guid idDiscriminator, DateTimeOffset? geTimestamp, [FromQuery] IEnumerable<string>? columnNames, int skip, int take, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await repository.Get(idDiscriminator, geTimestamp, columnNames, skip, take, token);
|
var result = await repository.Get(idDiscriminator, geTimestamp, columnNames, skip, take, token);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
@ -66,7 +66,7 @@ public class TimestampedSetController : ControllerBase
|
|||||||
/// <returns>Фильтрованный набор данных с сортировкой по отметке времени</returns>
|
/// <returns>Фильтрованный набор данных с сортировкой по отметке времени</returns>
|
||||||
[HttpGet("last")]
|
[HttpGet("last")]
|
||||||
[ProducesResponseType(typeof(IEnumerable<TimestampedSetDto>), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(IEnumerable<TimestampedSetDto>), (int)HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> GetLast(Guid idDiscriminator, [FromQuery]IEnumerable<string>? columnNames, int take, CancellationToken token)
|
public async Task<IActionResult> GetLast(Guid idDiscriminator, [FromQuery] IEnumerable<string>? columnNames, int take, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await repository.GetLast(idDiscriminator, columnNames, take, token);
|
var result = await repository.GetLast(idDiscriminator, columnNames, take, token);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
using System.Net;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
using Persistence.Services.Interfaces;
|
using Persistence.Services.Interfaces;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
namespace Persistence.API.Controllers;
|
namespace Persistence.API.Controllers;
|
||||||
|
|
||||||
|
@ -30,12 +30,11 @@ public static class DependencyInjection
|
|||||||
c.MapType<DateOnly>(() => new OpenApiSchema { Type = "string", Format = "date" });
|
c.MapType<DateOnly>(() => new OpenApiSchema { Type = "string", Format = "date" });
|
||||||
c.MapType<JsonValue>(() => new OpenApiSchema
|
c.MapType<JsonValue>(() => new OpenApiSchema
|
||||||
{
|
{
|
||||||
AnyOf = new OpenApiSchema[]
|
AnyOf = [
|
||||||
{
|
|
||||||
new OpenApiSchema {Type = "string", Format = "string" },
|
new OpenApiSchema {Type = "string", Format = "string" },
|
||||||
new OpenApiSchema {Type = "number", Format = "int32" },
|
new OpenApiSchema {Type = "number", Format = "int32" },
|
||||||
new OpenApiSchema {Type = "number", Format = "float" },
|
new OpenApiSchema {Type = "number", Format = "float" }
|
||||||
}
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
c.CustomOperationIds(e =>
|
c.CustomOperationIds(e =>
|
||||||
@ -47,8 +46,8 @@ public static class DependencyInjection
|
|||||||
|
|
||||||
var needUseKeyCloak = configuration.GetSection("NeedUseKeyCloak").Get<bool>();
|
var needUseKeyCloak = configuration.GetSection("NeedUseKeyCloak").Get<bool>();
|
||||||
if (needUseKeyCloak)
|
if (needUseKeyCloak)
|
||||||
c.AddKeycloackSecurity(configuration);
|
c.AddKeycloakSecurity(configuration);
|
||||||
else c.AddDefaultSecurity(configuration);
|
else c.AddDefaultSecurity();
|
||||||
|
|
||||||
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
|
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
|
||||||
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
|
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
|
||||||
@ -108,7 +107,7 @@ public static class DependencyInjection
|
|||||||
{
|
{
|
||||||
OnMessageReceived = context =>
|
OnMessageReceived = context =>
|
||||||
{
|
{
|
||||||
var accessToken = context.Request.Headers["Authorization"]
|
var accessToken = context.Request.Headers.Authorization
|
||||||
.ToString()
|
.ToString()
|
||||||
.Replace(JwtBearerDefaults.AuthenticationScheme, string.Empty)
|
.Replace(JwtBearerDefaults.AuthenticationScheme, string.Empty)
|
||||||
.Trim();
|
.Trim();
|
||||||
@ -141,12 +140,12 @@ public static class DependencyInjection
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Security (Swagger)
|
#region Keycloak
|
||||||
private static void AddKeycloackSecurity(this SwaggerGenOptions options, IConfiguration configuration)
|
private static void AddKeycloakSecurity(this SwaggerGenOptions options, IConfiguration configuration)
|
||||||
{
|
{
|
||||||
options.AddSecurityDefinition("Keycloack", new OpenApiSecurityScheme
|
options.AddSecurityDefinition("Keycloak", new OpenApiSecurityScheme
|
||||||
{
|
{
|
||||||
Description = @"JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token in the text input below. Example: 'Bearer 12345abcdef'",
|
Description = @"JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token in the text input below. Example: 'Bearer 12345token'",
|
||||||
Name = "Authorization",
|
Name = "Authorization",
|
||||||
In = ParameterLocation.Header,
|
In = ParameterLocation.Header,
|
||||||
Type = SecuritySchemeType.OAuth2,
|
Type = SecuritySchemeType.OAuth2,
|
||||||
@ -167,7 +166,7 @@ public static class DependencyInjection
|
|||||||
Reference = new OpenApiReference
|
Reference = new OpenApiReference
|
||||||
{
|
{
|
||||||
Type = ReferenceType.SecurityScheme,
|
Type = ReferenceType.SecurityScheme,
|
||||||
Id = "Keycloack"
|
Id = "Keycloak"
|
||||||
},
|
},
|
||||||
Scheme = "Bearer",
|
Scheme = "Bearer",
|
||||||
Name = "Bearer",
|
Name = "Bearer",
|
||||||
@ -178,11 +177,11 @@ public static class DependencyInjection
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void AddDefaultSecurity(this SwaggerGenOptions options, IConfiguration configuration)
|
private static void AddDefaultSecurity(this SwaggerGenOptions options)
|
||||||
{
|
{
|
||||||
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
|
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
|
||||||
{
|
{
|
||||||
Description = @"JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token in the text input below. Example: 'Bearer 12345abcdef'",
|
Description = @"JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token in the text input below. Example: 'Bearer 12345token'",
|
||||||
Name = "Authorization",
|
Name = "Authorization",
|
||||||
In = ParameterLocation.Header,
|
In = ParameterLocation.Header,
|
||||||
Type = SecuritySchemeType.ApiKey,
|
Type = SecuritySchemeType.ApiKey,
|
||||||
|
@ -7,18 +7,15 @@ public static class Extensions
|
|||||||
{
|
{
|
||||||
public static T GetUserId<T>(this ClaimsPrincipal principal)
|
public static T GetUserId<T>(this ClaimsPrincipal principal)
|
||||||
{
|
{
|
||||||
if (principal == null)
|
ArgumentNullException.ThrowIfNull(principal, nameof(principal));
|
||||||
throw new ArgumentNullException(nameof(principal));
|
|
||||||
|
|
||||||
var loggedInUserId = principal.FindFirstValue(ClaimTypes.NameIdentifier);
|
var loggedInUserId = principal.FindFirstValue(ClaimTypes.NameIdentifier);
|
||||||
|
|
||||||
if (String.IsNullOrEmpty(loggedInUserId))
|
ArgumentNullException.ThrowIfNullOrEmpty(loggedInUserId, nameof(loggedInUserId));
|
||||||
throw new ArgumentNullException(nameof(loggedInUserId));
|
|
||||||
|
|
||||||
var result = TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(loggedInUserId);
|
var result = TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(loggedInUserId);
|
||||||
|
|
||||||
if (result is null)
|
ArgumentNullException.ThrowIfNull(result, nameof(result));
|
||||||
throw new ArgumentNullException(nameof(result));
|
|
||||||
|
|
||||||
return (T)result;
|
return (T)result;
|
||||||
|
|
||||||
|
@ -9,6 +9,11 @@
|
|||||||
<NoWarn>$(NoWarn);1591</NoWarn>
|
<NoWarn>$(NoWarn);1591</NoWarn>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<VersionPrefix>1.0.$([System.DateTime]::UtcNow.ToString(yyMM.ddHH))</VersionPrefix>
|
||||||
|
<AssemblyVersion>1.0.$([System.DateTime]::UtcNow.ToString(yyMM.ddHH))</AssemblyVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.11" />
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.11" />
|
||||||
<PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.2.1" />
|
<PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.2.1" />
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
@Persistence.API_HostAddress = http://localhost:5032
|
|
||||||
|
|
||||||
GET {{Persistence.API_HostAddress}}/weatherforecast/
|
|
||||||
Accept: application/json
|
|
||||||
|
|
||||||
###
|
|
@ -1,6 +1,3 @@
|
|||||||
|
|
||||||
using Persistence.Models;
|
|
||||||
|
|
||||||
namespace Persistence.API;
|
namespace Persistence.API;
|
||||||
|
|
||||||
public class Program
|
public class Program
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
using Persistence.Repository;
|
using Persistence.Database.Model;
|
||||||
using Persistence.Database.Model;
|
|
||||||
using Persistence.Database.Postgres;
|
using Persistence.Database.Postgres;
|
||||||
|
using Persistence.Repository;
|
||||||
|
|
||||||
namespace Persistence.API;
|
namespace Persistence.API;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
using Refit;
|
using Refit;
|
||||||
|
|
||||||
namespace Persistence.Client.Clients.Interfaces.Refit;
|
namespace Persistence.Client.Clients.Interfaces.Refit;
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
using System.IdentityModel.Tokens.Jwt;
|
|
||||||
using System.Net.Http.Headers;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Text.Json;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using Persistence.Models.Configurations;
|
using Persistence.Models.Configurations;
|
||||||
using RestSharp;
|
using RestSharp;
|
||||||
|
using System.IdentityModel.Tokens.Jwt;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
|
using System.Security.Claims;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace Persistence.Client.Helpers;
|
namespace Persistence.Client.Helpers;
|
||||||
public static class ApiTokenHelper
|
public static class ApiTokenHelper
|
||||||
@ -68,10 +68,10 @@ public static class ApiTokenHelper
|
|||||||
request.AddParameter("client_id", authUser.ClientId);
|
request.AddParameter("client_id", authUser.ClientId);
|
||||||
request.AddParameter("grant_type", authUser.GrantType);
|
request.AddParameter("grant_type", authUser.GrantType);
|
||||||
|
|
||||||
var keyCloackResponse = restClient.Post(request);
|
var keycloakResponse = restClient.Post(request);
|
||||||
if (keyCloackResponse.IsSuccessful && !String.IsNullOrEmpty(keyCloackResponse.Content))
|
if (keycloakResponse.IsSuccessful && !String.IsNullOrEmpty(keycloakResponse.Content))
|
||||||
{
|
{
|
||||||
var token = JsonSerializer.Deserialize<JwtToken>(keyCloackResponse.Content)!;
|
var token = JsonSerializer.Deserialize<JwtToken>(keycloakResponse.Content)!;
|
||||||
return token.AccessToken;
|
return token.AccessToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
@ -38,6 +38,11 @@
|
|||||||
<PackageReadmeFile>Readme.md</PackageReadmeFile>
|
<PackageReadmeFile>Readme.md</PackageReadmeFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<VersionPrefix>1.0.$([System.DateTime]::UtcNow.ToString(yyMM.ddHH))</VersionPrefix>
|
||||||
|
<AssemblyVersion>1.0.$([System.DateTime]::UtcNow.ToString(yyMM.ddHH))</AssemblyVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Readme.md" Pack="true" PackagePath="\"/>
|
<None Include="Readme.md" Pack="true" PackagePath="\"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
using System.Text.Json;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Persistence.Client.Clients.Interfaces;
|
using Persistence.Client.Clients.Interfaces;
|
||||||
using Persistence.Client.Clients;
|
using Persistence.Client.Clients;
|
||||||
@ -8,6 +7,7 @@ using Persistence.Factories;
|
|||||||
using Persistence.Client.Clients.Interfaces.Refit;
|
using Persistence.Client.Clients.Interfaces.Refit;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace Persistence.Client
|
namespace Persistence.Client
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Npgsql;
|
|
||||||
|
|
||||||
namespace Persistence.Database.Model;
|
namespace Persistence.Database.Model;
|
||||||
|
|
||||||
|
@ -12,12 +12,14 @@ public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<Persistenc
|
|||||||
{
|
{
|
||||||
public PersistencePostgresContext CreateDbContext(string[] args)
|
public PersistencePostgresContext CreateDbContext(string[] args)
|
||||||
{
|
{
|
||||||
var connectionStringBuilder = new NpgsqlConnectionStringBuilder();
|
var connectionStringBuilder = new NpgsqlConnectionStringBuilder
|
||||||
connectionStringBuilder.Host = "localhost";
|
{
|
||||||
connectionStringBuilder.Database = "persistence";
|
Host = "localhost",
|
||||||
connectionStringBuilder.Username = "postgres";
|
Database = "persistence",
|
||||||
connectionStringBuilder.Password = "q";
|
Username = "postgres",
|
||||||
connectionStringBuilder.PersistSecurityInfo = true;
|
Password = "q",
|
||||||
|
PersistSecurityInfo = true
|
||||||
|
};
|
||||||
var connectionString = connectionStringBuilder.ToString();
|
var connectionString = connectionStringBuilder.ToString();
|
||||||
|
|
||||||
var optionsBuilder = new DbContextOptionsBuilder<PersistencePostgresContext>();
|
var optionsBuilder = new DbContextOptionsBuilder<PersistencePostgresContext>();
|
||||||
|
@ -1,11 +1,6 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Persistence.Database.Postgres;
|
namespace Persistence.Database.Postgres;
|
||||||
public static class EFExtensionsInitialization
|
public static class EFExtensionsInitialization
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System;
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
using System;
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using System.Collections.Generic;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System;
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System;
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System;
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure.Internal;
|
|
||||||
|
|
||||||
namespace Persistence.Database.Model;
|
namespace Persistence.Database.Model;
|
||||||
|
|
||||||
@ -10,7 +9,7 @@ public partial class PersistencePostgresContext : PersistenceDbContext
|
|||||||
{
|
{
|
||||||
public PersistencePostgresContext(DbContextOptions options)
|
public PersistencePostgresContext(DbContextOptions options)
|
||||||
: base(options)
|
: base(options)
|
||||||
{}
|
{ }
|
||||||
|
|
||||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
using Microsoft.EntityFrameworkCore.ChangeTracking;
|
using Microsoft.EntityFrameworkCore.ChangeTracking;
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace Persistence.Database;
|
namespace Persistence.Database;
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace Persistence.Database.Model;
|
namespace Persistence.Database.Model;
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace Persistence.Database.Model;
|
namespace Persistence.Database.Model;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
|
|
||||||
namespace Persistence.Database.Entity;
|
namespace Persistence.Database.Entity;
|
||||||
public class DrillingSystem
|
public class DrillingSystem
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
|
|
||||||
namespace Persistence.Database.Entity;
|
namespace Persistence.Database.Entity;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace Persistence.Database.Model
|
namespace Persistence.Database.Model
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace Persistence.Database.Entity
|
namespace Persistence.Database.Entity
|
||||||
{
|
{
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Persistence.Database;
|
using Persistence.Database;
|
||||||
using Persistence.Database.Model;
|
using Persistence.Database.Model;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Persistence.IntegrationTests;
|
namespace Persistence.IntegrationTests;
|
||||||
public abstract class BaseIntegrationTest : IClassFixture<WebAppFactoryFixture>,
|
public abstract class BaseIntegrationTest : IClassFixture<WebAppFactoryFixture>, IDisposable
|
||||||
IDisposable
|
|
||||||
{
|
{
|
||||||
protected readonly IServiceScope scope;
|
protected readonly IServiceScope scope;
|
||||||
|
|
||||||
@ -23,5 +21,6 @@ public abstract class BaseIntegrationTest : IClassFixture<WebAppFactoryFixture>,
|
|||||||
{
|
{
|
||||||
scope.Dispose();
|
scope.Dispose();
|
||||||
dbContext.Dispose();
|
dbContext.Dispose();
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ namespace Persistence.IntegrationTests.Controllers;
|
|||||||
public class ChangeLogControllerTest : BaseIntegrationTest
|
public class ChangeLogControllerTest : BaseIntegrationTest
|
||||||
{
|
{
|
||||||
private readonly IChangeLogClient client;
|
private readonly IChangeLogClient client;
|
||||||
private static Random generatorRandomDigits = new Random();
|
private static readonly Random generatorRandomDigits = new();
|
||||||
|
|
||||||
public ChangeLogControllerTest(WebAppFactoryFixture factory) : base(factory)
|
public ChangeLogControllerTest(WebAppFactoryFixture factory) : base(factory)
|
||||||
{
|
{
|
||||||
@ -30,7 +30,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
dbContext.CleanupDbSet<ChangeLog>();
|
dbContext.CleanupDbSet<ChangeLog>();
|
||||||
|
|
||||||
var idDiscriminator = Guid.NewGuid();
|
var idDiscriminator = Guid.NewGuid();
|
||||||
var dtos = Generate(2, DateTimeOffset.UtcNow);
|
var dtos = Generate(2);
|
||||||
|
|
||||||
// act
|
// act
|
||||||
var result = await client.ClearAndAddRange(idDiscriminator, dtos, new CancellationToken());
|
var result = await client.ClearAndAddRange(idDiscriminator, dtos, new CancellationToken());
|
||||||
@ -61,7 +61,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
// arrange
|
// arrange
|
||||||
var count = 1;
|
var count = 1;
|
||||||
var idDiscriminator = Guid.NewGuid();
|
var idDiscriminator = Guid.NewGuid();
|
||||||
var dtos = Generate(count, DateTimeOffset.UtcNow);
|
var dtos = Generate(count);
|
||||||
var dto = dtos.FirstOrDefault()!;
|
var dto = dtos.FirstOrDefault()!;
|
||||||
|
|
||||||
// act
|
// act
|
||||||
@ -77,7 +77,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
// arrange
|
// arrange
|
||||||
var count = 3;
|
var count = 3;
|
||||||
var idDiscriminator = Guid.NewGuid();
|
var idDiscriminator = Guid.NewGuid();
|
||||||
var dtos = Generate(count, DateTimeOffset.UtcNow);
|
var dtos = Generate(count);
|
||||||
|
|
||||||
// act
|
// act
|
||||||
var result = await client.AddRange(idDiscriminator, dtos, new CancellationToken());
|
var result = await client.AddRange(idDiscriminator, dtos, new CancellationToken());
|
||||||
@ -93,7 +93,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
dbContext.CleanupDbSet<ChangeLog>();
|
dbContext.CleanupDbSet<ChangeLog>();
|
||||||
|
|
||||||
var idDiscriminator = Guid.NewGuid();
|
var idDiscriminator = Guid.NewGuid();
|
||||||
var dtos = Generate(1, DateTimeOffset.UtcNow);
|
var dtos = Generate(1);
|
||||||
var dto = dtos.FirstOrDefault()!;
|
var dto = dtos.FirstOrDefault()!;
|
||||||
var result = await client.Add(idDiscriminator, dto, new CancellationToken());
|
var result = await client.Add(idDiscriminator, dto, new CancellationToken());
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
.Where(x => x.IdDiscriminator == idDiscriminator)
|
.Where(x => x.IdDiscriminator == idDiscriminator)
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
dto = entity.Adapt<DataWithWellDepthAndSectionDto>();
|
dto = entity.Adapt<DataWithWellDepthAndSectionDto>();
|
||||||
dto.DepthEnd = dto.DepthEnd + 10;
|
dto.DepthEnd += 10;
|
||||||
|
|
||||||
// act
|
// act
|
||||||
result = await client.Update(dto, new CancellationToken());
|
result = await client.Update(dto, new CancellationToken());
|
||||||
@ -138,7 +138,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
{
|
{
|
||||||
// arrange
|
// arrange
|
||||||
var count = 2;
|
var count = 2;
|
||||||
var dtos = Generate(count, DateTimeOffset.UtcNow);
|
var dtos = Generate(count);
|
||||||
var entities = dtos.Select(d => d.Adapt<ChangeLog>()).ToArray();
|
var entities = dtos.Select(d => d.Adapt<ChangeLog>()).ToArray();
|
||||||
dbContext.ChangeLog.AddRange(entities);
|
dbContext.ChangeLog.AddRange(entities);
|
||||||
dbContext.SaveChanges();
|
dbContext.SaveChanges();
|
||||||
@ -163,7 +163,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
public async Task Delete_returns_success()
|
public async Task Delete_returns_success()
|
||||||
{
|
{
|
||||||
// arrange
|
// arrange
|
||||||
var dtos = Generate(1, DateTimeOffset.UtcNow);
|
var dtos = Generate(1);
|
||||||
var dto = dtos.FirstOrDefault()!;
|
var dto = dtos.FirstOrDefault()!;
|
||||||
var entity = dto.Adapt<ChangeLog>();
|
var entity = dto.Adapt<ChangeLog>();
|
||||||
dbContext.ChangeLog.Add(entity);
|
dbContext.ChangeLog.Add(entity);
|
||||||
@ -181,7 +181,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
{
|
{
|
||||||
// arrange
|
// arrange
|
||||||
var count = 10;
|
var count = 10;
|
||||||
var dtos = Generate(count, DateTimeOffset.UtcNow);
|
var dtos = Generate(count);
|
||||||
var entities = dtos.Select(d => d.Adapt<ChangeLog>()).ToArray();
|
var entities = dtos.Select(d => d.Adapt<ChangeLog>()).ToArray();
|
||||||
dbContext.ChangeLog.AddRange(entities);
|
dbContext.ChangeLog.AddRange(entities);
|
||||||
dbContext.SaveChanges();
|
dbContext.SaveChanges();
|
||||||
@ -288,7 +288,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
|
|
||||||
foreach (var entity in entities)
|
foreach (var entity in entities)
|
||||||
{
|
{
|
||||||
entity.DepthEnd = entity.DepthEnd + 10;
|
entity.DepthEnd += 10;
|
||||||
}
|
}
|
||||||
var dtos = entities.Select(e => e.Adapt<DataWithWellDepthAndSectionDto>()).ToArray();
|
var dtos = entities.Select(e => e.Adapt<DataWithWellDepthAndSectionDto>()).ToArray();
|
||||||
await client.UpdateRange(dtos, new CancellationToken());
|
await client.UpdateRange(dtos, new CancellationToken());
|
||||||
@ -304,7 +304,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static IEnumerable<DataWithWellDepthAndSectionDto> Generate(int count, DateTimeOffset from)
|
private static IEnumerable<DataWithWellDepthAndSectionDto> Generate(int count)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
yield return new DataWithWellDepthAndSectionDto()
|
yield return new DataWithWellDepthAndSectionDto()
|
||||||
@ -326,8 +326,8 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
var minDayCount = daysRange.Item1;
|
var minDayCount = daysRange.Item1;
|
||||||
var maxDayCount = daysRange.Item2;
|
var maxDayCount = daysRange.Item2;
|
||||||
|
|
||||||
var idDiscriminator = Guid.NewGuid();
|
Guid idDiscriminator = Guid.NewGuid();
|
||||||
var dtos = Generate(count, DateTimeOffset.UtcNow);
|
var dtos = Generate(count);
|
||||||
var entities = dtos.Select(d =>
|
var entities = dtos.Select(d =>
|
||||||
{
|
{
|
||||||
var entity = d.Adapt<ChangeLog>();
|
var entity = d.Adapt<ChangeLog>();
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
using Persistence.Client;
|
using Persistence.Database.Model;
|
||||||
using Persistence.Database.Model;
|
using Persistence.Models;
|
||||||
using Persistence.Repository.Data;
|
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Persistence.IntegrationTests.Controllers;
|
namespace Persistence.IntegrationTests.Controllers;
|
||||||
public class DataSaubControllerTest : TimeSeriesBaseControllerTest<DataSaub, DataSaubDto>
|
public class DataSaubControllerTest : TimeSeriesBaseControllerTest<DataSaub, DataSaubDto>
|
||||||
{
|
{
|
||||||
private readonly DataSaubDto dto = new DataSaubDto()
|
private readonly DataSaubDto dto = new()
|
||||||
{
|
{
|
||||||
AxialLoad = 1,
|
AxialLoad = 1,
|
||||||
BitDepth = 2,
|
BitDepth = 2,
|
||||||
@ -29,7 +28,7 @@ public class DataSaubControllerTest : TimeSeriesBaseControllerTest<DataSaub, Dat
|
|||||||
WellDepth = 18,
|
WellDepth = 18,
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly DataSaub entity = new DataSaub()
|
private readonly DataSaub entity = new()
|
||||||
{
|
{
|
||||||
AxialLoad = 1,
|
AxialLoad = 1,
|
||||||
BitDepth = 2,
|
BitDepth = 2,
|
||||||
|
@ -1,18 +1,19 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Persistence.Client;
|
using Persistence.Client;
|
||||||
using Persistence.Client.Clients.Interfaces;
|
using Persistence.Client.Clients.Interfaces;
|
||||||
using Persistence.Database.Model;
|
using Persistence.Database.Model;
|
||||||
|
using System.Net;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Persistence.IntegrationTests.Controllers
|
namespace Persistence.IntegrationTests.Controllers
|
||||||
{
|
{
|
||||||
public class SetpointControllerTest : BaseIntegrationTest
|
public class SetpointControllerTest : BaseIntegrationTest
|
||||||
{
|
{
|
||||||
private ISetpointClient setpointClient;
|
private readonly ISetpointClient setpointClient;
|
||||||
private class TestObject
|
private class TestObject
|
||||||
{
|
{
|
||||||
public string? value1 { get; set; }
|
public string? Value1 { get; set; }
|
||||||
public int? value2 { get; set; }
|
public int? Value2 { get; set; }
|
||||||
}
|
}
|
||||||
public SetpointControllerTest(WebAppFactoryFixture factory) : base(factory)
|
public SetpointControllerTest(WebAppFactoryFixture factory) : base(factory)
|
||||||
{
|
{
|
||||||
@ -213,8 +214,8 @@ namespace Persistence.IntegrationTests.Controllers
|
|||||||
var setpointKey = Guid.NewGuid();
|
var setpointKey = Guid.NewGuid();
|
||||||
var setpointValue = new TestObject()
|
var setpointValue = new TestObject()
|
||||||
{
|
{
|
||||||
value1 = "1",
|
Value1 = "1",
|
||||||
value2 = 2
|
Value2 = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
//act
|
//act
|
||||||
|
@ -6,6 +6,7 @@ using Persistence.Database.Entity;
|
|||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
using Persistence.Models.Enumerations;
|
using Persistence.Models.Enumerations;
|
||||||
using Persistence.Models.Requests;
|
using Persistence.Models.Requests;
|
||||||
|
using System.Net;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Persistence.IntegrationTests.Controllers
|
namespace Persistence.IntegrationTests.Controllers
|
||||||
|
@ -1,17 +1,18 @@
|
|||||||
using System.Net;
|
|
||||||
using Mapster;
|
using Mapster;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Persistence.Client;
|
using Persistence.Client;
|
||||||
using Persistence.Client.Clients.Interfaces;
|
using Persistence.Client.Clients.Interfaces;
|
||||||
using Persistence.Database.Model;
|
using Persistence.Database.Model;
|
||||||
|
using System.Net;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Persistence.IntegrationTests.Controllers;
|
namespace Persistence.IntegrationTests.Controllers;
|
||||||
|
|
||||||
public abstract class TimeSeriesBaseControllerTest<TEntity, TDto> : BaseIntegrationTest
|
public abstract class TimeSeriesBaseControllerTest<TEntity, TDto> : BaseIntegrationTest
|
||||||
where TEntity : class, ITimestampedData, new()
|
where TEntity : class, ITimestampedData, new()
|
||||||
where TDto : class, new()
|
where TDto : class, new()
|
||||||
{
|
{
|
||||||
private ITimeSeriesClient<TDto> timeSeriesClient;
|
private readonly ITimeSeriesClient<TDto> timeSeriesClient;
|
||||||
|
|
||||||
public TimeSeriesBaseControllerTest(WebAppFactoryFixture factory) : base(factory)
|
public TimeSeriesBaseControllerTest(WebAppFactoryFixture factory) : base(factory)
|
||||||
{
|
{
|
||||||
@ -100,7 +101,7 @@ public abstract class TimeSeriesBaseControllerTest<TEntity, TDto> : BaseIntegrat
|
|||||||
//assert
|
//assert
|
||||||
Assert.NotNull(response);
|
Assert.NotNull(response);
|
||||||
|
|
||||||
var ratio = entities.Count() / approxPointsCount;
|
var ratio = entities.Count / approxPointsCount;
|
||||||
if (ratio > 1)
|
if (ratio > 1)
|
||||||
{
|
{
|
||||||
var expectedResampledCount = entities
|
var expectedResampledCount = entities
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Persistence.Client;
|
using Persistence.Client;
|
||||||
using Persistence.Client.Clients.Interfaces;
|
using Persistence.Client.Clients.Interfaces;
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
@ -25,7 +25,7 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
IEnumerable<TimestampedSetDto> testSets = Generate(10, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
IEnumerable<TimestampedSetDto> testSets = Generate(10, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
||||||
|
|
||||||
// act
|
// act
|
||||||
var response = await client.AddRange(idDiscriminator, testSets, new CancellationToken());
|
var response = await client.AddRange(idDiscriminator, testSets, CancellationToken.None);
|
||||||
|
|
||||||
// assert
|
// assert
|
||||||
Assert.Equal(testSets.Count(), response);
|
Assert.Equal(testSets.Count(), response);
|
||||||
@ -38,10 +38,10 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
Guid idDiscriminator = Guid.NewGuid();
|
Guid idDiscriminator = Guid.NewGuid();
|
||||||
int count = 10;
|
int count = 10;
|
||||||
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
||||||
var insertResponse = await client.AddRange(idDiscriminator, testSets, new CancellationToken());
|
await client.AddRange(idDiscriminator, testSets, CancellationToken.None);
|
||||||
|
|
||||||
// act
|
// act
|
||||||
var response = await client.Get(idDiscriminator, null, null, 0, int.MaxValue, new CancellationToken());
|
var response = await client.Get(idDiscriminator, null, null, 0, int.MaxValue, CancellationToken.None);
|
||||||
|
|
||||||
// assert
|
// assert
|
||||||
Assert.NotNull(response);
|
Assert.NotNull(response);
|
||||||
@ -55,7 +55,7 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
Guid idDiscriminator = Guid.NewGuid();
|
Guid idDiscriminator = Guid.NewGuid();
|
||||||
int count = 10;
|
int count = 10;
|
||||||
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
||||||
var insertResponse = await client.AddRange(idDiscriminator, testSets, new CancellationToken());
|
await client.AddRange(idDiscriminator, testSets, CancellationToken.None);
|
||||||
string[] props = ["A"];
|
string[] props = ["A"];
|
||||||
|
|
||||||
// act
|
// act
|
||||||
@ -64,7 +64,7 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
// assert
|
// assert
|
||||||
Assert.NotNull(response);
|
Assert.NotNull(response);
|
||||||
Assert.Equal(count, response.Count());
|
Assert.Equal(count, response.Count());
|
||||||
foreach ( var item in response )
|
foreach (var item in response)
|
||||||
{
|
{
|
||||||
Assert.Single(item.Set);
|
Assert.Single(item.Set);
|
||||||
var kv = item.Set.First();
|
var kv = item.Set.First();
|
||||||
@ -81,14 +81,14 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
var dateMin = DateTimeOffset.Now;
|
var dateMin = DateTimeOffset.Now;
|
||||||
var dateMax = DateTimeOffset.Now.AddSeconds(count);
|
var dateMax = DateTimeOffset.Now.AddSeconds(count);
|
||||||
IEnumerable<TimestampedSetDto> testSets = Generate(count, dateMin.ToOffset(TimeSpan.FromHours(7)));
|
IEnumerable<TimestampedSetDto> testSets = Generate(count, dateMin.ToOffset(TimeSpan.FromHours(7)));
|
||||||
var insertResponse = await client.AddRange(idDiscriminator, testSets, new CancellationToken());
|
var insertResponse = await client.AddRange(idDiscriminator, testSets, CancellationToken.None);
|
||||||
var tail = testSets.OrderBy(t => t.Timestamp).Skip(count / 2).Take(int.MaxValue);
|
var tail = testSets.OrderBy(t => t.Timestamp).Skip(count / 2).Take(int.MaxValue);
|
||||||
var geDate = tail.First().Timestamp;
|
var geDate = tail.First().Timestamp;
|
||||||
var tolerance = TimeSpan.FromSeconds(1);
|
var tolerance = TimeSpan.FromSeconds(1);
|
||||||
var expectedCount = tail.Count();
|
var expectedCount = tail.Count();
|
||||||
|
|
||||||
// act
|
// act
|
||||||
var response = await client.Get(idDiscriminator, geDate, null, 0, int.MaxValue, new CancellationToken());
|
var response = await client.Get(idDiscriminator, geDate, null, 0, int.MaxValue, CancellationToken.None);
|
||||||
|
|
||||||
// assert
|
// assert
|
||||||
Assert.NotNull(response);
|
Assert.NotNull(response);
|
||||||
@ -104,7 +104,7 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
Guid idDiscriminator = Guid.NewGuid();
|
Guid idDiscriminator = Guid.NewGuid();
|
||||||
int count = 10;
|
int count = 10;
|
||||||
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
||||||
var insertResponse = await client.AddRange(idDiscriminator, testSets, new CancellationToken());
|
await client.AddRange(idDiscriminator, testSets, CancellationToken.None);
|
||||||
var expectedCount = count / 2;
|
var expectedCount = count / 2;
|
||||||
|
|
||||||
// act
|
// act
|
||||||
@ -124,7 +124,7 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
var expectedCount = 1;
|
var expectedCount = 1;
|
||||||
int count = 10 + expectedCount;
|
int count = 10 + expectedCount;
|
||||||
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
||||||
var insertResponse = await client.AddRange(idDiscriminator, testSets, new CancellationToken());
|
await client.AddRange(idDiscriminator, testSets, CancellationToken.None);
|
||||||
|
|
||||||
// act
|
// act
|
||||||
var response = await client.Get(idDiscriminator, null, null, count - expectedCount, count, new CancellationToken());
|
var response = await client.Get(idDiscriminator, null, null, count - expectedCount, count, new CancellationToken());
|
||||||
@ -141,7 +141,7 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
Guid idDiscriminator = Guid.NewGuid();
|
Guid idDiscriminator = Guid.NewGuid();
|
||||||
int count = 10;
|
int count = 10;
|
||||||
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
||||||
var insertResponse = await client.AddRange(idDiscriminator, testSets, new CancellationToken());
|
await client.AddRange(idDiscriminator, testSets, CancellationToken.None);
|
||||||
var expectedCount = 8;
|
var expectedCount = 8;
|
||||||
|
|
||||||
// act
|
// act
|
||||||
@ -159,9 +159,9 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
Guid idDiscriminator = Guid.NewGuid();
|
Guid idDiscriminator = Guid.NewGuid();
|
||||||
int count = 10;
|
int count = 10;
|
||||||
var dateMin = DateTimeOffset.Now;
|
var dateMin = DateTimeOffset.Now;
|
||||||
var dateMax = DateTimeOffset.Now.AddSeconds(count-1);
|
var dateMax = DateTimeOffset.Now.AddSeconds(count - 1);
|
||||||
IEnumerable<TimestampedSetDto> testSets = Generate(count, dateMin.ToOffset(TimeSpan.FromHours(7)));
|
IEnumerable<TimestampedSetDto> testSets = Generate(count, dateMin.ToOffset(TimeSpan.FromHours(7)));
|
||||||
var insertResponse = await client.AddRange(idDiscriminator, testSets, new CancellationToken());
|
await client.AddRange(idDiscriminator, testSets, CancellationToken.None);
|
||||||
var tolerance = TimeSpan.FromSeconds(1);
|
var tolerance = TimeSpan.FromSeconds(1);
|
||||||
|
|
||||||
// act
|
// act
|
||||||
@ -180,7 +180,7 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
Guid idDiscriminator = Guid.NewGuid();
|
Guid idDiscriminator = Guid.NewGuid();
|
||||||
int count = 144;
|
int count = 144;
|
||||||
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
IEnumerable<TimestampedSetDto> testSets = Generate(count, DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(7)));
|
||||||
var insertResponse = await client.AddRange(idDiscriminator, testSets, new CancellationToken());
|
await client.AddRange(idDiscriminator, testSets, CancellationToken.None);
|
||||||
|
|
||||||
// act
|
// act
|
||||||
var response = await client.Count(idDiscriminator, new CancellationToken());
|
var response = await client.Count(idDiscriminator, new CancellationToken());
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Persistence.Client;
|
using Persistence.Client;
|
||||||
using Persistence.Client.Clients;
|
using Persistence.Client.Clients;
|
||||||
using Persistence.Client.Clients.Interfaces;
|
using Persistence.Client.Clients.Interfaces;
|
||||||
using Persistence.Database.Entity;
|
using Persistence.Database.Entity;
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
|
using System.Net;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Persistence.IntegrationTests.Controllers;
|
namespace Persistence.IntegrationTests.Controllers;
|
||||||
|
@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace Persistence.IntegrationTests;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Persistence.IntegrationTests;
|
|
||||||
public class DbConnection
|
public class DbConnection
|
||||||
{
|
{
|
||||||
public string Host { get; set; } = null!;
|
public string Host { get; set; } = null!;
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Persistence.Database.Model;
|
|
||||||
|
|
||||||
namespace Persistence.IntegrationTests;
|
namespace Persistence.IntegrationTests;
|
||||||
public static class EFCoreExtensions
|
public static class EFCoreExtensions
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
using Persistence.Database;
|
|
||||||
using Persistence.Database.Model;
|
|
||||||
|
|
||||||
namespace Persistence.IntegrationTests.Extensions;
|
|
||||||
|
|
||||||
public static class EFCoreExtensions
|
|
||||||
{
|
|
||||||
public static void CleanupDbSet<T>(this PersistenceDbContext dbContext)
|
|
||||||
where T : class
|
|
||||||
{
|
|
||||||
var dbset = dbContext.Set<T>();
|
|
||||||
dbset.RemoveRange(dbset);
|
|
||||||
dbContext.SaveChanges();
|
|
||||||
}
|
|
||||||
}
|
|
@ -64,5 +64,7 @@ public class WebAppFactoryFixture : WebApplicationFactory<Startup>
|
|||||||
.Options);
|
.Options);
|
||||||
|
|
||||||
await dbContext.Database.EnsureDeletedAsync();
|
await dbContext.Database.EnsureDeletedAsync();
|
||||||
|
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
using System;
|
using System.Collections;
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Persistence.Repository;
|
namespace Persistence.Repository;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -134,20 +129,20 @@ public class CyclicArray<T> : IEnumerable<T>
|
|||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public IEnumerator<T> GetEnumerator()
|
public IEnumerator<T> GetEnumerator()
|
||||||
=> new CyclycListEnumerator<T>(array, current, used);
|
=> new CyclicListEnumerator<T>(array, current, used);
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
IEnumerator IEnumerable.GetEnumerator()
|
IEnumerator IEnumerable.GetEnumerator()
|
||||||
=> GetEnumerator();
|
=> GetEnumerator();
|
||||||
|
|
||||||
class CyclycListEnumerator<Te> : IEnumerator<Te>
|
class CyclicListEnumerator<Te> : IEnumerator<Te>
|
||||||
{
|
{
|
||||||
private readonly Te[] array;
|
private readonly Te[] array;
|
||||||
private readonly int used;
|
private readonly int used;
|
||||||
private readonly int first;
|
private readonly int first;
|
||||||
private int current = -1;
|
private int current = -1;
|
||||||
|
|
||||||
public CyclycListEnumerator(Te[] array, int first, int used)
|
public CyclicListEnumerator(Te[] array, int first, int used)
|
||||||
{
|
{
|
||||||
this.array = new Te[array.Length];
|
this.array = new Te[array.Length];
|
||||||
array.CopyTo(this.array, 0);
|
array.CopyTo(this.array, 0);
|
||||||
|
@ -3,7 +3,6 @@ using Microsoft.Extensions.DependencyInjection;
|
|||||||
using Persistence.Database.Model;
|
using Persistence.Database.Model;
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
using Persistence.Repositories;
|
using Persistence.Repositories;
|
||||||
using Persistence.Repository.Data;
|
|
||||||
using Persistence.Repository.Repositories;
|
using Persistence.Repository.Repositories;
|
||||||
|
|
||||||
namespace Persistence.Repository;
|
namespace Persistence.Repository;
|
||||||
|
@ -44,7 +44,7 @@ public static class EFExtensionsSortBy
|
|||||||
var name = propertyInfo.Name.ToLower();
|
var name = propertyInfo.Name.ToLower();
|
||||||
ParameterExpression arg = Expression.Parameter(type, "x");
|
ParameterExpression arg = Expression.Parameter(type, "x");
|
||||||
MemberExpression property = Expression.Property(arg, propertyInfo.Name);
|
MemberExpression property = Expression.Property(arg, propertyInfo.Name);
|
||||||
var selector = Expression.Lambda(property, new ParameterExpression[] { arg });
|
var selector = Expression.Lambda(property, [arg]);
|
||||||
var typeAccessor = new TypeAccessor
|
var typeAccessor = new TypeAccessor
|
||||||
{
|
{
|
||||||
KeySelector = selector,
|
KeySelector = selector,
|
||||||
@ -200,7 +200,7 @@ public static class EFExtensionsSortBy
|
|||||||
: orderByAscending;
|
: orderByAscending;
|
||||||
|
|
||||||
var newQuery = (IOrderedQueryable<TSource>)genericMethod
|
var newQuery = (IOrderedQueryable<TSource>)genericMethod
|
||||||
.Invoke(genericMethod, new object[] { query, lambdaExpression })!;
|
.Invoke(genericMethod, [query, lambdaExpression])!;
|
||||||
return newQuery;
|
return newQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,7 +226,6 @@ public static class EFExtensionsSortBy
|
|||||||
|
|
||||||
LambdaExpression? lambdaExpression = null;
|
LambdaExpression? lambdaExpression = null;
|
||||||
|
|
||||||
// TODO: Устранить дублирование кода
|
|
||||||
if (propertyName.Contains('.'))
|
if (propertyName.Contains('.'))
|
||||||
{
|
{
|
||||||
Type type = rootType;
|
Type type = rootType;
|
||||||
@ -261,7 +260,7 @@ public static class EFExtensionsSortBy
|
|||||||
: orderByAscending;
|
: orderByAscending;
|
||||||
|
|
||||||
var newQuery = (IOrderedQueryable<TSource>)genericMethod
|
var newQuery = (IOrderedQueryable<TSource>)genericMethod
|
||||||
.Invoke(genericMethod, new object[] { query, lambdaExpression })!;
|
.Invoke(genericMethod, [query, lambdaExpression])!;
|
||||||
return newQuery;
|
return newQuery;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -29,7 +29,7 @@ public static class QueryBuilders
|
|||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IQueryable<TEntity> Apply<TEntity>(this IQueryable<TEntity> query,DateTimeOffset momentUtc)
|
public static IQueryable<TEntity> Apply<TEntity>(this IQueryable<TEntity> query, DateTimeOffset momentUtc)
|
||||||
where TEntity : class, IChangeLog
|
where TEntity : class, IChangeLog
|
||||||
{
|
{
|
||||||
momentUtc = momentUtc.ToUniversalTime();
|
momentUtc = momentUtc.ToUniversalTime();
|
||||||
|
@ -9,7 +9,7 @@ using UuidExtensions;
|
|||||||
namespace Persistence.Repository.Repositories;
|
namespace Persistence.Repository.Repositories;
|
||||||
public class ChangeLogRepository : IChangeLogRepository
|
public class ChangeLogRepository : IChangeLogRepository
|
||||||
{
|
{
|
||||||
private DbContext db;
|
private readonly DbContext db;
|
||||||
|
|
||||||
public ChangeLogRepository(DbContext db)
|
public ChangeLogRepository(DbContext db)
|
||||||
{
|
{
|
||||||
@ -195,7 +195,7 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
return datesOnly;
|
return datesOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ChangeLog CreateEntityFromDto(Guid idAuthor, Guid idDiscriminator, DataWithWellDepthAndSectionDto dto)
|
private static ChangeLog CreateEntityFromDto(Guid idAuthor, Guid idDiscriminator, DataWithWellDepthAndSectionDto dto)
|
||||||
{
|
{
|
||||||
var entity = new ChangeLog()
|
var entity = new ChangeLog()
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
using Mapster;
|
using Mapster;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using Persistence.Database.Entity;
|
using Persistence.Database.Entity;
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
using Persistence.Repositories;
|
using Persistence.Repositories;
|
||||||
@ -63,7 +62,7 @@ public class ParameterRepository : IParameterRepository
|
|||||||
.OrderBy(e => e.Timestamp);
|
.OrderBy(e => e.Timestamp);
|
||||||
if (ratio != null)
|
if (ratio != null)
|
||||||
{
|
{
|
||||||
query = query.Where(e => ((int) (e.Timestamp - dateFrom).TotalSeconds) % ratio == 0);
|
query = query.Where(e => ((int)(e.Timestamp - dateFrom).TotalSeconds) % ratio == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
var entities = await query
|
var entities = await query
|
||||||
|
@ -8,7 +8,7 @@ namespace Persistence.Repository.Repositories
|
|||||||
{
|
{
|
||||||
public class SetpointRepository : ISetpointRepository
|
public class SetpointRepository : ISetpointRepository
|
||||||
{
|
{
|
||||||
private DbContext db;
|
private readonly DbContext db;
|
||||||
public SetpointRepository(DbContext db)
|
public SetpointRepository(DbContext db)
|
||||||
{
|
{
|
||||||
this.db = db;
|
this.db = db;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using Mapster;
|
using Mapster;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
using Microsoft.Extensions.Caching.Memory;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
@ -6,7 +6,7 @@ using Persistence.Database.Entity;
|
|||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
using Persistence.Models.Requests;
|
using Persistence.Models.Requests;
|
||||||
using Persistence.Repositories;
|
using Persistence.Repositories;
|
||||||
using Persistence.Repository.Extensions;
|
using UuidExtensions;
|
||||||
|
|
||||||
namespace Persistence.Repository.Repositories
|
namespace Persistence.Repository.Repositories
|
||||||
{
|
{
|
||||||
@ -15,7 +15,7 @@ namespace Persistence.Repository.Repositories
|
|||||||
private static readonly string SystemCacheKey = $"{typeof(Database.Entity.DrillingSystem).FullName}CacheKey";
|
private static readonly string SystemCacheKey = $"{typeof(Database.Entity.DrillingSystem).FullName}CacheKey";
|
||||||
private const int CacheExpirationInMinutes = 60;
|
private const int CacheExpirationInMinutes = 60;
|
||||||
private readonly IMemoryCache memoryCache;
|
private readonly IMemoryCache memoryCache;
|
||||||
private DbContext db;
|
private readonly DbContext db;
|
||||||
|
|
||||||
public TechMessagesRepository(DbContext db, IMemoryCache memoryCache)
|
public TechMessagesRepository(DbContext db, IMemoryCache memoryCache)
|
||||||
{
|
{
|
||||||
@ -32,10 +32,10 @@ namespace Persistence.Repository.Repositories
|
|||||||
var count = await query.CountAsync(token);
|
var count = await query.CountAsync(token);
|
||||||
|
|
||||||
var sort = request.SortSettings != string.Empty
|
var sort = request.SortSettings != string.Empty
|
||||||
? request.SortSettings
|
? request.SortSettings!
|
||||||
: nameof(TechMessage.Timestamp);
|
: nameof(TechMessage.Timestamp);
|
||||||
var entities = await query
|
var entities = await query
|
||||||
.SortBy(request.SortSettings!)
|
.SortBy(sort)
|
||||||
.Skip(request.Skip)
|
.Skip(request.Skip)
|
||||||
.Take(request.Take)
|
.Take(request.Take)
|
||||||
.ToArrayAsync(token);
|
.ToArrayAsync(token);
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
using Mapster;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using Persistence.Database.Model;
|
using Persistence.Database.Model;
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
|
|
||||||
@ -36,7 +34,7 @@ public class TimeSeriesDataCachedRepository<TEntity, TDto> : TimeSeriesDataRepos
|
|||||||
public override async Task<IEnumerable<TDto>> GetGtDate(DateTimeOffset dateBegin, CancellationToken token)
|
public override async Task<IEnumerable<TDto>> GetGtDate(DateTimeOffset dateBegin, CancellationToken token)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (LastData.Count() == 0 || LastData[0].Date > dateBegin)
|
if (LastData.Count == 0 || LastData[0].Date > dateBegin)
|
||||||
{
|
{
|
||||||
var dtos = await base.GetGtDate(dateBegin, token);
|
var dtos = await base.GetGtDate(dateBegin, token);
|
||||||
return dtos;
|
return dtos;
|
||||||
|
@ -9,7 +9,7 @@ public class TimeSeriesDataRepository<TEntity, TDto> : ITimeSeriesDataRepository
|
|||||||
where TEntity : class, ITimestampedData, new()
|
where TEntity : class, ITimestampedData, new()
|
||||||
where TDto : class, ITimeSeriesAbstractDto, new()
|
where TDto : class, ITimeSeriesAbstractDto, new()
|
||||||
{
|
{
|
||||||
private DbContext db;
|
private readonly DbContext db;
|
||||||
|
|
||||||
public TimeSeriesDataRepository(DbContext db)
|
public TimeSeriesDataRepository(DbContext db)
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
using Persistence.Models.Requests;
|
using Persistence.Models.Requests;
|
||||||
|
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace Persistence.API;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Интерфейс для API, предназначенного для работы с элементами справочников
|
|
||||||
/// </summary>
|
|
||||||
public interface IDictionaryElementApi<TDto> where TDto : class, new()
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Получить все данные справочника
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dictionaryKey">ключ справочника</param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<ActionResult<IEnumerable<TDto>>> Get(Guid dictionaryKey, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Добавить элемент в справочник
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dictionaryKey">ключ справочника</param>
|
|
||||||
/// <param name="dto"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<ActionResult<Guid>> Add(Guid dictionaryKey, TDto dto, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Изменить одну запись
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dictionaryKey">ключ справочника</param>
|
|
||||||
/// <param name="dictionaryElementKey">ключ элемента в справочнике</param>
|
|
||||||
/// <param name="dto"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<ActionResult<Guid>> Update(Guid dictionaryKey, Guid dictionaryElementKey, TDto dto, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Удалить одну запись
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dictionaryKey">ключ справочника</param>
|
|
||||||
/// <param name="dictionaryElementKey">ключ элемента в справочнике</param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<ActionResult<int>> Delete(Guid dictionaryKey, Guid dictionaryElementKey, CancellationToken token);
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Persistence.Models;
|
|
||||||
using Persistence.Models.Requests;
|
|
||||||
|
|
||||||
namespace Persistence.API;
|
|
||||||
|
|
||||||
/// Интерфейс для API, предназначенного для работы с табличными данными
|
|
||||||
public interface ITableDataApi<TDto, TRequest>
|
|
||||||
where TDto : class, new()
|
|
||||||
where TRequest : PaginationRequest
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Получить страницу списка объектов
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="request">параметры фильтрации</param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<ActionResult<PaginationContainer<TDto>>> GetPage(TRequest request, CancellationToken token);
|
|
||||||
}
|
|
@ -1,5 +1,4 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Persistence.Models;
|
|
||||||
|
|
||||||
namespace Persistence.API;
|
namespace Persistence.API;
|
||||||
|
|
||||||
|
@ -1,10 +1,5 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Persistence.API;
|
namespace Persistence.API;
|
||||||
|
|
||||||
|
@ -1,16 +1,11 @@
|
|||||||
using System;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Persistence;
|
namespace Persistence;
|
||||||
public static class EFExtensions
|
public static class EFExtensions
|
||||||
{
|
{
|
||||||
struct TypeAcessor
|
struct TypeAccessor
|
||||||
{
|
{
|
||||||
public LambdaExpression KeySelector { get; set; }
|
public LambdaExpression KeySelector { get; set; }
|
||||||
public MethodInfo OrderBy { get; set; }
|
public MethodInfo OrderBy { get; set; }
|
||||||
@ -25,7 +20,7 @@ public static class EFExtensions
|
|||||||
private static readonly MethodInfo methodThenBy = GetExtOrderMethod("ThenBy");
|
private static readonly MethodInfo methodThenBy = GetExtOrderMethod("ThenBy");
|
||||||
|
|
||||||
private static readonly MethodInfo methodThenByDescending = GetExtOrderMethod("ThenByDescending");
|
private static readonly MethodInfo methodThenByDescending = GetExtOrderMethod("ThenByDescending");
|
||||||
private static ConcurrentDictionary<Type, Dictionary<string, TypeAcessor>> TypePropSelectors { get; set; } = new();
|
private static ConcurrentDictionary<Type, Dictionary<string, TypeAccessor>> TypePropSelectors { get; set; } = new();
|
||||||
|
|
||||||
private static MethodInfo GetExtOrderMethod(string methodName)
|
private static MethodInfo GetExtOrderMethod(string methodName)
|
||||||
=> typeof(System.Linq.Queryable)
|
=> typeof(System.Linq.Queryable)
|
||||||
@ -35,17 +30,17 @@ public static class EFExtensions
|
|||||||
m.GetParameters().Length == 2 &&
|
m.GetParameters().Length == 2 &&
|
||||||
m.GetParameters()[1].ParameterType.IsAssignableTo(typeof(LambdaExpression)))
|
m.GetParameters()[1].ParameterType.IsAssignableTo(typeof(LambdaExpression)))
|
||||||
.Single();
|
.Single();
|
||||||
private static Dictionary<string, TypeAcessor> MakeTypeAcessors(Type type)
|
private static Dictionary<string, TypeAccessor> MakeTypeAccessors(Type type)
|
||||||
{
|
{
|
||||||
var propContainer = new Dictionary<string, TypeAcessor>();
|
var propContainer = new Dictionary<string, TypeAccessor>();
|
||||||
var properties = type.GetProperties();
|
var properties = type.GetProperties();
|
||||||
foreach (var propertyInfo in properties)
|
foreach (var propertyInfo in properties)
|
||||||
{
|
{
|
||||||
var name = propertyInfo.Name.ToLower();
|
var name = propertyInfo.Name.ToLower();
|
||||||
ParameterExpression arg = Expression.Parameter(type, "x");
|
ParameterExpression arg = Expression.Parameter(type, "x");
|
||||||
MemberExpression property = Expression.Property(arg, propertyInfo.Name);
|
MemberExpression property = Expression.Property(arg, propertyInfo.Name);
|
||||||
var selector = Expression.Lambda(property, new ParameterExpression[] { arg });
|
var selector = Expression.Lambda(property, [arg]);
|
||||||
var typeAccessor = new TypeAcessor
|
var typeAccessor = new TypeAccessor
|
||||||
{
|
{
|
||||||
KeySelector = selector,
|
KeySelector = selector,
|
||||||
OrderBy = methodOrderBy.MakeGenericMethod(type, propertyInfo.PropertyType),
|
OrderBy = methodOrderBy.MakeGenericMethod(type, propertyInfo.PropertyType),
|
||||||
@ -99,16 +94,16 @@ public static class EFExtensions
|
|||||||
string propertyName,
|
string propertyName,
|
||||||
bool isDesc)
|
bool isDesc)
|
||||||
{
|
{
|
||||||
var typePropSelector = TypePropSelectors.GetOrAdd(typeof(TSource), MakeTypeAcessors);
|
var typePropSelector = TypePropSelectors.GetOrAdd(typeof(TSource), MakeTypeAccessors);
|
||||||
var propertyNamelower = propertyName.ToLower();
|
var propertyNameLower = propertyName.ToLower();
|
||||||
var typeAccessor = typePropSelector[propertyNamelower];
|
var typeAccessor = typePropSelector[propertyNameLower];
|
||||||
|
|
||||||
var genericMethod = isDesc
|
var genericMethod = isDesc
|
||||||
? typeAccessor.OrderByDescending
|
? typeAccessor.OrderByDescending
|
||||||
: typeAccessor.OrderBy;
|
: typeAccessor.OrderBy;
|
||||||
|
|
||||||
var newQuery = (IOrderedQueryable<TSource>)genericMethod
|
var newQuery = (IOrderedQueryable<TSource>)genericMethod
|
||||||
.Invoke(genericMethod, new object[] { query, typeAccessor.KeySelector })!;
|
.Invoke(genericMethod, [query, typeAccessor.KeySelector])!;
|
||||||
return newQuery;
|
return newQuery;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using System.Text;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using System.Text;
|
||||||
|
|
||||||
namespace Persistence.Models.Configurations
|
namespace Persistence.Models.Configurations
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
using Persistence.Models;
|
namespace Persistence.Models;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
|
||||||
|
|
||||||
namespace Persistence.Repository.Data;
|
|
||||||
public class DataSaubDto : ITimeSeriesAbstractDto
|
public class DataSaubDto : ITimeSeriesAbstractDto
|
||||||
{
|
{
|
||||||
public DateTimeOffset Date { get; set; } = DateTimeOffset.UtcNow;
|
public DateTimeOffset Date { get; set; } = DateTimeOffset.UtcNow;
|
@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace Persistence.Models;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Persistence.Models;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Dto для хранения записей, содержащих начальную и конечную глубину забоя, а также секцию
|
/// Dto для хранения записей, содержащих начальную и конечную глубину забоя, а также секцию
|
||||||
|
@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace Persistence.Models;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Persistence.Models;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Диапазон дат
|
/// Диапазон дат
|
||||||
|
@ -11,7 +11,7 @@ public class PaginationContainer<T>
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public PaginationContainer()
|
public PaginationContainer()
|
||||||
{
|
{
|
||||||
Items = Enumerable.Empty<T>();
|
Items = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using Persistence.Models.Enumerations;
|
using Persistence.Models.Enumerations;
|
||||||
|
|
||||||
namespace Persistence.Models
|
namespace Persistence.Models
|
||||||
|
@ -1,63 +0,0 @@
|
|||||||
namespace Persistence.Models;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Модель, описывающая пользователя
|
|
||||||
/// </summary>
|
|
||||||
public class UserDto
|
|
||||||
{
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public int Id { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// логин
|
|
||||||
/// </summary>
|
|
||||||
public string Login { get; set; } = null!;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Имя
|
|
||||||
/// </summary>
|
|
||||||
public string? Name { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Фамилия
|
|
||||||
/// </summary>
|
|
||||||
public string? Surname { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Отчество
|
|
||||||
/// </summary>
|
|
||||||
public string? Patronymic { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Email
|
|
||||||
/// </summary>
|
|
||||||
public string Email { get; set; } = null!;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Phone
|
|
||||||
/// </summary>
|
|
||||||
public string? Phone { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Должность
|
|
||||||
/// </summary>
|
|
||||||
public string? Position { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Id компании
|
|
||||||
/// </summary>
|
|
||||||
public int IdCompany { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Id состояния пользователя
|
|
||||||
/// 0 - не активен,
|
|
||||||
/// 1 - активен,
|
|
||||||
/// 2 - заблокирован
|
|
||||||
/// </summary>
|
|
||||||
public short IdState { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Получение отображаемого имени
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
}
|
|
@ -1,6 +1,4 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
namespace Persistence.Models;
|
||||||
|
|
||||||
namespace Persistence.Models;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Группа параметров Wits
|
/// Группа параметров Wits
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Persistence.Models;
|
using Persistence.Models;
|
||||||
|
|
||||||
namespace Persistence.Repositories;
|
namespace Persistence.Repositories;
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
using Persistence.Models.Requests;
|
|
||||||
|
|
||||||
namespace Persistence.Repositories;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Интерфейс по работе с табличными данными
|
|
||||||
/// </summary>
|
|
||||||
public interface ITableDataRepository<TDto, TRequest>
|
|
||||||
where TDto : class, new()
|
|
||||||
where TRequest : PaginationRequest
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Получить страницу списка объектов
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="request">параметры фильтрации</param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<IEnumerable<TDto>> Get(TRequest request, CancellationToken token);
|
|
||||||
}
|
|
@ -1,6 +1,4 @@
|
|||||||
using Persistence.Models;
|
namespace Persistence.Repositories;
|
||||||
|
|
||||||
namespace Persistence.Repositories;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Интерфейс по работе с прореженными данными
|
/// Интерфейс по работе с прореженными данными
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
namespace Persistence.Services.Interfaces;
|
|
||||||
|
|
||||||
public interface ITimeSeriesDataObserverService
|
|
||||||
{
|
|
||||||
}
|
|
@ -1,4 +0,0 @@
|
|||||||
namespace Persistence.Services.Interfaces;
|
|
||||||
public abstract class TimeSeriesDataObserverService : ITimeSeriesDataObserverService
|
|
||||||
{
|
|
||||||
}
|
|
@ -1,12 +1,11 @@
|
|||||||
using System.Text.Json.Serialization;
|
using Persistence.Models;
|
||||||
using System.Text.Json;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Persistence.Models;
|
|
||||||
using Persistence.Repositories;
|
|
||||||
using Persistence.Services.Interfaces;
|
|
||||||
using Persistence.Models.Configurations;
|
using Persistence.Models.Configurations;
|
||||||
using Persistence.Models.Enumerations;
|
using Persistence.Models.Enumerations;
|
||||||
|
using Persistence.Repositories;
|
||||||
|
using Persistence.Services.Interfaces;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace Persistence.Services;
|
namespace Persistence.Services;
|
||||||
public class WitsDataService : IWitsDataService
|
public class WitsDataService : IWitsDataService
|
||||||
@ -49,7 +48,7 @@ public class WitsDataService : IWitsDataService
|
|||||||
int? ratio = null;
|
int? ratio = null;
|
||||||
if (intervalSec > 2 * approxPointsCount)
|
if (intervalSec > 2 * approxPointsCount)
|
||||||
{
|
{
|
||||||
ratio = (int) intervalSec / approxPointsCount;
|
ratio = (int)intervalSec / approxPointsCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
var dtos = await witsDataRepository.GetValuesForGraph(discriminatorId, dateFrom, dateTo, approxPointsCount, ratio, token);
|
var dtos = await witsDataRepository.GetValuesForGraph(discriminatorId, dateFrom, dateTo, approxPointsCount, ratio, token);
|
||||||
@ -130,7 +129,7 @@ public class WitsDataService : IWitsDataService
|
|||||||
var witsType = witsInfo.FirstOrDefault(e => e.ItemId == itemId
|
var witsType = witsInfo.FirstOrDefault(e => e.ItemId == itemId
|
||||||
&& e.RecordId == recordId)?.ValueType;
|
&& e.RecordId == recordId)?.ValueType;
|
||||||
|
|
||||||
switch(witsType)
|
switch (witsType)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
78
exclusion.dic
Normal file
78
exclusion.dic
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
appsettings
|
||||||
|
autohold
|
||||||
|
Autostart
|
||||||
|
dd
|
||||||
|
dtos
|
||||||
|
HH
|
||||||
|
Impl
|
||||||
|
MM
|
||||||
|
mmss
|
||||||
|
modbus
|
||||||
|
noload
|
||||||
|
Saub
|
||||||
|
Toolface
|
||||||
|
yyyy
|
||||||
|
Автоудержание
|
||||||
|
макрооперации
|
||||||
|
Макрооперация
|
||||||
|
расхаживаний
|
||||||
|
расхаживания
|
||||||
|
Соотв
|
||||||
|
Noload
|
||||||
|
updatables
|
||||||
|
штропа
|
||||||
|
страгивания
|
||||||
|
updatables
|
||||||
|
MM
|
||||||
|
dd
|
||||||
|
HH
|
||||||
|
mmss
|
||||||
|
sqlite
|
||||||
|
Serializer
|
||||||
|
Auth
|
||||||
|
Saub
|
||||||
|
lightgray
|
||||||
|
appsettings
|
||||||
|
AutoScale
|
||||||
|
Hmmss
|
||||||
|
pinger
|
||||||
|
Desc
|
||||||
|
qwertyuiopasdfghjklzxcvbnm
|
||||||
|
Deserialize
|
||||||
|
Deserializer
|
||||||
|
Deserializers
|
||||||
|
Impl
|
||||||
|
Protobuf
|
||||||
|
сериализацию
|
||||||
|
param
|
||||||
|
tcpclient
|
||||||
|
tcpserver
|
||||||
|
tcplistener
|
||||||
|
serialport
|
||||||
|
bigendianunicode
|
||||||
|
Middlewares
|
||||||
|
Referer
|
||||||
|
бекапов
|
||||||
|
Encoderless
|
||||||
|
Безэнкодерный
|
||||||
|
безэнкодерного
|
||||||
|
энкодеру
|
||||||
|
автоудержания
|
||||||
|
дифф
|
||||||
|
энкодера
|
||||||
|
Коэфф
|
||||||
|
Миним
|
||||||
|
Проворот
|
||||||
|
вспом
|
||||||
|
Extrem
|
||||||
|
выкл
|
||||||
|
minidisplay
|
||||||
|
oauth
|
||||||
|
sbin
|
||||||
|
прога
|
||||||
|
yyyyMMdd_HHmmssfff
|
||||||
|
Serializers
|
||||||
|
keycloak
|
||||||
|
Params
|
||||||
|
Mapster
|
||||||
|
dest
|
Loading…
Reference in New Issue
Block a user