From 31283922127954695af528c57a8aaeebdd94154f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 17 Nov 2023 11:19:04 +0500 Subject: [PATCH 1/4] =?UTF-8?q?=D0=98=D0=BC=D0=BF=D0=BE=D1=80=D1=82=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Поправлен шаблон. В словарях секций и операций убраны пустые строки 2. Рефакторинг контроллера и сервисов. После успешного импорта операций операции в базе не сохраняются, а возвращаются списком, который отдаётся пользователю. Разделены методы вставки операций в API --- .../IWellOperationImportService.cs | 8 +- .../Files/WellOperationImportTemplate.xlsx | Bin 62838 -> 97455 bytes .../WellOperationImportService.cs | 31 +-- .../Controllers/WellOperationController.cs | 248 ++++++++++-------- 4 files changed, 150 insertions(+), 137 deletions(-) diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs index 54e813d8..f65d8888 100644 --- a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs +++ b/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs @@ -1,5 +1,5 @@ -using System.Threading; -using System.Threading.Tasks; +using System.Collections.Generic; +using AsbCloudApp.Data; using AsbCloudApp.Data.WellOperationImport; namespace AsbCloudApp.Services.WellOperationImport; @@ -16,7 +16,5 @@ public interface IWellOperationImportService /// /// /// - /// - /// - Task ImportAsync(int idWell, int idUser, int idType, SheetDto sheet, bool deleteBeforeImport, CancellationToken cancellationToken); + IEnumerable Import(int idWell, int idUser, int idType, SheetDto sheet); } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Files/WellOperationImportTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperationImport/Files/WellOperationImportTemplate.xlsx index 686f6f861af07242b0fecb124416c9b240ca097a..1e89ad3105c0e3b91c194081c382aafda1fe7386 100644 GIT binary patch literal 97455 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

