[backend/api] Add endpoints for updating and deleting user avatar

This commit is contained in:
pancakes 2024-11-27 19:19:30 +10:00 committed by Laura Hausmann
parent c16c0e761f
commit 94af2fe9ac
No known key found for this signature in database
GPG key ID: D044E84C5BE01605

View file

@ -16,7 +16,7 @@ namespace Iceshrimp.Backend.Controllers.Web;
[EnableRateLimiting("sliding")] [EnableRateLimiting("sliding")]
[Route("/api/iceshrimp/profile")] [Route("/api/iceshrimp/profile")]
[Produces(MediaTypeNames.Application.Json)] [Produces(MediaTypeNames.Application.Json)]
public class ProfileController(UserService userSvc) : ControllerBase public class ProfileController(UserService userSvc, DriveService driveSvc) : ControllerBase
{ {
[HttpGet] [HttpGet]
[ProducesResults(HttpStatusCode.OK)] [ProducesResults(HttpStatusCode.OK)]
@ -70,4 +70,53 @@ public class ProfileController(UserService userSvc) : ControllerBase
var prevBannerId = user.BannerId; var prevBannerId = user.BannerId;
await userSvc.UpdateLocalUserAsync(user, prevAvatarId, prevBannerId); await userSvc.UpdateLocalUserAsync(user, prevAvatarId, prevBannerId);
} }
[HttpPost("avatar")]
[ProducesResults(HttpStatusCode.OK)]
[ProducesErrors(HttpStatusCode.BadRequest)]
public async Task UpdateAvatarAsync(IFormFile file)
{
var user = HttpContext.GetUserOrFail();
var prevAvatarId = user.AvatarId;
var prevBannerId = user.BannerId;
if (!file.ContentType.StartsWith("image/"))
throw GracefulException.BadRequest("Avatar must be an image");
var rq = new DriveFileCreationRequest
{
Filename = file.FileName,
IsSensitive = false,
MimeType = file.ContentType
};
var avatar = await driveSvc.StoreFileAsync(file.OpenReadStream(), user, rq);
user.Avatar = avatar;
user.AvatarBlurhash = avatar.Blurhash;
user.AvatarUrl = avatar.AccessUrl;
await userSvc.UpdateLocalUserAsync(user, prevAvatarId, prevBannerId);
}
[HttpDelete("avatar")]
[ProducesResults(HttpStatusCode.OK)]
[ProducesErrors(HttpStatusCode.NotFound)]
public async Task DeleteAvatarAsync()
{
var user = HttpContext.GetUserOrFail();
var prevAvatarId = user.AvatarId;
var prevBannerId = user.BannerId;
if (prevAvatarId == null)
throw GracefulException.NotFound("You do not have an avatar");
user.Avatar = null;
user.AvatarBlurhash = null;
user.AvatarUrl = null;
await userSvc.UpdateLocalUserAsync(user, prevAvatarId, prevBannerId);
}
} }