From c2d982454385c7f4eb4182191d853e8ba50cc711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=B8=D0=BD=D0=B0?= Date: Sun, 5 Apr 2026 01:32:12 +0400 Subject: [PATCH 1/6] add response time and student info middleware --- TaskHub/Api/Api.csproj | 4 +-- .../Middleware/ResponseTimeMiddleware.cs.cs | 28 +++++++++++++++++++ .../Api/Middleware/StudentInfoMiddleware.cs | 24 ++++++++++++++++ TaskHub/Api/StartUp.cs | 4 +++ TaskHub/Dal/Dal.csproj | 6 ++-- .../DatabaseLibrary/DatabaseLibrary.csproj | 6 ++-- .../Libs/LoggingLibrary/LoggingLibrary.csproj | 6 ++-- TaskHub/Logic/Logic.csproj | 4 +-- 8 files changed, 69 insertions(+), 13 deletions(-) create mode 100644 TaskHub/Api/Middleware/ResponseTimeMiddleware.cs.cs create mode 100644 TaskHub/Api/Middleware/StudentInfoMiddleware.cs diff --git a/TaskHub/Api/Api.csproj b/TaskHub/Api/Api.csproj index a6946fa..7405f43 100644 --- a/TaskHub/Api/Api.csproj +++ b/TaskHub/Api/Api.csproj @@ -1,7 +1,7 @@ - net10.0 + net8.0 enable enable @@ -12,7 +12,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/TaskHub/Api/Middleware/ResponseTimeMiddleware.cs.cs b/TaskHub/Api/Middleware/ResponseTimeMiddleware.cs.cs new file mode 100644 index 0000000..1f1b9d1 --- /dev/null +++ b/TaskHub/Api/Middleware/ResponseTimeMiddleware.cs.cs @@ -0,0 +1,28 @@ +using System.Diagnostics; + +namespace Api.Middleware +{ + public class ResponseTimeMiddleware + { + private readonly RequestDelegate _next; + + public ResponseTimeMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task InvokeAsync(HttpContext context) + { + var stopwatch = Stopwatch.StartNew(); + + context.Response.OnStarting(() => + { + stopwatch.Stop(); + context.Response.Headers["X-Response-Time-Ms"] = stopwatch.ElapsedMilliseconds.ToString(); + return Task.CompletedTask; + }); + + await _next(context); + } + } +} diff --git a/TaskHub/Api/Middleware/StudentInfoMiddleware.cs b/TaskHub/Api/Middleware/StudentInfoMiddleware.cs new file mode 100644 index 0000000..23db0ab --- /dev/null +++ b/TaskHub/Api/Middleware/StudentInfoMiddleware.cs @@ -0,0 +1,24 @@ +namespace Api.Middleware +{ + public class StudentInfoMiddleware + { + private readonly RequestDelegate _next; + + public StudentInfoMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task InvokeAsync(HttpContext context) + { + context.Response.OnStarting(() => + { + context.Response.Headers["X-Student-Name"] = "Tumashova Marina"; + context.Response.Headers["X-Student-Group"] = "RI-240912"; + return Task.CompletedTask; + }); + + await _next(context); + } + } +} diff --git a/TaskHub/Api/StartUp.cs b/TaskHub/Api/StartUp.cs index 9220ca4..1d6c0a2 100644 --- a/TaskHub/Api/StartUp.cs +++ b/TaskHub/Api/StartUp.cs @@ -1,3 +1,4 @@ +using Api.Middleware; using Api.UseCases.Users; using Api.UseCases.Users.Interfaces; using Dal; @@ -81,6 +82,9 @@ public void Configure(IApplicationBuilder app) app.UseRouting(); + app.UseMiddleware(); + app.UseMiddleware(); + app.UseEndpoints(endpoints => { endpoints.MapControllers(); diff --git a/TaskHub/Dal/Dal.csproj b/TaskHub/Dal/Dal.csproj index edb5ba8..1c690cf 100644 --- a/TaskHub/Dal/Dal.csproj +++ b/TaskHub/Dal/Dal.csproj @@ -1,14 +1,14 @@  - net10.0 + net8.0 enable enable - - + + diff --git a/TaskHub/Libs/DatabaseLibrary/DatabaseLibrary.csproj b/TaskHub/Libs/DatabaseLibrary/DatabaseLibrary.csproj index 0c323c8..012f0c1 100644 --- a/TaskHub/Libs/DatabaseLibrary/DatabaseLibrary.csproj +++ b/TaskHub/Libs/DatabaseLibrary/DatabaseLibrary.csproj @@ -1,14 +1,14 @@  - net10.0 + net8.0 enable enable - - + + diff --git a/TaskHub/Libs/LoggingLibrary/LoggingLibrary.csproj b/TaskHub/Libs/LoggingLibrary/LoggingLibrary.csproj index bf06657..ff7786d 100644 --- a/TaskHub/Libs/LoggingLibrary/LoggingLibrary.csproj +++ b/TaskHub/Libs/LoggingLibrary/LoggingLibrary.csproj @@ -1,15 +1,15 @@  - net10.0 + net8.0 enable enable - + - + diff --git a/TaskHub/Logic/Logic.csproj b/TaskHub/Logic/Logic.csproj index a38dfe4..2be5253 100644 --- a/TaskHub/Logic/Logic.csproj +++ b/TaskHub/Logic/Logic.csproj @@ -5,11 +5,11 @@ - + - net10.0 + net8.0 enable enable From 991cf90cf3abcdb863267f44c0c965d89fc70fcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=B8=D0=BD=D0=B0?= Date: Sun, 5 Apr 2026 14:10:19 +0400 Subject: [PATCH 2/6] homework-2 --- TaskHub/Api/Services/DisposedService.cs | 18 ++++++++ TaskHub/Api/Services/IHasInstanceId.cs | 7 ++++ .../Api/Services/ServiceProviderExtensions.cs | 17 ++++++++ TaskHub/Api/Services/Services.cs | 20 +++++++++ TaskHub/Api/StartUp.cs | 42 +++++++++++++++++++ 5 files changed, 104 insertions(+) create mode 100644 TaskHub/Api/Services/DisposedService.cs create mode 100644 TaskHub/Api/Services/IHasInstanceId.cs create mode 100644 TaskHub/Api/Services/ServiceProviderExtensions.cs create mode 100644 TaskHub/Api/Services/Services.cs diff --git a/TaskHub/Api/Services/DisposedService.cs b/TaskHub/Api/Services/DisposedService.cs new file mode 100644 index 0000000..9a2ce8d --- /dev/null +++ b/TaskHub/Api/Services/DisposedService.cs @@ -0,0 +1,18 @@ +namespace Api.Services +{ + public abstract class DisposedService : IHasInstanceId, IDisposable + { + public Guid InstanceId { get; } = Guid.NewGuid(); + + protected DisposedService() + { + Console.WriteLine($"{GetType().Name} CREATED:{InstanceId}"); + } + + public void Dispose() + { + Console.WriteLine($"{GetType().Name} DISPOSED: {InstanceId}"); + } + } +} + diff --git a/TaskHub/Api/Services/IHasInstanceId.cs b/TaskHub/Api/Services/IHasInstanceId.cs new file mode 100644 index 0000000..d5abf99 --- /dev/null +++ b/TaskHub/Api/Services/IHasInstanceId.cs @@ -0,0 +1,7 @@ +namespace Api.Services +{ + public interface IHasInstanceId + { + Guid InstanceId { get; } + } +} diff --git a/TaskHub/Api/Services/ServiceProviderExtensions.cs b/TaskHub/Api/Services/ServiceProviderExtensions.cs new file mode 100644 index 0000000..9e0da57 --- /dev/null +++ b/TaskHub/Api/Services/ServiceProviderExtensions.cs @@ -0,0 +1,17 @@ +namespace Api.Services +{ + public static class ServiceProviderExtensions + { + public static void CompareServices(this IServiceProvider provider) + where T : IHasInstanceId + { + var first = provider.GetRequiredService(); + var second = provider.GetRequiredService(); + + Console.WriteLine($"Service: {typeof(T).Name}"); + Console.WriteLine($"First: {first.InstanceId}"); + Console.WriteLine($"Second: {second.InstanceId}"); + Console.WriteLine($"Same instance: {ReferenceEquals(first, second)}"); + } + } +} diff --git a/TaskHub/Api/Services/Services.cs b/TaskHub/Api/Services/Services.cs new file mode 100644 index 0000000..7a9a5eb --- /dev/null +++ b/TaskHub/Api/Services/Services.cs @@ -0,0 +1,20 @@ +namespace Api.Services +{ + public interface ISingletonService1 : IHasInstanceId { } + public interface ISingletonService2 : IHasInstanceId { } + + public interface IScopedService1 : IHasInstanceId { } + public interface IScopedService2 : IHasInstanceId { } + + public interface ITransientService1 : IHasInstanceId { } + public interface ITransientService2 : IHasInstanceId { } + + public class SingletonService1 : DisposedService, ISingletonService1 { } + public class SingletonService2 : DisposedService, ISingletonService2 { } + + public class ScopedService1 : DisposedService, IScopedService1 { } + public class ScopedService2 : DisposedService, IScopedService2 { } + + public class TransientService1 : DisposedService, ITransientService1 { } + public class TransientService2 : DisposedService, ITransientService2 { } +} diff --git a/TaskHub/Api/StartUp.cs b/TaskHub/Api/StartUp.cs index 1d6c0a2..7ee8fb3 100644 --- a/TaskHub/Api/StartUp.cs +++ b/TaskHub/Api/StartUp.cs @@ -1,4 +1,5 @@ using Api.Middleware; +using Api.Services; using Api.UseCases.Users; using Api.UseCases.Users.Interfaces; using Dal; @@ -62,6 +63,15 @@ public void ConfigureServices(IServiceCollection services) Version = "v1" }); }); + + services.AddSingleton(); + services.AddSingleton(); + + services.AddScoped(); + services.AddScoped(); + + services.AddTransient(); + services.AddTransient(); } /// @@ -70,6 +80,38 @@ public void ConfigureServices(IServiceCollection services) /// Построитель приложения public void Configure(IApplicationBuilder app) { + using (var scope1 = app.ApplicationServices.CreateScope()) + { + var provider = scope1.ServiceProvider; + + Console.WriteLine("SCOPE 1"); + + provider.CompareServices(); + provider.CompareServices(); + + provider.CompareServices(); + provider.CompareServices(); + + provider.CompareServices(); + provider.CompareServices(); + } + + using (var scope2 = app.ApplicationServices.CreateScope()) + { + var provider = scope2.ServiceProvider; + + Console.WriteLine("SCOPE 2"); + + provider.CompareServices(); + provider.CompareServices(); + + provider.CompareServices(); + provider.CompareServices(); + + provider.CompareServices(); + provider.CompareServices(); + } + if (Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); From 37c015ca4cb98a1e1f78b159375495d490f9aae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=B8=D0=BD=D0=B0?= Date: Sun, 5 Apr 2026 16:10:36 +0400 Subject: [PATCH 3/6] homework-3 --- TaskHub/Api/Api.csproj | 2 +- .../Api/Controllers/Users/UsersController.cs | 5 +++ .../Filters/ResponseTimeHeaderAttribute.cs | 23 +++++++++++++ TaskHub/Api/Filters/SetNameAttribute.cs | 6 ++++ .../Filters/StudentInfoHeadersAttribute.cs | 15 ++++++++ .../Filters/ValidateUserRequestAttribute.cs | 34 +++++++++++++++++++ 6 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 TaskHub/Api/Filters/ResponseTimeHeaderAttribute.cs create mode 100644 TaskHub/Api/Filters/SetNameAttribute.cs create mode 100644 TaskHub/Api/Filters/StudentInfoHeadersAttribute.cs create mode 100644 TaskHub/Api/Filters/ValidateUserRequestAttribute.cs diff --git a/TaskHub/Api/Api.csproj b/TaskHub/Api/Api.csproj index 7405f43..c8bbecd 100644 --- a/TaskHub/Api/Api.csproj +++ b/TaskHub/Api/Api.csproj @@ -1,4 +1,4 @@ - + net8.0 diff --git a/TaskHub/Api/Controllers/Users/UsersController.cs b/TaskHub/Api/Controllers/Users/UsersController.cs index 10a433a..b139e87 100644 --- a/TaskHub/Api/Controllers/Users/UsersController.cs +++ b/TaskHub/Api/Controllers/Users/UsersController.cs @@ -1,3 +1,4 @@ +using Api.Filters; using Api.Controllers.Users.Request; using Api.Controllers.Users.Response; using Api.UseCases.Users.Interfaces; @@ -5,6 +6,9 @@ namespace Api.Controllers.Users; +[ResponseTimeHeader] +[StudentInfoHeaders] + /// /// Контроллер работы с пользователями /// @@ -29,6 +33,7 @@ public UsersController(IManageUserUseCase userUseCase) /// Токен отмены /// Созданный пользователь [HttpPost] + [SetName] public async Task> CreateUserAsync( [FromBody] CreateUserRequest? request, CancellationToken cancellationToken) diff --git a/TaskHub/Api/Filters/ResponseTimeHeaderAttribute.cs b/TaskHub/Api/Filters/ResponseTimeHeaderAttribute.cs new file mode 100644 index 0000000..79b610a --- /dev/null +++ b/TaskHub/Api/Filters/ResponseTimeHeaderAttribute.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Mvc.Filters; +using System.Diagnostics; + +namespace Api.Filters +{ + public class ResponseTimeHeaderAttribute : ActionFilterAttribute + { + private Stopwatch _stopwatch; + + public override void OnActionExecuting(ActionExecutingContext context) + { + _stopwatch = Stopwatch.StartNew(); + } + + public override void OnActionExecuted(ActionExecutedContext context) + { + _stopwatch.Stop(); + + context.HttpContext.Response.Headers["X-Response-Time-Ms"] = + _stopwatch.ElapsedMilliseconds.ToString(); + } + } +} diff --git a/TaskHub/Api/Filters/SetNameAttribute.cs b/TaskHub/Api/Filters/SetNameAttribute.cs new file mode 100644 index 0000000..523ccb1 --- /dev/null +++ b/TaskHub/Api/Filters/SetNameAttribute.cs @@ -0,0 +1,6 @@ +namespace Api.Filters +{ + public class SetNameAttribute : ValidateUserRequestAttribute + { + } +} diff --git a/TaskHub/Api/Filters/StudentInfoHeadersAttribute.cs b/TaskHub/Api/Filters/StudentInfoHeadersAttribute.cs new file mode 100644 index 0000000..35488c3 --- /dev/null +++ b/TaskHub/Api/Filters/StudentInfoHeadersAttribute.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Mvc.Filters; + +namespace Api.Filters +{ + public class StudentInfoHeadersAttribute : ActionFilterAttribute + { + public override void OnActionExecuted(ActionExecutedContext context) + { + var headers = context.HttpContext.Request.Headers; + + headers["X-Student-Name"] = "Tumashova Marina"; + headers["X-Student-Group"] = "RI-240912"; + } + } +} diff --git a/TaskHub/Api/Filters/ValidateUserRequestAttribute.cs b/TaskHub/Api/Filters/ValidateUserRequestAttribute.cs new file mode 100644 index 0000000..8d44de0 --- /dev/null +++ b/TaskHub/Api/Filters/ValidateUserRequestAttribute.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using System.Reflection; + +namespace Api.Filters +{ + public class ValidateUserRequestAttribute : ActionFilterAttribute + { + public override void OnActionExecuting(ActionExecutingContext context) + { + var request = context.ActionArguments.Values.FirstOrDefault(); + + if (request == null) + { + context.Result = new BadRequestObjectResult("нет тела запроса"); + return; + } + + var nameProperty = request.GetType().GetProperty("Name"); + + if (nameProperty == null) + { + return; + } + + var nameValue = nameProperty.GetValue(request)?.ToString(); + + if (string.IsNullOrWhiteSpace(nameValue)) + { + context.Result = new BadRequestObjectResult("нет имени"); + } + } + } +} From f0a8c2105ccc80be16bd407fd088a07285e84eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=B8=D0=BD=D0=B0?= Date: Sun, 5 Apr 2026 22:13:28 +0400 Subject: [PATCH 4/6] homework-4 --- .../Tasks/Request/CreateTaskRequest.cs | 8 +++ .../Tasks/Request/SetTaskTitleRequest.cs | 7 +++ .../Tasks/Response/TaskResponse.cs | 18 ++++++ .../Api/Controllers/Tasks/TasksController.cs | 60 ++++++++++++++++++ TaskHub/Api/StartUp.cs | 11 ++-- .../Tasks/Interfaces/IManageTaskUseCase.cs | 19 ++++++ .../Api/UseCases/Tasks/ManageTaskUseCase.cs | 57 +++++++++++++++++ TaskHub/Dal/DalStartUp.cs | 3 + TaskHub/Dal/Entities/TaskEntity.cs | 16 +++++ .../Dal/Repositories/Tasks/ITaskRepository.cs | 19 ++++++ .../Dal/Repositories/Tasks/TaskRepository.cs | 63 +++++++++++++++++++ TaskHub/Dal/TaskDbContext.cs | 18 ++++++ TaskHub/Logic/LogicStartUp.cs | 5 +- .../Tasks/Services/Interfaces/ITaskService.cs | 23 +++++++ TaskHub/Logic/Tasks/Services/TaskService.cs | 45 +++++++++++++ 15 files changed, 367 insertions(+), 5 deletions(-) create mode 100644 TaskHub/Api/Controllers/Tasks/Request/CreateTaskRequest.cs create mode 100644 TaskHub/Api/Controllers/Tasks/Request/SetTaskTitleRequest.cs create mode 100644 TaskHub/Api/Controllers/Tasks/Response/TaskResponse.cs create mode 100644 TaskHub/Api/Controllers/Tasks/TasksController.cs create mode 100644 TaskHub/Api/UseCases/Tasks/Interfaces/IManageTaskUseCase.cs create mode 100644 TaskHub/Api/UseCases/Tasks/ManageTaskUseCase.cs create mode 100644 TaskHub/Dal/Entities/TaskEntity.cs create mode 100644 TaskHub/Dal/Repositories/Tasks/ITaskRepository.cs create mode 100644 TaskHub/Dal/Repositories/Tasks/TaskRepository.cs create mode 100644 TaskHub/Dal/TaskDbContext.cs create mode 100644 TaskHub/Logic/Tasks/Services/Interfaces/ITaskService.cs create mode 100644 TaskHub/Logic/Tasks/Services/TaskService.cs diff --git a/TaskHub/Api/Controllers/Tasks/Request/CreateTaskRequest.cs b/TaskHub/Api/Controllers/Tasks/Request/CreateTaskRequest.cs new file mode 100644 index 0000000..9507259 --- /dev/null +++ b/TaskHub/Api/Controllers/Tasks/Request/CreateTaskRequest.cs @@ -0,0 +1,8 @@ +namespace Api.Controllers.Tasks.Request +{ + public class CreateTaskRequest + { + public string? Title { get; set; } + public Guid UserId { get; set; } + } +} diff --git a/TaskHub/Api/Controllers/Tasks/Request/SetTaskTitleRequest.cs b/TaskHub/Api/Controllers/Tasks/Request/SetTaskTitleRequest.cs new file mode 100644 index 0000000..7e9d631 --- /dev/null +++ b/TaskHub/Api/Controllers/Tasks/Request/SetTaskTitleRequest.cs @@ -0,0 +1,7 @@ +namespace Api.Controllers.Tasks.Request +{ + public class SetTaskTitleRequest + { + public string? Title { get; set; } + } +} diff --git a/TaskHub/Api/Controllers/Tasks/Response/TaskResponse.cs b/TaskHub/Api/Controllers/Tasks/Response/TaskResponse.cs new file mode 100644 index 0000000..f21d312 --- /dev/null +++ b/TaskHub/Api/Controllers/Tasks/Response/TaskResponse.cs @@ -0,0 +1,18 @@ +namespace Api.Controllers.Tasks.Response +{ + public class TaskResponse + { + public Guid Id { get; } + public string? Title { get; } + public Guid CreatedByUserId { get; } + public DateTimeOffset CreatedUtc { get; } + + public TaskResponse(Guid id, string? title, Guid createdByUserId, DateTimeOffset createdUtc) + { + Id = id; + Title = title; + CreatedByUserId = createdByUserId; + CreatedUtc = createdUtc; + } + } +} diff --git a/TaskHub/Api/Controllers/Tasks/TasksController.cs b/TaskHub/Api/Controllers/Tasks/TasksController.cs new file mode 100644 index 0000000..62f898d --- /dev/null +++ b/TaskHub/Api/Controllers/Tasks/TasksController.cs @@ -0,0 +1,60 @@ +using Api.Controllers.Tasks.Request; +using Api.Controllers.Tasks.Response; +using Api.UseCases.Tasks.Interfaces; +using Microsoft.AspNetCore.Mvc; + +namespace Api.Controllers.Tasks; + +[ApiController] +[Route("tasks")] +public class TasksController : ControllerBase +{ + private readonly IManageTaskUseCase _useCase; + + public TasksController(IManageTaskUseCase useCase) + { + _useCase = useCase; + } + + [HttpPost] + public async Task> Create(CreateTaskRequest request, CancellationToken ct) + { + var result = await _useCase.CreateTaskAsync(request.Title, request.UserId, ct); + return Created("", result); + } + + [HttpGet] + public async Task>> GetAll(CancellationToken ct) + { + return Ok(await _useCase.GetAllTasksAsync(ct)); + } + + [HttpGet("{id:guid}")] + public async Task> Get(Guid id, CancellationToken ct) + { + var result = await _useCase.GetTaskByIdAsync(id, ct); + if (result == null) return NotFound(); + return Ok(result); + } + + [HttpPut("{id:guid}/title")] + public async Task SetTitle(Guid id, SetTaskTitleRequest request, CancellationToken ct) + { + await _useCase.SetTaskTitleAsync(id, request.Title!, ct); + return NoContent(); + } + + [HttpDelete("{id:guid}")] + public async Task Delete(Guid id, CancellationToken ct) + { + var deleted = await _useCase.DeleteTaskByIdAsync(id, ct); + return deleted ? NoContent() : NotFound(); + } + + [HttpDelete] + public async Task DeleteAll(CancellationToken ct) + { + await _useCase.DeleteAllTasksAsync(ct); + return NoContent(); + } +} diff --git a/TaskHub/Api/StartUp.cs b/TaskHub/Api/StartUp.cs index 7ee8fb3..0d2fcc8 100644 --- a/TaskHub/Api/StartUp.cs +++ b/TaskHub/Api/StartUp.cs @@ -2,6 +2,8 @@ using Api.Services; using Api.UseCases.Users; using Api.UseCases.Users.Interfaces; +using Api.UseCases.Tasks; +using Api.UseCases.Tasks.Interfaces; using Dal; using Logic; using Microsoft.OpenApi.Models; @@ -40,7 +42,8 @@ public void ConfigureServices(IServiceCollection services) services.AddLogic(); services.AddScoped(); - + services.AddScoped(); + services.AddCors(options => { options.AddDefaultPolicy(builder => @@ -112,15 +115,15 @@ public void Configure(IApplicationBuilder app) provider.CompareServices(); } - if (Environment.IsDevelopment()) - { + //if (Environment.IsDevelopment()) + //{ app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "TaskHub API v1"); }); - } + //} app.UseRouting(); diff --git a/TaskHub/Api/UseCases/Tasks/Interfaces/IManageTaskUseCase.cs b/TaskHub/Api/UseCases/Tasks/Interfaces/IManageTaskUseCase.cs new file mode 100644 index 0000000..9572d65 --- /dev/null +++ b/TaskHub/Api/UseCases/Tasks/Interfaces/IManageTaskUseCase.cs @@ -0,0 +1,19 @@ +using Api.Controllers.Tasks.Response; + +namespace Api.UseCases.Tasks.Interfaces +{ + public interface IManageTaskUseCase + { + Task CreateTaskAsync(string? title, Guid userId, CancellationToken cancellationToken); + + Task> GetAllTasksAsync(CancellationToken cancellationToken); + + Task GetTaskByIdAsync(Guid id, CancellationToken cancellationToken); + + Task SetTaskTitleAsync(Guid id, string title, CancellationToken cancellationToken); + + Task DeleteTaskByIdAsync(Guid id, CancellationToken cancellationToken); + + Task DeleteAllTasksAsync(CancellationToken cancellationToken); + } +} diff --git a/TaskHub/Api/UseCases/Tasks/ManageTaskUseCase.cs b/TaskHub/Api/UseCases/Tasks/ManageTaskUseCase.cs new file mode 100644 index 0000000..eb93d89 --- /dev/null +++ b/TaskHub/Api/UseCases/Tasks/ManageTaskUseCase.cs @@ -0,0 +1,57 @@ +using Api.Controllers.Tasks.Response; +using Api.UseCases.Tasks.Interfaces; +using Logic.Tasks.Services.Interfaces; + +namespace Api.UseCases.Tasks; + +internal sealed class ManageTaskUseCase : IManageTaskUseCase +{ + private readonly ITaskService _taskService; + + public ManageTaskUseCase(ITaskService taskService) + { + _taskService = taskService; + } + + public async Task CreateTaskAsync(string? title, Guid userId, CancellationToken cancellationToken) + { + var task = await _taskService.CreateTaskAsync(title, userId, cancellationToken); + + return new TaskResponse(task.Id, task.Title, task.CreatedByUserId, task.CreatedUtc); + } + + public async Task> GetAllTasksAsync(CancellationToken cancellationToken) + { + var tasks = await _taskService.GetAllTasksAsync(cancellationToken); + + return tasks + .Select(x => new TaskResponse(x.Id, x.Title, x.CreatedByUserId, x.CreatedUtc)) + .ToList() + .AsReadOnly(); + } + + public async Task GetTaskByIdAsync(Guid id, CancellationToken cancellationToken) + { + var task = await _taskService.GetTaskByIdAsync(id, cancellationToken); + + if (task == null) + return null; + + return new TaskResponse(task.Id, task.Title, task.CreatedByUserId, task.CreatedUtc); + } + + public async Task SetTaskTitleAsync(Guid id, string title, CancellationToken cancellationToken) + { + await _taskService.SetTaskTitleAsync(id, title, cancellationToken); + } + + public async Task DeleteTaskByIdAsync(Guid id, CancellationToken cancellationToken) + { + return await _taskService.DeleteTaskByIdAsync(id, cancellationToken); + } + + public async Task DeleteAllTasksAsync(CancellationToken cancellationToken) + { + await _taskService.DeleteAllTasksAsync(cancellationToken); + } +} diff --git a/TaskHub/Dal/DalStartUp.cs b/TaskHub/Dal/DalStartUp.cs index f6dfa82..81a8690 100644 --- a/TaskHub/Dal/DalStartUp.cs +++ b/TaskHub/Dal/DalStartUp.cs @@ -1,6 +1,7 @@ using Dal.Context; using Dal.Repositories; using Dal.Repositories.Interfaces; +using Dal.Repositories.Tasks; using DatabaseLibrary; using Microsoft.Extensions.DependencyInjection; @@ -18,6 +19,8 @@ public static class DalStartUp public static void AddDal(this IServiceCollection services) { services.AddDatabase(); + services.AddDatabase(); services.AddScoped(); + services.AddScoped(); } } diff --git a/TaskHub/Dal/Entities/TaskEntity.cs b/TaskHub/Dal/Entities/TaskEntity.cs new file mode 100644 index 0000000..9f8bcba --- /dev/null +++ b/TaskHub/Dal/Entities/TaskEntity.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Dal.Entities +{ + public class TaskEntity + { + public Guid Id { get; set; } + public string? Title { get; set; } + public Guid CreatedByUserId { get; set; } + public DateTimeOffset CreatedUtc { get; set; } + } +} diff --git a/TaskHub/Dal/Repositories/Tasks/ITaskRepository.cs b/TaskHub/Dal/Repositories/Tasks/ITaskRepository.cs new file mode 100644 index 0000000..cf428b5 --- /dev/null +++ b/TaskHub/Dal/Repositories/Tasks/ITaskRepository.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Dal.Entities; + +namespace Dal.Repositories.Tasks +{ + public interface ITaskRepository + { + Task CreateAsync(TaskEntity task); + Task> GetAllAsync(); + Task GetByIdAsync(Guid id); + Task UpdateTitleAsync(Guid id, string title); + Task DeleteAsync(Guid id); + Task DeleteAllAsync(); + } +} diff --git a/TaskHub/Dal/Repositories/Tasks/TaskRepository.cs b/TaskHub/Dal/Repositories/Tasks/TaskRepository.cs new file mode 100644 index 0000000..087cef7 --- /dev/null +++ b/TaskHub/Dal/Repositories/Tasks/TaskRepository.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Dal.Entities; +using Microsoft.EntityFrameworkCore; + +namespace Dal.Repositories.Tasks +{ + public class TaskRepository : ITaskRepository + { + private readonly TaskDbContext _context; + + public TaskRepository(TaskDbContext context) + { + _context = context; + } + + public async Task CreateAsync(TaskEntity task) + { + _context.Tasks.Add(task); + await _context.SaveChangesAsync(); + return task; + } + + public async Task> GetAllAsync() + { + return await _context.Tasks.ToListAsync(); + } + + public async Task GetByIdAsync(Guid id) + { + return await _context.Tasks.FindAsync(id); + } + + public async Task UpdateTitleAsync(Guid id, string title) + { + var task = await _context.Tasks.FindAsync(id); + if (task != null) + { + task.Title = title; + await _context.SaveChangesAsync(); + } + } + + public async Task DeleteAsync(Guid id) + { + var task = await _context.Tasks.FindAsync(id); + if (task == null) return false; + + _context.Tasks.Remove(task); + await _context.SaveChangesAsync(); + return true; + } + + public async Task DeleteAllAsync() + { + _context.Tasks.RemoveRange(_context.Tasks); + await _context.SaveChangesAsync(); + } + } +} diff --git a/TaskHub/Dal/TaskDbContext.cs b/TaskHub/Dal/TaskDbContext.cs new file mode 100644 index 0000000..42caa0c --- /dev/null +++ b/TaskHub/Dal/TaskDbContext.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Dal.Entities; +using Microsoft.EntityFrameworkCore; + +namespace Dal +{ + public class TaskDbContext : DbContext + { + public TaskDbContext(DbContextOptions options) + : base(options) { } + + public DbSet Tasks { get; set; } + } +} diff --git a/TaskHub/Logic/LogicStartUp.cs b/TaskHub/Logic/LogicStartUp.cs index 6fc3e70..5d0a99c 100644 --- a/TaskHub/Logic/LogicStartUp.cs +++ b/TaskHub/Logic/LogicStartUp.cs @@ -1,4 +1,6 @@ -using Logic.Users.Services; +using Logic.Tasks.Services; +using Logic.Tasks.Services.Interfaces; +using Logic.Users.Services; using Logic.Users.Services.Interfaces; using Microsoft.Extensions.DependencyInjection; @@ -16,5 +18,6 @@ public static class LogicStartUp public static void AddLogic(this IServiceCollection services) { services.AddScoped(); + services.AddScoped(); } } \ No newline at end of file diff --git a/TaskHub/Logic/Tasks/Services/Interfaces/ITaskService.cs b/TaskHub/Logic/Tasks/Services/Interfaces/ITaskService.cs new file mode 100644 index 0000000..69069af --- /dev/null +++ b/TaskHub/Logic/Tasks/Services/Interfaces/ITaskService.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Dal.Entities; + +namespace Logic.Tasks.Services.Interfaces; + +public interface ITaskService +{ + Task CreateTaskAsync(string? title, Guid userId, CancellationToken cancellationToken); + + Task> GetAllTasksAsync(CancellationToken cancellationToken); + + Task GetTaskByIdAsync(Guid id, CancellationToken cancellationToken); + + Task SetTaskTitleAsync(Guid id, string title, CancellationToken cancellationToken); + + Task DeleteTaskByIdAsync(Guid id, CancellationToken cancellationToken); + + Task DeleteAllTasksAsync(CancellationToken cancellationToken); +} diff --git a/TaskHub/Logic/Tasks/Services/TaskService.cs b/TaskHub/Logic/Tasks/Services/TaskService.cs new file mode 100644 index 0000000..bbda82d --- /dev/null +++ b/TaskHub/Logic/Tasks/Services/TaskService.cs @@ -0,0 +1,45 @@ +using Dal.Entities; +using Dal.Repositories.Interfaces; +using Dal.Repositories.Tasks; +using Logic.Tasks.Services.Interfaces; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Logic.Tasks.Services; + +public class TaskService : ITaskService +{ + private readonly ITaskRepository _repo; + + public TaskService(ITaskRepository repo) + { + _repo = repo; + } + + public Task CreateTaskAsync(string? title, Guid userId, CancellationToken cancellationToken) + => _repo.CreateAsync(new TaskEntity + { + Id = Guid.NewGuid(), + Title = title, + CreatedByUserId = userId, + CreatedUtc = DateTimeOffset.UtcNow + }); + + public Task> GetAllTasksAsync(CancellationToken cancellationToken) + => _repo.GetAllAsync(); + + public Task GetTaskByIdAsync(Guid id, CancellationToken cancellationToken) + => _repo.GetByIdAsync(id); + + public Task SetTaskTitleAsync(Guid id, string title, CancellationToken cancellationToken) + => _repo.UpdateTitleAsync(id, title); + + public Task DeleteTaskByIdAsync(Guid id, CancellationToken cancellationToken) + => _repo.DeleteAsync(id); + + public Task DeleteAllTasksAsync(CancellationToken cancellationToken) + => _repo.DeleteAllAsync(); +} From 44910eef56d76aab94308cb8c7559b5caf7acba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=B8=D0=BD=D0=B0?= Date: Mon, 6 Apr 2026 13:05:00 +0400 Subject: [PATCH 5/6] homework-5 --- .../Api/Controllers/Tasks/TasksController.cs | 57 +++++++++++++++---- .../Api/Filters/FromRouteTaskIdAttribute.cs | 34 +++++++++++ .../20260405200703_CreateTasks.Designer.cs | 50 ++++++++++++++++ .../Tasks/20260405200703_CreateTasks.cs | 36 ++++++++++++ .../Tasks/TaskDbContextModelSnapshot.cs | 47 +++++++++++++++ .../20260405203233_CreateUsers.Designer.cs | 50 ++++++++++++++++ .../Users/20260405203233_CreateUsers.cs | 35 ++++++++++++ .../Users/UserDbContextModelSnapshot.cs | 47 +++++++++++++++ docker-compose.yml | 17 ++++++ 9 files changed, 362 insertions(+), 11 deletions(-) create mode 100644 TaskHub/Api/Filters/FromRouteTaskIdAttribute.cs create mode 100644 TaskHub/Dal/Migrations/Tasks/20260405200703_CreateTasks.Designer.cs create mode 100644 TaskHub/Dal/Migrations/Tasks/20260405200703_CreateTasks.cs create mode 100644 TaskHub/Dal/Migrations/Tasks/TaskDbContextModelSnapshot.cs create mode 100644 TaskHub/Dal/Migrations/Users/20260405203233_CreateUsers.Designer.cs create mode 100644 TaskHub/Dal/Migrations/Users/20260405203233_CreateUsers.cs create mode 100644 TaskHub/Dal/Migrations/Users/UserDbContextModelSnapshot.cs create mode 100644 docker-compose.yml diff --git a/TaskHub/Api/Controllers/Tasks/TasksController.cs b/TaskHub/Api/Controllers/Tasks/TasksController.cs index 62f898d..3667b06 100644 --- a/TaskHub/Api/Controllers/Tasks/TasksController.cs +++ b/TaskHub/Api/Controllers/Tasks/TasksController.cs @@ -1,11 +1,11 @@ using Api.Controllers.Tasks.Request; using Api.Controllers.Tasks.Response; +using Api.Filters; using Api.UseCases.Tasks.Interfaces; using Microsoft.AspNetCore.Mvc; namespace Api.Controllers.Tasks; -[ApiController] [Route("tasks")] public class TasksController : ControllerBase { @@ -29,25 +29,60 @@ public async Task>> GetAll(CancellationTo return Ok(await _useCase.GetAllTasksAsync(ct)); } - [HttpGet("{id:guid}")] - public async Task> Get(Guid id, CancellationToken ct) + [HttpGet("{id}")] + [FromRouteTaskId] + public async Task> Get( + string id, + CancellationToken ct) { - var result = await _useCase.GetTaskByIdAsync(id, ct); + var guidObj = HttpContext.Items["TaskId"]; + + if (guidObj == null) + { + return BadRequest("Идентификатор задачи не задан"); + } + + var guid = (Guid)guidObj; + var result = await _useCase.GetTaskByIdAsync(guid, ct); + if (result == null) return NotFound(); return Ok(result); } - [HttpPut("{id:guid}/title")] - public async Task SetTitle(Guid id, SetTaskTitleRequest request, CancellationToken ct) + [HttpPut("{id}/title")] + [FromRouteTaskId] + public async Task SetTitle( + string id, + SetTaskTitleRequest request, + CancellationToken ct) { - await _useCase.SetTaskTitleAsync(id, request.Title!, ct); + var guidObj = HttpContext.Items["TaskId"]; + + if (guidObj == null) + { + return BadRequest("Идентификатор задачи не задан"); + } + + var guid = (Guid)guidObj; + await _useCase.SetTaskTitleAsync(guid, request.Title!, ct); return NoContent(); } - [HttpDelete("{id:guid}")] - public async Task Delete(Guid id, CancellationToken ct) + [HttpDelete("{id}")] + [FromRouteTaskId] + public async Task Delete( + string id, + CancellationToken ct) { - var deleted = await _useCase.DeleteTaskByIdAsync(id, ct); + var guidObj = HttpContext.Items["TaskId"]; + + if (guidObj == null) + { + return BadRequest("Идентификатор задачи не задан"); + } + + var guid = (Guid)guidObj; + var deleted = await _useCase.DeleteTaskByIdAsync(guid, ct); return deleted ? NoContent() : NotFound(); } @@ -57,4 +92,4 @@ public async Task DeleteAll(CancellationToken ct) await _useCase.DeleteAllTasksAsync(ct); return NoContent(); } -} +} \ No newline at end of file diff --git a/TaskHub/Api/Filters/FromRouteTaskIdAttribute.cs b/TaskHub/Api/Filters/FromRouteTaskIdAttribute.cs new file mode 100644 index 0000000..6b6cae6 --- /dev/null +++ b/TaskHub/Api/Filters/FromRouteTaskIdAttribute.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; + +namespace Api.Filters; + +public class FromRouteTaskIdAttribute : Attribute, IActionFilter +{ + public void OnActionExecuting(ActionExecutingContext context) + { + if (!context.RouteData.Values.TryGetValue("id", out var idObj)) + { + context.Result = new BadRequestObjectResult("Идентификатор задачи не задан"); + return; + } + + string? idString = idObj?.ToString(); + + if (string.IsNullOrWhiteSpace(idString)) + { + context.Result = new BadRequestObjectResult("Идентификатор задачи не задан"); + return; + } + + if (!Guid.TryParse(idString, out var guid)) + { + context.Result = new BadRequestObjectResult("Идентификатор задачи имеет некорректный формат"); + return; + } + + context.HttpContext.Items["TaskId"] = guid; + } + + public void OnActionExecuted(ActionExecutedContext context) { } +} \ No newline at end of file diff --git a/TaskHub/Dal/Migrations/Tasks/20260405200703_CreateTasks.Designer.cs b/TaskHub/Dal/Migrations/Tasks/20260405200703_CreateTasks.Designer.cs new file mode 100644 index 0000000..b47dfff --- /dev/null +++ b/TaskHub/Dal/Migrations/Tasks/20260405200703_CreateTasks.Designer.cs @@ -0,0 +1,50 @@ +// +using System; +using Dal; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Dal.Migrations.Tasks +{ + [DbContext(typeof(TaskDbContext))] + [Migration("20260405200703_CreateTasks")] + partial class CreateTasks + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Dal.Entities.TaskEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedByUserId") + .HasColumnType("uuid"); + + b.Property("CreatedUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Tasks"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TaskHub/Dal/Migrations/Tasks/20260405200703_CreateTasks.cs b/TaskHub/Dal/Migrations/Tasks/20260405200703_CreateTasks.cs new file mode 100644 index 0000000..abce812 --- /dev/null +++ b/TaskHub/Dal/Migrations/Tasks/20260405200703_CreateTasks.cs @@ -0,0 +1,36 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Dal.Migrations.Tasks +{ + /// + public partial class CreateTasks : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Tasks", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Title = table.Column(type: "text", nullable: true), + CreatedByUserId = table.Column(type: "uuid", nullable: false), + CreatedUtc = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Tasks", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Tasks"); + } + } +} diff --git a/TaskHub/Dal/Migrations/Tasks/TaskDbContextModelSnapshot.cs b/TaskHub/Dal/Migrations/Tasks/TaskDbContextModelSnapshot.cs new file mode 100644 index 0000000..9256b64 --- /dev/null +++ b/TaskHub/Dal/Migrations/Tasks/TaskDbContextModelSnapshot.cs @@ -0,0 +1,47 @@ +// +using System; +using Dal; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Dal.Migrations.Tasks +{ + [DbContext(typeof(TaskDbContext))] + partial class TaskDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Dal.Entities.TaskEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedByUserId") + .HasColumnType("uuid"); + + b.Property("CreatedUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Tasks"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TaskHub/Dal/Migrations/Users/20260405203233_CreateUsers.Designer.cs b/TaskHub/Dal/Migrations/Users/20260405203233_CreateUsers.Designer.cs new file mode 100644 index 0000000..bd48a9a --- /dev/null +++ b/TaskHub/Dal/Migrations/Users/20260405203233_CreateUsers.Designer.cs @@ -0,0 +1,50 @@ +// +using System; +using Dal.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Dal.Migrations.Users +{ + [DbContext(typeof(UserDbContext))] + [Migration("20260405203233_CreateUsers")] + partial class CreateUsers + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Dal.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("LastActivityUtc") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_activity_utc"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("users", (string)null); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TaskHub/Dal/Migrations/Users/20260405203233_CreateUsers.cs b/TaskHub/Dal/Migrations/Users/20260405203233_CreateUsers.cs new file mode 100644 index 0000000..2932ed2 --- /dev/null +++ b/TaskHub/Dal/Migrations/Users/20260405203233_CreateUsers.cs @@ -0,0 +1,35 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Dal.Migrations.Users +{ + /// + public partial class CreateUsers : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "users", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + name = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + last_activity_utc = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_users", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "users"); + } + } +} diff --git a/TaskHub/Dal/Migrations/Users/UserDbContextModelSnapshot.cs b/TaskHub/Dal/Migrations/Users/UserDbContextModelSnapshot.cs new file mode 100644 index 0000000..d673cf2 --- /dev/null +++ b/TaskHub/Dal/Migrations/Users/UserDbContextModelSnapshot.cs @@ -0,0 +1,47 @@ +// +using System; +using Dal.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Dal.Migrations.Users +{ + [DbContext(typeof(UserDbContext))] + partial class UserDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Dal.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("LastActivityUtc") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_activity_utc"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("users", (string)null); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8d3ee0f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,17 @@ +version: '3.8' + +services: + postgres: + image: postgres:15 + container_name: taskhub_postgres + environment: + POSTGRES_DB: taskhub + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + +volumes: + postgres_data: \ No newline at end of file From c695ff6075e6fb774123ded73569b83cab542e70 Mon Sep 17 00:00:00 2001 From: Meowmeow-me8ow Date: Mon, 6 Apr 2026 13:06:33 +0400 Subject: [PATCH 6/6] homework-5 --- 5,1.png | Bin 0 -> 44134 bytes 5,2.png | Bin 0 -> 35974 bytes 5,3.png | Bin 0 -> 34274 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 5,1.png create mode 100644 5,2.png create mode 100644 5,3.png diff --git a/5,1.png b/5,1.png new file mode 100644 index 0000000000000000000000000000000000000000..848b1da8b35ee28c5e0428a35fc7d80ad74f6026 GIT binary patch literal 44134 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�>$L&`G>rfm2JG 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 NceNheL2B3r{SWMP=05-c literal 0 HcmV?d00001 diff --git a/5,2.png b/5,2.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0e98250b5837e4cf6963b43f853506f319f8f6 GIT binary patch literal 35974 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 literal 0 HcmV?d00001 diff --git a/5,3.png b/5,3.png new file mode 100644 index 0000000000000000000000000000000000000000..fdac4073d4f87bf4001365c0979aa4dd116194d8 GIT binary patch literal 34274 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

