void.cat/VoidCat/Controllers/UserController.cs

113 lines
3.6 KiB
C#
Raw Normal View History

2022-02-27 13:54:25 +00:00
using Microsoft.AspNetCore.Mvc;
using VoidCat.Model;
using VoidCat.Services.Abstractions;
namespace VoidCat.Controllers;
[Route("user/{id}")]
2022-02-27 13:54:25 +00:00
public class UserController : Controller
{
private readonly IUserStore _store;
2022-02-27 23:01:57 +00:00
private readonly IUserUploadsStore _userUploads;
private readonly IEmailVerification _emailVerification;
2022-02-27 13:54:25 +00:00
public UserController(IUserStore store, IUserUploadsStore userUploads, IEmailVerification emailVerification)
2022-02-27 13:54:25 +00:00
{
_store = store;
2022-02-27 23:01:57 +00:00
_userUploads = userUploads;
_emailVerification = emailVerification;
2022-02-27 13:54:25 +00:00
}
[HttpGet]
[Route("")]
public async Task<IActionResult> GetUser([FromRoute] string id)
2022-02-27 13:54:25 +00:00
{
var loggedUser = HttpContext.GetUserId();
var requestedId = id.FromBase58Guid();
if (loggedUser == requestedId)
{
return Json(await _store.Get<PrivateVoidUser>(id.FromBase58Guid()));
2022-02-27 13:54:25 +00:00
}
2022-02-27 18:15:37 +00:00
2022-02-27 23:01:57 +00:00
var user = await _store.Get<PublicVoidUser>(id.FromBase58Guid());
if (!(user?.Flags.HasFlag(VoidUserFlags.PublicProfile) ?? false)) return NotFound();
2022-02-27 23:01:57 +00:00
return Json(user);
2022-02-27 18:15:37 +00:00
}
[HttpPost]
[Route("")]
2022-02-27 18:15:37 +00:00
public async Task<IActionResult> UpdateUser([FromRoute] string id, [FromBody] PublicVoidUser user)
{
var loggedUser = await GetAuthorizedUser(id);
if (loggedUser == default) return Unauthorized();
2022-02-27 18:15:37 +00:00
if (!loggedUser.Flags.HasFlag(VoidUserFlags.EmailVerified)) return Forbid();
await _store.UpdateProfile(user);
2022-02-27 18:15:37 +00:00
return Ok();
2022-02-27 13:54:25 +00:00
}
2022-02-27 23:01:57 +00:00
[HttpPost]
[Route("files")]
public async Task<IActionResult> ListUserFiles([FromRoute] string id,
[FromBody] PagedRequest request)
2022-02-27 23:01:57 +00:00
{
var loggedUser = HttpContext.GetUserId();
var isAdmin = HttpContext.IsRole(Roles.Admin);
var user = await GetRequestedUser(id);
if (user == default) return NotFound();
// not logged in user files, check public flag
var canViewUploads = loggedUser == user.Id || isAdmin;
if (!canViewUploads &&
!user.Flags.HasFlag(VoidUserFlags.PublicUploads)) return Forbid();
2022-02-27 23:01:57 +00:00
var results = await _userUploads.ListFiles(id.FromBase58Guid(), request);
return Json(await results.GetResults());
}
[HttpGet]
[Route("verify")]
public async Task<IActionResult> SendVerificationCode([FromRoute] string id)
{
var user = await GetAuthorizedUser(id);
if (user == default) return Unauthorized();
var isEmailVerified = (user?.Flags.HasFlag(VoidUserFlags.EmailVerified) ?? false);
if (isEmailVerified) return UnprocessableEntity();
await _emailVerification.SendNewCode(user!);
return Accepted();
}
[HttpPost]
[Route("verify")]
public async Task<IActionResult> VerifyCode([FromRoute] string id, [FromBody] string code)
{
var user = await GetAuthorizedUser(id);
if (user == default) return Unauthorized();
var token = code.FromBase58Guid();
if (!await _emailVerification.VerifyCode(user, token)) return BadRequest();
user.Flags |= VoidUserFlags.EmailVerified;
await _store.Set(user);
return Accepted();
}
private async Task<InternalVoidUser?> GetAuthorizedUser(string id)
{
var loggedUser = HttpContext.GetUserId();
var gid = id.FromBase58Guid();
var user = await _store.Get<InternalVoidUser>(gid);
return user?.Id != loggedUser ? default : user;
}
private async Task<InternalVoidUser?> GetRequestedUser(string id)
{
var gid = id.FromBase58Guid();
return await _store.Get<InternalVoidUser>(gid);
2022-02-27 23:01:57 +00:00
}
}