using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using Mizuki.Dtos;
using Mizuki.Services;
using Mizuki.Validators;
namespace Mizuki.Controllers;
///
/// The file api
///
///
[Authorize]
[Route("/api/file")]
public class FileController(
UploadService uploadService,
LoginService loginService,
FormFileValidator formFileValidator)
{
///
/// Creates a new file.
///
/// The given file.
/// Either the result, or an error.
[HttpPost]
[Route("upload")]
public async Task, BadRequest>> UploadFile(
IFormFile formFile)
{
var result = await formFileValidator.ValidateAsync(formFile);
if (!result.IsValid)
{
if (result.Errors.Any(e => e.PropertyName == "Length"))
return TypedResults.BadRequest(new FileCreationErrorDto("The file is too big. (Max is 50MiB)"));
if (result.Errors.Any(e => e.PropertyName == "Filename"))
return TypedResults.BadRequest(new FileCreationErrorDto("Invalid filename."));
return TypedResults.BadRequest(new FileCreationErrorDto("Unknown validation error."));
}
var user = await loginService.GetActiveUser();
var upload = await uploadService.CreateUpload(user, formFile);
if (upload is null)
{
return TypedResults.BadRequest(new FileCreationErrorDto("There was a problem processing your upload, please try again later."));
}
return TypedResults.Ok(new FileCreationResultDto(upload.Filename));
}
///
/// Lists all of the files for the logged in user.
///
/// The list of all files this user has.
[HttpGet]
[Route("all")]
public async Task> ListAllFiles()
{
var user = await loginService.GetActiveUser();
var uploads = await uploadService.GetAllUploadsForUser(user);
return uploads.Select(u => new FileDto(
u.Filename,
u.OriginalFilename,
u.SizeInBytes));
}
///
/// Deletes a file.
///
/// The filename of the file.
[HttpGet]
[Route("delete")]
public async Task DeleteFile(
[FromQuery] string filename)
{
var user = await loginService.GetActiveUser();
await uploadService.DeleteUpload(user, filename);
}
}