< Summary

Class:SVETA.Api.CustomMiddleware.ExceptionMiddleware
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/CustomMiddleware/ExceptionMiddleware.cs
Covered lines:0
Uncovered lines:59
Coverable lines:59
Total lines:97
Line coverage:0% (0 of 59)
Covered branches:0
Total branches:22
Branch coverage:0% (0 of 22)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
InvokeAsync()0%0%
HandleExceptionAsync(...)0%0%

File(s)

/opt/dev/sveta_api_build/SVETA.Api/CustomMiddleware/ExceptionMiddleware.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Http;
 2using SVETA.Api.Data.DTO;
 3using SVETA.Api.Helpers.Authorize;
 4using System;
 5using System.Collections.Generic;
 6using System.Linq;
 7using System.Net;
 8using System.Threading.Tasks;
 9using Microsoft.Extensions.Hosting;
 10using Microsoft.Extensions.Logging;
 11using Serilog;
 12using WinSolutions.Sveta.Common;
 13using ILogger = Serilog.ILogger;
 14
 15namespace SVETA.Api.CustomMiddleware
 16{
 17    /// <summary>
 18    /// Перехватывает все исключения при вызове контроллеров и возвращает ошибку в едином формате ErrorDTO
 19    /// </summary>
 20    public class ExceptionMiddleware
 21    {
 22        private readonly RequestDelegate _next;
 23        private readonly IHostEnvironment env;
 24        private readonly ILogger<ExceptionMiddleware> _logger;
 25
 026        public ExceptionMiddleware(RequestDelegate next,
 027            ILogger<ExceptionMiddleware> logger,
 028            IHostEnvironment environment)
 029        {
 030            env = environment;
 031            _logger = logger;
 032            _next = next;
 033        }
 34
 35        public async Task InvokeAsync(HttpContext httpContext)
 036        {
 37            try
 038            {
 039                await _next(httpContext);
 040            }
 041            catch (Exception ex)
 042            {
 043                ex.Data["errorcode"] = $"{DateTime.UtcNow.Ticks}";
 044                _logger.LogError($"Код ошибки: {ex.Data["errorcode"]} {ex.Message} {ex.StackTrace}");
 045                await HandleExceptionAsync(httpContext, ex, env);
 046            }
 047        }
 48
 49        private static Task HandleExceptionAsync(HttpContext context, Exception exception, IHostEnvironment environment)
 050        {
 051            context.Response.ContentType = "application/json";
 52
 053            if (exception is ForbidException)
 054            {
 055                context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
 056            }
 057            else if(exception is KeyNotFoundException)
 058            {
 059                context.Response.StatusCode = (int)HttpStatusCode.NotFound;
 060            }
 061            else if(exception is ArgumentException)
 062            {
 063                context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
 064            }
 065            else if(exception is SvetaException)
 066            {
 067                context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
 068            }
 069            else if (exception is AuthorizationException)
 070            {
 071                context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
 072            }
 73            else
 074            {
 075                context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
 076            }
 77
 78            object dto;
 079            if (environment.EnvironmentName.Equals("prod", StringComparison.OrdinalIgnoreCase))
 080            {
 081                dto = new ErrorSimpleDto(exception.Message +$" (Код ошибки: {exception.Data["errorcode"]})"  )
 082                {
 083                    code = exception is SvetaException ? (exception as SvetaException).Code : 0
 084                };
 085            }
 86            else
 087            {
 088                dto = new ErrorDTO(exception)
 089                {
 090                    code = exception is SvetaException ? (exception as SvetaException).Code : 0
 091                };
 092            }
 93
 094            return context.Response.WriteAsync(dto.ToString());
 095        }
 96    }
 97}