Ut 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 literal 62838 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 z ze|gY9K0b6*@OkU`dCh-@jnF|K%}oD4T2#WQALEY-VOND+{h)u>2^a9YUBK??%tn_{ zp=PHvFl*+(=SN|Zq2Rbw!!gi?QkS2{fKR79TC6|hFYo>5r%R0pK5sogt$@mT#kuaI zbkN5#(;xCG5nlVpxc7x!6?XN5{^ccH!2hZRJc)SBFv9=VCf>cXCG3K*3qr!@qha%2wVfvqkD0uK?B{Xd(=f?B;Dzyl@b1l7^LD0R z9=o|Q>ZIgrgyf0Sci>aNcTM96sRkj{@Rq{U`SHfimaq%LF8sR)pTXgp zntMkpZqF|4G>upglJ?b(4F{i`!p%Ii(KXE|UV(o8^EMGRrh2EF&+)X>If8Yyr;Tcf zf-PIm2$oEDtc+FvP4?#2jNhQFfqe2n@2r@wu*IeMMNtSXY7iJ(c5-{}^D@e9gMLXlL2kqP*&@kAGbo2&tI~z<5Aag?MPxl*J1I!dIm2y?8Y=OXY|9 z6=_ffdS86c`=0j+5Ql`9{I5eH{v8yRaA61+hETqlGzsosz5TM(0_DzDOxttw!I~^A z29y%o>PF38bDi_E={h7=93S!aI9NQ1ask}7(o)*P0i9FVn)DcIfT(9H<%PTYL=;_A<@_p|SOd!)O*U$C#|hhg>| zK?AS0;ats8Q;YVFs2?4J_S_NF&a2t;qqn7Fvv`5j)pnrOT=QD3IWX+LS`!th_bL6C zWi{pK<9q6sWld?xhm&Kym694t9EJuS4$M}!DpSartC6&^i&rS#&MIVd^LPG?%C3nn zGp%SWwCgFGQ_)E8-jJj0*)w0#!dqp#Ml3Q%BmA*cT8&%3p~dhVc4N!>y0$vyKk9aO zb_ZFoS2ySQeN&Xo;yaynvNCtv^;5Q)wfAzFxr+01GP^GxYAC4VD&OS<+gfeBEgn;M zM0xwY=9;H1PTp7h+&W7fE_*B&bDSUZ`A*l{$wAE($)%iq3I*GSdkS5KTz(gH2rfk< zQ8m9ktIa4VWMs(PG$|-mpR3v5mgm`3!m4^yAG#^DVUVT6OK-``D<~`tD|ixI>ltl@ zK4uqGUH?|?wvxahbxuioVV%Q&!&H;ADh4%c+dS-4?%b1A(6myISr)9QxNpAZsSWik zRz>w-7OO;FZQ5P$ZwI1`54GGWuiFTv_A!# z=bul|ma0`Xq2T#s(Y?LOXxGeLm&S@9Rvn zv2k%$8u_qdyej$pG%dw6Wa|gYj6n;%iA}~e_tOXD???x gDlcxlm#c`g#;r2e(*NLLWJ&Oc4cd6U6aMS}09+?fEdT%j diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs index 9da293c6..bf551edc 100644 --- a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs @@ -2,12 +2,9 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Threading; -using System.Threading.Tasks; using AsbCloudApp.Data; using AsbCloudApp.Data.WellOperationImport; using AsbCloudApp.Repositories; -using AsbCloudApp.Requests; using AsbCloudApp.Services.WellOperationImport; namespace AsbCloudInfrastructure.Services.WellOperationImport; @@ -25,14 +22,14 @@ public class WellOperationImportService : IWellOperationImportService this.wellOperationRepository = wellOperationRepository; } - public async Task ImportAsync(int idWell, int idUser, int idType, SheetDto sheet, bool deleteBeforeImport, CancellationToken cancellationToken) + public IEnumerable Import(int idWell, int idUser, int idType, SheetDto sheet) { var validationErrors = new List(); var sections = wellOperationRepository.GetSectionTypes(); var categories = wellOperationRepository.GetCategories(false); - var operations = new List(); + var wellOperations = new List(); foreach (var row in sheet.Rows) { @@ -62,14 +59,14 @@ public class WellOperationImportService : IWellOperationImportService throw new FileFormatException( $"Лист '{sheet.Name}'. Строка '{row.Number}' неправильно получена дата начала операции"); - if (operations.LastOrDefault()?.DateStart > row.Date) + if (wellOperations.LastOrDefault()?.DateStart > row.Date) throw new FileFormatException( $"Лист '{sheet.Name}' строка '{row.Number}' дата позднее даты предыдущей операции"); if (row.Duration is not (>= 0d and <= 240d)) throw new FileFormatException($"Лист '{sheet.Name}'. Строка '{row.Number}' некорректная длительность операции"); - operations.Add(new WellOperationDto + wellOperations.Add(new WellOperationDto { IdWell = idWell, IdUser = idUser, @@ -89,26 +86,12 @@ public class WellOperationImportService : IWellOperationImportService } } - if (operations.Any() && operations.Min(o => o.DateStart) - operations.Max(o => o.DateStart) > drillingDurationLimitMax) + if (wellOperations.Any() && wellOperations.Min(o => o.DateStart) - wellOperations.Max(o => o.DateStart) > drillingDurationLimitMax) validationErrors.Add($"Лист {sheet.Name} содержит диапазон дат больше {drillingDurationLimitMax}"); if (validationErrors.Any()) throw new FileFormatException(string.Join("\r\n", validationErrors)); - - if (!operations.Any()) - return; - - if (deleteBeforeImport) - { - var existingOperations = await wellOperationRepository.GetAsync(new WellOperationRequest - { - IdWell = idWell, - OperationType = idType - }, cancellationToken); - - await wellOperationRepository.DeleteAsync(existingOperations.Select(o => o.Id), cancellationToken); - } - - await wellOperationRepository.InsertRangeAsync(operations, cancellationToken); + + return wellOperations; } } \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index 54270f49..45db3f0e 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -9,8 +9,10 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.IO; +using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperationImport; using AsbCloudApp.Services.WellOperationImport; using AsbCloudApp.Data.WellOperationImport.Options; using AsbCloudApp.Exceptions; @@ -204,37 +206,87 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } + ///

+ /// Добавляет новую операцию на скважину + /// + /// Id скважины + /// Тип добавляемой операции + /// Добавляемая операция + /// + /// Количество добавленных в БД записей + [HttpPost("{idType:int}")] + [Permission] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + public async Task InsertAsync( + [Range(1, int.MaxValue, ErrorMessage = "Id скважины не может быть меньше 1")] int idWell, + [Range(0, 1, ErrorMessage = "Тип операции недопустим. Допустимые: 0, 1")] int idType, + WellOperationDto wellOperation, + CancellationToken cancellationToken) + { + if (!await CanUserAccessToWellAsync(idWell, cancellationToken)) + return Forbid(); + + if (!await CanUserEditWellOperationsAsync(idWell, cancellationToken)) + return Forbid(); + + wellOperation.IdWell = idWell; + wellOperation.LastUpdateDate = DateTimeOffset.UtcNow; + wellOperation.IdUser = User.GetUserId(); + wellOperation.IdType = idType; + + var result = await operationRepository.InsertRangeAsync(new[] { wellOperation }, cancellationToken); + + return Ok(result); + } + /// /// Добавляет новые операции на скважине /// - /// id скважины - /// Данные о добавляемых операциях - /// Токен отмены задачи - /// Количество добавленных в БД строк - [HttpPost] + /// Id скважины + /// Добавляемые операции + /// Тип добавляемых операций + /// Удалить операции перед сохранением + /// + /// Количество добавленных в БД записей + [HttpPost("{idType:int}/{deleteBeforeInsert:bool}")] [Permission] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] public async Task InsertRangeAsync( - [Range(1, int.MaxValue, ErrorMessage = "Id скважины не может быть меньше 1")] int idWell, - [FromBody] IEnumerable values, - CancellationToken token) + [Range(1, int.MaxValue, ErrorMessage = "Id скважины не может быть меньше 1")] int idWell, + [Range(0, 1, ErrorMessage = "Тип операции недопустим. Допустимые: 0, 1")] int idType, + bool deleteBeforeInsert, + [FromBody] IEnumerable wellOperations, + CancellationToken cancellationToken) { - if (!await CanUserAccessToWellAsync(idWell, token)) - return Forbid(); - - if (!await CanUserEditWellOperationsAsync(idWell, token)) + if (!await CanUserAccessToWellAsync(idWell, cancellationToken)) return Forbid(); - foreach (var value in values) + if (!await CanUserEditWellOperationsAsync(idWell, cancellationToken)) + return Forbid(); + + if (deleteBeforeInsert && wellOperations.Any()) { - value.IdWell = idWell; - value.LastUpdateDate = DateTimeOffset.UtcNow; - value.IdUser = User.GetUserId(); + var existingOperations = await operationRepository.GetAsync(new WellOperationRequest + { + IdWell = idWell, + OperationType = idType + }, cancellationToken); + + await operationRepository.DeleteAsync(existingOperations.Select(o => o.Id), cancellationToken); + } + + foreach (var wellOperation in wellOperations) + { + wellOperation.IdWell = idWell; + wellOperation.LastUpdateDate = DateTimeOffset.UtcNow; + wellOperation.IdUser = User.GetUserId(); + wellOperation.IdType = idType; } - var result = await operationRepository.InsertRangeAsync(values, token) - .ConfigureAwait(false); - + var result = await operationRepository.InsertRangeAsync(wellOperations, cancellationToken); + return Ok(result); } @@ -299,46 +351,19 @@ namespace AsbCloudWebApi.Controllers /// id скважины /// Параметры для парсинга файла /// Коллекция из одного файла xlsx - /// Удалить операции перед импортом = 1, если файл валидный - /// + /// /// - [HttpPost("import/default/{deleteBeforeImport}")] + [HttpPost("import/default")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status204NoContent)] [Permission] - public async Task ImportDefaultExcelFileAsync(int idWell, + public Task ImportDefaultExcelFileAsync(int idWell, [FromQuery] WellOperationImportDefaultOptionsDto options, [FromForm] IFormFileCollection files, - [Range(0, 1, ErrorMessage = "Недопустимое значение. Допустимые: 0, 1")] int deleteBeforeImport, - CancellationToken token) - { - var idUser = User.GetUserId(); - - if (!idUser.HasValue) - throw new ForbidException("Неизвестный пользователь"); - - await AssertUserHasAccessToImportWellOperationsAsync(idWell, token); - - if (files.Count < 1) - return this.ValidationBadRequest(nameof(files), "Нет файла"); - - var file = files[0]; - if (Path.GetExtension(file.FileName).ToLower() != ".xlsx") - return this.ValidationBadRequest(nameof(files), "Требуется xlsx файл."); - - using Stream stream = file.OpenReadStream(); - - try - { - var sheet = wellOperationDefaultExcelParser.Parse(stream, options); - - await wellOperationImportService.ImportAsync(idWell, idUser.Value, options.IdType, sheet, (deleteBeforeImport & 1) > 0, token); - } - catch (FileFormatException ex) - { - return this.ValidationBadRequest(nameof(files), ex.Message); - } - - return Ok(); - } + CancellationToken cancellationToken) => ImportExcelFileAsync(idWell, files, options, + (stream, _) => wellOperationDefaultExcelParser.Parse(stream, options), + cancellationToken); /// /// Импорт операций из excel (xlsx) файла. ГПНХ (Хантос) @@ -346,46 +371,19 @@ namespace AsbCloudWebApi.Controllers /// id скважины /// Параметры для парсинга файла /// Коллекция из одного файла xlsx - /// Удалить операции перед импортом = 1, если файл валидный - /// + /// /// - [HttpPost("import/gazpromKhantos/{deleteBeforeImport}")] + [HttpPost("import/gazpromKhantos")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status204NoContent)] [Permission] - public async Task ImportGazpromKhantosExcelFileAsync(int idWell, - [FromQuery] WellOperationImportGazpromKhantosOptionsDto options, - [FromForm] IFormFileCollection files, - [Range(0, 1, ErrorMessage = "Недопустимое значение. Допустимые: 0, 1")] int deleteBeforeImport, - CancellationToken token) - { - var idUser = User.GetUserId(); - - if (!idUser.HasValue) - throw new ForbidException("Неизвестный пользователь"); - - await AssertUserHasAccessToImportWellOperationsAsync(idWell, token); - - if (files.Count < 1) - return this.ValidationBadRequest(nameof(files), "Нет файла"); - - var file = files[0]; - if (Path.GetExtension(file.FileName).ToLower() != ".xlsx") - return this.ValidationBadRequest(nameof(files), "Требуется xlsx файл."); - - using Stream stream = file.OpenReadStream(); - - try - { - var sheet = wellOperationGazpromKhantosExcelParser.Parse(stream, options); - - await wellOperationImportService.ImportAsync(idWell, idUser.Value, options.IdType, sheet, (deleteBeforeImport & 1) > 0, token); - } - catch (FileFormatException ex) - { - return this.ValidationBadRequest(nameof(files), ex.Message); - } - - return Ok(); - } + public Task ImportGazpromKhantosExcelFileAsync(int idWell, + [FromQuery] WellOperationImportGazpromKhantosOptionsDto options, + [FromForm] IFormFileCollection files, + CancellationToken cancellationToken) => ImportExcelFileAsync(idWell, files, options, + (stream, _) => wellOperationGazpromKhantosExcelParser.Parse(stream, options), + cancellationToken); /// /// Создает excel файл с операциями по скважине @@ -453,7 +451,11 @@ namespace AsbCloudWebApi.Controllers return File(stream, "application/octet-stream", fileName); } - private async Task AssertUserHasAccessToImportWellOperationsAsync(int idWell, CancellationToken token) + private async Task ImportExcelFileAsync(int idWell, [FromForm] IFormFileCollection files, + TOptions options, + Func parseMethod, + CancellationToken cancellationToken) + where TOptions : IWellOperationImportOptions { var idCompany = User.GetCompanyId(); var idUser = User.GetUserId(); @@ -461,16 +463,54 @@ namespace AsbCloudWebApi.Controllers if (!idCompany.HasValue || !idUser.HasValue) throw new ForbidException("Неизвестный пользователь"); - if (!await CanUserAccessToWellAsync(idWell, token)) + if (!await CanUserAccessToWellAsync(idWell, cancellationToken)) throw new ForbidException("Нет доступа к скважине"); - if (!await CanUserEditWellOperationsAsync(idWell, token)) + if (!await CanUserEditWellOperationsAsync(idWell, cancellationToken)) throw new ForbidException("Недостаточно прав для редактирования ГГД на завершенной скважине"); - if (!await wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, token)) + if (!await wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, cancellationToken)) throw new ForbidException("Скважина недоступна для компании"); - } + if (files.Count < 1) + return this.ValidationBadRequest(nameof(files), "Нет файла"); + + var file = files[0]; + if (Path.GetExtension(file.FileName).ToLower() != ".xlsx") + return this.ValidationBadRequest(nameof(files), "Требуется xlsx файл."); + + using Stream stream = file.OpenReadStream(); + + try + { + var sheet = parseMethod(stream, options); + + var wellOperations = wellOperationImportService.Import(idWell, idUser.Value, options.IdType, sheet) + .OrderBy(w => w.DateStart); + + var dateStart = wellOperations.Min(w => w.DateStart); + + foreach (var wellOperation in wellOperations) + wellOperation.Day = (wellOperation.DateStart - dateStart).TotalDays; + + if (!wellOperations.Any()) + return NoContent(); + + return Ok(wellOperations); + } + catch (FileFormatException ex) + { + return this.ValidationBadRequest(nameof(files), ex.Message); + } + } + + private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token) + { + int? idCompany = User.GetCompanyId(); + return idCompany is not null && await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, + idWell, token).ConfigureAwait(false); + } + private async Task CanUserEditWellOperationsAsync(int idWell, CancellationToken token) { var idUser = User.GetUserId(); @@ -485,13 +525,5 @@ namespace AsbCloudWebApi.Controllers return well.IdState != 2 || userRepository.HasPermission(idUser.Value, "WellOperation.editCompletedWell"); } - - private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token) - { - int? idCompany = User.GetCompanyId(); - return idCompany is not null && await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, - idWell, token).ConfigureAwait(false); - } } - -} +} \ No newline at end of file From 05181998b7a75ae7642e1d50372dd1ec80b8ee19 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 1 Dec 2023 11:25:52 +0500 Subject: [PATCH 2/4] fix test --- .../UnitTests/Services/DailyReportServiceTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs b/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs index 8202a95f..95008c7a 100644 --- a/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs +++ b/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs @@ -254,7 +254,7 @@ public class DailyReportServiceTest wellServiceMock.GetOrDefaultAsync(Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(fakeWell); - trajectoryFactNnbRepositoryMock.GetAsync(Arg.Any(), Arg.Any()) + trajectoryFactNnbRepositoryMock.GetByRequestAsync(Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(new[] { fakeLastFactTrajectory }); wellOperationRepositoryMock.GetAsync(Arg.Any(), Arg.Any()) From 7436cfd11a57d8fba2ef518fda1d21f6cce0f0f6 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 1 Dec 2023 16:26:18 +0500 Subject: [PATCH 3/4] MockController Add method testing sirnalR --- AsbCloudWebApi/Controllers/MockController.cs | 159 ++++++++++++------- 1 file changed, 103 insertions(+), 56 deletions(-) diff --git a/AsbCloudWebApi/Controllers/MockController.cs b/AsbCloudWebApi/Controllers/MockController.cs index 0c95725e..4cec7ce2 100644 --- a/AsbCloudWebApi/Controllers/MockController.cs +++ b/AsbCloudWebApi/Controllers/MockController.cs @@ -1,72 +1,119 @@ -using Microsoft.AspNetCore.Mvc; +using AsbCloudApp.Exceptions; +using AsbCloudWebApi.SignalR; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.DependencyInjection; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; +using System.Threading; +using System.Threading.Tasks; -namespace AsbCloudWebApi.Controllers +namespace AsbCloudWebApi.Controllers; + +/// +/// Имитирует разные типы ответа сервера +/// +[Route("api/[controller]")] +[ApiController] +public class MockController : ControllerBase { - /// - /// Имитирует разные типы ответа сервера - /// - [Route("api/[controller]")] - [ApiController] - public class MockController : ControllerBase + private readonly IServiceProvider provider; + + public MockController(IServiceProvider provider) { - /// - /// имитирует http-400 - /// - [HttpGet("400")] - [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] - public IActionResult Get400([FromQuery, Required]IDictionary args) + this.provider = provider; + } + + /// + /// имитирует http-400 + /// + [HttpGet("400")] + [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] + public IActionResult Get400([FromQuery, Required]IDictionary args) + { + var errors = new Dictionary(); + + foreach (var arg in args) { - var errors = new Dictionary(); - - foreach (var arg in args) - { - var countOfErrors = ((arg.Key + arg.Value).Length % 3) + 1; - var errorsText = Enumerable.Range(0, countOfErrors) - .Select(i => $"{arg.Value} не соответствует критериям проверки № {i}"); + var countOfErrors = ((arg.Key + arg.Value).Length % 3) + 1; + var errorsText = Enumerable.Range(0, countOfErrors) + .Select(i => $"{arg.Value} не соответствует критериям проверки № {i}"); - errors.Add(arg.Key, errorsText.ToArray()); - } - - if (errors.Any()) - { - var problem = new ValidationProblemDetails(errors); - return BadRequest(problem); - } - else - { - var problem = new ValidationProblemDetails { Detail = "at least one argument must be provided" }; - return BadRequest(problem); - } + errors.Add(arg.Key, errorsText.ToArray()); } - /// - /// имитирует http-403 - /// - [HttpGet("403")] - public IActionResult Get403() + if (errors.Any()) { - return Forbid(); + var problem = new ValidationProblemDetails(errors); + return BadRequest(problem); } - - /// - /// имитирует http-401 - /// - [HttpGet("401")] - public IActionResult Get401() + else { - return Unauthorized(); - } - - /// - /// имитирует http-500 - /// - [HttpGet("500")] - public IActionResult Get500() - { - throw new System.Exception("Это тестовое исключение"); + var problem = new ValidationProblemDetails { Detail = "at least one argument must be provided" }; + return BadRequest(problem); } } + + /// + /// имитирует http-403 + /// + [HttpGet("403")] + public IActionResult Get403() + { + return Forbid(); + } + + /// + /// имитирует http-401 + /// + [HttpGet("401")] + public IActionResult Get401() + { + return Unauthorized(); + } + + /// + /// имитирует http-500 + /// + [HttpGet("500")] + public IActionResult Get500() + { + throw new System.Exception("Это тестовое исключение"); + } + + /// + /// имитация отправки SignalR данных + /// + /// + /// + /// + /// Поддерживаемые hubЫ: wellInfo, notifications, telemetry, reports + /// + /// Название вызываемого на клиенте метода. Прим.:"ReceiveDataSaub". Список методов см. в swagger definition signalr + /// Группа пользователей. Прим.: "well_1". Если не задана - все пользователи. Шаблон формирования групп см. описание методов в swagger definition signalr + /// передаваемая нагрузка. (json) + /// + /// + [HttpPost("signalr/hubs/{hubName}/{methodName}/{groupName}")] + [Authorize] + public async Task PostAsync(string hubName, string methodName, string? groupName, object body, CancellationToken token) + { + IHubClients clients = hubName.ToLower() switch { + "wellinfo" => provider.GetRequiredService>().Clients, + "notifications" => provider.GetRequiredService>().Clients, + "telemetry" => provider.GetRequiredService>().Clients, + "reports" => provider.GetRequiredService>().Clients, + _ => throw new ArgumentInvalidException(nameof(hubName), "hubName does not listed"), + }; + + IClientProxy selectedClients = string.IsNullOrEmpty(groupName) + ? clients.All + : clients.Group(groupName); + + await selectedClients.SendAsync(methodName, body, token); + return Ok(); + } } From e8bbff2d3c9c0f9b493ebcceaa8b3074e44c3f54 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 1 Dec 2023 17:41:39 +0500 Subject: [PATCH 4/4] fix doc --- AsbCloudDb/Setup db replication.md | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/AsbCloudDb/Setup db replication.md b/AsbCloudDb/Setup db replication.md index 91c64792..4c5fe184 100644 --- a/AsbCloudDb/Setup db replication.md +++ b/AsbCloudDb/Setup db replication.md @@ -113,17 +113,12 @@ sudo -u postgres psql SELECT * FROM pg_stat_replication; ``` - 7. Для включения синхронного режима необходимо выполнить следующую команду - ``` - ALTER SYSTEM SET synchronous_standby_names TO '*'; - ``` + 7. Сделать рестарт primary-сервера. - 8. Сделать рестарт primary-сервера. - - 9. Внести запись в любую таблицу базы данных primary-сервера - 10. Убедиться, что соответствующая запись появилась в таблице базы данных standby-сервера - 11. Попытаться внести запись в таблицу базы данных standby-сервера. - 12. Убедиться, что операция завершилась с ошибкой + 8. Внести запись в любую таблицу базы данных primary-сервера + 9. Убедиться, что соответствующая запись появилась в таблице базы данных standby-сервера + 10. Попытаться внести запись в таблицу базы данных standby-сервера. + 11. Убедиться, что операция завершилась с ошибкой > cannot execute OPERATION in a read-only transaction