2024-08-04 18:44:33 -05:00
|
|
|
|
using LANCommander.Server.Data.Models;
|
|
|
|
|
|
using LANCommander.Server.Models;
|
|
|
|
|
|
using LANCommander.Server.Services;
|
2023-10-16 20:48:12 -05:00
|
|
|
|
using Microsoft.AspNetCore.Authorization;
|
|
|
|
|
|
using Microsoft.AspNetCore.Identity;
|
|
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
|
using Microsoft.IdentityModel.Tokens;
|
|
|
|
|
|
using System.IdentityModel.Tokens.Jwt;
|
|
|
|
|
|
using System.Security.Claims;
|
|
|
|
|
|
using System.Security.Cryptography;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
2024-08-04 18:44:33 -05:00
|
|
|
|
namespace LANCommander.Server.Controllers.Api
|
2023-10-16 20:48:12 -05:00
|
|
|
|
{
|
|
|
|
|
|
[Route("api/[controller]")]
|
|
|
|
|
|
[Authorize(AuthenticationSchemes = "Bearer")]
|
|
|
|
|
|
[ApiController]
|
2024-08-28 20:33:59 -05:00
|
|
|
|
public class ProfileController : BaseApiController
|
2023-10-16 20:48:12 -05:00
|
|
|
|
{
|
2024-08-21 20:19:04 -05:00
|
|
|
|
private readonly UserService UserService;
|
2024-12-20 11:34:59 -06:00
|
|
|
|
private readonly MediaService MediaService;
|
2024-10-16 01:54:51 -05:00
|
|
|
|
private readonly UserCustomFieldService UserCustomFieldService;
|
2023-10-16 20:48:12 -05:00
|
|
|
|
|
2024-08-28 20:33:59 -05:00
|
|
|
|
public ProfileController(
|
|
|
|
|
|
ILogger<ProfileController> logger,
|
2024-10-16 01:54:51 -05:00
|
|
|
|
UserService userService,
|
2024-12-20 11:34:59 -06:00
|
|
|
|
MediaService mediaService,
|
2024-10-16 01:54:51 -05:00
|
|
|
|
UserCustomFieldService userCustomFieldService) : base(logger)
|
2023-10-16 20:48:12 -05:00
|
|
|
|
{
|
2024-08-21 20:19:04 -05:00
|
|
|
|
UserService = userService;
|
2024-12-20 11:34:59 -06:00
|
|
|
|
MediaService = mediaService;
|
2024-10-16 01:54:51 -05:00
|
|
|
|
UserCustomFieldService = userCustomFieldService;
|
2023-10-16 20:48:12 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[HttpGet]
|
2024-11-12 23:22:01 -06:00
|
|
|
|
public async Task<ActionResult<User>> GetAsync()
|
2023-10-16 20:48:12 -05:00
|
|
|
|
{
|
|
|
|
|
|
if (User != null && User.Identity != null && User.Identity.IsAuthenticated)
|
|
|
|
|
|
{
|
2024-11-16 12:12:25 -06:00
|
|
|
|
var user = await UserService.GetAsync<SDK.Models.User>(User?.Identity?.Name);
|
2023-10-16 20:48:12 -05:00
|
|
|
|
|
2024-09-16 20:27:54 -05:00
|
|
|
|
if (user != null)
|
|
|
|
|
|
return Ok(user);
|
|
|
|
|
|
else
|
|
|
|
|
|
return NotFound();
|
2023-10-16 20:48:12 -05:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
return Unauthorized();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-12 23:28:05 -06:00
|
|
|
|
[HttpPut("ChangeAlias")]
|
2024-11-12 23:22:01 -06:00
|
|
|
|
public async Task<IActionResult> ChangeAliasAsync(ChangeAliasRequest request)
|
2023-10-16 20:48:12 -05:00
|
|
|
|
{
|
|
|
|
|
|
if (User != null && User.Identity != null && User.Identity.IsAuthenticated)
|
|
|
|
|
|
{
|
2024-11-12 18:32:46 -06:00
|
|
|
|
var user = await UserService.GetAsync(User?.Identity?.Name);
|
2023-10-16 20:48:12 -05:00
|
|
|
|
|
2024-01-15 20:38:45 -06:00
|
|
|
|
user.Alias = request.Alias;
|
2023-10-16 20:48:12 -05:00
|
|
|
|
|
2024-11-12 18:32:46 -06:00
|
|
|
|
await UserService.UpdateAsync(user);
|
2023-10-16 20:48:12 -05:00
|
|
|
|
|
2024-01-15 20:38:45 -06:00
|
|
|
|
return Ok(request.Alias);
|
2023-10-16 20:48:12 -05:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
return Unauthorized();
|
|
|
|
|
|
}
|
2024-01-23 18:54:44 -06:00
|
|
|
|
|
2024-06-03 19:11:15 -05:00
|
|
|
|
[HttpGet("Avatar")]
|
2024-11-12 23:22:01 -06:00
|
|
|
|
public async Task<IActionResult> AvatarAsync()
|
2024-06-03 19:11:15 -05:00
|
|
|
|
{
|
|
|
|
|
|
if (User != null && User.Identity != null && User.Identity.IsAuthenticated)
|
|
|
|
|
|
{
|
2024-11-12 18:32:46 -06:00
|
|
|
|
var user = await UserService.GetAsync(User?.Identity?.Name);
|
2024-06-03 19:11:15 -05:00
|
|
|
|
|
2024-12-20 11:34:59 -06:00
|
|
|
|
if (user == null)
|
|
|
|
|
|
return NotFound();
|
|
|
|
|
|
|
|
|
|
|
|
var media = await MediaService.FirstOrDefaultAsync(m => m.Type == SDK.Enums.MediaType.Avatar && m.UserId == user.Id);
|
2024-06-03 19:11:15 -05:00
|
|
|
|
|
|
|
|
|
|
if (media == null)
|
|
|
|
|
|
return NotFound();
|
|
|
|
|
|
|
2024-11-05 19:38:59 -06:00
|
|
|
|
var fs = System.IO.File.OpenRead(MediaService.GetMediaPath(media));
|
2024-06-03 19:11:15 -05:00
|
|
|
|
|
|
|
|
|
|
return File(fs, media.MimeType);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return NotFound();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-23 18:54:44 -06:00
|
|
|
|
[AllowAnonymous]
|
|
|
|
|
|
[HttpGet("{userName}/Avatar")]
|
2024-11-12 23:22:01 -06:00
|
|
|
|
public async Task<IActionResult> AvatarAsync(string userName)
|
2024-01-23 18:54:44 -06:00
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
2024-11-12 18:32:46 -06:00
|
|
|
|
var user = await UserService.GetAsync(userName);
|
2024-01-23 18:54:44 -06:00
|
|
|
|
|
|
|
|
|
|
if (user == null)
|
|
|
|
|
|
return NotFound();
|
|
|
|
|
|
|
2024-12-20 11:34:59 -06:00
|
|
|
|
var media = await MediaService.FirstOrDefaultAsync(m => m.Type == SDK.Enums.MediaType.Avatar && m.UserId == user.Id);
|
2024-01-23 18:54:44 -06:00
|
|
|
|
|
|
|
|
|
|
if (media == null)
|
|
|
|
|
|
return NotFound();
|
|
|
|
|
|
|
2024-11-05 19:38:59 -06:00
|
|
|
|
var fs = System.IO.File.OpenRead(MediaService.GetMediaPath(media));
|
2024-01-23 18:54:44 -06:00
|
|
|
|
|
|
|
|
|
|
return File(fs, media.MimeType);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
return NotFound();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-08-21 20:19:04 -05:00
|
|
|
|
|
|
|
|
|
|
[HttpGet("CustomField/{name}")]
|
2024-11-12 23:22:01 -06:00
|
|
|
|
public async Task<IActionResult> GetCustomFieldAsync(string name)
|
2024-08-21 20:19:04 -05:00
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
2024-11-12 18:32:46 -06:00
|
|
|
|
var user = await UserService.GetAsync(User?.Identity?.Name);
|
2024-08-21 20:19:04 -05:00
|
|
|
|
|
2024-11-12 18:32:46 -06:00
|
|
|
|
var field = await UserCustomFieldService.GetAsync(user.Id, name);
|
2024-08-21 20:19:04 -05:00
|
|
|
|
|
|
|
|
|
|
return Ok(field.Value);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
2024-09-16 20:27:54 -05:00
|
|
|
|
Logger?.LogError(ex, "Could not get the custom field with the name {CustomFieldName}", name);
|
|
|
|
|
|
|
2024-08-21 20:19:04 -05:00
|
|
|
|
return NotFound();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-12 23:28:05 -06:00
|
|
|
|
[HttpPut("CustomField/{name}")]
|
2024-11-12 23:22:01 -06:00
|
|
|
|
public async Task<IActionResult> UpdateCustomFieldAsync(string name, string value)
|
2024-08-21 20:19:04 -05:00
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
2024-11-12 18:32:46 -06:00
|
|
|
|
var user = await UserService.GetAsync(User?.Identity?.Name);
|
2024-08-21 20:19:04 -05:00
|
|
|
|
|
2024-11-12 18:32:46 -06:00
|
|
|
|
await UserCustomFieldService.UpdateAsync(user.Id, name, value);
|
2024-08-21 20:19:04 -05:00
|
|
|
|
|
|
|
|
|
|
return Ok(value);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
2024-09-16 20:27:54 -05:00
|
|
|
|
Logger?.LogError(ex, "Could not update the custom field with the name {CustomFieldName}", name);
|
|
|
|
|
|
|
|
|
|
|
|
return BadRequest();
|
2024-08-21 20:19:04 -05:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-10-16 20:48:12 -05:00
|
|
|
|
}
|
|
|
|
|
|
}
|