diff --git a/AsbCloudWebApi/Extensions.cs b/AsbCloudWebApi/Extensions.cs new file mode 100644 index 00000000..489d6149 --- /dev/null +++ b/AsbCloudWebApi/Extensions.cs @@ -0,0 +1,125 @@ +using AsbCloudApp.Data.User; +using AsbCloudWebApi.Converters; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Security.Claims; +using AsbCloudApp.Data; +using AsbCloudApp.Requests.ParserOptions; +using AsbCloudWebApi.Controllers.Interfaces; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Mvc; + +public static class Extensions +{ + public static int? GetCompanyId(this ClaimsPrincipal user) + { + var claimIdCompany = user.FindFirst(nameof(UserDto.IdCompany)); + if (claimIdCompany is null) + return null; + + return int.TryParse(claimIdCompany.Value, out int uid) + ? uid + : null; + } + + public static int? GetUserId(this ClaimsPrincipal user) + { + var userId = user.FindFirst(nameof(UserDto.Id)); + if (userId is null) + return null; + + return int.TryParse(userId.Value, out int uid) + ? uid + : null; + } + + /// + /// + /// Returns BadRequest with ValidationProblemDetails as body + /// + /// + /// Используйте этот метод только если валидацию нельзя сделать через + /// атрибуты валидации или IValidatableObject модели. + /// + /// + /// + /// + /// + /// + public static BadRequestObjectResult ValidationBadRequest(this ControllerBase controller, string paramName, string error) + { + return MakeBadRequestObjectResult(paramName, error); + } + + private static BadRequestObjectResult MakeBadRequestObjectResult(string paramName, string error) + { + var errors = new Dictionary { + { paramName, new[]{ error } } + }; + var problem = new ValidationProblemDetails(errors); + var badRequestObject = new BadRequestObjectResult(problem); + return badRequestObject; + } + + /// + /// + /// Returns BadRequest with ValidationProblemDetails as body + /// + /// + /// Используйте этот метод только если валидацию нельзя сделать через + /// атрибуты валидации или IValidatableObject модели. + /// + /// + /// + /// + /// + public static BadRequestObjectResult ValidationBadRequest(this ControllerBase controller, IEnumerable validationResults) + { + var errors = validationResults + .SelectMany(e => e.MemberNames.Select(name => new { name, e.ErrorMessage })) + .GroupBy(e => e.name) + .ToDictionary(e => e.Key, e => e.Select(el => el.ErrorMessage ?? string.Empty).ToArray()); + + var problem = new ValidationProblemDetails(errors); + return controller.BadRequest(problem); + } + + public static MvcOptions UseDateOnlyTimeOnlyStringConverters(this MvcOptions options) + { + TypeDescriptor.AddAttributes(typeof(DateOnly), new TypeConverterAttribute(typeof(DateOnlyTypeConverter))); + return options; + } + + /// + /// Вызов парсера со стандартной валидацией входного файла + /// + /// + /// + /// + /// + /// + /// + public static ActionResult> ParseExcelFile( + this IControllerWithParser controller, + IFormFileCollection files, + TOptions options) + where TDto : class, IId + where TOptions : class, IParserOptionsRequest + { + if (files.Count < 1) + return MakeBadRequestObjectResult(nameof(files), "Нет файла"); + + var file = files[0]; + if (Path.GetExtension(file.FileName).ToLower() != ".xlsx") + return MakeBadRequestObjectResult(nameof(files), "Требуется .xlsx файл."); + + var stream = file.OpenReadStream(); + + return controller.Parse(stream, options); + } +} \ No newline at end of file diff --git a/AsbCloudWebApi/Extentions.cs b/AsbCloudWebApi/Extentions.cs deleted file mode 100644 index 5e46eef6..00000000 --- a/AsbCloudWebApi/Extentions.cs +++ /dev/null @@ -1,116 +0,0 @@ -using AsbCloudApp.Data.User; -using AsbCloudWebApi.Converters; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Security.Claims; -using AsbCloudApp.Data; -using AsbCloudApp.Exceptions; -using AsbCloudApp.Requests.ParserOptions; -using AsbCloudWebApi.Controllers.Interfaces; -using Microsoft.AspNetCore.Http; - -namespace Microsoft.AspNetCore.Mvc -{ - public static class Extentions - { - public static int? GetCompanyId(this ClaimsPrincipal user) - { - var claimIdCompany = user.FindFirst(nameof(UserDto.IdCompany)); - if (claimIdCompany is null) - return null; - - return int.TryParse(claimIdCompany.Value, out int uid) - ? uid - : null; - } - - public static int? GetUserId(this ClaimsPrincipal user) - { - var userId = user.FindFirst(nameof(UserDto.Id)); - if (userId is null) - return null; - - return int.TryParse(userId.Value, out int uid) - ? uid - : null; - } - - /// - /// - /// Returns BadRequest with ValidationProblemDetails as body - /// - /// - /// Используйте этот метод только если валидацию нельзя сделать через - /// атрибуты валидации или IValidatableObject модели. - /// - /// - /// - /// - /// - /// - public static BadRequestObjectResult ValidationBadRequest(this ControllerBase controller, string paramName, string error) - { - var errors = new Dictionary { - { paramName, new[]{ error } } - }; - var problem = new ValidationProblemDetails(errors); - return controller.BadRequest(problem); - } - - /// - /// - /// Returns BadRequest with ValidationProblemDetails as body - /// - /// - /// Используйте этот метод только если валидацию нельзя сделать через - /// атрибуты валидации или IValidatableObject модели. - /// - /// - /// - /// - /// - public static BadRequestObjectResult ValidationBadRequest(this ControllerBase controller, IEnumerable validationResults) - { - var errors = validationResults - .SelectMany(e => e.MemberNames.Select(name => new { name, e.ErrorMessage })) - .GroupBy(e => e.name) - .ToDictionary(e => e.Key, e => e.Select(el => el.ErrorMessage ?? string.Empty).ToArray()); - - var problem = new ValidationProblemDetails(errors); - return controller.BadRequest(problem); - } - - public static MvcOptions UseDateOnlyTimeOnlyStringConverters(this MvcOptions options) - { - TypeDescriptor.AddAttributes(typeof(DateOnly), new TypeConverterAttribute(typeof(DateOnlyTypeConverter))); - return options; - } - - public static ActionResult> ParseExcelFile( - this IControllerWithParser controller, - IFormFileCollection files, - TOptions options) - where TDto : class, IId - where TOptions : class, IParserOptionsRequest - { - using var file = GetExcelFile(files); - return controller.Parse(file, options); - } - - private static Stream GetExcelFile(IFormFileCollection files) - { - if (files.Count < 1) - throw new ArgumentInvalidException(nameof(files), "Нет файла"); - - var file = files[0]; - if (Path.GetExtension(file.FileName).ToLower() != ".xlsx") - throw new ArgumentInvalidException(nameof(files), "Требуется .xlsx файл."); - - return file.OpenReadStream(); - } - } -} \ No newline at end of file