Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
41f2dd3
[SN-48] Добавлена начальная конфигурация для Serilog
c23p1 Feb 21, 2025
3d0274e
Merge remote-tracking branch 'origin/master' into features/add-logging
c23p1 Aug 24, 2025
70e9811
Исправлены последствия слияния с main
c23p1 Aug 24, 2025
b9a5e45
Исправлена конфигурация Serilog
c23p1 Aug 25, 2025
79f1fd3
Merge branch 'develop' into features/add-logging
c23p1 Sep 6, 2025
ad9fe8b
[SN-48] Добавлены логи для обработчиков исключений
c23p1 Sep 7, 2025
8ec48de
[SN-48] Добавлены логи для обработчиков исключений проекта Admin.API
c23p1 Sep 7, 2025
aaccc5a
[SN-48] Добавлены логи для методов расширения ResponseCookiesExtensions
c23p1 Sep 8, 2025
a7de6f4
[SN-48] Добавлены логи для сервисов прикладного слоя
c23p1 Sep 8, 2025
6c8aacd
[SN-48] Добавлены логи для сервисов инфраструктурного слоя
c23p1 Sep 9, 2025
7d18b7e
Merge branch 'develop' into features/add-logging
c23p1 Sep 9, 2025
60a14e5
Изменены параметры сервера для Scalar
c23p1 Sep 9, 2025
6ec2c0c
[SN-48] Незначительные изменения логов
c23p1 Sep 9, 2025
02d21fd
[SN-48] Изменено расположение файлов логов для проектов Platform.API …
c23p1 Sep 9, 2025
ce32051
[SN-48] Удалена лишняя версия пакета Scalar.AspNetCore
c23p1 Sep 9, 2025
56a75c3
[SN-48] Незначительное изменение
c23p1 Sep 9, 2025
13c3107
Merge branch 'develop' into features/add-logging
c23p1 Sep 9, 2025
2001fd4
Merge remote-tracking branch 'origin/features/add-logging' into featu…
c23p1 Sep 9, 2025
1e2db35
[SN-48] Незначительные изменения
c23p1 Sep 9, 2025
fbadf7c
[SN-48] Добавлено логгирование для проекта Admin.API
c23p1 Sep 9, 2025
a5cf38a
[SN-48] Внесено незначительное изменение
c23p1 Sep 9, 2025
32a7b8c
Merge pull request #67 from C23-RTU/features/add-logging
c23p1 Sep 9, 2025
9213e59
Merge branch 'master' into develop
c23p1 Sep 13, 2025
795a5c4
Исправлен адрес сервера панели администрирования
c23p1 Sep 13, 2025
1457f35
[SN-142]
jbkkkkk Sep 21, 2025
fa8c11f
Merge branch 'master' into develop
c23p1 Sep 23, 2025
d7043cb
[SN-148] Добавлена возможность загрузки изображений при создании поста
c23p1 Sep 23, 2025
b82b793
Merge pull request #69 from C23-RTU/features/add-image-loading-for-posts
c23p1 Sep 23, 2025
10ea7bf
[SN-142]
jbkkkkk Sep 24, 2025
2e58dbb
[SN-142]
jbkkkkk Sep 24, 2025
896db6e
[SN-149]
jbkkkkk Sep 24, 2025
dbb6367
Merge pull request #70 from C23-RTU/features/add-image-paths-to-clubc…
c23p1 Sep 24, 2025
65cd336
[SN-142]
jbkkkkk Sep 24, 2025
3120bdc
[SN-142]
jbkkkkk Sep 25, 2025
8eab59f
Merge pull request #68 from C23-RTU/features/add-reports
c23p1 Sep 25, 2025
1eabc31
[SN-127] Добавлены начальные файлы тестов
c23p1 Oct 17, 2025
af787ab
Добавлен тест метода Create сервиса ClubCreationRequestsService
c23p1 Oct 18, 2025
ca9c0ef
Добавлен запуск тестов в CI
c23p1 Oct 18, 2025
af5db25
Добавлен тест метода AcceptRequest сервиса ClubCreationRequestsService
jbkkkkk Oct 18, 2025
87dcdee
Внесены незначительные изменения
c23p1 Nov 25, 2025
2bceb46
Merge remote-tracking branch 'origin/test/add-tests' into test/add-tests
c23p1 Nov 25, 2025
3513e4a
Merge pull request #71 from C23-RTU/test/add-tests
c23p1 Nov 25, 2025
a65c2b3
Исправлено логгирование исключений панели администрирования
c23p1 Nov 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,5 @@ jobs:
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Test
run: dotnet test --no-build
6 changes: 6 additions & 0 deletions StudHub.Server.sln
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Platform.API", "src\Platfor
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Admin.API", "src\Admin.API\Admin.API.csproj", "{781F6E4E-FC3B-46E4-895A-F27A4310CF42}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unit", "test\Unit\Unit.csproj", "{3558A138-C00A-4857-93E5-3ECCB5CD873C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -36,5 +38,9 @@ Global
{781F6E4E-FC3B-46E4-895A-F27A4310CF42}.Debug|Any CPU.Build.0 = Debug|Any CPU
{781F6E4E-FC3B-46E4-895A-F27A4310CF42}.Release|Any CPU.ActiveCfg = Release|Any CPU
{781F6E4E-FC3B-46E4-895A-F27A4310CF42}.Release|Any CPU.Build.0 = Release|Any CPU
{3558A138-C00A-4857-93E5-3ECCB5CD873C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3558A138-C00A-4857-93E5-3ECCB5CD873C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3558A138-C00A-4857-93E5-3ECCB5CD873C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3558A138-C00A-4857-93E5-3ECCB5CD873C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
1 change: 1 addition & 0 deletions src/Admin.API/Admin.API.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.12" />
<PackageReference Include="NSwag.AspNetCore" Version="14.4.0" />
<PackageReference Include="Scalar.AspNetCore" Version="2.6.9" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
</ItemGroup>

</Project>
49 changes: 49 additions & 0 deletions src/Admin.API/Controllers/ReportController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Application;
using Application.DTO;
using Application.Interfaces.Queries;
using Application.Interfaces.Services;
using Domain.Entities.Admin;

namespace Admin.API.Controllers;

[Authorize]
[ApiController]
[Route("reports")]
public class ReportController : ControllerBase
{
private readonly IReportsService _reportsService;
private readonly IReportsQueryService _reportsQueryService;

public ReportController(IReportsService reportsService, IReportsQueryService reportsQueryService)
{
_reportsService = reportsService;
_reportsQueryService = reportsQueryService;
}

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> Create(ReportDTO reportDTO)
{
await _reportsService.CreateReport(reportDTO);
return new StatusCodeResult(StatusCodes.Status201Created);
}

[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult<ICollection<Report>>> GetAll() => Ok(await _reportsQueryService.GetAllAsync());

[HttpGet("{id:int}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<ReportDTO>> GetById(int id) => Ok(await _reportsQueryService.GetByIdAsync(id));

[HttpGet("getByTargetEntityId")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<ActionResult<ICollection<Report>>> GetByTargetEntityId(ReportTargetEntities entity)
=> Ok(await _reportsQueryService.GetByTargetEntityIdAsync(entity));
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,25 @@
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Application.Exceptions;
using ILogger = Serilog.ILogger;

namespace Admin.API.ExceptionHandlers;

public class AuthorizationExceptionHandler : IExceptionHandler
public class ApplicationAuthorizationExceptionHandler : IExceptionHandler
{
private const string ResponseTitle = "Доступ запрещён";
private const int StatusCode = StatusCodes.Status403Forbidden;
private readonly ILogger _logger;

public ApplicationAuthorizationExceptionHandler(ILogger logger)
{
_logger = logger;
}

public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception exception,
CancellationToken cancellationToken)
{
if (exception is not UnauthorizedAccessException)
if (exception is not ApplicationAuthorizationException)
{
return false;
}
Expand All @@ -23,6 +32,7 @@ public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception e
Detail = exception.Message
};
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
_logger.Warning(exception, "Исключение обработано: {ResponseTitle}", ResponseTitle);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
using System.Security.Authentication;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using ILogger = Serilog.ILogger;

namespace Admin.API.ExceptionHandlers;

public class AuthenticationExceptionHandler : IExceptionHandler
{
private const string ResponseTitle = "При аутентификации произошла ошибка";
private const int StatusCode = StatusCodes.Status401Unauthorized;
private readonly ILogger _logger;

public AuthenticationExceptionHandler(ILogger logger)
{
_logger = logger;
}

public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception exception,
CancellationToken cancellationToken)
{
Expand All @@ -24,6 +32,7 @@ public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception e
Detail = exception.Message
};
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
_logger.Warning(exception, "Исключение обработано: {ResponseTitle}", ResponseTitle);
return true;
}
}
9 changes: 9 additions & 0 deletions src/Admin.API/ExceptionHandlers/BadRequestExceptionHandler.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using ILogger = Serilog.ILogger;

namespace Admin.API.ExceptionHandlers;

public class BadRequestExceptionHandler : IExceptionHandler
{
private const string ResponseTitle = "Некорректный запрос";
private const int StatusCode = StatusCodes.Status400BadRequest;
private readonly ILogger _logger;

public BadRequestExceptionHandler(ILogger logger)
{
_logger = logger;
}

public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception exception,
CancellationToken cancellationToken)
{
Expand All @@ -23,6 +31,7 @@ public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception e
Detail = exception.Message
};
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
_logger.Warning(exception, "Исключение обработано: {ResponseTitle}", ResponseTitle);
return true;
}
}
9 changes: 9 additions & 0 deletions src/Admin.API/ExceptionHandlers/GlobalExceptionHandler.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using ILogger = Serilog.ILogger;

namespace Admin.API.ExceptionHandlers;

public class GlobalExceptionHandler : IExceptionHandler
{
private const string ResponseTitle = "Произошла ошибка на стороне сервера";
private const int StatusCode = StatusCodes.Status500InternalServerError;
private readonly ILogger _logger;

public GlobalExceptionHandler(ILogger logger)
{
_logger = logger;
}

public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception exception,
CancellationToken cancellationToken)
{
Expand All @@ -19,6 +27,7 @@ public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception e
Detail = exception.Message
};
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
_logger.Error(exception, ResponseTitle);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using ILogger = Serilog.ILogger;

namespace Admin.API.ExceptionHandlers;

public class InvalidOperationExceptionHandler : IExceptionHandler
{
private const string ResponseTitle = "Недопустимая операция";
private const int StatusCode = StatusCodes.Status409Conflict;
private readonly ILogger _logger;

public InvalidOperationExceptionHandler(ILogger logger)
{
_logger = logger;
}

public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception exception,
CancellationToken cancellationToken)
{
Expand All @@ -24,6 +32,7 @@ public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception e
Detail = exception.Message
};
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
_logger.Warning(exception, "Исключение обработано: {ResponseTitle}", ResponseTitle);
return true;
}
}
9 changes: 9 additions & 0 deletions src/Admin.API/ExceptionHandlers/NotFoundExceptionHandler.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Application.Exceptions;
using ILogger = Serilog.ILogger;

namespace Admin.API.ExceptionHandlers;

public class NotFoundExceptionHandler : IExceptionHandler
{
private const string ResponseTitle = "Запрашиваемый ресурс отсутствует на сервере";
private const int StatusCode = StatusCodes.Status404NotFound;
private readonly ILogger _logger;

public NotFoundExceptionHandler(ILogger logger)
{
_logger = logger;
}

public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception exception,
CancellationToken cancellationToken)
{
Expand All @@ -24,6 +32,7 @@ public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception e
Detail = exception.Message
};
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
_logger.Warning(exception, "Исключение обработано: {ResponseTitle}", ResponseTitle);
return true;
}
}
2 changes: 1 addition & 1 deletion src/Admin.API/Extensions/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public static IServiceCollection AddExceptionHandlers(this IServiceCollection se
services.AddExceptionHandler<InvalidOperationExceptionHandler>();
services.AddExceptionHandler<NotFoundExceptionHandler>();
services.AddExceptionHandler<AuthenticationExceptionHandler>();
services.AddExceptionHandler<AuthorizationExceptionHandler>();
services.AddExceptionHandler<ApplicationAuthorizationExceptionHandler>();
services.AddExceptionHandler<GlobalExceptionHandler>();
return services;
}
Expand Down
23 changes: 19 additions & 4 deletions src/Admin.API/Program.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Scalar.AspNetCore;
using Serilog;
using Serilog.Filters;
using Application.Interfaces.Services;
using Infrastructure.Extensions;
using Admin.API.Extensions;
Expand All @@ -12,8 +14,18 @@ public class Program
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog((context, configuration) =>
{
configuration.ReadFrom.Configuration(context.Configuration);
// Временное решение, дублирование логов при использовании ExceptionHandlerMiddleware исправлено в .NET 10
configuration.Filter.ByExcluding(Matching
.FromSource<Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware>());
});
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddOpenApiDocument();
builder.Services.AddOpenApiDocument(options =>
{
options.Title = builder.Environment.IsDevelopment() ? "StudHub Admin API [DEV]" : "StudHub Admin API";
});
builder.Configuration.AddEnvironmentVariables();
builder.Services.AddStudHubServices(builder.Configuration.GetConnectionString("Default")!);
builder.Services.AddAdminServices();
Expand Down Expand Up @@ -67,6 +79,7 @@ public static void Main(string[] args)
};
});
var app = builder.Build();
app.UseSerilogRequestLogging();
app.UseCors();
app.UseExceptionHandler();
app.UseOpenApi(options =>
Expand All @@ -75,10 +88,12 @@ public static void Main(string[] args)
});
app.MapScalarApiReference(options =>
{
options.Title = "StudHub.Admin API";
options.Title = app.Environment.IsDevelopment()
? "StudHub Admin API [DEV]"
: "StudHub Admin API";
options.Servers = new List<ScalarServer>
{
new ScalarServer("https://api.admin.setka-rtu.ru")
new ScalarServer("https://api-admin.setka-rtu.ru")
};
if (app.Environment.IsDevelopment())
{
Expand All @@ -90,4 +105,4 @@ public static void Main(string[] args)

app.Run();
}
}
}
24 changes: 19 additions & 5 deletions src/Admin.API/appsettings.Development.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,22 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft.EntityFrameworkCore": "Information",
"Microsoft.AspNetCore": "Information"
}
},
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": {
"path": "/Logs/Admin.API/Development/DevLog-.txt",
"rollingInterval": "Day"
}
}
]
}
}
Loading
Loading