From d4eadc5919b146e063421dde5d2139e20a585813 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 21 Jan 2026 23:25:53 +0100 Subject: [PATCH] quick refactor for clarity --- src/Auth/AuthAPI/AuthSettings.cs | 8 ++++ src/Auth/AuthAPI/MemberValidationService.cs | 42 +++++++++++++++++++++ src/Auth/AuthAPI/Program.cs | 24 ++++++++---- src/Auth/AuthAPI/Request.cs | 34 ----------------- 4 files changed, 67 insertions(+), 41 deletions(-) create mode 100644 src/Auth/AuthAPI/AuthSettings.cs create mode 100644 src/Auth/AuthAPI/MemberValidationService.cs diff --git a/src/Auth/AuthAPI/AuthSettings.cs b/src/Auth/AuthAPI/AuthSettings.cs new file mode 100644 index 0000000..b205449 --- /dev/null +++ b/src/Auth/AuthAPI/AuthSettings.cs @@ -0,0 +1,8 @@ +namespace AuthAPI; + +public class AuthSettings +{ + public string ApiUrl { get; set; } = string.Empty; + public string ApiKey { get; set; } = string.Empty; + public string AssociationNumber { get; set; } = string.Empty; +} diff --git a/src/Auth/AuthAPI/MemberValidationService.cs b/src/Auth/AuthAPI/MemberValidationService.cs new file mode 100644 index 0000000..3fca78a --- /dev/null +++ b/src/Auth/AuthAPI/MemberValidationService.cs @@ -0,0 +1,42 @@ +using Microsoft.Extensions.Options; + +namespace AuthAPI; + +public class MemberValidationService(IOptions authSettings) +{ + private readonly AuthSettings _settings = authSettings.Value; + + public Result GetRequestWithApiKey(Request request) + { + if (ValidateRequest(request)) + return Result.CreateFailure( + "Invalid request. Either SSN or both Email and FirstName must be provided."); + + return Result.CreateSuccess( + new ValidateMembersRoot( + new ValidateMembersRequest( + "confirm_membership", + _settings.AssociationNumber, + _settings.ApiKey, + YearId: null, + Firstname: request.FirstName ?? null, + Lastname: null, + SSN: request.Ssn ?? null, + Email: request.Email ?? null, + Phone: null, + MemberNick: null, + DiscordId: null + ) + ) + ); + } + + private static bool ValidateRequest(Request validationRequest) => ( + (string.IsNullOrWhiteSpace(validationRequest.Ssn) && + (string.IsNullOrWhiteSpace(validationRequest.Email) || + string.IsNullOrWhiteSpace(validationRequest.FirstName))) || + (!string.IsNullOrWhiteSpace(validationRequest.Email) && + string.IsNullOrWhiteSpace(validationRequest.FirstName))) || + (!string.IsNullOrWhiteSpace(validationRequest.Ssn) && + long.TryParse(validationRequest.Ssn ?? "", out _) == false); +} diff --git a/src/Auth/AuthAPI/Program.cs b/src/Auth/AuthAPI/Program.cs index cb7c6b9..600ec4b 100644 --- a/src/Auth/AuthAPI/Program.cs +++ b/src/Auth/AuthAPI/Program.cs @@ -1,8 +1,12 @@ +using Microsoft.Extensions.Options; using Microsoft.AspNetCore.Mvc; using AuthAPI; var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpClient(); +builder.Services.Configure( + builder.Configuration.GetSection("EnviromentVariables")); +builder.Services.AddScoped(); builder.Services.ConfigureHttpJsonOptions(options => { options.SerializerOptions.AllowTrailingCommas = true; @@ -10,20 +14,26 @@ builder.Services.ConfigureHttpJsonOptions(options => var app = builder.Build(); -var enviromentVariables = builder.Configuration.GetSection("EnviromentVariables"); - -app.MapGet("/validate", async ([FromBody] Request validationRequest, HttpClient httpClient) => +app.MapGet("/validate", async ( + [FromBody] Request validationRequest, + HttpClient httpClient, + MemberValidationService memberService, + IOptions settings) => { - var request = Request.GetRequestWithApiKey(validationRequest, enviromentVariables); + var request = memberService.GetRequestWithApiKey(validationRequest); if (request.IsFailure) return Results.BadRequest(request.Failure); - var response = await httpClient.PostAsJsonAsync(enviromentVariables["ApiUrl"], request.Success); + var response = await httpClient.PostAsJsonAsync( + settings.Value.ApiUrl, + request.Success); + if (!response.IsSuccessStatusCode) return Results.StatusCode((int)response.StatusCode); - return Results.Ok(response.Content.ReadAsStringAsync().Result.Contains("\"member_found\":true,")); + var content = await response.Content.ReadAsStringAsync(); + return Results.Ok(content.Contains("\"member_found\":true,")); }) .WithName("ValidateMember"); -app.Run(); \ No newline at end of file +app.Run(); diff --git a/src/Auth/AuthAPI/Request.cs b/src/Auth/AuthAPI/Request.cs index d653d70..d8530c8 100644 --- a/src/Auth/AuthAPI/Request.cs +++ b/src/Auth/AuthAPI/Request.cs @@ -7,40 +7,6 @@ public class Request(string? ssn, string? email, string? firstName) public string? Ssn { get; } = ssn; public string? Email { get; } = email; public string? FirstName { get; } = firstName; - - public static Result GetRequestWithApiKey(Request request, IConfigurationSection enviromentVariables) - { - if (ValidateRequest(request)) - return Result.CreateFailure( - "Invalid request. Either SSN or both Email and FirstName must be provided."); - - return Result.CreateSuccess( - new ValidateMembersRoot( - new ValidateMembersRequest( - "confirm_membership", - enviromentVariables["AssociationNumber"] ?? "", - enviromentVariables["ApiKey"] ?? "", - YearId: null, - Firstname: request.FirstName ?? null, - Lastname: null, - SSN: request.Ssn ?? null, - Email: request.Email ?? null, - Phone: null, - MemberNick: null, - DiscordId: null - ) - ) - ); - } - - private static bool ValidateRequest(Request validationRequest) => ( - (string.IsNullOrWhiteSpace(validationRequest.Ssn) && - (string.IsNullOrWhiteSpace(validationRequest.Email) || - string.IsNullOrWhiteSpace(validationRequest.FirstName))) || - (!string.IsNullOrWhiteSpace(validationRequest.Email) && - string.IsNullOrWhiteSpace(validationRequest.FirstName))) || - (!string.IsNullOrWhiteSpace(validationRequest.Ssn) && - long.TryParse(validationRequest.Ssn ?? "", out _) == false); }; public record ValidateMembersRoot(