ngM}@A`~~eyTT2Q+{a4 z`(BnyG;yKiHDoDSU)%O`4>y^sldIH_%S4}$vqTi{p}p{Y_hv!gZRBF^FpyZASF+|0 z;e*H&6{pj$48UK4wy)1b%WGDVk3<(aYE37Lge-0Er8U?VUg^ksKVH z7q+94Klu=iZO=P96Jyf}V0Ed((u)A6{eEs;a74rEa8aa%mqV6vGNQ75?#;TWxX$Qi zMovy7X=GYpdp;m{=bHdtus2o81+k6AvU%Ph`Pm89C2oT0Uw3+ThI*I8dg;MU0acP~ z!XJ3&3seo7pmLAX4ikw*x3Cdzw6IWT8Ah7PJ6xLZjK)FJMx?%*{S4^icJUTO>Z6^i z#(q8K=fGOv65-K8G3z4q31M=YAs2q5>l6SOEe7P3G7;hPxX)R14$Mko1)Ah}!Q25(>F3c@OpMJ+(oDBnOFJfE#mup-C7w@!Bb1eC1YKn-mw+hrd(be(le6?JYZ@jKdn(Jl&|T zVg1$}xvj>Vmb=JJgi5*U7nEGoIXTGt)3S(UidqXHCu)&F?VmLvWSFU?B&vt|KX71O z&$%iGJE>zRhDR zXiCwlSGWrcDi5Pb3>n`gB>BTel#Jj=U#*)^yhM8L!vUl&D*2RgE1(?V=o7rVJ;ZYc z1h%W(sD0Vqb}YM0s~+Jp$E8>r-PLKD7DM%6wh$jzh}=vNX{q6=(O-$Il8lpRy&od7iF2NDNv*{d^Z?2`CtNL{$saVCFkJ6tX1F54(FAfGuj@l@`(gKHQ$?-FPPV!k`0@{q zE4SvCfv)k>HmW|BgU_}Z};&DE^6Dg zmuvj*m=M_I|Mu+g1(8JVd!NwK`kf&UykFMxs@QesYb!xVKInlnxDVe>RkS$Ftvqsn z_Qt%bDd^JjLMlCx{p|_+?_MqpmyO$Dp|<|{O5OhsPu%wJ2?Ec)>>vX3vT8V@^Ji!8 zT-lwwGv*p#)@!55u|<9#FqesCCwh2TdUn&=$A!glZw!Zgel`jhdDKM69h{qtitf5! zQo!3xfl$=3|5n|1hBdjZZMt=<`+$OOL8M!@g)U03DjORD3WU%?6hx#OT7VF+fl4SU zQltb00U`7bp{Nj|lthJqkU%660tA8~KnQi-1U={5-|RW_%{4RET*EKmN?GrE-}S8L zxu5&KSD~`p51CnugKwsxUZ1kVF0*vb+^r|?hP{#*ahWN1zYn@M&5Qw#D66!^u1xZ_ zG5%XOwc>m|Owu-D5?VK3;-iqfPzYOij664G@zhA;tof z?LfXk1coc4??JVK7=aF9D8&;&Z@u=4_fHuRRXwF-3vP#WM~@`O3MM^pK;;@cZ{7

vW#B?ua-C;Kk5t38Z=RUv|N(r zuz3 zuZ4aDeIS3VtOeK)jYcl-dOx^XQm-6Ei|vV7wI;Cz;wyDM3#0N$c>{oOJj+-RXE@oe zq-xbqsu=tbe3fEUom+GWE#HUt1=xE^d?MWo+5ar*Lv_cf@ZNJf`q#PyGdS>ZL79+* z-A&Iau)Rs9P)JJ$9$-B5w_>HW0+}2~85`La+4?l?WJrn$nR(C+4^n#gN!>MAB-8q8 z#+bgN{f^ke-M$!+ zedtV|jItk?wMV8$)knwO-RqHp#Avx$XAE6Tip$s zJ0W*s;pRa%6sEb&Jdysbe79F}sUik}kr)I48ZZ?Fxd@G|^(y6oSCB;7r%%rm;r-h9 z=&E{ukiDUk0^zx8g*Qn2b4gL8y7MaPJ8%;)g^Khwn{`{YF-JL+-n~)ZY1IaRQ*k3j zzGh9Z8gGxdYd3x^+554kZ92<*S{@h_5hB&&Z}yNQQQcOB@i(SBJ#wmkow~;|!Dq_e z0A^cAfyi;J7qJF~yY$jS>^-+UVU*ZA+o}>XpWc{7O?j#)#?;%~aUziJG6S2?4%V0I zUx)t!1zXZqT$+uXqqW%;g<+xH*;_$6&Yn{v6!GhVCvZyc?}2ZVf-{S0qw3RzhjkY> zgkt-rqJQ?s(hV^`lmw?=Zv67^+vNZ1X8(oi|Nli_;NL=!`v7+}eywm+uHi7@133;z zg)I$siz3S(42TZ@E-D@XN1pH#y)!&BpHVmZ(uKte9ks28!u&>`;9ahrye3QjWeZ!M`vI#rvzno1 zWP>CS5EvuJ(6#898nR|*K<`)>LO|sBXsn2W_ip!l1W!QOEq^>mk2mO@NIXfady-CP zBN!>^9ICOx5pxGAug>DrbJYp$3W-N>J1xBlTUtM?=wRw(lEV9`!wzWwI23&k6=VW5b1>SW3%# z0XsHB4*>l9Hr>6&4-ST(#rBwQQ@K*wQSd|BK!?Ek%fJhxOhk=oF$%U@!{oi zf5cv*xN&@lwH|p5qp}bnxa-eN70fn`YrUsR`6l@J3gQGGHZN($M zx9QZhBo!Hgq6ppBT!pllV@J&O4nH6cDFwn`Jgo{5A?7k}MY6^4O;{l{6w}GdwknS^ zv@5|+PX46-zA%D>u?#-WN!rY-zw?go4Apc!gM)*gV}GOLJHvEniGFG($T!s&|pu{ew5R2@n8A{K+h?-zGFj3R^fy`^}g3M%+ zI03iEUT>mEag$mzS=3T$pq1P2HcV#Toua+YwfvL43bk^=EOs5rLgfavw9a<`O|wON z7-dn>T&*Ny^RyZ5VgBcJ+1S`a5tV}y{O2jS_qz}ZQS@bKYxSv;m!3gB2DQ5WZr-Ax ztm^M&58jmQ&_~n*`q;WG5H1e%ayKXP8Lc1CLGSn#QGXVR^Rz!qh8j}9L7DRSoY6&D z_PF)LOPMR%YCv0=i>XgaNM=z%ME~1RVGHSuJxAqER-|+=72hNTRmThhtsqHn;%lRs zP<%4taP=lGwtleYsQxVE4@grk=1t8F1n~f_gJ2Yg5U*Z9J%TQ1-an;agywCute}xED-IzB3(P)i`bnpnLi5&jxkA zt+mbnf^2@^UtjF0&885ug)+Q;@g2DPYDq-j@zK;*_>;|xir>xq3pbN3$e|)${ke}@ zN(|2`fN$rQ=~LZTJ9&j#N2(t;n@Qd^UJo&VhZHK7DrQifmoEhgaJ}kLYKV*k-Ux0& z%A;u~9AjM%Fz9!z7L!$d^kh7C_;c>^1&7QWMoi!E@;+{n zZMlQ+7A7XVQ;|-&>*}bxqwCIi$?JFR4hduj(oBL>p>1c)9=GuU>cY0Bd1Zp({o2s8 z9_w@24S0IAvxC|n5Mr%ueMZWO@1=K#9UeC1P)&0^r!NavVVU!~E8|5c&a>8Lo2(=? zz$*F;gC29U{%tNRt%+94kIr#UWzH?9lJk0N&FWnT5>S@Iq?(*^D}jbSm;&_h^P5Z3 z5fKH0{YFw$2zZ&ehK*{hk2?)|;>eVBT+goS4Za#+5J6s8V%c8vWS|D5=KAn;doyg+ z?qi0`?0-Sb+rv!Qp`Kg=SIVHB1M>mdr=&7%elnN6IOg;ZL+-;xSh;1s4Ing4H*y!! z=tPEvOFE|XF1?sc$|$*F@L*iXTiW?!-$%KF6TnttK479#Q_xZ3a8XPtQ!SGTRLEWr zX*?NciepRIA?_#ZhU4qQ_)h09^J;Zi`XOpub^YeWN7iT*o~c-~93hg#o3V@>d5m^l zLwf>{t!jN1Y`Q*g;Sl-P0o)9o-<_^#`jaGbeZ_;sEuWjD!N(hI3^O-RtTdu>i)<_+ z2VjvfhT*CRKUlr7*!S;%xnsF67M|*`c)rCugKY=4?Qd{)u|2vqCPjurkBEN0BX49C zVl%CkU6Le7Vs|{--dua4bQ<83^A|M0Ro?%O)>P#VWBDi@6I3eWDM;E6^1__?e?>Y>#DU zXB4+RZ$l>dhNb-nP;KZ-v`sVf+Z&ft+K^!LIJ*`dqX2g^^hS~gm;SrKdVVc(K7Mjc z4V4;9dYY<#STy(|2+!AOlKOrWYVbIGZ|dGo*MX&Vv6=9m7CcupRlGKW6}t~KbtO|f z>Z1g%Eh5YPhgosKU}-InE}yxFq1JI{;Y*3v*`k=Je24@NuP`5xsX-1YHi!3RR(>gM zm^s5~Qs>^q?XGk;?a9WG>hmE|T!@x#aS)-jphhZ--jPn5<5zJF0RpnZ)a?V)_Kj0% z&(&)kP1%!M6~0av>N!{5v`}_>el&63i$30os$Vvii1hCmcfsmvJ==q!jXW!~NOy|P zSv9sqUUtflXy)ae=rw;ih2%n|diZo~i6TX~W7GbvI8qQ$KsMA7?%EAHS%CD2)-n=+ zXNEf_SsHX%2FB_pX%b|y24iq9eEE&gHeFt0xi`$n&rErBie{I%nd#y?Ts0@-7en$; zjCv0kDr{j669hhPALUJc-)q^Zyfr^bjE0VI5YfkOZB}>luZMD$8cu~yU4Vs)z|Uod zSOF9u_AQ}1fEk6-t$cHHQmuY4T8`9R>Wo$l%5VSRHqZK|qnlZz0|x&Fj6)*pTI&Gl zJb9N99PRF(k$8qWpU@UFmTXtvSeHVm=a*WfczXQODa6!xMObL>7dFn=kv0*%D-4zq zInty)Rw1SZCbg!^A^+$TW9aePYz7SYE)(*3g3@7*x(l?|GQPfEv8KXcEdS!rSn@H> zN4Ngb6e?(1w$J;uzn z@Gu#Sc5$&6PshYs=lb@HAESTj&C;$;c&$?H+(dp)s_fj0&lYR$Q+xzpG(aj4G__W{ zR8;g*D8h9Uv37R8`8A>*`?ph(o-sK+%{xgS^sjc90)%~HN!aPHsp=q87-=xOX72M1 z!R5XXHQBW{U*cU5s5Mv-;~ju{;D#xjq|8;+xKN{=TZe3lk2$z>FF6RuT*ni8QXW}b zANKQwU%{@Q*kz$sjzK1WQm4-rcGSH*SXWuyR#wwGR4Up}vL@N?&& zKWV0|a~3u5*(t)FOljWSONq(Gk(K4Pmp6z->&e3s4GaVx$s`pCc+|9&$N8Qap1fE;O zsBVw&+ENgpApl^}vwvGVmb+TH&BWh-!+*)9R{Z0I9{^H_)rLjK?Z0v<|7UI&f?NH+ zgEsw_7;M)7vavaw@CeXa+t*UWFdPcOQCzsEUf>e+q-m&z2-}`D3do=My7nA6Mxr;f zR_6%BeWb%*5X!#@@4R4_aTm`QV;%da80&+`zQ0%;^;AxsyUOPsHr)sv9w)bTey#`f z-y1slFW8+Cc7R7gYKwC5rMOVHI(uQA9y>Eia|p>@R zr!2)mL-Kekj8~MptJC!g!@XO)KePaCtseZAW@lYgY_E~e8R#=6E(wiBchFc3hOXjx z{w*nENCUPT^RtCdg9btKphDfRG8>{P&1ak6%iIWd2!@!T9`)XRDTG$)EU8zW)Iu1X z6FSRXI$r4!s3C6L=Y8I7kZ-|4tAFK=SbtgvNaAU_xk9WD>fA9gMZg0HFf2$xBZOxA z!OKHnf=U9<@YlJx7*1qONIP$Zlb1VlZTsL={!lixe%}88r}C-MXf;FXsHMX820nGs zm~RA$7%P0wYZt^oHZngS zrcoO60Of9UZSvdfK)fFNRqEw%QA=(w%eBK424%~7p9i%K-CLSgXinh(fL;4duwchU zL>&lw3z!$PDzyRHrcP~PDiZKxcvWPChD5#XW;(`1R{a?o1Gs-=ID7~2FUf8F-d`?9 zedsJHs6PKb3C~P-HPNjUJth|@gzU84Ga>nHS6z7YP_J{cwz2B;j=tJbCPHBgJunVA zzV#men#*dXzLkXpYK#uIk!@;{k$zs&!fCW||CYBEO=V%CDfj07;hGk6ZlIUsnO#&; zk{p$JAlw|VO&Yd}p2;jewWI|4qaWm(|8emo0_k^?|B1k(6XwQlD*%amxsx@6pGNRm3aR5-Zt#}dnEU8 z(=8thit~ah%NN-414R50VQ(Q%6`=usbg^)B*79EM*V8>@-8_gx(?=h*kDQaKQXHwJ zZTY8anWK>k23d|Ztk=t`pHE^9XeTp?UV)ePk*$ir#1r%C=oaNHIAF~MSRh~tJ*&Di zrbIzuw*Ug7Gq`4_E_QoHRK)$qn9g054q3+$wi+r9GM$r~M|}uaj0Hu~sf1|dpOCiH z+=kWMrX7+07U%gtkd*yDcMbYW9KH6il_oH9=Nq^Umw5lMb8F;BzK~qKynu+eg$4pF z>CGw0&t)M!nZkTaj+`3;S2Q+&!5@Y}%PD#YpDq9c{_-pz@M7Lmo6uC1ft^_cRH5_z zK6|tT+h&bU2H6)~Q>Zs(n z_yBkFk|VBxU8#neeacXh ze-||#w7R5?PunMNZXT+rpmn78-F5ymx@lY6$NM;?nMY(iAx3ikrC#S!%K`Id=cD-8&z{8?uBBQx~1T;5GF z>CF`?xbakVglCa`pk+~s$U}3uYP?(ZaUh#XH7o{XxEXgxUmZ?Xb&%VWXAyrTR8TP8 zhG=W3)iFDtp=f;rUak@Lp#~=jPz|FoBrBG1JcQ;3c<(VwnT40+5FW|~h`=9}!2W+K zkp3fPE2t9QG`nzrlr3fCzb{*kPqotWn|V=obKOTdeaGk2%v?XEB)40KR#MTBy<7l= zW4Bd?Vq4N?;_CCeV|x$~-xyLTcp)4RH1oX#bF#FCbdT;W>5{(p2jqu^6(Xg$v0!m% zdZMx?Ytb6x^X4d;g!xe+& zcc|T^p~%Jqeq3^Z+MixBdk?{9bIh@xfNg%HWv8jS`b?{wFVJd=w0E8<-RQc^wttlj zT9}7X8H9&dLJ|Eyjnc17WX@at77o!Ms+NG(e1QTX86pudQ?wrbV<2k)IlT^%y2OEc z$M54U>70mqPYtgqlv%SX@7?-7(-qoq6dk5Jz1HrTy#oz&c}b0y?QlJO%PuM}rKH@m z33Em_io`_*cu>GyL)f^46yK%j(oR z;1foX6akbzN$=bqHp1*zI+=vnfukCxjVotX8owNhYOwV7j=3PeR_SSwmOW97OAxCv zT5ypGa8O?x@nE;#jE@YRdhT*?Yh@?xc}|`<-GfD>aXVI_54+V*i0EhAm12Dxvijn1 z_EfzS4(p>)H!t>oSvg~nP6$|UxT#2tydlF$>;AOT6S(G1$E9fFtrMDd`KjQ0Sh&R} zJ+!$-__$?Diyk-% z&sx~s6xlqB?(`({MdnM0;e}KJBbmj%i!0Bwg9MxVG%oO@lzci7#p^rBRoWBS%nw@B zWf3`QK@l1)#VJWk+ui^q5)@9=hq$C!>m&FoJ2_DXqc=++J{iwCErP;UKM7el`e|kM z{mn3rG-el1(+{=B@;#_E_h?S2Yn!xX>TbN4<2>ktrQzE3D!KXiR2%fGUYmiQek!LV_^|6B4f;p z3g;9(G!3Zvhh@KVgDM(5R8723lSJm#SPES$wI>I~4+c%Xn-0uuXJ|L?2$jx)HZ>bV zc}|_1f&xQ_qTEKkMe(l?#nq5h|0~syDf=3Q0wk53*n-My=sUv66XdBh!@&tUW?|2s z8(9M;%xB3ro#oZ9U0M>(@zE@`q?$)A@Hd4QE!(sKHdJ2lwmRKE2}#wK#Xj*mo@Zow zilstUqh0bV6zd(wog``&`cBqeYuxe7tKXcvXO#Dutx#10k~s$nnw_f52Z35f4f_kz z5z7Xo8&(jm4;$*q;N22Gp>1QA!nIz`(9bWD@p=8Nt5b_qKfnGcqI+BiZVP!_H;b-A zB83h!mt-yLkBym|9q@Dg+8X~e&K5{Gi_{$dX^Wi-XbOQwJiOv}2x8I-Yv zi*B~wmu51lYVGRmer#}B256vXyD8`t>*w*?sSD#iWU))wDxva3m#hJtJG3$!#2e5q zhB~eUglhyj*VYjjlkdI|nBMEWpotj(V~$H*%|nh`Zc zn+d=8&dxU2QK#cVAtO_X?95*Ix@RTn?}iFLFP0rD^n%+iCQl!e(!5VtMJhmi3qDo4 z(;ms^E>GY?mp(FuSq!2DIb35AS)8R^;JoQR0#Fmv~|cMho;g`u4-`+)?gv@{RyFi`Unfknxdoy1FU z*Pq+4k-Sq)e~9vTDTrp>H8v2}iqDZ8^urIJzpT_Osue)~G}#J++;VDJPjHsU%Ye|i z-`i8?Shcv9(kV#{p7FZB-K7q3>^byzXvf;SYOh}B6Y#FZyo#f<*=no%Mf6|lXl-pS z$ktv}E``cVNi4U(9U99QvKtyWz2IN{tZ^%S|8Sf6cJ%WaZ!40t`mMZy?HZ36S~q0V zQeB!1-X8z#`r4qb<3&}oVuR!N=Y`gO0LJB=4vX-~@=?sMbtmr%e~@%w8Zhm%n=Tw@ z4JXzKB}yAv4g}P}_1AcX!3Rbo3bff(z40`Dryf1*k?87cWVs6ej1Z1v1ZVb z_tzJ36+MAD0FFQT+md02S{b*y0vW^REy@B6oy(xuxk z?p)53pg<%(B`~!Lm!|TXKY*x1uk^s2sipF146E|+k#F=4qqhZ6n2Bc4P(6M)5wR2Q zHGSErwbw*9jvE+Rzn#5gA4e>)4vKRt*m{=j-9ERl5`39U>?bMdQX{$3RuFmmoJ=TLAi4M25Npnrf3D~HigA)DnPm+X&p2FAKZSQ23+1C6A*$Np~cI@1AiI}i2ZefqJN$X`?6ZB2*`z~`YW zwS%I3mHc9O6S+Q>+jH{0BX$o}Fr~sMCC;}XymyrW9gjfcjW3rH>G|frUQoWbH86qh|lZI%T~QS6v(*SZiFvzsdsdYn;i{U-RT6MUv!Su zL)c#OT8u!s2Y1g#&y*N1^C$VE@!;htj~Y(a_oEY|@CoCVnR3vnfsPmDfFS}eYfi0G z+AYZ)DSSuF*LOK-L> zeCM)YH?&2-^t;OVPe!ml$N1N{>8COI{}Rsse?g2)GwjOKXS4xl;81Qn=a+`Aem#7G zlM!9eN2sVQbk{zbti=$NMlTY}LJ~Ce2u-2$~1_O)it4{qU0K}#=uCbl3{=}3C zWg#HtB8;AM-3d_%TeWei($c=-cE6aYAkIAA6u|gvgPmHPz@syt39bM@9$K^9q+xrC z8<9o!jMx7h)Pa=7+>^!>GfN@sp^P?J>DjB-(iQ0|yoF&QAO8G}rEK;TpM2?YQ_k*Y4=0UU+Di@pRso zTfss;%aK_-`L^3B*A@Za(O{T7Q~r^7w@SH7sM(NHGv8Z0p4JRjgF45W#|@0S%gEv_ zi_HDc=bl7n>)1hvf`RaVRJF|tYy0vF169Yk5)8jnD<5pQfXUE0cO-Oz@VvlQ9U?N zQfDSrMy}K^e&^6#ft&IdiGQHD*MW@|@VeF7S}yFLf;dpUws$!~Fv5MYIHF0^WG*3q_GXQDkJ~QewA3+6aa)3F5 z36)g8;NOL-)FaBntss>HLY;fTs}a(JN*c}YizAS|11X>p9~0AC#r?McPfeTZTjzZg zY9?k744PeXVY<7yYAvFFeim!4@VdFN@C5pJUIFl3SA12TILE;8*)*e$>gc~(^n!Wun@G~-itZG)OymNP2r-Q$+@mo{~7|_JiZ!U~Pv<^ZSpjhSQS_4$68@&adV2r~*uN|eXbu)OTl)M)FV@7lsm6r!;@zvFE&O*}oyo08MOp(Z zS{tlknTp)dZvzKs{Q&)K{^Er8KWK0M^SG#g84Upf(j8!9q2|=femzM=^-3-{MaW*PDO}l;$51V+ER}ld;G*{LA!V=$4V>p#JgwW zd0n^m|AyioFUYn#FCZ5Fp`di>`N*kVduOg$F$G<@+i7O6U+;35~^n=k1ZRc8wBx4Ae|K zJ5-kcpBKh}M`@PuJuwtHbQ^^>l%K9nAm6*8Vod)UtD#_B^De04_9a*!&i$wwcZ z;>)#Bsdn|G!*LLv)Xsn=4;`>W1A0P>_`3NW79eiv(@BgHpZ-V*Lqn|5Gw#qluOpyW zzUO;=gOPP<^rY@LVt>!fAN&DtF|lh*c@F0SJg`uoqM?lKdOq=Z35ytM^y~EVcgP;+ zp3xJJn8)NY+wrl}_v85F6@Tia0U)d_H}d$b!2VPU;v@yolC2v&(-}j^3o_ajU$|@4 zINSMvZ?DW6Hh(OtjTslyBkThYt=oh1p8(XE(4j$OLM)wN#)U{j9h`C(+bk)Ur#Wjp zUS)hjHMd{(WUbK-S?G$NM=fW5WU{g_0PgG;-l)I*d9}NZs<3=QH~mK7a*<)U1a$dk z#^=yxX&Sp52frd;;)}m+lQ`2h(|T)zIyYr-jXnJBp(L9H+wCRqAVnN~`Poly_aW4i zEX`jVb~7&N*X*-==>fv&=IGQo3k7yg66*2dhHxuvjs)3+?J5r<29ycu3RuQx-8TLC~RWx}(Z!1di zmlz@c(c6Vf2Vhn&FWR1A+FZ#sxcm>fvS-_iE?!A&H;0&=hh^9#AAEgS0<3t%c6Z(7 zQxT_he0T2tEoaK%aZ$dMSM|#Pmf=bLO005ch~$lAs-@IWz)WU6W9oV65|bR@Ql+4+ zT=eC4YWOQ-!kU-Y{voGoy--Sz!g^mN+jh6sIRlQZ`dz!e*Oz4DT#Z%Eg#^FSdboCn zdB3z9)aB?oV<^47WsTO0NMx|2sHRq>Xrl;&C?=0)CV`r%a4R{2?V~_?+TiH18dg}# zgNdMFKoe`6Yz)_P_2j2fgGC z2B{2O{xt=UHvS@IN4&XT%V56#AziKQEtiwq5a5ow%4>d*R%ixq%GmPFziXK|%9JHJ z0ll#|$>P->yjYtdq;m7gZVH5ny;*`*%}Vj>T^fiC4~%{s7+sIe3o}kE3={5OGrUx4 z&AIH!)aI}DH$}gp7|$z9Ek(G^zkA7#`xQ@hJ2$4%D39E>jQtr|TuN8d0R6HKce-?7 z?5W$HPRXgT*L}>J8KF5wpKXX?%FZ`!UTGne(C^LmY4l-KV%y)Z_liIxN?zwRqnD^l zmz}p=W0-JBa3opNWgjL;wvMQ+>s?N>L4({+5 z;e~nR)nnBI<`H%F9RB>h={~HCw#>5;k351#7_KX=$EcXPdDc&z68RNwe8nbNtI)QG zd8kyB+_>ZP#B*b^ygNX3pceVv0vE|r8j9L_A7ek5k?BzegoDS2n~dY*#zuc%yRn~e zsUSY{?3&}uvI`IHYY)>}sI}?tOM$*8m3d^+C98agll!l$8gX2_BUim$o3&$QloWHU zPwDl**|dJqzF}~B`ds7uA=uQm!d&+Ztn{b$nV0DsYQ2OTr>h;B^t810CS5!nEF&3f zD2?Z+G<+Hh^78l6>bS~!TiddSDg6s8uwU4UlopK%_A7L8@^G#FAU)rm ztGcY}D=CNYMH)C9P?qyxEDIS2l6X*bqlMJOBY~kAFwHV@g<*X4Ya1iPt=TA`x+(T49{-7vHM1$@^BMp zf|8agCP(aZ0`IN0?JtS(p*l!sO=2|9S>Q_;BFQP~r4p+6NA3|~%bvvw!~*a(OAdO( znu_9dX2rj}^Kc|UB0JJF49eu>6$47XlU|aJ6$hHj1Kc$5tb)>+=BJhpto|iEarIXl zJo)kaVw;F#B#1@(u(s--nwm39e-^2fn2W?D;?%1+1z&3PXy1tsP+aa%bzP%oh`UIT z1l}+qpI%tE&Z?r|Ms=va`5j8ux=VYt&^Rsak9hjwH0(s#iQq^tubxGRd$j8lt@D%P zAGlsf!wmf3;f>pQoR}*_|4>@O9V>O!kX>deZ|TE>0Y}opx$a-MUJRomh~2&{slm&L zbv2sHMbvg9`}>uSDVD#MucB;Ci<-5QbBPI!U|W&?+{v$Vjn*lhoU=MZp3KXVV)=?+ zPh2&Ynb|urH@i>q-FRX-ci_?YCYZ629Lly|WS%WS>KsK_#J=LNHV(PG9qN1VO-9IJ zrt$iAT)9MVD|O`Lp7d_nwUPDqTb^RS%zUVuJ*{_PWUA0E5L|5EB-2WI*o>V4*omL( zmQIUARgMUUNn_{$*W+O&<3FjgO?$zD>sbidV09zybW7JZCupS1ilQqNY&^r8OB>B56(d&y?i zST_?Tlp<|1w+Cjl^*s{aetEZ68()Fp97><~j-=Ljp&BsO!(^b+=sZJxOCDSVx!WTQ%#rso??4XBqeC)Ur z{*PirBOtcYjLEOfcW^lObEO$wzs%C?(iHDuTG@p3YWhwLSVb*930e%^T^i#fnoJ@T zWVN4=h%?%IF4Ec!hFn1^*;*7`%P^*@{Jh^Jldnq^d*Bo{8CRY@S8PZA-A>fpd0`}} zCr<@syp zhkMMW$IN5>KHq@Pv-9Jo(~PO6Kfgy)5k)13GBGPjOnMj){)^ z_`8e!CE2H56I6KHe8f*r3$y)QWR-8w3jXB@kKz`1jq^~8cI^$nyz&!G0|d?;lXC$W zjz)z^~MEm`ll}( zC4gmDcU-XDZ5mTODYloJN{zf8DYMj}Yn+zL8wN&VR<@}pTI=@%|K%Eg zzq&F+UEePUSq^