From b1a65e63c59c89d4ba03172242551c704d646353 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 15:58:32 +0300 Subject: [PATCH 01/48] test jwt --- backend/user-service/user-service/Dockerfile | 2 +- backend/user-service/user-service/Program.cs | 16 +++++++++++----- .../user-service/user-service.csproj | 6 +++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/backend/user-service/user-service/Dockerfile b/backend/user-service/user-service/Dockerfile index 2ac8c86..17b39e0 100644 --- a/backend/user-service/user-service/Dockerfile +++ b/backend/user-service/user-service/Dockerfile @@ -6,4 +6,4 @@ RUN dotnet publish -c Release -o /app FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app . -ENTRYPOINT ["dotnet", "user-service.dll"] +ENTRYPOINT ["dotnet", "user-service.dll"] \ No newline at end of file diff --git a/backend/user-service/user-service/Program.cs b/backend/user-service/user-service/Program.cs index ddb667a..9ca7e3b 100644 --- a/backend/user-service/user-service/Program.cs +++ b/backend/user-service/user-service/Program.cs @@ -1,7 +1,13 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Hosting; +using UserService.Services; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); +builder.Services.AddScoped(); + +var app = builder.Build(); + +app.UseRouting(); +app.MapControllers(); -var app = WebApplication.Create(args); -app.MapGet("/", () => "Hello from Kestrel!"); app.Run(); diff --git a/backend/user-service/user-service/user-service.csproj b/backend/user-service/user-service/user-service.csproj index 1b28a01..72d22df 100644 --- a/backend/user-service/user-service/user-service.csproj +++ b/backend/user-service/user-service/user-service.csproj @@ -6,4 +6,8 @@ enable - + + + + + \ No newline at end of file From e35424d6898f50a89e3852e605a5d46dffdc2f9d Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 16:12:03 +0300 Subject: [PATCH 02/48] Good --- backend/user-service/user-service-docs.md | 2 +- backend/user-service/user-service/Dockerfile | 9 --------- backend/user-service/user-service/Program.cs | 13 ------------- .../user-service/Properties/launchSettings.json | 12 ++++++++++++ .../user-service/user-service/user-service.csproj | 13 ------------- 5 files changed, 13 insertions(+), 36 deletions(-) delete mode 100644 backend/user-service/user-service/Dockerfile delete mode 100644 backend/user-service/user-service/Program.cs create mode 100644 backend/user-service/user-service/Properties/launchSettings.json delete mode 100644 backend/user-service/user-service/user-service.csproj diff --git a/backend/user-service/user-service-docs.md b/backend/user-service/user-service-docs.md index 9be9bcf..a1672e4 100644 --- a/backend/user-service/user-service-docs.md +++ b/backend/user-service/user-service-docs.md @@ -1 +1 @@ -Nothing \ No newline at end of file +JWT \ No newline at end of file diff --git a/backend/user-service/user-service/Dockerfile b/backend/user-service/user-service/Dockerfile deleted file mode 100644 index 17b39e0..0000000 --- a/backend/user-service/user-service/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build -WORKDIR /src -COPY . . -RUN dotnet publish -c Release -o /app - -FROM mcr.microsoft.com/dotnet/aspnet:8.0 -WORKDIR /app -COPY --from=build /app . -ENTRYPOINT ["dotnet", "user-service.dll"] \ No newline at end of file diff --git a/backend/user-service/user-service/Program.cs b/backend/user-service/user-service/Program.cs deleted file mode 100644 index 9ca7e3b..0000000 --- a/backend/user-service/user-service/Program.cs +++ /dev/null @@ -1,13 +0,0 @@ -using UserService.Services; - -var builder = WebApplication.CreateBuilder(args); - -builder.Services.AddControllers(); -builder.Services.AddScoped(); - -var app = builder.Build(); - -app.UseRouting(); -app.MapControllers(); - -app.Run(); diff --git a/backend/user-service/user-service/Properties/launchSettings.json b/backend/user-service/user-service/Properties/launchSettings.json new file mode 100644 index 0000000..d19ef5c --- /dev/null +++ b/backend/user-service/user-service/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "user-service": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:55348;http://localhost:55349" + } + } +} \ No newline at end of file diff --git a/backend/user-service/user-service/user-service.csproj b/backend/user-service/user-service/user-service.csproj deleted file mode 100644 index 72d22df..0000000 --- a/backend/user-service/user-service/user-service.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net8.0 - enable - enable - - - - - - - \ No newline at end of file From 843355a152174a77f6a3b6c990b53c34c8bcaf06 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 16:16:08 +0300 Subject: [PATCH 03/48] fix: proper tracked files only --- .../Controllers/ControllerGetUsers.cs | 27 ++++++++ backend/user-service/user-service/Dockerfile | 9 +++ backend/user-service/user-service/Program.cs | 13 ++++ .../Properties/launchSettings.json | 12 ---- .../Services/ITokenPacketProcessorService.cs | 6 ++ .../Services/TokenPacketProcessorService.cs | 62 +++++++++++++++++++ .../user-service/appsettings.json | 5 ++ .../user-service/docker-compose.yml | 9 +++ .../user-service/user-service.csproj | 13 ++++ 9 files changed, 144 insertions(+), 12 deletions(-) create mode 100644 backend/user-service/user-service/Controllers/ControllerGetUsers.cs create mode 100644 backend/user-service/user-service/Dockerfile create mode 100644 backend/user-service/user-service/Program.cs delete mode 100644 backend/user-service/user-service/Properties/launchSettings.json create mode 100644 backend/user-service/user-service/Services/ITokenPacketProcessorService.cs create mode 100644 backend/user-service/user-service/Services/TokenPacketProcessorService.cs create mode 100644 backend/user-service/user-service/appsettings.json create mode 100644 backend/user-service/user-service/docker-compose.yml create mode 100644 backend/user-service/user-service/user-service.csproj diff --git a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs new file mode 100644 index 0000000..53219b5 --- /dev/null +++ b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Mvc; +using UserService.Services; + +namespace UserService.Controllers; + +[ApiController] +[Route("api/admin/get_users")] +public class ControllerGetUsers : ControllerBase +{ + private readonly ITokenPacketProcessorService _tokenService; + + public ControllerGetUsers(ITokenPacketProcessorService tokenService) + { + _tokenService = tokenService; + } + + [HttpGet] + public IActionResult GetUsers() + { + if (_tokenService.TryValidateToken(Request, out var userId)) + { + return Ok(new { message = "OK", userId }); + } + + return Unauthorized(new { message = "Invalid token" }); + } +} diff --git a/backend/user-service/user-service/Dockerfile b/backend/user-service/user-service/Dockerfile new file mode 100644 index 0000000..17b39e0 --- /dev/null +++ b/backend/user-service/user-service/Dockerfile @@ -0,0 +1,9 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /src +COPY . . +RUN dotnet publish -c Release -o /app + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 +WORKDIR /app +COPY --from=build /app . +ENTRYPOINT ["dotnet", "user-service.dll"] \ No newline at end of file diff --git a/backend/user-service/user-service/Program.cs b/backend/user-service/user-service/Program.cs new file mode 100644 index 0000000..9ca7e3b --- /dev/null +++ b/backend/user-service/user-service/Program.cs @@ -0,0 +1,13 @@ +using UserService.Services; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); +builder.Services.AddScoped(); + +var app = builder.Build(); + +app.UseRouting(); +app.MapControllers(); + +app.Run(); diff --git a/backend/user-service/user-service/Properties/launchSettings.json b/backend/user-service/user-service/Properties/launchSettings.json deleted file mode 100644 index d19ef5c..0000000 --- a/backend/user-service/user-service/Properties/launchSettings.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "profiles": { - "user-service": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:55348;http://localhost:55349" - } - } -} \ No newline at end of file diff --git a/backend/user-service/user-service/Services/ITokenPacketProcessorService.cs b/backend/user-service/user-service/Services/ITokenPacketProcessorService.cs new file mode 100644 index 0000000..78fdb30 --- /dev/null +++ b/backend/user-service/user-service/Services/ITokenPacketProcessorService.cs @@ -0,0 +1,6 @@ +namespace UserService.Services; + +public interface ITokenPacketProcessorService +{ + bool TryValidateToken(HttpRequest request, out Guid userId); +} \ No newline at end of file diff --git a/backend/user-service/user-service/Services/TokenPacketProcessorService.cs b/backend/user-service/user-service/Services/TokenPacketProcessorService.cs new file mode 100644 index 0000000..acefd22 --- /dev/null +++ b/backend/user-service/user-service/Services/TokenPacketProcessorService.cs @@ -0,0 +1,62 @@ +using Microsoft.IdentityModel.Tokens; + +using System.IdentityModel.Tokens.Jwt; + +using System.Security.Claims; +using System.Security.Cryptography; + +namespace UserService.Services; + +public class TokenPacketProcessorService : ITokenPacketProcessorService +{ + private readonly IConfiguration _configuration; + private readonly TokenValidationParameters _validationParameters; + + public TokenPacketProcessorService(IConfiguration configuration) + { + _configuration = configuration; + + var publicKeyPath = _configuration["Jwt:PublicKeyPath"]; + var publicKeyText = File.ReadAllText(publicKeyPath!); + + var rsa = RSA.Create(); + rsa.ImportFromPem(publicKeyText.ToCharArray()); + + _validationParameters = new TokenValidationParameters + { + ValidateIssuer = false, + ValidateAudience = false, + ValidateLifetime = true, + ValidateIssuerSigningKey = true, + IssuerSigningKey = new RsaSecurityKey(rsa) + }; + } + + public bool TryValidateToken(HttpRequest request, out Guid userId) + { + userId = Guid.Empty; + + if (!request.Headers.TryGetValue("Authorization", out var authHeader)) + return false; + + var token = authHeader.ToString().Replace("Bearer ", ""); + + var handler = new JwtSecurityTokenHandler(); + + try + { + var principal = handler.ValidateToken(token, _validationParameters, out var _); + var userIdClaim = principal.FindFirst(ClaimTypes.NameIdentifier); + + if (userIdClaim != null && Guid.TryParse(userIdClaim.Value, out var parsedId)) + { + userId = parsedId; + return true; + } + } + catch + { } + + return false; + } +} diff --git a/backend/user-service/user-service/appsettings.json b/backend/user-service/user-service/appsettings.json new file mode 100644 index 0000000..6b51d66 --- /dev/null +++ b/backend/user-service/user-service/appsettings.json @@ -0,0 +1,5 @@ +{ + "Jwt": { + "PublicKeyPath": "public.pem" + } +} diff --git a/backend/user-service/user-service/docker-compose.yml b/backend/user-service/user-service/docker-compose.yml new file mode 100644 index 0000000..673a7b2 --- /dev/null +++ b/backend/user-service/user-service/docker-compose.yml @@ -0,0 +1,9 @@ +version: '3.8' + +services: + user-service: + build: + context: . + dockerfile: Dockerfile + ports: + - "5000:80" \ No newline at end of file diff --git a/backend/user-service/user-service/user-service.csproj b/backend/user-service/user-service/user-service.csproj new file mode 100644 index 0000000..72d22df --- /dev/null +++ b/backend/user-service/user-service/user-service.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + \ No newline at end of file From 2528ca42ecc2f327bd4cd3b0e91a7fdbfdc48602 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 16:17:35 +0300 Subject: [PATCH 04/48] force: 12-04-2025_16 --- .../Controllers/ControllerGetUsers.cs | 27 -------- backend/user-service/user-service/Dockerfile | 9 --- backend/user-service/user-service/Program.cs | 13 ---- .../Services/ITokenPacketProcessorService.cs | 6 -- .../Services/TokenPacketProcessorService.cs | 62 ------------------- .../user-service/appsettings.json | 5 -- .../user-service/docker-compose.yml | 9 --- .../user-service/user-service.csproj | 13 ---- 8 files changed, 144 deletions(-) delete mode 100644 backend/user-service/user-service/Controllers/ControllerGetUsers.cs delete mode 100644 backend/user-service/user-service/Dockerfile delete mode 100644 backend/user-service/user-service/Program.cs delete mode 100644 backend/user-service/user-service/Services/ITokenPacketProcessorService.cs delete mode 100644 backend/user-service/user-service/Services/TokenPacketProcessorService.cs delete mode 100644 backend/user-service/user-service/appsettings.json delete mode 100644 backend/user-service/user-service/docker-compose.yml delete mode 100644 backend/user-service/user-service/user-service.csproj diff --git a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs deleted file mode 100644 index 53219b5..0000000 --- a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using UserService.Services; - -namespace UserService.Controllers; - -[ApiController] -[Route("api/admin/get_users")] -public class ControllerGetUsers : ControllerBase -{ - private readonly ITokenPacketProcessorService _tokenService; - - public ControllerGetUsers(ITokenPacketProcessorService tokenService) - { - _tokenService = tokenService; - } - - [HttpGet] - public IActionResult GetUsers() - { - if (_tokenService.TryValidateToken(Request, out var userId)) - { - return Ok(new { message = "OK", userId }); - } - - return Unauthorized(new { message = "Invalid token" }); - } -} diff --git a/backend/user-service/user-service/Dockerfile b/backend/user-service/user-service/Dockerfile deleted file mode 100644 index 17b39e0..0000000 --- a/backend/user-service/user-service/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build -WORKDIR /src -COPY . . -RUN dotnet publish -c Release -o /app - -FROM mcr.microsoft.com/dotnet/aspnet:8.0 -WORKDIR /app -COPY --from=build /app . -ENTRYPOINT ["dotnet", "user-service.dll"] \ No newline at end of file diff --git a/backend/user-service/user-service/Program.cs b/backend/user-service/user-service/Program.cs deleted file mode 100644 index 9ca7e3b..0000000 --- a/backend/user-service/user-service/Program.cs +++ /dev/null @@ -1,13 +0,0 @@ -using UserService.Services; - -var builder = WebApplication.CreateBuilder(args); - -builder.Services.AddControllers(); -builder.Services.AddScoped(); - -var app = builder.Build(); - -app.UseRouting(); -app.MapControllers(); - -app.Run(); diff --git a/backend/user-service/user-service/Services/ITokenPacketProcessorService.cs b/backend/user-service/user-service/Services/ITokenPacketProcessorService.cs deleted file mode 100644 index 78fdb30..0000000 --- a/backend/user-service/user-service/Services/ITokenPacketProcessorService.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace UserService.Services; - -public interface ITokenPacketProcessorService -{ - bool TryValidateToken(HttpRequest request, out Guid userId); -} \ No newline at end of file diff --git a/backend/user-service/user-service/Services/TokenPacketProcessorService.cs b/backend/user-service/user-service/Services/TokenPacketProcessorService.cs deleted file mode 100644 index acefd22..0000000 --- a/backend/user-service/user-service/Services/TokenPacketProcessorService.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Microsoft.IdentityModel.Tokens; - -using System.IdentityModel.Tokens.Jwt; - -using System.Security.Claims; -using System.Security.Cryptography; - -namespace UserService.Services; - -public class TokenPacketProcessorService : ITokenPacketProcessorService -{ - private readonly IConfiguration _configuration; - private readonly TokenValidationParameters _validationParameters; - - public TokenPacketProcessorService(IConfiguration configuration) - { - _configuration = configuration; - - var publicKeyPath = _configuration["Jwt:PublicKeyPath"]; - var publicKeyText = File.ReadAllText(publicKeyPath!); - - var rsa = RSA.Create(); - rsa.ImportFromPem(publicKeyText.ToCharArray()); - - _validationParameters = new TokenValidationParameters - { - ValidateIssuer = false, - ValidateAudience = false, - ValidateLifetime = true, - ValidateIssuerSigningKey = true, - IssuerSigningKey = new RsaSecurityKey(rsa) - }; - } - - public bool TryValidateToken(HttpRequest request, out Guid userId) - { - userId = Guid.Empty; - - if (!request.Headers.TryGetValue("Authorization", out var authHeader)) - return false; - - var token = authHeader.ToString().Replace("Bearer ", ""); - - var handler = new JwtSecurityTokenHandler(); - - try - { - var principal = handler.ValidateToken(token, _validationParameters, out var _); - var userIdClaim = principal.FindFirst(ClaimTypes.NameIdentifier); - - if (userIdClaim != null && Guid.TryParse(userIdClaim.Value, out var parsedId)) - { - userId = parsedId; - return true; - } - } - catch - { } - - return false; - } -} diff --git a/backend/user-service/user-service/appsettings.json b/backend/user-service/user-service/appsettings.json deleted file mode 100644 index 6b51d66..0000000 --- a/backend/user-service/user-service/appsettings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Jwt": { - "PublicKeyPath": "public.pem" - } -} diff --git a/backend/user-service/user-service/docker-compose.yml b/backend/user-service/user-service/docker-compose.yml deleted file mode 100644 index 673a7b2..0000000 --- a/backend/user-service/user-service/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: '3.8' - -services: - user-service: - build: - context: . - dockerfile: Dockerfile - ports: - - "5000:80" \ No newline at end of file diff --git a/backend/user-service/user-service/user-service.csproj b/backend/user-service/user-service/user-service.csproj deleted file mode 100644 index 72d22df..0000000 --- a/backend/user-service/user-service/user-service.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net8.0 - enable - enable - - - - - - - \ No newline at end of file From b9ba179ced6a4e4a36a47a33e49d7fa8d186dc0e Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 16:21:49 +0300 Subject: [PATCH 05/48] new --- .../Controllers/ControllerGetUsers.cs | 27 ++++++++ backend/user-service/user-service/Dockerfile | 9 +++ .../user-service/Models/Common/Packet.cs | 8 +++ backend/user-service/user-service/Program.cs | 13 ++++ .../Services/Common/IPacketReaderService.cs | 8 +++ .../Services/Common/PacketReaderService.cs | 6 ++ .../Services/ITokenPacketProcessorService.cs | 6 ++ .../Services/TokenPacketProcessorService.cs | 62 +++++++++++++++++++ .../user-service/appsettings.json | 5 ++ .../user-service/docker-compose.yml | 9 +++ .../user-service/user-service.csproj | 13 ++++ 11 files changed, 166 insertions(+) create mode 100644 backend/user-service/user-service/Controllers/ControllerGetUsers.cs create mode 100644 backend/user-service/user-service/Dockerfile create mode 100644 backend/user-service/user-service/Models/Common/Packet.cs create mode 100644 backend/user-service/user-service/Program.cs create mode 100644 backend/user-service/user-service/Services/Common/IPacketReaderService.cs create mode 100644 backend/user-service/user-service/Services/Common/PacketReaderService.cs create mode 100644 backend/user-service/user-service/Services/ITokenPacketProcessorService.cs create mode 100644 backend/user-service/user-service/Services/TokenPacketProcessorService.cs create mode 100644 backend/user-service/user-service/appsettings.json create mode 100644 backend/user-service/user-service/docker-compose.yml create mode 100644 backend/user-service/user-service/user-service.csproj diff --git a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs new file mode 100644 index 0000000..53219b5 --- /dev/null +++ b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Mvc; +using UserService.Services; + +namespace UserService.Controllers; + +[ApiController] +[Route("api/admin/get_users")] +public class ControllerGetUsers : ControllerBase +{ + private readonly ITokenPacketProcessorService _tokenService; + + public ControllerGetUsers(ITokenPacketProcessorService tokenService) + { + _tokenService = tokenService; + } + + [HttpGet] + public IActionResult GetUsers() + { + if (_tokenService.TryValidateToken(Request, out var userId)) + { + return Ok(new { message = "OK", userId }); + } + + return Unauthorized(new { message = "Invalid token" }); + } +} diff --git a/backend/user-service/user-service/Dockerfile b/backend/user-service/user-service/Dockerfile new file mode 100644 index 0000000..17b39e0 --- /dev/null +++ b/backend/user-service/user-service/Dockerfile @@ -0,0 +1,9 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /src +COPY . . +RUN dotnet publish -c Release -o /app + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 +WORKDIR /app +COPY --from=build /app . +ENTRYPOINT ["dotnet", "user-service.dll"] \ No newline at end of file diff --git a/backend/user-service/user-service/Models/Common/Packet.cs b/backend/user-service/user-service/Models/Common/Packet.cs new file mode 100644 index 0000000..270f3e0 --- /dev/null +++ b/backend/user-service/user-service/Models/Common/Packet.cs @@ -0,0 +1,8 @@ +namespace UserService.Models; + +public class Packet +{ + public Dictionary Headers { get; set; } = new(); + + public string Body { get; set; } = string.Empty; +} diff --git a/backend/user-service/user-service/Program.cs b/backend/user-service/user-service/Program.cs new file mode 100644 index 0000000..9ca7e3b --- /dev/null +++ b/backend/user-service/user-service/Program.cs @@ -0,0 +1,13 @@ +using UserService.Services; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); +builder.Services.AddScoped(); + +var app = builder.Build(); + +app.UseRouting(); +app.MapControllers(); + +app.Run(); diff --git a/backend/user-service/user-service/Services/Common/IPacketReaderService.cs b/backend/user-service/user-service/Services/Common/IPacketReaderService.cs new file mode 100644 index 0000000..83ae627 --- /dev/null +++ b/backend/user-service/user-service/Services/Common/IPacketReaderService.cs @@ -0,0 +1,8 @@ +using US.Models; + +namespace US.Services; + +public interface IPacketReaderService +{ + Packet Create(); +} diff --git a/backend/user-service/user-service/Services/Common/PacketReaderService.cs b/backend/user-service/user-service/Services/Common/PacketReaderService.cs new file mode 100644 index 0000000..873f06a --- /dev/null +++ b/backend/user-service/user-service/Services/Common/PacketReaderService.cs @@ -0,0 +1,6 @@ +namespace US.Services; + +public class PacketReaderService : IPacketReaderService +{ + +} diff --git a/backend/user-service/user-service/Services/ITokenPacketProcessorService.cs b/backend/user-service/user-service/Services/ITokenPacketProcessorService.cs new file mode 100644 index 0000000..78fdb30 --- /dev/null +++ b/backend/user-service/user-service/Services/ITokenPacketProcessorService.cs @@ -0,0 +1,6 @@ +namespace UserService.Services; + +public interface ITokenPacketProcessorService +{ + bool TryValidateToken(HttpRequest request, out Guid userId); +} \ No newline at end of file diff --git a/backend/user-service/user-service/Services/TokenPacketProcessorService.cs b/backend/user-service/user-service/Services/TokenPacketProcessorService.cs new file mode 100644 index 0000000..acefd22 --- /dev/null +++ b/backend/user-service/user-service/Services/TokenPacketProcessorService.cs @@ -0,0 +1,62 @@ +using Microsoft.IdentityModel.Tokens; + +using System.IdentityModel.Tokens.Jwt; + +using System.Security.Claims; +using System.Security.Cryptography; + +namespace UserService.Services; + +public class TokenPacketProcessorService : ITokenPacketProcessorService +{ + private readonly IConfiguration _configuration; + private readonly TokenValidationParameters _validationParameters; + + public TokenPacketProcessorService(IConfiguration configuration) + { + _configuration = configuration; + + var publicKeyPath = _configuration["Jwt:PublicKeyPath"]; + var publicKeyText = File.ReadAllText(publicKeyPath!); + + var rsa = RSA.Create(); + rsa.ImportFromPem(publicKeyText.ToCharArray()); + + _validationParameters = new TokenValidationParameters + { + ValidateIssuer = false, + ValidateAudience = false, + ValidateLifetime = true, + ValidateIssuerSigningKey = true, + IssuerSigningKey = new RsaSecurityKey(rsa) + }; + } + + public bool TryValidateToken(HttpRequest request, out Guid userId) + { + userId = Guid.Empty; + + if (!request.Headers.TryGetValue("Authorization", out var authHeader)) + return false; + + var token = authHeader.ToString().Replace("Bearer ", ""); + + var handler = new JwtSecurityTokenHandler(); + + try + { + var principal = handler.ValidateToken(token, _validationParameters, out var _); + var userIdClaim = principal.FindFirst(ClaimTypes.NameIdentifier); + + if (userIdClaim != null && Guid.TryParse(userIdClaim.Value, out var parsedId)) + { + userId = parsedId; + return true; + } + } + catch + { } + + return false; + } +} diff --git a/backend/user-service/user-service/appsettings.json b/backend/user-service/user-service/appsettings.json new file mode 100644 index 0000000..6b51d66 --- /dev/null +++ b/backend/user-service/user-service/appsettings.json @@ -0,0 +1,5 @@ +{ + "Jwt": { + "PublicKeyPath": "public.pem" + } +} diff --git a/backend/user-service/user-service/docker-compose.yml b/backend/user-service/user-service/docker-compose.yml new file mode 100644 index 0000000..673a7b2 --- /dev/null +++ b/backend/user-service/user-service/docker-compose.yml @@ -0,0 +1,9 @@ +version: '3.8' + +services: + user-service: + build: + context: . + dockerfile: Dockerfile + ports: + - "5000:80" \ No newline at end of file diff --git a/backend/user-service/user-service/user-service.csproj b/backend/user-service/user-service/user-service.csproj new file mode 100644 index 0000000..72d22df --- /dev/null +++ b/backend/user-service/user-service/user-service.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + \ No newline at end of file From 0f2591a8c7c18335f2c240d1795396550537c6ba Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 16:22:50 +0300 Subject: [PATCH 06/48] newnew --- backend/user-service/user-service/Models/Common/Packet.cs | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 backend/user-service/user-service/Models/Common/Packet.cs diff --git a/backend/user-service/user-service/Models/Common/Packet.cs b/backend/user-service/user-service/Models/Common/Packet.cs deleted file mode 100644 index 270f3e0..0000000 --- a/backend/user-service/user-service/Models/Common/Packet.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace UserService.Models; - -public class Packet -{ - public Dictionary Headers { get; set; } = new(); - - public string Body { get; set; } = string.Empty; -} From 711f075ce45b739319400ed79920cf650944d42a Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 16:44:22 +0300 Subject: [PATCH 07/48] log --- .../user-service/Controllers/ControllerGetUsers.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs index 53219b5..7af01aa 100644 --- a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs +++ b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs @@ -11,17 +11,22 @@ public class ControllerGetUsers : ControllerBase public ControllerGetUsers(ITokenPacketProcessorService tokenService) { + Console.WriteLine("[INIT] ControllerGetUsers initialized"); _tokenService = tokenService; } [HttpGet] public IActionResult GetUsers() { + Console.WriteLine("[REQUEST] GET /api/admin/get_users"); + if (_tokenService.TryValidateToken(Request, out var userId)) { + Console.WriteLine($"[OK] Token valid for userId: {userId}"); return Ok(new { message = "OK", userId }); } + Console.WriteLine("[ERR] Invalid token"); return Unauthorized(new { message = "Invalid token" }); } } From 2d04a689897d93e8f076cf3dae41ff48c865bb72 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 16:50:00 +0300 Subject: [PATCH 08/48] fix --- backend/user-service/user-service/Dockerfile | 1 + backend/user-service/user-service/Program.cs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/backend/user-service/user-service/Dockerfile b/backend/user-service/user-service/Dockerfile index 17b39e0..49169fb 100644 --- a/backend/user-service/user-service/Dockerfile +++ b/backend/user-service/user-service/Dockerfile @@ -6,4 +6,5 @@ RUN dotnet publish -c Release -o /app FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app . +ENV ASPNETCORE_URLS=http://+:80 ENTRYPOINT ["dotnet", "user-service.dll"] \ No newline at end of file diff --git a/backend/user-service/user-service/Program.cs b/backend/user-service/user-service/Program.cs index 9ca7e3b..c4827cc 100644 --- a/backend/user-service/user-service/Program.cs +++ b/backend/user-service/user-service/Program.cs @@ -2,6 +2,8 @@ var builder = WebApplication.CreateBuilder(args); +builder.WebHost.UseUrls("http://0.0.0.0:80"); + builder.Services.AddControllers(); builder.Services.AddScoped(); From 1fbde25d58ed209d66b44a5fc3847200f1a1f175 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 18:20:01 +0300 Subject: [PATCH 09/48] blank --- .../Common/ControllerBaseTokenized.cs | 32 +++++++++++++++++++ .../Controllers/ControllerGetUsers.cs | 21 ++---------- .../Controllers/ControllerUserAdd.cs | 15 +++++++++ .../Controllers/ControllerUserRemove.cs | 15 +++++++++ backend/user-service/user-service/Dockerfile | 3 +- .../Services/Common/IPacketReaderService.cs | 8 ----- .../Services/Common/PacketReaderService.cs | 6 ---- .../Services/TokenPacketProcessorService.cs | 11 ++----- .../user-service/appsettings.json | 5 --- backend/user-service/user-service/public.pem | 9 ++++++ .../user-service/user-service.csproj | 1 + 11 files changed, 79 insertions(+), 47 deletions(-) create mode 100644 backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs create mode 100644 backend/user-service/user-service/Controllers/ControllerUserAdd.cs create mode 100644 backend/user-service/user-service/Controllers/ControllerUserRemove.cs delete mode 100644 backend/user-service/user-service/Services/Common/IPacketReaderService.cs delete mode 100644 backend/user-service/user-service/Services/Common/PacketReaderService.cs delete mode 100644 backend/user-service/user-service/appsettings.json create mode 100644 backend/user-service/user-service/public.pem diff --git a/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs b/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs new file mode 100644 index 0000000..62007d0 --- /dev/null +++ b/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using UserService.Services; + +namespace UserService.Controllers; + +[ApiController] +public abstract class ControllerBaseTokenized : ControllerBase, IActionFilter +{ + protected ITokenPacketProcessorService _tokenService; + + protected Guid UserId { get; private set; } + + protected ControllerBaseTokenized(ITokenPacketProcessorService tokenService) + { + _tokenService = tokenService; + } + + public void OnActionExecuting(ActionExecutingContext context) + { + if (!_tokenService.TryValidateToken(context.HttpContext.Request, out var userId)) + { + context.Result = new UnauthorizedObjectResult(new { message = "Invalid token" }); + + return; + } + + UserId = userId; + } + + public void OnActionExecuted(ActionExecutedContext context) { } +} diff --git a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs index 7af01aa..7009e7e 100644 --- a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs +++ b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs @@ -5,28 +5,11 @@ namespace UserService.Controllers; [ApiController] [Route("api/admin/get_users")] -public class ControllerGetUsers : ControllerBase +public class ControllerGetUsers(ITokenPacketProcessorService tokenService) : ControllerBaseTokenized(tokenService) { - private readonly ITokenPacketProcessorService _tokenService; - - public ControllerGetUsers(ITokenPacketProcessorService tokenService) - { - Console.WriteLine("[INIT] ControllerGetUsers initialized"); - _tokenService = tokenService; - } - [HttpGet] public IActionResult GetUsers() { - Console.WriteLine("[REQUEST] GET /api/admin/get_users"); - - if (_tokenService.TryValidateToken(Request, out var userId)) - { - Console.WriteLine($"[OK] Token valid for userId: {userId}"); - return Ok(new { message = "OK", userId }); - } - - Console.WriteLine("[ERR] Invalid token"); - return Unauthorized(new { message = "Invalid token" }); + return Ok(new { message = "TODO: Get!", UserId }); } } diff --git a/backend/user-service/user-service/Controllers/ControllerUserAdd.cs b/backend/user-service/user-service/Controllers/ControllerUserAdd.cs new file mode 100644 index 0000000..882cabc --- /dev/null +++ b/backend/user-service/user-service/Controllers/ControllerUserAdd.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Mvc; +using UserService.Services; + +namespace UserService.Controllers; + +[ApiController] +[Route("api/admin/get_users")] +public class ControllerUserAdd(ITokenPacketProcessorService tokenService) : ControllerBaseTokenized(tokenService) +{ + [HttpGet] + public IActionResult GetUsers() + { + return Ok(new { message = "TODO: Get!", UserId }); + } +} diff --git a/backend/user-service/user-service/Controllers/ControllerUserRemove.cs b/backend/user-service/user-service/Controllers/ControllerUserRemove.cs new file mode 100644 index 0000000..5d678e6 --- /dev/null +++ b/backend/user-service/user-service/Controllers/ControllerUserRemove.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Mvc; +using UserService.Services; + +namespace UserService.Controllers; + +[ApiController] +[Route("api/admin/get_users")] +public class ControllerUserRemove(ITokenPacketProcessorService tokenService) : ControllerBaseTokenized(tokenService) +{ + [HttpGet] + public IActionResult GetUsers() + { + return Ok(new { message = "TODO: Get!", UserId }); + } +} diff --git a/backend/user-service/user-service/Dockerfile b/backend/user-service/user-service/Dockerfile index 49169fb..2d9c252 100644 --- a/backend/user-service/user-service/Dockerfile +++ b/backend/user-service/user-service/Dockerfile @@ -6,5 +6,6 @@ RUN dotnet publish -c Release -o /app FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app . +COPY public.pem /app/public.pem ENV ASPNETCORE_URLS=http://+:80 -ENTRYPOINT ["dotnet", "user-service.dll"] \ No newline at end of file +ENTRYPOINT ["dotnet", "user-service.dll"] diff --git a/backend/user-service/user-service/Services/Common/IPacketReaderService.cs b/backend/user-service/user-service/Services/Common/IPacketReaderService.cs deleted file mode 100644 index 83ae627..0000000 --- a/backend/user-service/user-service/Services/Common/IPacketReaderService.cs +++ /dev/null @@ -1,8 +0,0 @@ -using US.Models; - -namespace US.Services; - -public interface IPacketReaderService -{ - Packet Create(); -} diff --git a/backend/user-service/user-service/Services/Common/PacketReaderService.cs b/backend/user-service/user-service/Services/Common/PacketReaderService.cs deleted file mode 100644 index 873f06a..0000000 --- a/backend/user-service/user-service/Services/Common/PacketReaderService.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace US.Services; - -public class PacketReaderService : IPacketReaderService -{ - -} diff --git a/backend/user-service/user-service/Services/TokenPacketProcessorService.cs b/backend/user-service/user-service/Services/TokenPacketProcessorService.cs index acefd22..be75229 100644 --- a/backend/user-service/user-service/Services/TokenPacketProcessorService.cs +++ b/backend/user-service/user-service/Services/TokenPacketProcessorService.cs @@ -1,7 +1,5 @@ using Microsoft.IdentityModel.Tokens; - using System.IdentityModel.Tokens.Jwt; - using System.Security.Claims; using System.Security.Cryptography; @@ -9,15 +7,12 @@ namespace UserService.Services; public class TokenPacketProcessorService : ITokenPacketProcessorService { - private readonly IConfiguration _configuration; private readonly TokenValidationParameters _validationParameters; - public TokenPacketProcessorService(IConfiguration configuration) + public TokenPacketProcessorService() { - _configuration = configuration; - - var publicKeyPath = _configuration["Jwt:PublicKeyPath"]; - var publicKeyText = File.ReadAllText(publicKeyPath!); + var publicKeyPath = "public.pem"; + var publicKeyText = File.ReadAllText(publicKeyPath); var rsa = RSA.Create(); rsa.ImportFromPem(publicKeyText.ToCharArray()); diff --git a/backend/user-service/user-service/appsettings.json b/backend/user-service/user-service/appsettings.json deleted file mode 100644 index 6b51d66..0000000 --- a/backend/user-service/user-service/appsettings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Jwt": { - "PublicKeyPath": "public.pem" - } -} diff --git a/backend/user-service/user-service/public.pem b/backend/user-service/user-service/public.pem new file mode 100644 index 0000000..bddff5a --- /dev/null +++ b/backend/user-service/user-service/public.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Ytzek1ZpurQJ+wCb5q5 +4IBg33MCA+QXbgQ3G1udE7f1EjRKlLmMOyedMVr5t5Ssyh6oQYMKjr/5akRfwoXm +JU4JjkdmS6slqho/vYQQoOB1+HNzeOIY8jMMrbVMLYnwGBH3DNgOFJUFQiPPJ/o9 ++GSvDwCbQ4cz1hSNKpywwAuHNowe7umC/9AzbOjSUfZcrh+qf2BbJg2Am5cYtdZV +h1PBXBiJCR+Bt+eEag8OUCSPBe4iOfyGttjPsLOHxObvlsuERuq6AowqvY0bam1L +tbHs4bZ7Jo0k7X0dYI9CriaeaNHGs/lBWfueGGJNlbplj9tZz9Qe/fIkK4NLN3qi +jQIDAQAB +-----END PUBLIC KEY----- diff --git a/backend/user-service/user-service/user-service.csproj b/backend/user-service/user-service/user-service.csproj index 72d22df..c5b5589 100644 --- a/backend/user-service/user-service/user-service.csproj +++ b/backend/user-service/user-service/user-service.csproj @@ -7,6 +7,7 @@ + From 35cafd0cce7251e5970236db93dfdd8b3bae8448 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 18:38:25 +0300 Subject: [PATCH 10/48] new blank eps --- .../user-service/Controllers/ControllerUserAdd.cs | 4 ++-- .../user-service/Controllers/ControllerUserRemove.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/user-service/user-service/Controllers/ControllerUserAdd.cs b/backend/user-service/user-service/Controllers/ControllerUserAdd.cs index 882cabc..c435a7f 100644 --- a/backend/user-service/user-service/Controllers/ControllerUserAdd.cs +++ b/backend/user-service/user-service/Controllers/ControllerUserAdd.cs @@ -4,12 +4,12 @@ namespace UserService.Controllers; [ApiController] -[Route("api/admin/get_users")] +[Route("api/admin/user_add")] public class ControllerUserAdd(ITokenPacketProcessorService tokenService) : ControllerBaseTokenized(tokenService) { [HttpGet] public IActionResult GetUsers() { - return Ok(new { message = "TODO: Get!", UserId }); + return Ok(new { message = "TODO: Add!", UserId }); } } diff --git a/backend/user-service/user-service/Controllers/ControllerUserRemove.cs b/backend/user-service/user-service/Controllers/ControllerUserRemove.cs index 5d678e6..7250029 100644 --- a/backend/user-service/user-service/Controllers/ControllerUserRemove.cs +++ b/backend/user-service/user-service/Controllers/ControllerUserRemove.cs @@ -4,12 +4,12 @@ namespace UserService.Controllers; [ApiController] -[Route("api/admin/get_users")] +[Route("api/admin/user_remove")] public class ControllerUserRemove(ITokenPacketProcessorService tokenService) : ControllerBaseTokenized(tokenService) { [HttpGet] public IActionResult GetUsers() { - return Ok(new { message = "TODO: Get!", UserId }); + return Ok(new { message = "TODO: Remove!", UserId }); } } From fc5cf1feed17a7c3023d059b92e420f17ad5381f Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 18:39:20 +0300 Subject: [PATCH 11/48] no tokens req --- .../user-service/Controllers/Common/ControllerBaseTokenized.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs b/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs index 62007d0..b711b48 100644 --- a/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs +++ b/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs @@ -20,7 +20,7 @@ public void OnActionExecuting(ActionExecutingContext context) { if (!_tokenService.TryValidateToken(context.HttpContext.Request, out var userId)) { - context.Result = new UnauthorizedObjectResult(new { message = "Invalid token" }); + //context.Result = new UnauthorizedObjectResult(new { message = "Invalid token" }); return; } From a4e1e7ed64377007d1b11a501ff534dfaabded9e Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 18:49:51 +0300 Subject: [PATCH 12/48] blank no token --- backend/user-service/user-service/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/user-service/user-service/docker-compose.yml b/backend/user-service/user-service/docker-compose.yml index 673a7b2..c0402ac 100644 --- a/backend/user-service/user-service/docker-compose.yml +++ b/backend/user-service/user-service/docker-compose.yml @@ -6,4 +6,4 @@ services: context: . dockerfile: Dockerfile ports: - - "5000:80" \ No newline at end of file + - "25565:80" \ No newline at end of file From 060a4865d29f0c7841c56513d2ed26488bd3abfb Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 19:59:13 +0300 Subject: [PATCH 13/48] get_users test --- .../Controllers/ControllerGetUsers.cs | 15 ----- .../Common/ControllerBaseTokenized.cs | 4 +- .../Controllers/Users/ControllerGetUsers.cs | 29 +++++++++ .../{ => Users}/ControllerUserAdd.cs | 7 +- .../{ => Users}/ControllerUserRemove.cs | 7 +- .../user-service/Models/UserDto.cs | 18 ++++++ backend/user-service/user-service/Program.cs | 4 +- .../Services/Database/DbService.cs | 64 +++++++++++++++++++ .../Services/Database/IDbService.cs | 10 +++ .../ITokenPacketProcessorService.cs | 2 +- .../TokenPacketProcessorService.cs | 2 +- .../Services/Users/UserDataService.cs | 46 +++++++++++++ .../user-service/appsettings.json | 5 ++ 13 files changed, 187 insertions(+), 26 deletions(-) delete mode 100644 backend/user-service/user-service/Controllers/ControllerGetUsers.cs rename backend/user-service/user-service/Controllers/{ => Users}/Common/ControllerBaseTokenized.cs (92%) create mode 100644 backend/user-service/user-service/Controllers/Users/ControllerGetUsers.cs rename backend/user-service/user-service/Controllers/{ => Users}/ControllerUserAdd.cs (70%) rename backend/user-service/user-service/Controllers/{ => Users}/ControllerUserRemove.cs (71%) create mode 100644 backend/user-service/user-service/Models/UserDto.cs create mode 100644 backend/user-service/user-service/Services/Database/DbService.cs create mode 100644 backend/user-service/user-service/Services/Database/IDbService.cs rename backend/user-service/user-service/Services/{ => Token}/ITokenPacketProcessorService.cs (78%) rename backend/user-service/user-service/Services/{ => Token}/TokenPacketProcessorService.cs (98%) create mode 100644 backend/user-service/user-service/Services/Users/UserDataService.cs create mode 100644 backend/user-service/user-service/appsettings.json diff --git a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs deleted file mode 100644 index 7009e7e..0000000 --- a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using UserService.Services; - -namespace UserService.Controllers; - -[ApiController] -[Route("api/admin/get_users")] -public class ControllerGetUsers(ITokenPacketProcessorService tokenService) : ControllerBaseTokenized(tokenService) -{ - [HttpGet] - public IActionResult GetUsers() - { - return Ok(new { message = "TODO: Get!", UserId }); - } -} diff --git a/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs b/backend/user-service/user-service/Controllers/Users/Common/ControllerBaseTokenized.cs similarity index 92% rename from backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs rename to backend/user-service/user-service/Controllers/Users/Common/ControllerBaseTokenized.cs index b711b48..ebf5b0a 100644 --- a/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs +++ b/backend/user-service/user-service/Controllers/Users/Common/ControllerBaseTokenized.cs @@ -1,8 +1,8 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; -using UserService.Services; +using Services.Token; -namespace UserService.Controllers; +namespace Controllers.Users.Common; [ApiController] public abstract class ControllerBaseTokenized : ControllerBase, IActionFilter diff --git a/backend/user-service/user-service/Controllers/Users/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/Users/ControllerGetUsers.cs new file mode 100644 index 0000000..30928b8 --- /dev/null +++ b/backend/user-service/user-service/Controllers/Users/ControllerGetUsers.cs @@ -0,0 +1,29 @@ +using Controllers.Users.Common; +using Microsoft.AspNetCore.Mvc; +using Services.Token; +using Services.Users; + +namespace Controllers.Users; + +[ApiController] +[Route("api/admin/get_users")] +public class ControllerGetUsers( + ITokenPacketProcessorService tokenService, + UserDataService userDataService +) : ControllerBaseTokenized(tokenService) + +{ + [HttpGet] + public IActionResult GetUsers() + { + try + { + var users = userDataService.GetAllUsers(); + return Ok(new { message = "OK", userId = UserId, users }); + } + catch (Exception ex) + { + return StatusCode(500, new { message = "Internal error" }); + } + } +} diff --git a/backend/user-service/user-service/Controllers/ControllerUserAdd.cs b/backend/user-service/user-service/Controllers/Users/ControllerUserAdd.cs similarity index 70% rename from backend/user-service/user-service/Controllers/ControllerUserAdd.cs rename to backend/user-service/user-service/Controllers/Users/ControllerUserAdd.cs index c435a7f..aaa7fd0 100644 --- a/backend/user-service/user-service/Controllers/ControllerUserAdd.cs +++ b/backend/user-service/user-service/Controllers/Users/ControllerUserAdd.cs @@ -1,7 +1,8 @@ -using Microsoft.AspNetCore.Mvc; -using UserService.Services; +using Controllers.Users.Common; +using Microsoft.AspNetCore.Mvc; +using Services.Token; -namespace UserService.Controllers; +namespace Controllers.Users; [ApiController] [Route("api/admin/user_add")] diff --git a/backend/user-service/user-service/Controllers/ControllerUserRemove.cs b/backend/user-service/user-service/Controllers/Users/ControllerUserRemove.cs similarity index 71% rename from backend/user-service/user-service/Controllers/ControllerUserRemove.cs rename to backend/user-service/user-service/Controllers/Users/ControllerUserRemove.cs index 7250029..49c7e7c 100644 --- a/backend/user-service/user-service/Controllers/ControllerUserRemove.cs +++ b/backend/user-service/user-service/Controllers/Users/ControllerUserRemove.cs @@ -1,7 +1,8 @@ -using Microsoft.AspNetCore.Mvc; -using UserService.Services; +using Controllers.Users.Common; +using Microsoft.AspNetCore.Mvc; +using Services.Token; -namespace UserService.Controllers; +namespace Controllers.Users; [ApiController] [Route("api/admin/user_remove")] diff --git a/backend/user-service/user-service/Models/UserDto.cs b/backend/user-service/user-service/Models/UserDto.cs new file mode 100644 index 0000000..8c2ed6c --- /dev/null +++ b/backend/user-service/user-service/Models/UserDto.cs @@ -0,0 +1,18 @@ +namespace Models.Users; + +public record UserDto( + Guid Id, + DateTime CreatedAt, + DateTime UpdatedAt, + DateTime? LastLoginAt, + bool IsActive, + byte[] Password, + Guid RoleId, + string VerificationStatus, + Guid OrganizationId, + string Email, + string FullName, + string Phone, + string AvatarUrl, + string GovId +); diff --git a/backend/user-service/user-service/Program.cs b/backend/user-service/user-service/Program.cs index c4827cc..022432d 100644 --- a/backend/user-service/user-service/Program.cs +++ b/backend/user-service/user-service/Program.cs @@ -1,4 +1,5 @@ -using UserService.Services; +using Services.Database; +using Services.Token; var builder = WebApplication.CreateBuilder(args); @@ -6,6 +7,7 @@ builder.Services.AddControllers(); builder.Services.AddScoped(); +builder.Services.AddSingleton(new DbService(builder.Configuration.GetConnectionString("Postgres")!)); var app = builder.Build(); diff --git a/backend/user-service/user-service/Services/Database/DbService.cs b/backend/user-service/user-service/Services/Database/DbService.cs new file mode 100644 index 0000000..f9eb939 --- /dev/null +++ b/backend/user-service/user-service/Services/Database/DbService.cs @@ -0,0 +1,64 @@ +using Npgsql; +using System.Data; + +namespace Services.Database; + +public sealed class DbService : IDbService +{ + private readonly string _connectionString; + + public DbService(string connectionString) + { + _connectionString = connectionString; + } + + public T? QuerySingle(string sql, Func map, object? parameters = null) + { + using var conn = new NpgsqlConnection(_connectionString); + conn.Open(); + + using var cmd = new NpgsqlCommand(sql, conn); + AddParameters(cmd, parameters); + + using var reader = cmd.ExecuteReader(); + return reader.Read() ? map(reader) : default; + } + + public IEnumerable Query(string sql, Func map, object? parameters = null) + { + using var conn = new NpgsqlConnection(_connectionString); + conn.Open(); + + using var cmd = new NpgsqlCommand(sql, conn); + AddParameters(cmd, parameters); + + using var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + yield return map(reader); + } + } + + public int Execute(string sql, object? parameters = null) + { + using var conn = new NpgsqlConnection(_connectionString); + conn.Open(); + + using var cmd = new NpgsqlCommand(sql, conn); + AddParameters(cmd, parameters); + + return cmd.ExecuteNonQuery(); + } + + private void AddParameters(NpgsqlCommand cmd, object? parameters) + { + if (parameters == null) return; + + foreach (var prop in parameters.GetType().GetProperties()) + { + var name = prop.Name.StartsWith("@") ? prop.Name : "@" + prop.Name; + var value = prop.GetValue(parameters) ?? DBNull.Value; + cmd.Parameters.AddWithValue(name, value); + } + } +} diff --git a/backend/user-service/user-service/Services/Database/IDbService.cs b/backend/user-service/user-service/Services/Database/IDbService.cs new file mode 100644 index 0000000..ba33f69 --- /dev/null +++ b/backend/user-service/user-service/Services/Database/IDbService.cs @@ -0,0 +1,10 @@ +using System.Data; + +namespace Services.Database; + +public interface IDbService +{ + T? QuerySingle(string sql, Func map, object? parameters = null); + IEnumerable Query(string sql, Func map, object? parameters = null); + int Execute(string sql, object? parameters = null); +} diff --git a/backend/user-service/user-service/Services/ITokenPacketProcessorService.cs b/backend/user-service/user-service/Services/Token/ITokenPacketProcessorService.cs similarity index 78% rename from backend/user-service/user-service/Services/ITokenPacketProcessorService.cs rename to backend/user-service/user-service/Services/Token/ITokenPacketProcessorService.cs index 78fdb30..b0a7b1a 100644 --- a/backend/user-service/user-service/Services/ITokenPacketProcessorService.cs +++ b/backend/user-service/user-service/Services/Token/ITokenPacketProcessorService.cs @@ -1,4 +1,4 @@ -namespace UserService.Services; +namespace Services.Token; public interface ITokenPacketProcessorService { diff --git a/backend/user-service/user-service/Services/TokenPacketProcessorService.cs b/backend/user-service/user-service/Services/Token/TokenPacketProcessorService.cs similarity index 98% rename from backend/user-service/user-service/Services/TokenPacketProcessorService.cs rename to backend/user-service/user-service/Services/Token/TokenPacketProcessorService.cs index be75229..18f41a8 100644 --- a/backend/user-service/user-service/Services/TokenPacketProcessorService.cs +++ b/backend/user-service/user-service/Services/Token/TokenPacketProcessorService.cs @@ -3,7 +3,7 @@ using System.Security.Claims; using System.Security.Cryptography; -namespace UserService.Services; +namespace Services.Token; public class TokenPacketProcessorService : ITokenPacketProcessorService { diff --git a/backend/user-service/user-service/Services/Users/UserDataService.cs b/backend/user-service/user-service/Services/Users/UserDataService.cs new file mode 100644 index 0000000..8beae8b --- /dev/null +++ b/backend/user-service/user-service/Services/Users/UserDataService.cs @@ -0,0 +1,46 @@ +using Services.Database; + +using Models.Users; + +namespace Services.Users; + +public class UserDataService +{ + private readonly IDbService _db; + + public UserDataService(IDbService db) + { + _db = db; + } + + public IEnumerable GetAllUsers() + { + const string sql = """ + SELECT + id, created_at, updated_at, last_login_at, is_active, + password, role_id, verification_status, organization_id, + email, full_name, phone, avatar_url, gov_id + FROM users + """; + + return _db.Query(sql, reader => + { + return new UserDto( + reader.GetGuid(reader.GetOrdinal("id")), + reader.GetDateTime(reader.GetOrdinal("created_at")), + reader.GetDateTime(reader.GetOrdinal("updated_at")), + reader.IsDBNull(reader.GetOrdinal("last_login_at")) ? null : reader.GetDateTime(reader.GetOrdinal("last_login_at")), + reader.GetBoolean(reader.GetOrdinal("is_active")), + (byte[])reader["password"], + reader.GetGuid(reader.GetOrdinal("role_id")), + reader.GetString(reader.GetOrdinal("verification_status")), + reader.GetGuid(reader.GetOrdinal("organization_id")), + reader.GetString(reader.GetOrdinal("email")), + reader.GetString(reader.GetOrdinal("full_name")), + reader.GetString(reader.GetOrdinal("phone")), + reader.GetString(reader.GetOrdinal("avatar_url")), + reader.GetString(reader.GetOrdinal("gov_id")) + ); + }); + } +} diff --git a/backend/user-service/user-service/appsettings.json b/backend/user-service/user-service/appsettings.json new file mode 100644 index 0000000..6b26a17 --- /dev/null +++ b/backend/user-service/user-service/appsettings.json @@ -0,0 +1,5 @@ +{ + "ConnectionStrings": { + "Postgres": "Host=192.168.1.174;Port=5432;Database=geo_db;Username=postgres;Password=sUpers3cRet" + } +} From 0dcc9433a3fd99e06ccef054a540c74f71d2d843 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 20:08:21 +0300 Subject: [PATCH 14/48] sry --- backend/user-service/user-service/Program.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/user-service/user-service/Program.cs b/backend/user-service/user-service/Program.cs index 022432d..e67e405 100644 --- a/backend/user-service/user-service/Program.cs +++ b/backend/user-service/user-service/Program.cs @@ -1,5 +1,6 @@ using Services.Database; using Services.Token; +using Services.Users; var builder = WebApplication.CreateBuilder(args); @@ -8,6 +9,7 @@ builder.Services.AddControllers(); builder.Services.AddScoped(); builder.Services.AddSingleton(new DbService(builder.Configuration.GetConnectionString("Postgres")!)); +builder.Services.AddScoped(); var app = builder.Build(); From 4d1d46e05ab3aebe47db97e875d491edfc1309d7 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 20:11:35 +0300 Subject: [PATCH 15/48] directories --- .../Controllers/{Users => }/Common/ControllerBaseTokenized.cs | 0 .../user-service/Controllers/{Users => }/ControllerGetUsers.cs | 0 .../user-service/Controllers/{Users => }/ControllerUserAdd.cs | 0 .../user-service/Controllers/{Users => }/ControllerUserRemove.cs | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename backend/user-service/user-service/Controllers/{Users => }/Common/ControllerBaseTokenized.cs (100%) rename backend/user-service/user-service/Controllers/{Users => }/ControllerGetUsers.cs (100%) rename backend/user-service/user-service/Controllers/{Users => }/ControllerUserAdd.cs (100%) rename backend/user-service/user-service/Controllers/{Users => }/ControllerUserRemove.cs (100%) diff --git a/backend/user-service/user-service/Controllers/Users/Common/ControllerBaseTokenized.cs b/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs similarity index 100% rename from backend/user-service/user-service/Controllers/Users/Common/ControllerBaseTokenized.cs rename to backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs diff --git a/backend/user-service/user-service/Controllers/Users/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs similarity index 100% rename from backend/user-service/user-service/Controllers/Users/ControllerGetUsers.cs rename to backend/user-service/user-service/Controllers/ControllerGetUsers.cs diff --git a/backend/user-service/user-service/Controllers/Users/ControllerUserAdd.cs b/backend/user-service/user-service/Controllers/ControllerUserAdd.cs similarity index 100% rename from backend/user-service/user-service/Controllers/Users/ControllerUserAdd.cs rename to backend/user-service/user-service/Controllers/ControllerUserAdd.cs diff --git a/backend/user-service/user-service/Controllers/Users/ControllerUserRemove.cs b/backend/user-service/user-service/Controllers/ControllerUserRemove.cs similarity index 100% rename from backend/user-service/user-service/Controllers/Users/ControllerUserRemove.cs rename to backend/user-service/user-service/Controllers/ControllerUserRemove.cs From 8319cc1704705ddae66807e70e7c2a41c03f684b Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 20:17:30 +0300 Subject: [PATCH 16/48] no passwd --- .../Controllers/ControllerGetUsers.cs | 4 +-- .../user-service/Models/UserDto.cs | 17 ++++------- .../Services/Users/UserDataService.cs | 28 ++++++++----------- 3 files changed, 20 insertions(+), 29 deletions(-) diff --git a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs index 30928b8..cc877ed 100644 --- a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs +++ b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs @@ -1,9 +1,9 @@ -using Controllers.Users.Common; +using Controllers.Common; using Microsoft.AspNetCore.Mvc; using Services.Token; using Services.Users; -namespace Controllers.Users; +namespace Controllers; [ApiController] [Route("api/admin/get_users")] diff --git a/backend/user-service/user-service/Models/UserDto.cs b/backend/user-service/user-service/Models/UserDto.cs index 8c2ed6c..4079501 100644 --- a/backend/user-service/user-service/Models/UserDto.cs +++ b/backend/user-service/user-service/Models/UserDto.cs @@ -1,18 +1,13 @@ namespace Models.Users; -public record UserDto( +public record UserDto +( Guid Id, - DateTime CreatedAt, - DateTime UpdatedAt, - DateTime? LastLoginAt, - bool IsActive, - byte[] Password, - Guid RoleId, - string VerificationStatus, - Guid OrganizationId, - string Email, string FullName, + string Email, string Phone, string AvatarUrl, - string GovId + string VerificationStatus, + bool IsActive, + DateTime? LastLoginAt ); diff --git a/backend/user-service/user-service/Services/Users/UserDataService.cs b/backend/user-service/user-service/Services/Users/UserDataService.cs index 8beae8b..ef1a48e 100644 --- a/backend/user-service/user-service/Services/Users/UserDataService.cs +++ b/backend/user-service/user-service/Services/Users/UserDataService.cs @@ -16,31 +16,27 @@ public UserDataService(IDbService db) public IEnumerable GetAllUsers() { const string sql = """ - SELECT - id, created_at, updated_at, last_login_at, is_active, - password, role_id, verification_status, organization_id, - email, full_name, phone, avatar_url, gov_id - FROM users - """; + SELECT + id, full_name, email, phone, avatar_url, + verification_status, is_active, last_login_at + FROM users + """; return _db.Query(sql, reader => { return new UserDto( reader.GetGuid(reader.GetOrdinal("id")), - reader.GetDateTime(reader.GetOrdinal("created_at")), - reader.GetDateTime(reader.GetOrdinal("updated_at")), - reader.IsDBNull(reader.GetOrdinal("last_login_at")) ? null : reader.GetDateTime(reader.GetOrdinal("last_login_at")), - reader.GetBoolean(reader.GetOrdinal("is_active")), - (byte[])reader["password"], - reader.GetGuid(reader.GetOrdinal("role_id")), - reader.GetString(reader.GetOrdinal("verification_status")), - reader.GetGuid(reader.GetOrdinal("organization_id")), - reader.GetString(reader.GetOrdinal("email")), reader.GetString(reader.GetOrdinal("full_name")), + reader.GetString(reader.GetOrdinal("email")), reader.GetString(reader.GetOrdinal("phone")), reader.GetString(reader.GetOrdinal("avatar_url")), - reader.GetString(reader.GetOrdinal("gov_id")) + reader.GetString(reader.GetOrdinal("verification_status")), + reader.GetBoolean(reader.GetOrdinal("is_active")), + reader.IsDBNull(reader.GetOrdinal("last_login_at")) + ? null + : reader.GetDateTime(reader.GetOrdinal("last_login_at")) ); }); } + } From 98ddaf2acc8f708d4b6a1784f1ca8f3374ba9424 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 20:26:09 +0300 Subject: [PATCH 17/48] dabeljy --- .../user-service/Controllers/ControllerGetUsers.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs index cc877ed..9d4f68c 100644 --- a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs +++ b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs @@ -1,9 +1,9 @@ -using Controllers.Common; +using Controllers.Users.Common; using Microsoft.AspNetCore.Mvc; using Services.Token; using Services.Users; -namespace Controllers; +namespace Controllers.Users; [ApiController] [Route("api/admin/get_users")] @@ -14,16 +14,21 @@ UserDataService userDataService { [HttpGet] - public IActionResult GetUsers() + public IActionResult GetUsers([FromServices] ILogger logger) { + logger.LogInformation("Запрос на /api/admin/get_users"); + try { var users = userDataService.GetAllUsers(); + logger.LogInformation("Вернул {count} пользователей", users.Count()); return Ok(new { message = "OK", userId = UserId, users }); } catch (Exception ex) { - return StatusCode(500, new { message = "Internal error" }); + logger.LogError(ex, "Ошибка при получении пользователей"); + return Ok(new { message = "Internal error" }); } } + } From 6f6710f478319c784f291cae06d9fcf02ef171ec Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 21:36:21 +0300 Subject: [PATCH 18/48] user add integration --- .../Controllers/ControllerAddUser.cs | 43 +++++++++++ .../Controllers/ControllerGetUsers.cs | 12 ++-- .../Controllers/ControllerUserAdd.cs | 16 ----- .../Controllers/ControllerUserRemove.cs | 16 ----- backend/user-service/user-service/Program.cs | 2 +- .../IPasswordHashingService.cs | 8 +++ .../PasswordHashingService.cs | 17 +++++ .../Services/Users/AddUserService.cs | 72 +++++++++++++++++++ ...{UserDataService.cs => GetUsersService.cs} | 4 +- .../user-service/user-service.csproj | 1 + 10 files changed, 148 insertions(+), 43 deletions(-) create mode 100644 backend/user-service/user-service/Controllers/ControllerAddUser.cs delete mode 100644 backend/user-service/user-service/Controllers/ControllerUserAdd.cs delete mode 100644 backend/user-service/user-service/Controllers/ControllerUserRemove.cs create mode 100644 backend/user-service/user-service/Services/Password Hashing Service/IPasswordHashingService.cs create mode 100644 backend/user-service/user-service/Services/Password Hashing Service/PasswordHashingService.cs create mode 100644 backend/user-service/user-service/Services/Users/AddUserService.cs rename backend/user-service/user-service/Services/Users/{UserDataService.cs => GetUsersService.cs} (94%) diff --git a/backend/user-service/user-service/Controllers/ControllerAddUser.cs b/backend/user-service/user-service/Controllers/ControllerAddUser.cs new file mode 100644 index 0000000..32913eb --- /dev/null +++ b/backend/user-service/user-service/Controllers/ControllerAddUser.cs @@ -0,0 +1,43 @@ +using Controllers.Users.Common; +using Microsoft.AspNetCore.Mvc; +using Services.Token; +using Services.PasswordHashing; +using Services.Users; + +namespace Controllers.Users; + +[ApiController] +[Route("api/admin/user_add")] +public class ControllerAddUser( + ITokenPacketProcessorService tokenService, + IPasswordHashingService passwordHasher, + AddUserService addUserService +) : ControllerBaseTokenized(tokenService) +{ + public record AddUserRequest(string FullName, string Email, string Password); + + [HttpPost] + public IActionResult AddUser([FromBody] AddUserRequest req) + { + if (string.IsNullOrWhiteSpace(req.FullName)) + return BadRequest(new { message = "Full name is required" }); + + if (string.IsNullOrWhiteSpace(req.Email)) + return BadRequest(new { message = "Email is required" }); + + if (string.IsNullOrWhiteSpace(req.Password)) + return BadRequest(new { message = "Password is required" }); + + if (addUserService.EmailExists(req.Email)) + return Conflict(new { message = "Email already exists" }); + + var hash = passwordHasher.Hash(req.Password); + + var id = addUserService.CreateUser(req.FullName, req.Email, hash); + var createdUser = addUserService.GetById(id); + + if (createdUser is null) return StatusCode(500, new { message = "Internal Error" }); + + return Ok(new { user = createdUser }); + } +} diff --git a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs index 9d4f68c..43f99fe 100644 --- a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs +++ b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs @@ -9,25 +9,21 @@ namespace Controllers.Users; [Route("api/admin/get_users")] public class ControllerGetUsers( ITokenPacketProcessorService tokenService, - UserDataService userDataService + GetUsersService userDataService ) : ControllerBaseTokenized(tokenService) { [HttpGet] public IActionResult GetUsers([FromServices] ILogger logger) { - logger.LogInformation("Запрос на /api/admin/get_users"); - try { var users = userDataService.GetAllUsers(); - logger.LogInformation("Вернул {count} пользователей", users.Count()); - return Ok(new { message = "OK", userId = UserId, users }); + return Ok(new { users }); } - catch (Exception ex) + catch (Exception) { - logger.LogError(ex, "Ошибка при получении пользователей"); - return Ok(new { message = "Internal error" }); + return StatusCode(500, new { message = "Internal error" }); } } diff --git a/backend/user-service/user-service/Controllers/ControllerUserAdd.cs b/backend/user-service/user-service/Controllers/ControllerUserAdd.cs deleted file mode 100644 index aaa7fd0..0000000 --- a/backend/user-service/user-service/Controllers/ControllerUserAdd.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Controllers.Users.Common; -using Microsoft.AspNetCore.Mvc; -using Services.Token; - -namespace Controllers.Users; - -[ApiController] -[Route("api/admin/user_add")] -public class ControllerUserAdd(ITokenPacketProcessorService tokenService) : ControllerBaseTokenized(tokenService) -{ - [HttpGet] - public IActionResult GetUsers() - { - return Ok(new { message = "TODO: Add!", UserId }); - } -} diff --git a/backend/user-service/user-service/Controllers/ControllerUserRemove.cs b/backend/user-service/user-service/Controllers/ControllerUserRemove.cs deleted file mode 100644 index 49c7e7c..0000000 --- a/backend/user-service/user-service/Controllers/ControllerUserRemove.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Controllers.Users.Common; -using Microsoft.AspNetCore.Mvc; -using Services.Token; - -namespace Controllers.Users; - -[ApiController] -[Route("api/admin/user_remove")] -public class ControllerUserRemove(ITokenPacketProcessorService tokenService) : ControllerBaseTokenized(tokenService) -{ - [HttpGet] - public IActionResult GetUsers() - { - return Ok(new { message = "TODO: Remove!", UserId }); - } -} diff --git a/backend/user-service/user-service/Program.cs b/backend/user-service/user-service/Program.cs index e67e405..a9e188b 100644 --- a/backend/user-service/user-service/Program.cs +++ b/backend/user-service/user-service/Program.cs @@ -9,7 +9,7 @@ builder.Services.AddControllers(); builder.Services.AddScoped(); builder.Services.AddSingleton(new DbService(builder.Configuration.GetConnectionString("Postgres")!)); -builder.Services.AddScoped(); +builder.Services.AddScoped(); var app = builder.Build(); diff --git a/backend/user-service/user-service/Services/Password Hashing Service/IPasswordHashingService.cs b/backend/user-service/user-service/Services/Password Hashing Service/IPasswordHashingService.cs new file mode 100644 index 0000000..8546886 --- /dev/null +++ b/backend/user-service/user-service/Services/Password Hashing Service/IPasswordHashingService.cs @@ -0,0 +1,8 @@ +namespace Services.PasswordHashing; + +public interface IPasswordHashingService +{ + string Hash(string password); + + bool Verify(string hash, string password); +} diff --git a/backend/user-service/user-service/Services/Password Hashing Service/PasswordHashingService.cs b/backend/user-service/user-service/Services/Password Hashing Service/PasswordHashingService.cs new file mode 100644 index 0000000..a5e3a5a --- /dev/null +++ b/backend/user-service/user-service/Services/Password Hashing Service/PasswordHashingService.cs @@ -0,0 +1,17 @@ +using Isopoh.Cryptography.Argon2; +using Services.PasswordHashing; + +namespace Services.Auth; + +public class Argon2PasswordHashingService : IPasswordHashingService +{ + public string Hash(string password) + { + return Argon2.Hash(password); + } + + public bool Verify(string hash, string password) + { + return Argon2.Verify(hash, password); + } +} diff --git a/backend/user-service/user-service/Services/Users/AddUserService.cs b/backend/user-service/user-service/Services/Users/AddUserService.cs new file mode 100644 index 0000000..cf790b4 --- /dev/null +++ b/backend/user-service/user-service/Services/Users/AddUserService.cs @@ -0,0 +1,72 @@ +using Services.Database; + +using Models.Users; + +namespace Services.Users; + +public class AddUserService +{ + private readonly IDbService _db; + + public AddUserService(IDbService db) + { + _db = db; + } + + public bool EmailExists(string email) + { + const string sql = "SELECT EXISTS(SELECT 1 FROM users WHERE email = @Email);"; + + return _db.QuerySingle(sql, reader => + reader.GetBoolean(0), + new { Email = email } + ); + } + + public Guid CreateUser(string fullName, string email, string passwordHash) + { + const string sql = """ + INSERT INTO users (id, full_name, email, password) + VALUES (@Id, @FullName, @Email, @Password); + """; + + var id = Guid.NewGuid(); + + _db.Execute(sql, new + { + Id = id, + FullName = fullName, + Email = email, + Password = passwordHash + }); + + return id; + } + + public UserDto? GetById(Guid id) + { + const string sql = """ + SELECT + id, full_name, email, phone, avatar_url, + verification_status, is_active, last_login_at + FROM users + WHERE id = @Id + """; + + return _db.QuerySingle(sql, reader => + { + return new UserDto( + reader.GetGuid(reader.GetOrdinal("id")), + reader.GetString(reader.GetOrdinal("full_name")), + reader.GetString(reader.GetOrdinal("email")), + reader.GetString(reader.GetOrdinal("phone")), + reader.GetString(reader.GetOrdinal("avatar_url")), + reader.GetString(reader.GetOrdinal("verification_status")), + reader.GetBoolean(reader.GetOrdinal("is_active")), + reader.IsDBNull(reader.GetOrdinal("last_login_at")) + ? null + : reader.GetDateTime(reader.GetOrdinal("last_login_at")) + ); + }, new { Id = id }); + } +} diff --git a/backend/user-service/user-service/Services/Users/UserDataService.cs b/backend/user-service/user-service/Services/Users/GetUsersService.cs similarity index 94% rename from backend/user-service/user-service/Services/Users/UserDataService.cs rename to backend/user-service/user-service/Services/Users/GetUsersService.cs index ef1a48e..94e6445 100644 --- a/backend/user-service/user-service/Services/Users/UserDataService.cs +++ b/backend/user-service/user-service/Services/Users/GetUsersService.cs @@ -4,11 +4,11 @@ namespace Services.Users; -public class UserDataService +public class GetUsersService { private readonly IDbService _db; - public UserDataService(IDbService db) + public GetUsersService(IDbService db) { _db = db; } diff --git a/backend/user-service/user-service/user-service.csproj b/backend/user-service/user-service/user-service.csproj index c5b5589..6b75ec9 100644 --- a/backend/user-service/user-service/user-service.csproj +++ b/backend/user-service/user-service/user-service.csproj @@ -7,6 +7,7 @@ + From 1907c3455a521d0421ff958013a8252c3a524763 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 21:38:18 +0300 Subject: [PATCH 19/48] add user cool sigmo --- .../Controllers/ControllerAddUser.cs | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/backend/user-service/user-service/Controllers/ControllerAddUser.cs b/backend/user-service/user-service/Controllers/ControllerAddUser.cs index 32913eb..e4d347b 100644 --- a/backend/user-service/user-service/Controllers/ControllerAddUser.cs +++ b/backend/user-service/user-service/Controllers/ControllerAddUser.cs @@ -19,25 +19,32 @@ public record AddUserRequest(string FullName, string Email, string Password); [HttpPost] public IActionResult AddUser([FromBody] AddUserRequest req) { - if (string.IsNullOrWhiteSpace(req.FullName)) - return BadRequest(new { message = "Full name is required" }); + try + { + if (string.IsNullOrWhiteSpace(req.FullName)) + return BadRequest(new { message = "Full name is required" }); - if (string.IsNullOrWhiteSpace(req.Email)) - return BadRequest(new { message = "Email is required" }); + if (string.IsNullOrWhiteSpace(req.Email)) + return BadRequest(new { message = "Email is required" }); - if (string.IsNullOrWhiteSpace(req.Password)) - return BadRequest(new { message = "Password is required" }); + if (string.IsNullOrWhiteSpace(req.Password)) + return BadRequest(new { message = "Password is required" }); - if (addUserService.EmailExists(req.Email)) - return Conflict(new { message = "Email already exists" }); + if (addUserService.EmailExists(req.Email)) + return Conflict(new { message = "Email already exists" }); - var hash = passwordHasher.Hash(req.Password); + var hash = passwordHasher.Hash(req.Password); - var id = addUserService.CreateUser(req.FullName, req.Email, hash); - var createdUser = addUserService.GetById(id); + var id = addUserService.CreateUser(req.FullName, req.Email, hash); + var createdUser = addUserService.GetById(id); - if (createdUser is null) return StatusCode(500, new { message = "Internal Error" }); + if (createdUser is null) return StatusCode(500, new { message = "Internal Error" }); - return Ok(new { user = createdUser }); + return Ok(new { user = createdUser }); + } + catch (Exception) + { + return StatusCode(500, new { message = "Internal error" }); + } } } From 817c0656da91e75becb92d8cf325d43ded537d7b Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 21:47:42 +0300 Subject: [PATCH 20/48] dep --- backend/user-service/user-service/Program.cs | 5 +++++ .../Password Hashing Service/PasswordHashingService.cs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/user-service/user-service/Program.cs b/backend/user-service/user-service/Program.cs index a9e188b..74a9cdb 100644 --- a/backend/user-service/user-service/Program.cs +++ b/backend/user-service/user-service/Program.cs @@ -1,15 +1,20 @@ using Services.Database; using Services.Token; using Services.Users; +using Services.PasswordHashing; +using Services.Auth; var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseUrls("http://0.0.0.0:80"); builder.Services.AddControllers(); + builder.Services.AddScoped(); builder.Services.AddSingleton(new DbService(builder.Configuration.GetConnectionString("Postgres")!)); builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); var app = builder.Build(); diff --git a/backend/user-service/user-service/Services/Password Hashing Service/PasswordHashingService.cs b/backend/user-service/user-service/Services/Password Hashing Service/PasswordHashingService.cs index a5e3a5a..4fc47a9 100644 --- a/backend/user-service/user-service/Services/Password Hashing Service/PasswordHashingService.cs +++ b/backend/user-service/user-service/Services/Password Hashing Service/PasswordHashingService.cs @@ -3,7 +3,7 @@ namespace Services.Auth; -public class Argon2PasswordHashingService : IPasswordHashingService +public class PasswordHashingService : IPasswordHashingService { public string Hash(string password) { From aa0ec37ec7ec07ae007d3ee8dc709cdfdec5502f Mon Sep 17 00:00:00 2001 From: enoreex Date: Sat, 12 Apr 2025 22:05:51 +0300 Subject: [PATCH 21/48] test --- ...Tokenized.cs => ControllerBaseAdminRequired.cs} | 4 ++-- .../user-service/Controllers/ControllerAddUser.cs | 14 +++++--------- .../user-service/Controllers/ControllerGetUsers.cs | 2 +- 3 files changed, 8 insertions(+), 12 deletions(-) rename backend/user-service/user-service/Controllers/Common/{ControllerBaseTokenized.cs => ControllerBaseAdminRequired.cs} (81%) diff --git a/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs b/backend/user-service/user-service/Controllers/Common/ControllerBaseAdminRequired.cs similarity index 81% rename from backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs rename to backend/user-service/user-service/Controllers/Common/ControllerBaseAdminRequired.cs index ebf5b0a..bdb60ea 100644 --- a/backend/user-service/user-service/Controllers/Common/ControllerBaseTokenized.cs +++ b/backend/user-service/user-service/Controllers/Common/ControllerBaseAdminRequired.cs @@ -5,13 +5,13 @@ namespace Controllers.Users.Common; [ApiController] -public abstract class ControllerBaseTokenized : ControllerBase, IActionFilter +public abstract class ControllerBaseAdminRequired : ControllerBase, IActionFilter { protected ITokenPacketProcessorService _tokenService; protected Guid UserId { get; private set; } - protected ControllerBaseTokenized(ITokenPacketProcessorService tokenService) + protected ControllerBaseAdminRequired(ITokenPacketProcessorService tokenService) { _tokenService = tokenService; } diff --git a/backend/user-service/user-service/Controllers/ControllerAddUser.cs b/backend/user-service/user-service/Controllers/ControllerAddUser.cs index e4d347b..23f81ef 100644 --- a/backend/user-service/user-service/Controllers/ControllerAddUser.cs +++ b/backend/user-service/user-service/Controllers/ControllerAddUser.cs @@ -12,7 +12,7 @@ public class ControllerAddUser( ITokenPacketProcessorService tokenService, IPasswordHashingService passwordHasher, AddUserService addUserService -) : ControllerBaseTokenized(tokenService) +) : ControllerBaseAdminRequired(tokenService) { public record AddUserRequest(string FullName, string Email, string Password); @@ -21,17 +21,13 @@ public IActionResult AddUser([FromBody] AddUserRequest req) { try { - if (string.IsNullOrWhiteSpace(req.FullName)) - return BadRequest(new { message = "Full name is required" }); + if (string.IsNullOrWhiteSpace(req.FullName)) return BadRequest(new { message = "Full name is required" }); - if (string.IsNullOrWhiteSpace(req.Email)) - return BadRequest(new { message = "Email is required" }); + if (string.IsNullOrWhiteSpace(req.Email)) return BadRequest(new { message = "Email is required" }); - if (string.IsNullOrWhiteSpace(req.Password)) - return BadRequest(new { message = "Password is required" }); + if (string.IsNullOrWhiteSpace(req.Password)) return BadRequest(new { message = "Password is required" }); - if (addUserService.EmailExists(req.Email)) - return Conflict(new { message = "Email already exists" }); + if (addUserService.EmailExists(req.Email)) return Conflict(new { message = "Email already exists" }); var hash = passwordHasher.Hash(req.Password); diff --git a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs index 43f99fe..3807aaf 100644 --- a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs +++ b/backend/user-service/user-service/Controllers/ControllerGetUsers.cs @@ -10,7 +10,7 @@ namespace Controllers.Users; public class ControllerGetUsers( ITokenPacketProcessorService tokenService, GetUsersService userDataService -) : ControllerBaseTokenized(tokenService) +) : ControllerBaseAdminRequired(tokenService) { [HttpGet] From aeb9b6727a1db4afd77c51ae8bc82e050fac26dc Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 09:12:49 +0300 Subject: [PATCH 22/48] structure --- backend/user-service/user-service/docker-compose.yml | 6 ++---- .../user-service/user-service/{ => docker}/Dockerfile | 9 +++++---- backend/user-service/user-service/{ => keys}/public.pem | 0 .../Controllers/Common/ControllerBaseAdminRequired.cs | 0 .../{ => src}/Controllers/ControllerAddUser.cs | 0 .../{ => src}/Controllers/ControllerGetUsers.cs | 0 .../user-service/{ => src}/Models/UserDto.cs | 0 backend/user-service/user-service/{ => src}/Program.cs | 0 .../{ => src}/Services/Database/DbService.cs | 0 .../{ => src}/Services/Database/IDbService.cs | 0 .../Password Hashing Service/IPasswordHashingService.cs | 0 .../Password Hashing Service/PasswordHashingService.cs | 0 .../Services/Token/ITokenPacketProcessorService.cs | 0 .../Services/Token/TokenPacketProcessorService.cs | 0 .../{ => src}/Services/Users/AddUserService.cs | 0 .../{ => src}/Services/Users/GetUsersService.cs | 0 .../user-service/{user-service.csproj => src/app.csproj} | 0 .../user-service/user-service/{ => src}/appsettings.json | 0 18 files changed, 7 insertions(+), 8 deletions(-) rename backend/user-service/user-service/{ => docker}/Dockerfile (60%) rename backend/user-service/user-service/{ => keys}/public.pem (100%) rename backend/user-service/user-service/{ => src}/Controllers/Common/ControllerBaseAdminRequired.cs (100%) rename backend/user-service/user-service/{ => src}/Controllers/ControllerAddUser.cs (100%) rename backend/user-service/user-service/{ => src}/Controllers/ControllerGetUsers.cs (100%) rename backend/user-service/user-service/{ => src}/Models/UserDto.cs (100%) rename backend/user-service/user-service/{ => src}/Program.cs (100%) rename backend/user-service/user-service/{ => src}/Services/Database/DbService.cs (100%) rename backend/user-service/user-service/{ => src}/Services/Database/IDbService.cs (100%) rename backend/user-service/user-service/{ => src}/Services/Password Hashing Service/IPasswordHashingService.cs (100%) rename backend/user-service/user-service/{ => src}/Services/Password Hashing Service/PasswordHashingService.cs (100%) rename backend/user-service/user-service/{ => src}/Services/Token/ITokenPacketProcessorService.cs (100%) rename backend/user-service/user-service/{ => src}/Services/Token/TokenPacketProcessorService.cs (100%) rename backend/user-service/user-service/{ => src}/Services/Users/AddUserService.cs (100%) rename backend/user-service/user-service/{ => src}/Services/Users/GetUsersService.cs (100%) rename backend/user-service/user-service/{user-service.csproj => src/app.csproj} (100%) rename backend/user-service/user-service/{ => src}/appsettings.json (100%) diff --git a/backend/user-service/user-service/docker-compose.yml b/backend/user-service/user-service/docker-compose.yml index c0402ac..c9481cd 100644 --- a/backend/user-service/user-service/docker-compose.yml +++ b/backend/user-service/user-service/docker-compose.yml @@ -1,9 +1,7 @@ -version: '3.8' - services: user-service: build: context: . - dockerfile: Dockerfile + dockerfile: docker/Dockerfile ports: - - "25565:80" \ No newline at end of file + - "25565:80" diff --git a/backend/user-service/user-service/Dockerfile b/backend/user-service/user-service/docker/Dockerfile similarity index 60% rename from backend/user-service/user-service/Dockerfile rename to backend/user-service/user-service/docker/Dockerfile index 2d9c252..301c89f 100644 --- a/backend/user-service/user-service/Dockerfile +++ b/backend/user-service/user-service/docker/Dockerfile @@ -1,11 +1,12 @@ FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src -COPY . . +COPY ./src/ . RUN dotnet publish -c Release -o /app FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app . -COPY public.pem /app/public.pem -ENV ASPNETCORE_URLS=http://+:80 -ENTRYPOINT ["dotnet", "user-service.dll"] + +COPY ./keys/public.pem ./public.pem + +ENTRYPOINT ["dotnet", "app.dll"] diff --git a/backend/user-service/user-service/public.pem b/backend/user-service/user-service/keys/public.pem similarity index 100% rename from backend/user-service/user-service/public.pem rename to backend/user-service/user-service/keys/public.pem diff --git a/backend/user-service/user-service/Controllers/Common/ControllerBaseAdminRequired.cs b/backend/user-service/user-service/src/Controllers/Common/ControllerBaseAdminRequired.cs similarity index 100% rename from backend/user-service/user-service/Controllers/Common/ControllerBaseAdminRequired.cs rename to backend/user-service/user-service/src/Controllers/Common/ControllerBaseAdminRequired.cs diff --git a/backend/user-service/user-service/Controllers/ControllerAddUser.cs b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs similarity index 100% rename from backend/user-service/user-service/Controllers/ControllerAddUser.cs rename to backend/user-service/user-service/src/Controllers/ControllerAddUser.cs diff --git a/backend/user-service/user-service/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs similarity index 100% rename from backend/user-service/user-service/Controllers/ControllerGetUsers.cs rename to backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs diff --git a/backend/user-service/user-service/Models/UserDto.cs b/backend/user-service/user-service/src/Models/UserDto.cs similarity index 100% rename from backend/user-service/user-service/Models/UserDto.cs rename to backend/user-service/user-service/src/Models/UserDto.cs diff --git a/backend/user-service/user-service/Program.cs b/backend/user-service/user-service/src/Program.cs similarity index 100% rename from backend/user-service/user-service/Program.cs rename to backend/user-service/user-service/src/Program.cs diff --git a/backend/user-service/user-service/Services/Database/DbService.cs b/backend/user-service/user-service/src/Services/Database/DbService.cs similarity index 100% rename from backend/user-service/user-service/Services/Database/DbService.cs rename to backend/user-service/user-service/src/Services/Database/DbService.cs diff --git a/backend/user-service/user-service/Services/Database/IDbService.cs b/backend/user-service/user-service/src/Services/Database/IDbService.cs similarity index 100% rename from backend/user-service/user-service/Services/Database/IDbService.cs rename to backend/user-service/user-service/src/Services/Database/IDbService.cs diff --git a/backend/user-service/user-service/Services/Password Hashing Service/IPasswordHashingService.cs b/backend/user-service/user-service/src/Services/Password Hashing Service/IPasswordHashingService.cs similarity index 100% rename from backend/user-service/user-service/Services/Password Hashing Service/IPasswordHashingService.cs rename to backend/user-service/user-service/src/Services/Password Hashing Service/IPasswordHashingService.cs diff --git a/backend/user-service/user-service/Services/Password Hashing Service/PasswordHashingService.cs b/backend/user-service/user-service/src/Services/Password Hashing Service/PasswordHashingService.cs similarity index 100% rename from backend/user-service/user-service/Services/Password Hashing Service/PasswordHashingService.cs rename to backend/user-service/user-service/src/Services/Password Hashing Service/PasswordHashingService.cs diff --git a/backend/user-service/user-service/Services/Token/ITokenPacketProcessorService.cs b/backend/user-service/user-service/src/Services/Token/ITokenPacketProcessorService.cs similarity index 100% rename from backend/user-service/user-service/Services/Token/ITokenPacketProcessorService.cs rename to backend/user-service/user-service/src/Services/Token/ITokenPacketProcessorService.cs diff --git a/backend/user-service/user-service/Services/Token/TokenPacketProcessorService.cs b/backend/user-service/user-service/src/Services/Token/TokenPacketProcessorService.cs similarity index 100% rename from backend/user-service/user-service/Services/Token/TokenPacketProcessorService.cs rename to backend/user-service/user-service/src/Services/Token/TokenPacketProcessorService.cs diff --git a/backend/user-service/user-service/Services/Users/AddUserService.cs b/backend/user-service/user-service/src/Services/Users/AddUserService.cs similarity index 100% rename from backend/user-service/user-service/Services/Users/AddUserService.cs rename to backend/user-service/user-service/src/Services/Users/AddUserService.cs diff --git a/backend/user-service/user-service/Services/Users/GetUsersService.cs b/backend/user-service/user-service/src/Services/Users/GetUsersService.cs similarity index 100% rename from backend/user-service/user-service/Services/Users/GetUsersService.cs rename to backend/user-service/user-service/src/Services/Users/GetUsersService.cs diff --git a/backend/user-service/user-service/user-service.csproj b/backend/user-service/user-service/src/app.csproj similarity index 100% rename from backend/user-service/user-service/user-service.csproj rename to backend/user-service/user-service/src/app.csproj diff --git a/backend/user-service/user-service/appsettings.json b/backend/user-service/user-service/src/appsettings.json similarity index 100% rename from backend/user-service/user-service/appsettings.json rename to backend/user-service/user-service/src/appsettings.json From cd868949fb4096353b7ec066e754baf35098992e Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 09:41:41 +0300 Subject: [PATCH 23/48] lol --- .../user-service/src/Controllers/ControllerAddUser.cs | 4 ++-- .../user-service/src/Controllers/ControllerGetUsers.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs index 23f81ef..55350f1 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs @@ -38,9 +38,9 @@ public IActionResult AddUser([FromBody] AddUserRequest req) return Ok(new { user = createdUser }); } - catch (Exception) + catch (Exception ex) { - return StatusCode(500, new { message = "Internal error" }); + return StatusCode(500, new { message = "Internal error", error = ex.Message }); } } } diff --git a/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs index 3807aaf..523919f 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs @@ -21,9 +21,9 @@ public IActionResult GetUsers([FromServices] ILogger logger) var users = userDataService.GetAllUsers(); return Ok(new { users }); } - catch (Exception) + catch (Exception ex) { - return StatusCode(500, new { message = "Internal error" }); + return StatusCode(500, new { message = "Internal error", error = ex.Message }); } } From 2b39062c413eb778e6c9a6dffd53072ec0ce2d42 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 09:46:56 +0300 Subject: [PATCH 24/48] leonid sigmos --- .../user-service/src/Controllers/ControllerAddUser.cs | 2 ++ .../user-service/src/Services/Database/DbService.cs | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs index 55350f1..92178b2 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs @@ -31,6 +31,8 @@ public IActionResult AddUser([FromBody] AddUserRequest req) var hash = passwordHasher.Hash(req.Password); + Console.WriteLine("leonid: " + hash); + var id = addUserService.CreateUser(req.FullName, req.Email, hash); var createdUser = addUserService.GetById(id); diff --git a/backend/user-service/user-service/src/Services/Database/DbService.cs b/backend/user-service/user-service/src/Services/Database/DbService.cs index f9eb939..341ea37 100644 --- a/backend/user-service/user-service/src/Services/Database/DbService.cs +++ b/backend/user-service/user-service/src/Services/Database/DbService.cs @@ -58,7 +58,9 @@ private void AddParameters(NpgsqlCommand cmd, object? parameters) { var name = prop.Name.StartsWith("@") ? prop.Name : "@" + prop.Name; var value = prop.GetValue(parameters) ?? DBNull.Value; - cmd.Parameters.AddWithValue(name, value); + cmd.Parameters.AddWithValue(name, value is byte[] bytes + ? NpgsqlTypes.NpgsqlDbType.Bytea + : NpgsqlTypes.NpgsqlDbType.Text, value); } } } From 0dc4c7814767a05b8b09df75238cbe80f0711195 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 09:51:17 +0300 Subject: [PATCH 25/48] compile --- .../src/Controllers/ControllerAddUser.cs | 2 -- .../src/Services/Database/DbService.cs | 20 ++++++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs index 92178b2..55350f1 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs @@ -31,8 +31,6 @@ public IActionResult AddUser([FromBody] AddUserRequest req) var hash = passwordHasher.Hash(req.Password); - Console.WriteLine("leonid: " + hash); - var id = addUserService.CreateUser(req.FullName, req.Email, hash); var createdUser = addUserService.GetById(id); diff --git a/backend/user-service/user-service/src/Services/Database/DbService.cs b/backend/user-service/user-service/src/Services/Database/DbService.cs index 341ea37..308712c 100644 --- a/backend/user-service/user-service/src/Services/Database/DbService.cs +++ b/backend/user-service/user-service/src/Services/Database/DbService.cs @@ -58,9 +58,23 @@ private void AddParameters(NpgsqlCommand cmd, object? parameters) { var name = prop.Name.StartsWith("@") ? prop.Name : "@" + prop.Name; var value = prop.GetValue(parameters) ?? DBNull.Value; - cmd.Parameters.AddWithValue(name, value is byte[] bytes - ? NpgsqlTypes.NpgsqlDbType.Bytea - : NpgsqlTypes.NpgsqlDbType.Text, value); + + var param = cmd.Parameters.Add(name, GetDbType(value)); + param.Value = value; } } + + private NpgsqlTypes.NpgsqlDbType GetDbType(object value) + { + return value switch + { + Guid => NpgsqlTypes.NpgsqlDbType.Uuid, + byte[] => NpgsqlTypes.NpgsqlDbType.Bytea, + bool => NpgsqlTypes.NpgsqlDbType.Boolean, + int => NpgsqlTypes.NpgsqlDbType.Integer, + long => NpgsqlTypes.NpgsqlDbType.Bigint, + DateTime => NpgsqlTypes.NpgsqlDbType.Timestamp, + _ => NpgsqlTypes.NpgsqlDbType.Text + }; + } } From a410cfb34493ec0263afb4b389339de0a350c72e Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 10:15:40 +0300 Subject: [PATCH 26/48] work --- .../Common/ControllerBaseAdminRequired.cs | 1 + .../src/Controllers/ControllerAddUser.cs | 3 ++ .../src/Controllers/ControllerGetUsers.cs | 2 + .../user-service/src/Models/UserDto.cs | 17 ++++--- .../src/Services/Database/DbService.cs | 9 ++-- .../src/Services/Database/Helpers/DbReader.cs | 24 ++++++++++ .../src/Services/Database/Helpers/DbWriter.cs | 15 +++++++ .../src/Services/Database/IDbService.cs | 2 + .../IPasswordHashingService.cs | 4 +- .../PasswordHashingService.cs | 13 ++++-- .../Token/TokenPacketProcessorService.cs | 2 + .../src/Services/Users/AddUserService.cs | 44 +++++++++++-------- .../src/Services/Users/GetUsersService.cs | 40 +++++++++-------- 13 files changed, 122 insertions(+), 54 deletions(-) create mode 100644 backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs create mode 100644 backend/user-service/user-service/src/Services/Database/Helpers/DbWriter.cs diff --git a/backend/user-service/user-service/src/Controllers/Common/ControllerBaseAdminRequired.cs b/backend/user-service/user-service/src/Controllers/Common/ControllerBaseAdminRequired.cs index bdb60ea..66afdf2 100644 --- a/backend/user-service/user-service/src/Controllers/Common/ControllerBaseAdminRequired.cs +++ b/backend/user-service/user-service/src/Controllers/Common/ControllerBaseAdminRequired.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; + using Services.Token; namespace Controllers.Users.Common; diff --git a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs index 55350f1..f719584 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs @@ -1,5 +1,7 @@ using Controllers.Users.Common; + using Microsoft.AspNetCore.Mvc; + using Services.Token; using Services.PasswordHashing; using Services.Users; @@ -32,6 +34,7 @@ public IActionResult AddUser([FromBody] AddUserRequest req) var hash = passwordHasher.Hash(req.Password); var id = addUserService.CreateUser(req.FullName, req.Email, hash); + var createdUser = addUserService.GetById(id); if (createdUser is null) return StatusCode(500, new { message = "Internal Error" }); diff --git a/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs index 523919f..dfcc951 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs @@ -1,5 +1,7 @@ using Controllers.Users.Common; + using Microsoft.AspNetCore.Mvc; + using Services.Token; using Services.Users; diff --git a/backend/user-service/user-service/src/Models/UserDto.cs b/backend/user-service/user-service/src/Models/UserDto.cs index 4079501..8c2ed6c 100644 --- a/backend/user-service/user-service/src/Models/UserDto.cs +++ b/backend/user-service/user-service/src/Models/UserDto.cs @@ -1,13 +1,18 @@ namespace Models.Users; -public record UserDto -( +public record UserDto( Guid Id, - string FullName, + DateTime CreatedAt, + DateTime UpdatedAt, + DateTime? LastLoginAt, + bool IsActive, + byte[] Password, + Guid RoleId, + string VerificationStatus, + Guid OrganizationId, string Email, + string FullName, string Phone, string AvatarUrl, - string VerificationStatus, - bool IsActive, - DateTime? LastLoginAt + string GovId ); diff --git a/backend/user-service/user-service/src/Services/Database/DbService.cs b/backend/user-service/user-service/src/Services/Database/DbService.cs index 308712c..f8fb827 100644 --- a/backend/user-service/user-service/src/Services/Database/DbService.cs +++ b/backend/user-service/user-service/src/Services/Database/DbService.cs @@ -1,4 +1,5 @@ using Npgsql; + using System.Data; namespace Services.Database; @@ -56,7 +57,7 @@ private void AddParameters(NpgsqlCommand cmd, object? parameters) foreach (var prop in parameters.GetType().GetProperties()) { - var name = prop.Name.StartsWith("@") ? prop.Name : "@" + prop.Name; + var name = "@" + prop.Name; var value = prop.GetValue(parameters) ?? DBNull.Value; var param = cmd.Parameters.Add(name, GetDbType(value)); @@ -64,9 +65,8 @@ private void AddParameters(NpgsqlCommand cmd, object? parameters) } } - private NpgsqlTypes.NpgsqlDbType GetDbType(object value) - { - return value switch + private NpgsqlTypes.NpgsqlDbType GetDbType(object value) => + value switch { Guid => NpgsqlTypes.NpgsqlDbType.Uuid, byte[] => NpgsqlTypes.NpgsqlDbType.Bytea, @@ -76,5 +76,4 @@ private NpgsqlTypes.NpgsqlDbType GetDbType(object value) DateTime => NpgsqlTypes.NpgsqlDbType.Timestamp, _ => NpgsqlTypes.NpgsqlDbType.Text }; - } } diff --git a/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs b/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs new file mode 100644 index 0000000..ee9b028 --- /dev/null +++ b/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs @@ -0,0 +1,24 @@ +using System.Data; + +namespace Services.Database.Helpers; + +public static class DbReader +{ + public static Guid GetGuid(this IDataReader r, string name) => + r.GetGuid(r.GetOrdinal(name)); + + public static string GetString(this IDataReader r, string name) => + r.GetString(r.GetOrdinal(name)); + + public static bool GetBool(this IDataReader r, string name) => + r.GetBoolean(r.GetOrdinal(name)); + + public static byte[] GetByteArray(this IDataReader r, string name) => + (byte[])r[name]; + + public static DateTime GetDateTime(this IDataReader r, string name) => + r.GetDateTime(r.GetOrdinal(name)); + + public static DateTime? GetNullableDateTime(this IDataReader r, string name) => + r.IsDBNull(r.GetOrdinal(name)) ? null : r.GetDateTime(r.GetOrdinal(name)); +} \ No newline at end of file diff --git a/backend/user-service/user-service/src/Services/Database/Helpers/DbWriter.cs b/backend/user-service/user-service/src/Services/Database/Helpers/DbWriter.cs new file mode 100644 index 0000000..a13b87c --- /dev/null +++ b/backend/user-service/user-service/src/Services/Database/Helpers/DbWriter.cs @@ -0,0 +1,15 @@ +namespace Services.Database.Helpers; + +public static class DbWriter +{ + public static Dictionary FromObject(object src) + { + var dict = new Dictionary(); + foreach (var prop in src.GetType().GetProperties()) + { + var val = prop.GetValue(src); + dict[prop.Name] = val ?? DBNull.Value; + } + return dict; + } +} diff --git a/backend/user-service/user-service/src/Services/Database/IDbService.cs b/backend/user-service/user-service/src/Services/Database/IDbService.cs index ba33f69..e6c99e1 100644 --- a/backend/user-service/user-service/src/Services/Database/IDbService.cs +++ b/backend/user-service/user-service/src/Services/Database/IDbService.cs @@ -5,6 +5,8 @@ namespace Services.Database; public interface IDbService { T? QuerySingle(string sql, Func map, object? parameters = null); + IEnumerable Query(string sql, Func map, object? parameters = null); + int Execute(string sql, object? parameters = null); } diff --git a/backend/user-service/user-service/src/Services/Password Hashing Service/IPasswordHashingService.cs b/backend/user-service/user-service/src/Services/Password Hashing Service/IPasswordHashingService.cs index 8546886..f406166 100644 --- a/backend/user-service/user-service/src/Services/Password Hashing Service/IPasswordHashingService.cs +++ b/backend/user-service/user-service/src/Services/Password Hashing Service/IPasswordHashingService.cs @@ -2,7 +2,7 @@ public interface IPasswordHashingService { - string Hash(string password); + byte[] Hash(string password); - bool Verify(string hash, string password); + bool Verify(byte[] hash, string password); } diff --git a/backend/user-service/user-service/src/Services/Password Hashing Service/PasswordHashingService.cs b/backend/user-service/user-service/src/Services/Password Hashing Service/PasswordHashingService.cs index 4fc47a9..77c49c0 100644 --- a/backend/user-service/user-service/src/Services/Password Hashing Service/PasswordHashingService.cs +++ b/backend/user-service/user-service/src/Services/Password Hashing Service/PasswordHashingService.cs @@ -1,17 +1,22 @@ using Isopoh.Cryptography.Argon2; + using Services.PasswordHashing; +using System.Text; + namespace Services.Auth; public class PasswordHashingService : IPasswordHashingService { - public string Hash(string password) + public byte[] Hash(string password) { - return Argon2.Hash(password); + string hashString = Argon2.Hash(password); + return Encoding.UTF8.GetBytes(hashString); } - public bool Verify(string hash, string password) + public bool Verify(byte[] hash, string password) { - return Argon2.Verify(hash, password); + string hashString = Encoding.UTF8.GetString(hash); + return Argon2.Verify(hashString, password); } } diff --git a/backend/user-service/user-service/src/Services/Token/TokenPacketProcessorService.cs b/backend/user-service/user-service/src/Services/Token/TokenPacketProcessorService.cs index 18f41a8..30f0aa3 100644 --- a/backend/user-service/user-service/src/Services/Token/TokenPacketProcessorService.cs +++ b/backend/user-service/user-service/src/Services/Token/TokenPacketProcessorService.cs @@ -1,5 +1,7 @@ using Microsoft.IdentityModel.Tokens; + using System.IdentityModel.Tokens.Jwt; + using System.Security.Claims; using System.Security.Cryptography; diff --git a/backend/user-service/user-service/src/Services/Users/AddUserService.cs b/backend/user-service/user-service/src/Services/Users/AddUserService.cs index cf790b4..59ffd5e 100644 --- a/backend/user-service/user-service/src/Services/Users/AddUserService.cs +++ b/backend/user-service/user-service/src/Services/Users/AddUserService.cs @@ -1,4 +1,5 @@ -using Services.Database; +using Services.Database; +using Services.Database.Helpers; using Models.Users; @@ -18,17 +19,17 @@ public bool EmailExists(string email) const string sql = "SELECT EXISTS(SELECT 1 FROM users WHERE email = @Email);"; return _db.QuerySingle(sql, reader => - reader.GetBoolean(0), + reader.GetBool(0), new { Email = email } ); } - public Guid CreateUser(string fullName, string email, string passwordHash) + public Guid CreateUser(string fullName, string email, byte[] passwordHash) { const string sql = """ INSERT INTO users (id, full_name, email, password) VALUES (@Id, @FullName, @Email, @Password); - """; + """; var id = Guid.NewGuid(); @@ -47,26 +48,31 @@ INSERT INTO users (id, full_name, email, password) { const string sql = """ SELECT - id, full_name, email, phone, avatar_url, - verification_status, is_active, last_login_at + id, created_at, updated_at, last_login_at, is_active, + password, role_id, verification_status, organization_id, + email, full_name, phone, avatar_url, gov_id FROM users WHERE id = @Id - """; + """; - return _db.QuerySingle(sql, reader => + return _db.QuerySingle(sql, r => { return new UserDto( - reader.GetGuid(reader.GetOrdinal("id")), - reader.GetString(reader.GetOrdinal("full_name")), - reader.GetString(reader.GetOrdinal("email")), - reader.GetString(reader.GetOrdinal("phone")), - reader.GetString(reader.GetOrdinal("avatar_url")), - reader.GetString(reader.GetOrdinal("verification_status")), - reader.GetBoolean(reader.GetOrdinal("is_active")), - reader.IsDBNull(reader.GetOrdinal("last_login_at")) - ? null - : reader.GetDateTime(reader.GetOrdinal("last_login_at")) + r.GetGuid("id"), + r.GetDateTime("created_at"), + r.GetDateTime("updated_at"), + r.GetNullableDateTime("last_login_at"), + r.GetBool("is_active"), + r.GetByteArray("password"), + r.GetGuid("role_id"), + r.GetString("verification_status"), + r.GetGuid("organization_id"), + r.GetString("email"), + r.GetString("full_name"), + r.GetString("phone"), + r.GetString("avatar_url"), + r.GetString("gov_id") ); }, new { Id = id }); } -} +} \ No newline at end of file diff --git a/backend/user-service/user-service/src/Services/Users/GetUsersService.cs b/backend/user-service/user-service/src/Services/Users/GetUsersService.cs index 94e6445..0f29b3c 100644 --- a/backend/user-service/user-service/src/Services/Users/GetUsersService.cs +++ b/backend/user-service/user-service/src/Services/Users/GetUsersService.cs @@ -1,5 +1,5 @@ using Services.Database; - +using Services.Database.Helpers; using Models.Users; namespace Services.Users; @@ -16,27 +16,31 @@ public GetUsersService(IDbService db) public IEnumerable GetAllUsers() { const string sql = """ - SELECT - id, full_name, email, phone, avatar_url, - verification_status, is_active, last_login_at - FROM users - """; + SELECT + id, created_at, updated_at, last_login_at, is_active, + password, role_id, verification_status, organization_id, + email, full_name, phone, avatar_url, gov_id + FROM users + """; - return _db.Query(sql, reader => + return _db.Query(sql, r => { return new UserDto( - reader.GetGuid(reader.GetOrdinal("id")), - reader.GetString(reader.GetOrdinal("full_name")), - reader.GetString(reader.GetOrdinal("email")), - reader.GetString(reader.GetOrdinal("phone")), - reader.GetString(reader.GetOrdinal("avatar_url")), - reader.GetString(reader.GetOrdinal("verification_status")), - reader.GetBoolean(reader.GetOrdinal("is_active")), - reader.IsDBNull(reader.GetOrdinal("last_login_at")) - ? null - : reader.GetDateTime(reader.GetOrdinal("last_login_at")) + r.GetGuid("id"), + r.GetDateTime("created_at"), + r.GetDateTime("updated_at"), + r.GetNullableDateTime("last_login_at"), + r.GetBool("is_active"), + r.GetByteArray("password"), + r.GetGuid("role_id"), + r.GetString("verification_status"), + r.GetGuid("organization_id"), + r.GetString("email"), + r.GetString("full_name"), + r.GetString("phone"), + r.GetString("avatar_url"), + r.GetString("gov_id") ); }); } - } From 1ecd12dcb3da2276d708e6b95a25a4f3ce8833dd Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 10:35:28 +0300 Subject: [PATCH 27/48] okej les go --- .../user-service/docker/Dockerfile | 5 ++++ .../user-service/src/Models/UserDto.cs | 2 +- .../src/Services/Database/Helpers/DbReader.cs | 12 ++++---- .../src/Services/Users/AddUserService.cs | 30 +++++++++---------- .../src/Services/Users/GetUsersService.cs | 29 +++++++++--------- 5 files changed, 42 insertions(+), 36 deletions(-) diff --git a/backend/user-service/user-service/docker/Dockerfile b/backend/user-service/user-service/docker/Dockerfile index 301c89f..bd2fc59 100644 --- a/backend/user-service/user-service/docker/Dockerfile +++ b/backend/user-service/user-service/docker/Dockerfile @@ -3,10 +3,15 @@ WORKDIR /src COPY ./src/ . RUN dotnet publish -c Release -o /app +RUN useradd -u 8571 -r -g -0 -s /sbin/nologin \ + -c "Default Application User" postgres + FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app . COPY ./keys/public.pem ./public.pem +USER 8571 + ENTRYPOINT ["dotnet", "app.dll"] diff --git a/backend/user-service/user-service/src/Models/UserDto.cs b/backend/user-service/user-service/src/Models/UserDto.cs index 8c2ed6c..a8087ad 100644 --- a/backend/user-service/user-service/src/Models/UserDto.cs +++ b/backend/user-service/user-service/src/Models/UserDto.cs @@ -6,7 +6,7 @@ public record UserDto( DateTime UpdatedAt, DateTime? LastLoginAt, bool IsActive, - byte[] Password, + string Password, Guid RoleId, string VerificationStatus, Guid OrganizationId, diff --git a/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs b/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs index ee9b028..5fff1ff 100644 --- a/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs +++ b/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs @@ -4,21 +4,21 @@ namespace Services.Database.Helpers; public static class DbReader { - public static Guid GetGuid(this IDataReader r, string name) => + public static Guid _GetGuid(this IDataReader r, string name) => r.GetGuid(r.GetOrdinal(name)); - public static string GetString(this IDataReader r, string name) => + public static string _GetString(this IDataReader r, string name) => r.GetString(r.GetOrdinal(name)); - public static bool GetBool(this IDataReader r, string name) => + public static bool _GetBool(this IDataReader r, string name) => r.GetBoolean(r.GetOrdinal(name)); - public static byte[] GetByteArray(this IDataReader r, string name) => + public static byte[] _GetByteArray(this IDataReader r, string name) => (byte[])r[name]; - public static DateTime GetDateTime(this IDataReader r, string name) => + public static DateTime _GetDateTime(this IDataReader r, string name) => r.GetDateTime(r.GetOrdinal(name)); - public static DateTime? GetNullableDateTime(this IDataReader r, string name) => + public static DateTime? _GetNullableDateTime(this IDataReader r, string name) => r.IsDBNull(r.GetOrdinal(name)) ? null : r.GetDateTime(r.GetOrdinal(name)); } \ No newline at end of file diff --git a/backend/user-service/user-service/src/Services/Users/AddUserService.cs b/backend/user-service/user-service/src/Services/Users/AddUserService.cs index 59ffd5e..91b7386 100644 --- a/backend/user-service/user-service/src/Services/Users/AddUserService.cs +++ b/backend/user-service/user-service/src/Services/Users/AddUserService.cs @@ -19,7 +19,7 @@ public bool EmailExists(string email) const string sql = "SELECT EXISTS(SELECT 1 FROM users WHERE email = @Email);"; return _db.QuerySingle(sql, reader => - reader.GetBool(0), + reader.GetBoolean(0), new { Email = email } ); } @@ -58,20 +58,20 @@ FROM users return _db.QuerySingle(sql, r => { return new UserDto( - r.GetGuid("id"), - r.GetDateTime("created_at"), - r.GetDateTime("updated_at"), - r.GetNullableDateTime("last_login_at"), - r.GetBool("is_active"), - r.GetByteArray("password"), - r.GetGuid("role_id"), - r.GetString("verification_status"), - r.GetGuid("organization_id"), - r.GetString("email"), - r.GetString("full_name"), - r.GetString("phone"), - r.GetString("avatar_url"), - r.GetString("gov_id") + r._GetGuid("id"), + r._GetDateTime("created_at"), + r._GetDateTime("updated_at"), + r._GetNullableDateTime("last_login_at"), + r._GetBool("is_active"), + Convert.ToBase64String(r._GetByteArray("password")), + r._GetGuid("role_id"), + r._GetString("verification_status"), + r._GetGuid("organization_id"), + r._GetString("email"), + r._GetString("full_name"), + r._GetString("phone"), + r._GetString("avatar_url"), + r._GetString("gov_id") ); }, new { Id = id }); } diff --git a/backend/user-service/user-service/src/Services/Users/GetUsersService.cs b/backend/user-service/user-service/src/Services/Users/GetUsersService.cs index 0f29b3c..7f38917 100644 --- a/backend/user-service/user-service/src/Services/Users/GetUsersService.cs +++ b/backend/user-service/user-service/src/Services/Users/GetUsersService.cs @@ -1,5 +1,6 @@ using Services.Database; using Services.Database.Helpers; + using Models.Users; namespace Services.Users; @@ -26,20 +27,20 @@ FROM users return _db.Query(sql, r => { return new UserDto( - r.GetGuid("id"), - r.GetDateTime("created_at"), - r.GetDateTime("updated_at"), - r.GetNullableDateTime("last_login_at"), - r.GetBool("is_active"), - r.GetByteArray("password"), - r.GetGuid("role_id"), - r.GetString("verification_status"), - r.GetGuid("organization_id"), - r.GetString("email"), - r.GetString("full_name"), - r.GetString("phone"), - r.GetString("avatar_url"), - r.GetString("gov_id") + r._GetGuid("id"), + r._GetDateTime("created_at"), + r._GetDateTime("updated_at"), + r._GetNullableDateTime("last_login_at"), + r._GetBool("is_active"), + Convert.ToBase64String(r._GetByteArray("password")), + r._GetGuid("role_id"), + r._GetString("verification_status"), + r._GetGuid("organization_id"), + r._GetString("email"), + r._GetString("full_name"), + r._GetString("phone"), + r._GetString("avatar_url"), + r._GetString("gov_id") ); }); } From e662e10d5974eaa2bd8ecb2cf647790a6e1a8e89 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 10:43:20 +0300 Subject: [PATCH 28/48] ok cool --- .../src/Services/Database/Helpers/DbReader.cs | 69 +++++++++++++++---- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs b/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs index 5fff1ff..0ee2821 100644 --- a/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs +++ b/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs @@ -1,24 +1,67 @@ +using System; using System.Data; namespace Services.Database.Helpers; public static class DbReader { - public static Guid _GetGuid(this IDataReader r, string name) => - r.GetGuid(r.GetOrdinal(name)); + public static Guid GetGuid(this IDataReader r, string name) + { + try + { + int i = r.GetOrdinal(name); + return r.IsDBNull(i) ? Guid.Empty : r.GetGuid(i); + } + catch { return Guid.Empty; } + } - public static string _GetString(this IDataReader r, string name) => - r.GetString(r.GetOrdinal(name)); + public static string GetString(this IDataReader r, string name) + { + try + { + int i = r.GetOrdinal(name); + return r.IsDBNull(i) ? string.Empty : r.GetString(i); + } + catch { return string.Empty; } + } - public static bool _GetBool(this IDataReader r, string name) => - r.GetBoolean(r.GetOrdinal(name)); + public static bool GetBool(this IDataReader r, string name) + { + try + { + int i = r.GetOrdinal(name); + return !r.IsDBNull(i) && r.GetBoolean(i); + } + catch { return false; } + } - public static byte[] _GetByteArray(this IDataReader r, string name) => - (byte[])r[name]; + public static byte[] GetByteArray(this IDataReader r, string name) + { + try + { + object val = r[name]; + return val is byte[] data ? data : Array.Empty(); + } + catch { return Array.Empty(); } + } - public static DateTime _GetDateTime(this IDataReader r, string name) => - r.GetDateTime(r.GetOrdinal(name)); + public static DateTime GetDateTime(this IDataReader r, string name) + { + try + { + int i = r.GetOrdinal(name); + return r.IsDBNull(i) ? DateTime.MinValue : r.GetDateTime(i); + } + catch { return DateTime.MinValue; } + } - public static DateTime? _GetNullableDateTime(this IDataReader r, string name) => - r.IsDBNull(r.GetOrdinal(name)) ? null : r.GetDateTime(r.GetOrdinal(name)); -} \ No newline at end of file + public static DateTime? GetNullableDateTime(this IDataReader r, string name) + { + try + { + int i = r.GetOrdinal(name); + return r.IsDBNull(i) ? null : r.GetDateTime(i); + } + catch { return null; } + } +} From 40f194754c13f6a12c7254069ab9eb114dbaa76e Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 11:00:22 +0300 Subject: [PATCH 29/48] names fix --- .../src/Services/Database/Helpers/DbReader.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs b/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs index 0ee2821..5fc648f 100644 --- a/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs +++ b/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs @@ -5,7 +5,7 @@ namespace Services.Database.Helpers; public static class DbReader { - public static Guid GetGuid(this IDataReader r, string name) + public static Guid _GetGuid(this IDataReader r, string name) { try { @@ -15,7 +15,7 @@ public static Guid GetGuid(this IDataReader r, string name) catch { return Guid.Empty; } } - public static string GetString(this IDataReader r, string name) + public static string _GetString(this IDataReader r, string name) { try { @@ -25,7 +25,7 @@ public static string GetString(this IDataReader r, string name) catch { return string.Empty; } } - public static bool GetBool(this IDataReader r, string name) + public static bool _GetBool(this IDataReader r, string name) { try { @@ -35,7 +35,7 @@ public static bool GetBool(this IDataReader r, string name) catch { return false; } } - public static byte[] GetByteArray(this IDataReader r, string name) + public static byte[] _GetByteArray(this IDataReader r, string name) { try { @@ -45,7 +45,7 @@ public static byte[] GetByteArray(this IDataReader r, string name) catch { return Array.Empty(); } } - public static DateTime GetDateTime(this IDataReader r, string name) + public static DateTime _GetDateTime(this IDataReader r, string name) { try { @@ -55,7 +55,7 @@ public static DateTime GetDateTime(this IDataReader r, string name) catch { return DateTime.MinValue; } } - public static DateTime? GetNullableDateTime(this IDataReader r, string name) + public static DateTime? _GetNullableDateTime(this IDataReader r, string name) { try { From 2690979ab5dfa553b4cc3c7d9e437401d5fc8609 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 11:24:33 +0300 Subject: [PATCH 30/48] getuser --- .../src/Controllers/ControllerAddUser.cs | 2 +- .../src/Controllers/ControllerGetUser.cs | 34 +++++++++++++ .../src/Controllers/ControllerGetUsers.cs | 2 +- .../user-service/user-service/src/Program.cs | 3 +- .../src/Services/Users/GetUserService.cs | 48 +++++++++++++++++++ 5 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 backend/user-service/user-service/src/Controllers/ControllerGetUser.cs create mode 100644 backend/user-service/user-service/src/Services/Users/GetUserService.cs diff --git a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs index f719584..4eb64c7 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs @@ -39,7 +39,7 @@ public IActionResult AddUser([FromBody] AddUserRequest req) if (createdUser is null) return StatusCode(500, new { message = "Internal Error" }); - return Ok(new { user = createdUser }); + return Ok(new { createdUser }); } catch (Exception ex) { diff --git a/backend/user-service/user-service/src/Controllers/ControllerGetUser.cs b/backend/user-service/user-service/src/Controllers/ControllerGetUser.cs new file mode 100644 index 0000000..c9352d6 --- /dev/null +++ b/backend/user-service/user-service/src/Controllers/ControllerGetUser.cs @@ -0,0 +1,34 @@ +using Controllers.Users.Common; + +using Microsoft.AspNetCore.Mvc; + +using Services.Token; +using Services.Users; + +namespace Controllers.Users; + +[ApiController] +[Route("api/admin/get_user")] +public class ControllerGetUser( + ITokenPacketProcessorService tokenService, + GetUserService userDataService +) : ControllerBaseAdminRequired(tokenService) + +{ + public record GetUserRequest(Guid Id); + + [HttpGet] + public IActionResult GetUser([FromBody] GetUserRequest req) + { + try + { + var user = userDataService.GetUser(req.Id); + return Ok(new { user }); + } + catch (Exception ex) + { + return StatusCode(500, new { message = "Internal error", error = ex.Message }); + } + } + +} diff --git a/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs index dfcc951..65163b3 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs @@ -16,7 +16,7 @@ GetUsersService userDataService { [HttpGet] - public IActionResult GetUsers([FromServices] ILogger logger) + public IActionResult GetUsers() { try { diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index 74a9cdb..e270390 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -12,8 +12,9 @@ builder.Services.AddScoped(); builder.Services.AddSingleton(new DbService(builder.Configuration.GetConnectionString("Postgres")!)); -builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddScoped(); var app = builder.Build(); diff --git a/backend/user-service/user-service/src/Services/Users/GetUserService.cs b/backend/user-service/user-service/src/Services/Users/GetUserService.cs new file mode 100644 index 0000000..670fe72 --- /dev/null +++ b/backend/user-service/user-service/src/Services/Users/GetUserService.cs @@ -0,0 +1,48 @@ +using Services.Database; +using Services.Database.Helpers; + +using Models.Users; + +namespace Services.Users; + +public class GetUserService +{ + private readonly IDbService _db; + + public GetUserService(IDbService db) + { + _db = db; + } + + public UserDto? GetUser(Guid id) + { + const string sql = """ + SELECT + id, created_at, updated_at, last_login_at, is_active, + password, role_id, verification_status, organization_id, + email, full_name, phone, avatar_url, gov_id + FROM users + WHERE id = @Id + """; + + return _db.QuerySingle(sql, r => + { + return new UserDto( + r._GetGuid("id"), + r._GetDateTime("created_at"), + r._GetDateTime("updated_at"), + r._GetNullableDateTime("last_login_at"), + r._GetBool("is_active"), + Convert.ToBase64String(r._GetByteArray("password")), + r._GetGuid("role_id"), + r._GetString("verification_status"), + r._GetGuid("organization_id"), + r._GetString("email"), + r._GetString("full_name"), + r._GetString("phone"), + r._GetString("avatar_url"), + r._GetString("gov_id") + ); + }, new { Id = id }); + } +} From 31d1ba5b938dca5846a917c29fd45d332cf60dcb Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 11:56:31 +0300 Subject: [PATCH 31/48] post only --- .../user-service/src/Controllers/ControllerGetUser.cs | 2 +- .../user-service/src/Controllers/ControllerGetUsers.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/user-service/user-service/src/Controllers/ControllerGetUser.cs b/backend/user-service/user-service/src/Controllers/ControllerGetUser.cs index c9352d6..49844dc 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerGetUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerGetUser.cs @@ -17,7 +17,7 @@ GetUserService userDataService { public record GetUserRequest(Guid Id); - [HttpGet] + [HttpPost] public IActionResult GetUser([FromBody] GetUserRequest req) { try diff --git a/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs b/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs index 65163b3..2f49307 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerGetUsers.cs @@ -15,7 +15,7 @@ GetUsersService userDataService ) : ControllerBaseAdminRequired(tokenService) { - [HttpGet] + [HttpPost] public IActionResult GetUsers() { try From 0f67cd783f10c179528dec3177354fdb5b48d5b9 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 11:58:20 +0300 Subject: [PATCH 32/48] =?UTF-8?q?=D1=8C=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/user-service/user-service-docs.md | 170 +++++++++++++++++++++- 1 file changed, 169 insertions(+), 1 deletion(-) diff --git a/backend/user-service/user-service-docs.md b/backend/user-service/user-service-docs.md index a1672e4..78dcb6a 100644 --- a/backend/user-service/user-service-docs.md +++ b/backend/user-service/user-service-docs.md @@ -1 +1,169 @@ -JWT \ No newline at end of file +### Опис проєкту + +Проєкт було написано на c# з використанням .NET, ASP.NET Core Web API, Kestrel, PostgreSQL, JWT, Docker + +### ЩО ПОВИННО БУТИ В КОЖНОМУ ЗАПИТІ + +**Header** + +```application/json +Authorization: Bearer +``` + +**Unautorized error (401)**: + +```json +{ + "message": "Unautorized error", +} +``` + +**Internal error (500)**: + +```json +{ + "message": "Internal error", + "error": "" +} +``` + +#### `GET /api/admin/get_users` + +**Опис**: Отримання даних всіх користувачів + +### Request + +**Body**: +```application/json +Null +``` + +**Success (200)**: + +```json +{ + "users": [ + { + "id": "", + "createdAt": "", + "updatedAt": "", + "lastLoginAt": "", + "isActive": "", + "password": "", + "roleId": "", + "verificationStatus": "", + "organizationId": "", + "email": "", + "fullName": "", + "phone": "", + "avatarUrl": "", + "govId": "" + } + ] +} +``` + +#### `GET /api/admin/get_user` + +**Опис**: Отримання даних одного користувача + +### Request + +**Body**: +```json +{ + "id": "" +} +``` +**Success (200)**: + +```json +{ + "createdUser": { + "id": "", + "createdAt": "", + "updatedAt": "", + "lastLoginAt": "", + "isActive": "", + "password": "", + "roleId": "", + "verificationStatus": "", + "organizationId": "", + "email": "", + "fullName": "", + "phone": "", + "avatarUrl": "", + "govId": "" + } +} + +``` + +#### `POST /api/admin/add_user` + +**Опис**: Додавання нового користувача + +### Request + +**Body** + +```json +{ + "fullName": "", + "email": "", + "password": "", +} +``` + +**Success (200)**: + +```json +{ + "user": [ + { + "id": "", + "created_at": "", + "updated_at": "", + "last_login_at": "", + "is_active": "", + "password": "", + "role_id": "", + "verification_status": "", + "organization_id": "", + "email": "", + "fullName": "", + "phone": "", + "avatar_url": "", + "gov_id": "" + } + ] +} +``` + +**Bad Request (400)**: + +```json +{ + "message": "Full name is required" +} +``` + +```json +{ + "message": "Email is required" +} +``` + +```json +{ + "message": "Password is required" +} +``` + +**Conflict (409)**: + +```json +{ + "message": "Email already exists" +} +``` \ No newline at end of file From 22ebdad7e2509f9f7c9f4c1f6d878f83164ec165 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 12:51:41 +0300 Subject: [PATCH 33/48] change user --- .../src/Controllers/ControllerAddUser.cs | 4 +- .../src/Controllers/ControllerChangeUser.cs | 30 +++++++++++ .../src/Controllers/ControllerGetUser.cs | 4 +- .../src/Models/{UserDto.cs => Models.cs} | 6 ++- .../user-service/user-service/src/Program.cs | 1 + .../src/Services/Database/Helpers/DbReader.cs | 1 - .../src/Services/Users/ChangeUserService.cs | 54 +++++++++++++++++++ 7 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs rename backend/user-service/user-service/src/Models/{UserDto.cs => Models.cs} (74%) create mode 100644 backend/user-service/user-service/src/Services/Users/ChangeUserService.cs diff --git a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs index 4eb64c7..d9d2061 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerAddUser.cs @@ -6,6 +6,8 @@ using Services.PasswordHashing; using Services.Users; +using Models.Users; + namespace Controllers.Users; [ApiController] @@ -16,8 +18,6 @@ public class ControllerAddUser( AddUserService addUserService ) : ControllerBaseAdminRequired(tokenService) { - public record AddUserRequest(string FullName, string Email, string Password); - [HttpPost] public IActionResult AddUser([FromBody] AddUserRequest req) { diff --git a/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs b/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs new file mode 100644 index 0000000..c52f20a --- /dev/null +++ b/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs @@ -0,0 +1,30 @@ +using Controllers.Users.Common; +using Microsoft.AspNetCore.Mvc; +using Services.Token; +using Services.Users; + +using ChangeUserRequest = Models.Users.UserDto; + +namespace Controllers.Users; + +[ApiController] +[Route("api/admin/user_change")] +public class ControllerChangeUser( + ITokenPacketProcessorService tokenService, + ChangeUserService changeUserService +) : ControllerBaseAdminRequired(tokenService) +{ + [HttpPost] + public IActionResult ChangeUser([FromBody] ChangeUserRequest req) + { + try + { + changeUserService.ChangeUser(req); + return Ok(new { message = "OK" }); + } + catch (Exception ex) + { + return StatusCode(500, new { message = "Internal error", error = ex.Message }); + } + } +} diff --git a/backend/user-service/user-service/src/Controllers/ControllerGetUser.cs b/backend/user-service/user-service/src/Controllers/ControllerGetUser.cs index 49844dc..4c16146 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerGetUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerGetUser.cs @@ -5,6 +5,8 @@ using Services.Token; using Services.Users; +using Models.Users; + namespace Controllers.Users; [ApiController] @@ -15,8 +17,6 @@ GetUserService userDataService ) : ControllerBaseAdminRequired(tokenService) { - public record GetUserRequest(Guid Id); - [HttpPost] public IActionResult GetUser([FromBody] GetUserRequest req) { diff --git a/backend/user-service/user-service/src/Models/UserDto.cs b/backend/user-service/user-service/src/Models/Models.cs similarity index 74% rename from backend/user-service/user-service/src/Models/UserDto.cs rename to backend/user-service/user-service/src/Models/Models.cs index a8087ad..a87eeda 100644 --- a/backend/user-service/user-service/src/Models/UserDto.cs +++ b/backend/user-service/user-service/src/Models/Models.cs @@ -1,5 +1,9 @@ namespace Models.Users; +public record AddUserRequest(string FullName, string Email, string Password); + +public record GetUserRequest(Guid Id); + public record UserDto( Guid Id, DateTime CreatedAt, @@ -15,4 +19,4 @@ public record UserDto( string Phone, string AvatarUrl, string GovId -); +); \ No newline at end of file diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index e270390..7d80e85 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -13,6 +13,7 @@ builder.Services.AddScoped(); builder.Services.AddSingleton(new DbService(builder.Configuration.GetConnectionString("Postgres")!)); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs b/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs index 5fc648f..370d196 100644 --- a/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs +++ b/backend/user-service/user-service/src/Services/Database/Helpers/DbReader.cs @@ -1,4 +1,3 @@ -using System; using System.Data; namespace Services.Database.Helpers; diff --git a/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs b/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs new file mode 100644 index 0000000..3c604a0 --- /dev/null +++ b/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs @@ -0,0 +1,54 @@ +using Services.Database; + +using Models.Users; + +namespace Services.Users; + +public class ChangeUserService +{ + private readonly IDbService _db; + + public ChangeUserService(IDbService db) + { + _db = db; + } + + public void ChangeUser(UserDto user) + { + const string sql = """ + UPDATE users SET + created_at = @CreatedAt, + updated_at = @UpdatedAt, + last_login_at = @LastLoginAt, + is_active = @IsActive, + password = @Password, + role_id = @RoleId, + verification_status = @VerificationStatus, + organization_id = @OrganizationId, + email = @Email, + full_name = @FullName, + phone = @Phone, + avatar_url = @AvatarUrl, + gov_id = @GovId + WHERE id = @Id; + """; + + _db.Execute(sql, new + { + user.CreatedAt, + user.UpdatedAt, + user.LastLoginAt, + user.IsActive, + Password = Convert.FromBase64String(user.Password), + user.RoleId, + user.VerificationStatus, + user.OrganizationId, + user.Email, + user.FullName, + user.Phone, + user.AvatarUrl, + user.GovId, + user.Id + }); + } +} \ No newline at end of file From fae64cc4542a1f6a5b66316456ef8226ce16b20b Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 13:03:02 +0300 Subject: [PATCH 34/48] md --- backend/user-service/user-service-docs.md | 128 ++++++++++++------ .../src/Controllers/ControllerChangeUser.cs | 2 + 2 files changed, 89 insertions(+), 41 deletions(-) diff --git a/backend/user-service/user-service-docs.md b/backend/user-service/user-service-docs.md index 78dcb6a..6959bba 100644 --- a/backend/user-service/user-service-docs.md +++ b/backend/user-service/user-service-docs.md @@ -1,24 +1,28 @@ -### Опис проєкту +# 🛡️ User Service API -Проєкт було написано на c# з використанням .NET, ASP.NET Core Web API, Kestrel, PostgreSQL, JWT, Docker +Проєкт розроблений на **C# (.NET 8)** з використанням **ASP.NET Core Web API**, **Kestrel**, **PostgreSQL**, **JWT-аутентифікації**, контейнеризований у **Docker**. -### ЩО ПОВИННО БУТИ В КОЖНОМУ ЗАПИТІ +## 🔐 Загальні вимоги до запитів -**Header** +Кожен запит до API повинен містити заголовок авторизації з JWT-токеном: -```application/json +### 🔸 Authorization Header + +```http Authorization: Bearer ``` -**Unautorized error (401)**: +## 🔴 Помилки + +### 401 Unauthorized ```json { - "message": "Unautorized error", + "message": "Unautorized error" } ``` -**Internal error (500)**: +### 500 Internal Server Error ```json { @@ -27,18 +31,19 @@ Authorization: Bearer } ``` -#### `GET /api/admin/get_users` +## 📘 Ендпоїнти + +### ✅ POST /api/admin/get_users -**Опис**: Отримання даних всіх користувачів +Отримання **всіх користувачів** з бази. -### Request +#### 🔹 Request Body -**Body**: -```application/json -Null +```json +null ``` -**Success (200)**: +#### 🔹 Response 200 OK ```json { @@ -63,19 +68,19 @@ Null } ``` -#### `GET /api/admin/get_user` +### ✅ POST /api/admin/get_user -**Опис**: Отримання даних одного користувача +Отримання **одного користувача** по `id`. -### Request +#### 🔹 Request Body -**Body**: ```json { "id": "" } ``` -**Success (200)**: + +#### 🔹 Response 200 OK ```json { @@ -96,51 +101,50 @@ Null "govId": "" } } - ``` -#### `POST /api/admin/add_user` - -**Опис**: Додавання нового користувача +### ✅ POST /api/admin/user_add -### Request +Додавання **нового користувача**. -**Body** +#### 🔹 Request Body ```json { "fullName": "", "email": "", - "password": "", + "password": "" } ``` -**Success (200)**: +#### 🔹 Response 200 OK ```json { "user": [ { "id": "", - "created_at": "", - "updated_at": "", - "last_login_at": "", - "is_active": "", - "password": "", - "role_id": "", - "verification_status": "", - "organization_id": "", + "createdAt": "", + "updatedAt": "", + "lastLoginAt": "", + "isActive": "", + "password": "", + "roleId": "", + "verificationStatus": "", + "organizationId": "", "email": "", "fullName": "", "phone": "", - "avatar_url": "", - "gov_id": "" + "avatarUrl": "", + "govId": "" } ] } ``` -**Bad Request (400)**: +#### 🔻 Помилки + +##### 400 Bad Request ```json { @@ -160,10 +164,52 @@ Null } ``` -**Conflict (409)**: +##### 409 Conflict ```json { "message": "Email already exists" } -``` \ No newline at end of file +``` + +### ✅ POST /api/admin/user_change + +Зміна **даних користувача** за `id`. + +#### 🔹 Request Body + +```json +{ + "id": "", + "createdAt": "", + "updatedAt": "", + "lastLoginAt": "", + "isActive": "", + "password": "", + "roleId": "", + "verificationStatus": "", + "organizationId": "", + "email": "", + "fullName": "", + "phone": "", + "avatarUrl": "", + "govId": "" +} +``` + +#### 🔹 Response 200 OK + +```json +{ + "message": "Ok" +} +``` + +## 📦 Технології + +- C# / .NET 8 +- ASP.NET Core Web API +- PostgreSQL +- JWT (RS256) +- Docker +- Kestrel \ No newline at end of file diff --git a/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs b/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs index c52f20a..e70fae4 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs @@ -1,5 +1,7 @@ using Controllers.Users.Common; + using Microsoft.AspNetCore.Mvc; + using Services.Token; using Services.Users; From a7daceefeaa45469ed70192678ccf725f89e6231 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 13:14:25 +0300 Subject: [PATCH 35/48] cooool --- .../user-service/src/Services/Users/ChangeUserService.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs b/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs index 3c604a0..07589e4 100644 --- a/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs +++ b/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs @@ -17,11 +17,7 @@ public void ChangeUser(UserDto user) { const string sql = """ UPDATE users SET - created_at = @CreatedAt, - updated_at = @UpdatedAt, - last_login_at = @LastLoginAt, is_active = @IsActive, - password = @Password, role_id = @RoleId, verification_status = @VerificationStatus, organization_id = @OrganizationId, @@ -35,11 +31,7 @@ UPDATE users SET _db.Execute(sql, new { - user.CreatedAt, - user.UpdatedAt, - user.LastLoginAt, user.IsActive, - Password = Convert.FromBase64String(user.Password), user.RoleId, user.VerificationStatus, user.OrganizationId, From c53b4e651462dd52f7e55ab68ca008b22b81710c Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 13:42:49 +0300 Subject: [PATCH 36/48] cors --- backend/user-service/user-service/src/Program.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index 7d80e85..67d9de4 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -1,13 +1,23 @@ +using Services.Auth; using Services.Database; +using Services.PasswordHashing; using Services.Token; using Services.Users; -using Services.PasswordHashing; -using Services.Auth; var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseUrls("http://0.0.0.0:80"); +builder.Services.AddCors(options => +{ + options.AddDefaultPolicy(policy => + { + policy.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); +}); + builder.Services.AddControllers(); builder.Services.AddScoped(); @@ -20,6 +30,8 @@ var app = builder.Build(); +app.UseCors(); + app.UseRouting(); app.MapControllers(); From 997b9bb5423b2abeef9918969f6397b2074a90d4 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 13:50:33 +0300 Subject: [PATCH 37/48] pizdo --- .../src/Controllers/ControllerChangeUser.cs | 4 +--- backend/user-service/user-service/src/Program.cs | 13 ++++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs b/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs index e70fae4..cd45847 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs @@ -1,7 +1,5 @@ using Controllers.Users.Common; - using Microsoft.AspNetCore.Mvc; - using Services.Token; using Services.Users; @@ -22,7 +20,7 @@ public IActionResult ChangeUser([FromBody] ChangeUserRequest req) try { changeUserService.ChangeUser(req); - return Ok(new { message = "OK" }); + return Ok(new { message = "User updated successfully" }); } catch (Exception ex) { diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index 67d9de4..1ff23fa 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -1,13 +1,14 @@ -using Services.Auth; -using Services.Database; -using Services.PasswordHashing; +using Services.Database; using Services.Token; using Services.Users; +using Services.PasswordHashing; +using Services.Auth; var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseUrls("http://0.0.0.0:80"); +// 🔓 CORS — разрешаем вообще всё и обрабатываем OPTIONS builder.Services.AddCors(options => { options.AddDefaultPolicy(policy => @@ -30,9 +31,15 @@ var app = builder.Build(); +// 🔥 Обязательно до маршрутов app.UseCors(); +// 🚦 Включаем маршрутизацию app.UseRouting(); + +// 👇 Это позволяет .NET автоматически обрабатывать OPTIONS-запросы +app.UseAuthorization(); + app.MapControllers(); app.Run(); From a478096c7e8c3b288ad4bd3932cb6d269b123298 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 13:55:11 +0300 Subject: [PATCH 38/48] options ss --- .../user-service/user-service/src/Program.cs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index 1ff23fa..6e92b74 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -1,26 +1,25 @@ -using Services.Database; +using Services.Auth; +using Services.Database; +using Services.PasswordHashing; using Services.Token; using Services.Users; -using Services.PasswordHashing; -using Services.Auth; var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseUrls("http://0.0.0.0:80"); -// 🔓 CORS — разрешаем вообще всё и обрабатываем OPTIONS builder.Services.AddCors(options => { options.AddDefaultPolicy(policy => { - policy.AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader(); + policy + .AllowAnyOrigin() + .AllowAnyHeader() + .AllowAnyMethod(); }); }); builder.Services.AddControllers(); - builder.Services.AddScoped(); builder.Services.AddSingleton(new DbService(builder.Configuration.GetConnectionString("Postgres")!)); builder.Services.AddScoped(); @@ -31,13 +30,10 @@ var app = builder.Build(); -// 🔥 Обязательно до маршрутов app.UseCors(); -// 🚦 Включаем маршрутизацию app.UseRouting(); -// 👇 Это позволяет .NET автоматически обрабатывать OPTIONS-запросы app.UseAuthorization(); app.MapControllers(); From c6405a5db9af39b64c271225b23427e4dc7642d6 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 13:56:16 +0300 Subject: [PATCH 39/48] CORS --- backend/user-service/user-service/src/Models/Models.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/user-service/user-service/src/Models/Models.cs b/backend/user-service/user-service/src/Models/Models.cs index a87eeda..1022063 100644 --- a/backend/user-service/user-service/src/Models/Models.cs +++ b/backend/user-service/user-service/src/Models/Models.cs @@ -2,6 +2,8 @@ public record AddUserRequest(string FullName, string Email, string Password); +public record ChangeUserRequest1(Guid Id); + public record GetUserRequest(Guid Id); public record UserDto( From 92e93e66b942e586a227a38a561995b4b533f4c4 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 13:59:17 +0300 Subject: [PATCH 40/48] OKK CORS --- backend/user-service/user-service/src/Program.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index 6e92b74..d418260 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -6,20 +6,24 @@ var builder = WebApplication.CreateBuilder(args); +// Слушать на порту 80 (0.0.0.0 — на всех интерфейсах, включая Docker) builder.WebHost.UseUrls("http://0.0.0.0:80"); +// Настройка CORS: разрешён только конкретный адрес builder.Services.AddCors(options => { options.AddDefaultPolicy(policy => { policy - .AllowAnyOrigin() + .WithOrigins("http://192.168.88.26:25565") // IP Docker-фронта .AllowAnyHeader() .AllowAnyMethod(); }); }); builder.Services.AddControllers(); + +// DI-сервисы builder.Services.AddScoped(); builder.Services.AddSingleton(new DbService(builder.Configuration.GetConnectionString("Postgres")!)); builder.Services.AddScoped(); @@ -30,7 +34,7 @@ var app = builder.Build(); -app.UseCors(); +app.UseCors(); // подключаем CORS app.UseRouting(); From d2df1ffae1b1fa76e64e0708ea44a77a635e281d Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 14:03:29 +0300 Subject: [PATCH 41/48] jhjhh --- backend/user-service/user-service/src/Models/Models.cs | 2 +- backend/user-service/user-service/src/Program.cs | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/user-service/user-service/src/Models/Models.cs b/backend/user-service/user-service/src/Models/Models.cs index 1022063..401bda3 100644 --- a/backend/user-service/user-service/src/Models/Models.cs +++ b/backend/user-service/user-service/src/Models/Models.cs @@ -2,7 +2,7 @@ public record AddUserRequest(string FullName, string Email, string Password); -public record ChangeUserRequest1(Guid Id); +public record ChangeUserRequest1(Guid Id, ); public record GetUserRequest(Guid Id); diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index d418260..a075e3c 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -15,12 +15,16 @@ options.AddDefaultPolicy(policy => { policy - .WithOrigins("http://192.168.88.26:25565") // IP Docker-фронта + .WithOrigins( + "http://192.168.88.51:5173", + "http://localhost:5173" + ) .AllowAnyHeader() .AllowAnyMethod(); }); }); + builder.Services.AddControllers(); // DI-сервисы From 6594eb3b87abe33ed5ca604fa7a5748c29fa2044 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 14:06:48 +0300 Subject: [PATCH 42/48] NEW TYPE --- backend/user-service/user-service/src/Models/Models.cs | 2 +- backend/user-service/user-service/src/Program.cs | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/backend/user-service/user-service/src/Models/Models.cs b/backend/user-service/user-service/src/Models/Models.cs index 401bda3..c3bbb1f 100644 --- a/backend/user-service/user-service/src/Models/Models.cs +++ b/backend/user-service/user-service/src/Models/Models.cs @@ -2,7 +2,7 @@ public record AddUserRequest(string FullName, string Email, string Password); -public record ChangeUserRequest1(Guid Id, ); +public record ChangeUserRequest1(Guid Id, DateTime CreatedAt, string Email, string Phone, string VerificationStatus); public record GetUserRequest(Guid Id); diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index a075e3c..a1ce058 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -6,10 +6,8 @@ var builder = WebApplication.CreateBuilder(args); -// Слушать на порту 80 (0.0.0.0 — на всех интерфейсах, включая Docker) builder.WebHost.UseUrls("http://0.0.0.0:80"); -// Настройка CORS: разрешён только конкретный адрес builder.Services.AddCors(options => { options.AddDefaultPolicy(policy => @@ -24,10 +22,8 @@ }); }); - builder.Services.AddControllers(); -// DI-сервисы builder.Services.AddScoped(); builder.Services.AddSingleton(new DbService(builder.Configuration.GetConnectionString("Postgres")!)); builder.Services.AddScoped(); @@ -38,7 +34,7 @@ var app = builder.Build(); -app.UseCors(); // подключаем CORS +app.UseCors(); app.UseRouting(); From c7bc68c3939578552703b221db7c27c1a4592ea5 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 14:08:01 +0300 Subject: [PATCH 43/48] CORS AGAIN --- backend/user-service/user-service/src/Program.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index a1ce058..e0fa7bb 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -15,7 +15,9 @@ policy .WithOrigins( "http://192.168.88.51:5173", - "http://localhost:5173" + "http://localhost:5173", + "http://192.168.88.51:80", + "http://localhost:80" ) .AllowAnyHeader() .AllowAnyMethod(); From 296dacb5dbe616b3449840f75db9412cfda1e83e Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 14:11:33 +0300 Subject: [PATCH 44/48] CORS LAST HOPE --- .../user-service/user-service/src/Models/Models.cs | 2 +- backend/user-service/user-service/src/Program.cs | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/backend/user-service/user-service/src/Models/Models.cs b/backend/user-service/user-service/src/Models/Models.cs index c3bbb1f..05cbfdb 100644 --- a/backend/user-service/user-service/src/Models/Models.cs +++ b/backend/user-service/user-service/src/Models/Models.cs @@ -2,7 +2,7 @@ public record AddUserRequest(string FullName, string Email, string Password); -public record ChangeUserRequest1(Guid Id, DateTime CreatedAt, string Email, string Phone, string VerificationStatus); +public record ChangeUserRequest1(Guid Id, DateTime CreatedAt, string Email, string FullName, string Phone, string VerificationStatus); public record GetUserRequest(Guid Id); diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index e0fa7bb..9416a8c 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -14,11 +14,12 @@ { policy .WithOrigins( - "http://192.168.88.51:5173", - "http://localhost:5173", - "http://192.168.88.51:80", - "http://localhost:80" - ) + "http://192.168.88.26:25565", // ⬅️ Добавь обязательно + "http://192.168.88.51:5173", + "http://localhost:5173", + "http://192.168.88.51:80", + "http://localhost:80" +) .AllowAnyHeader() .AllowAnyMethod(); }); From 518e6c63e3960810b3fee36107ba165d9a9c85b0 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 14:15:33 +0300 Subject: [PATCH 45/48] QWE --- .../src/Controllers/ControllerChangeUser.cs | 4 ++- .../user-service/src/Models/Models.cs | 2 +- .../user-service/user-service/src/Program.cs | 13 ++++---- .../src/Services/Users/ChangeUserService.cs | 30 ++----------------- 4 files changed, 13 insertions(+), 36 deletions(-) diff --git a/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs b/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs index cd45847..c56e0bb 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs @@ -1,9 +1,11 @@ using Controllers.Users.Common; + using Microsoft.AspNetCore.Mvc; + using Services.Token; using Services.Users; -using ChangeUserRequest = Models.Users.UserDto; +using Models.Users; namespace Controllers.Users; diff --git a/backend/user-service/user-service/src/Models/Models.cs b/backend/user-service/user-service/src/Models/Models.cs index 05cbfdb..0645cad 100644 --- a/backend/user-service/user-service/src/Models/Models.cs +++ b/backend/user-service/user-service/src/Models/Models.cs @@ -2,7 +2,7 @@ public record AddUserRequest(string FullName, string Email, string Password); -public record ChangeUserRequest1(Guid Id, DateTime CreatedAt, string Email, string FullName, string Phone, string VerificationStatus); +public record ChangeUserRequest(Guid Id, DateTime CreatedAt, string Email, string FullName, string Phone, string VerificationStatus); public record GetUserRequest(Guid Id); diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index 9416a8c..6f0f27d 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -14,12 +14,13 @@ { policy .WithOrigins( - "http://192.168.88.26:25565", // ⬅️ Добавь обязательно - "http://192.168.88.51:5173", - "http://localhost:5173", - "http://192.168.88.51:80", - "http://localhost:80" -) + "http://192.168.88.26:25565", // адрес запроса + "http://192.168.88.51", // Origin, который реально пришёл! + "http://192.168.88.51:5173", + "http://localhost:5173", + "http://192.168.88.51:80", + "http://localhost:80" + ) .AllowAnyHeader() .AllowAnyMethod(); }); diff --git a/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs b/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs index 07589e4..3eb9e3e 100644 --- a/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs +++ b/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs @@ -13,34 +13,8 @@ public ChangeUserService(IDbService db) _db = db; } - public void ChangeUser(UserDto user) + public void ChangeUser(ChangeUserRequest user) { - const string sql = """ - UPDATE users SET - is_active = @IsActive, - role_id = @RoleId, - verification_status = @VerificationStatus, - organization_id = @OrganizationId, - email = @Email, - full_name = @FullName, - phone = @Phone, - avatar_url = @AvatarUrl, - gov_id = @GovId - WHERE id = @Id; - """; - - _db.Execute(sql, new - { - user.IsActive, - user.RoleId, - user.VerificationStatus, - user.OrganizationId, - user.Email, - user.FullName, - user.Phone, - user.AvatarUrl, - user.GovId, - user.Id - }); + } } \ No newline at end of file From 9c6e440b43f28b63d9c6dd41ebbf02d3c20793af Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 14:22:59 +0300 Subject: [PATCH 46/48] change fix --- .../src/Controllers/ControllerChangeUser.cs | 2 +- .../src/Services/Users/ChangeUserService.cs | 25 +++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs b/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs index c56e0bb..2d29ac6 100644 --- a/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs +++ b/backend/user-service/user-service/src/Controllers/ControllerChangeUser.cs @@ -21,7 +21,7 @@ public IActionResult ChangeUser([FromBody] ChangeUserRequest req) { try { - changeUserService.ChangeUser(req); + changeUserService.ChangeUser(req.Id, req.CreatedAt, req.Email, req.FullName, req.Phone, req.VerificationStatus); return Ok(new { message = "User updated successfully" }); } catch (Exception ex) diff --git a/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs b/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs index 3eb9e3e..722222d 100644 --- a/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs +++ b/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs @@ -13,8 +13,29 @@ public ChangeUserService(IDbService db) _db = db; } - public void ChangeUser(ChangeUserRequest user) + public void ChangeUser(Guid id, DateTime createdAt, string email, string fullName, string phone, string verificationStatus) { - + const string sql = """ + UPDATE users + SET + created_at = @CreatedAt, + email = @Email, + full_name = @FullName, + phone = @Phone, + verification_status = @VerificationStatus, + updated_at = NOW() + WHERE id = @Id + """; + + _db.Execute(sql, new + { + Id = id, + CreatedAt = createdAt, + Email = email, + FullName = fullName, + Phone = phone, + VerificationStatus = verificationStatus + }); } + } \ No newline at end of file From 1bd59828f8d5b8d84b96e5dadb233e7721741a85 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 14:34:56 +0300 Subject: [PATCH 47/48] change fix --- .../user-service/src/Services/Users/ChangeUserService.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs b/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs index 722222d..1e3ade0 100644 --- a/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs +++ b/backend/user-service/user-service/src/Services/Users/ChangeUserService.cs @@ -22,7 +22,7 @@ UPDATE users email = @Email, full_name = @FullName, phone = @Phone, - verification_status = @VerificationStatus, + verification_status = @VerificationStatus::verification_status_enum, updated_at = NOW() WHERE id = @Id """; @@ -37,5 +37,4 @@ UPDATE users VerificationStatus = verificationStatus }); } - } \ No newline at end of file From b974aa624377af8a443c139637dc949eae96a5d5 Mon Sep 17 00:00:00 2001 From: enoreex Date: Sun, 13 Apr 2025 14:46:26 +0300 Subject: [PATCH 48/48] FINAL --- .../user-service/user-service/docker-compose.yml | 2 +- backend/user-service/user-service/src/Program.cs | 9 +-------- .../src/Services/Database/Helpers/DbWriter.cs | 15 --------------- 3 files changed, 2 insertions(+), 24 deletions(-) delete mode 100644 backend/user-service/user-service/src/Services/Database/Helpers/DbWriter.cs diff --git a/backend/user-service/user-service/docker-compose.yml b/backend/user-service/user-service/docker-compose.yml index c9481cd..2bf70c5 100644 --- a/backend/user-service/user-service/docker-compose.yml +++ b/backend/user-service/user-service/docker-compose.yml @@ -4,4 +4,4 @@ services: context: . dockerfile: docker/Dockerfile ports: - - "25565:80" + - "883:80" diff --git a/backend/user-service/user-service/src/Program.cs b/backend/user-service/user-service/src/Program.cs index 6f0f27d..15a1449 100644 --- a/backend/user-service/user-service/src/Program.cs +++ b/backend/user-service/user-service/src/Program.cs @@ -13,14 +13,7 @@ options.AddDefaultPolicy(policy => { policy - .WithOrigins( - "http://192.168.88.26:25565", // адрес запроса - "http://192.168.88.51", // Origin, который реально пришёл! - "http://192.168.88.51:5173", - "http://localhost:5173", - "http://192.168.88.51:80", - "http://localhost:80" - ) + .AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); diff --git a/backend/user-service/user-service/src/Services/Database/Helpers/DbWriter.cs b/backend/user-service/user-service/src/Services/Database/Helpers/DbWriter.cs deleted file mode 100644 index a13b87c..0000000 --- a/backend/user-service/user-service/src/Services/Database/Helpers/DbWriter.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Services.Database.Helpers; - -public static class DbWriter -{ - public static Dictionary FromObject(object src) - { - var dict = new Dictionary(); - foreach (var prop in src.GetType().GetProperties()) - { - var val = prop.GetValue(src); - dict[prop.Name] = val ?? DBNull.Value; - } - return dict; - } -}