66 lines
2.2 KiB
C#
66 lines
2.2 KiB
C#
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<ActionResult<NeutrinoAuthenticateResponse>> AuthorizeNeutrinoAsync(
|
|
CancellationToken ct)
|
|
{
|
|
using var reader = new StreamReader(Request.Body);
|
|
string rawText = await reader.ReadToEndAsync(ct);
|
|
|
|
NeutrinoAuthenticateRequest? request;
|
|
|
|
try
|
|
{
|
|
request = JsonSerializer.Deserialize<NeutrinoAuthenticateRequest>(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;
|
|
}
|