LANCommander/LANCommander.Server/Endpoints/ProfileEndpoints.cs
2025-11-21 01:28:37 -06:00

170 lines
5.3 KiB
C#

using System.Security.Claims;
using LANCommander.Server.Data.Models;
using LANCommander.Server.Models;
using LANCommander.Server.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace LANCommander.Server.Endpoints;
public static class ProfileEndpoints
{
public static void MapProfileEndpoints(this IEndpointRouteBuilder routes)
{
var group = routes.MapGroup("/api/Profile").RequireAuthorization();
group.MapGet("/", GetAsync);
group.MapPut("/ChangeAlias", ChangeAliasAsync);
group.MapGet("/Avatar", AvatarAsync);
group.MapGet("/{userName}/Avatar", AvatarByUserNameAsync).AllowAnonymous();
group.MapGet("/CustomField/{name}", GetCustomFieldAsync);
group.MapPut("/CustomField/{name}", UpdateCustomFieldAsync);
}
internal static async Task<IResult> GetAsync(
ClaimsPrincipal userPrincipal,
[FromServices] UserService userService)
{
if (userPrincipal?.Identity?.IsAuthenticated ?? false)
{
var user = await userService.GetAsync<SDK.Models.User>(userPrincipal.Identity!.Name);
if (user != null)
return TypedResults.Ok(user);
return TypedResults.NotFound();
}
return TypedResults.Unauthorized();
}
internal static async Task<IResult> ChangeAliasAsync(
[FromBody] ChangeAliasRequest request,
ClaimsPrincipal userPrincipal,
[FromServices] UserService userService)
{
if (userPrincipal?.Identity?.IsAuthenticated ?? false)
{
var user = await userService.GetAsync(userPrincipal.Identity!.Name);
user.Alias = request.Alias;
await userService.UpdateAsync(user);
return TypedResults.Ok(request.Alias);
}
return TypedResults.Unauthorized();
}
internal static async Task<IResult> AvatarAsync(
ClaimsPrincipal userPrincipal,
[FromServices] UserService userService,
[FromServices] MediaService mediaService)
{
if (userPrincipal?.Identity?.IsAuthenticated ?? false)
{
var user = await userService.GetAsync(userPrincipal.Identity!.Name);
if (user == null)
return TypedResults.NotFound();
var media = await mediaService.FirstOrDefaultAsync(
m => m.Type == SDK.Enums.MediaType.Avatar && m.UserId == user.Id);
if (media == null)
return TypedResults.NotFound();
var fs = File.OpenRead(MediaService.GetMediaPath(media));
return TypedResults.File(fs, media.MimeType);
}
return TypedResults.NotFound();
}
internal static async Task<IResult> AvatarByUserNameAsync(
string userName,
[FromServices] UserService userService,
[FromServices] MediaService mediaService,
[FromServices] ILoggerFactory loggerFactory)
{
var logger = loggerFactory.CreateLogger("ProfileApi");
try
{
var user = await userService.GetAsync(userName);
if (user == null)
return TypedResults.NotFound();
var media = await mediaService.FirstOrDefaultAsync(
m => m.Type == SDK.Enums.MediaType.Avatar && m.UserId == user.Id);
if (media == null)
return TypedResults.NotFound();
var fs = File.OpenRead(MediaService.GetMediaPath(media));
return TypedResults.File(fs, media.MimeType);
}
catch (Exception ex)
{
logger.LogError(ex, "Error while getting avatar for user {UserName}", userName);
return TypedResults.NotFound();
}
}
internal static async Task<IResult> GetCustomFieldAsync(
string name,
ClaimsPrincipal userPrincipal,
[FromServices] UserService userService,
[FromServices] UserCustomFieldService userCustomFieldService,
[FromServices] ILoggerFactory loggerFactory)
{
var logger = loggerFactory.CreateLogger("ProfileApi");
try
{
var user = await userService.GetAsync(userPrincipal?.Identity?.Name);
var field = await userCustomFieldService.GetAsync(user.Id, name);
return TypedResults.Ok(field.Value);
}
catch (Exception ex)
{
logger.LogError(ex, "Could not get the custom field with the name {CustomFieldName}", name);
return TypedResults.NotFound();
}
}
internal static async Task<IResult> UpdateCustomFieldAsync(
string name,
[FromBody] string value,
ClaimsPrincipal userPrincipal,
[FromServices] UserService userService,
[FromServices] UserCustomFieldService userCustomFieldService,
[FromServices] ILoggerFactory loggerFactory)
{
var logger = loggerFactory.CreateLogger("ProfileApi");
try
{
var user = await userService.GetAsync(userPrincipal?.Identity?.Name);
await userCustomFieldService.UpdateAsync(user.Id, name, value);
return TypedResults.Ok(value);
}
catch (Exception ex)
{
logger.LogError(ex, "Could not update the custom field with the name {CustomFieldName}", name);
return TypedResults.BadRequest();
}
}
}