using System.Text.Json; using API.Contracts.Neutrino.Enums; using API.Contracts.Neutrino.Requests; using API.Contracts.Neutrino.Responses; using Microsoft.AspNetCore.Mvc; using RecNet.Application.Neutrino; namespace API.Controllers.Neutrino; [Route("[controller]")] [ApiController] public class NeutrinoController(INeutrinoAuthorizationService authorizationService) : ControllerBase { // Photon sends the request with Content-Type: text/plain instead of application/json. [Route("authorize")] public async Task> AuthorizeNeutrinoAsync( CancellationToken ct) { using var reader = new StreamReader(Request.Body); string rawText = await reader.ReadToEndAsync(ct); NeutrinoAuthenticateRequest? request; try { request = JsonSerializer.Deserialize(rawText, new JsonSerializerOptions { IncludeFields = true, PropertyNameCaseInsensitive = true }); } catch { return Ok( NeutrinoAuthenticateResponse.Failure( AuthenticationResultCode.InvalidParameters)); } if (request is null) return Ok( NeutrinoAuthenticateResponse.Failure( AuthenticationResultCode.InvalidParameters)); var result = await authorizationService.AuthorizeAsync( new AuthorizeNeutrinoCommand( request.ProfileId, request.AccessToken), ct); if (!result.Succeeded) return Ok( NeutrinoAuthenticateResponse.Failure( MapFailure(result.Failure))); return Ok( NeutrinoAuthenticateResponse.Success( result.UserId!, result.Nickname!)); } private static AuthenticationResultCode MapFailure(NeutrinoAuthorizationFailure? failure) => failure == NeutrinoAuthorizationFailure.InvalidParameters ? AuthenticationResultCode.InvalidParameters : AuthenticationResultCode.AuthenticationFailedWrongCredentials; }