Files
vtuber-awards/Backend/Endpoints/AdminClipModerationEndpoints.cs
T

87 lines
2.8 KiB
C#

using Backend.Contracts;
using Backend.Common;
using Backend.Data;
using Backend.Services;
using Microsoft.EntityFrameworkCore;
namespace Backend.Endpoints;
public static partial class AdminModerationEndpoints
{
private static async Task<IResult> DeleteClip(
HttpContext context,
int clipId,
AwardsDbContext db,
IAdminAuditService adminAuditService)
{
var session = AdminEndpointConventions.CurrentSession(context);
var clip = await db.ClipSubmissions.FirstOrDefaultAsync(item => item.Id == clipId);
if (clip is null)
{
return Results.NotFound();
}
db.ClipSubmissions.Remove(clip);
adminAuditService.AddEntry(
session.TwitchUserId,
"clip.delete",
"clip",
clip.Id.ToString(),
$"Clip-Einreichung von {clip.SubmittedByTwitchId} wurde entfernt.",
new { clip.Platform },
RequestMetadataReader.Read(context));
await db.SaveChangesAsync(context.RequestAborted);
return Results.Ok(new { deleted = true, clipId });
}
private static async Task<IResult> UpdateClipStatus(
HttpContext context,
int clipId,
UpdateClipStatusRequest request,
AwardsDbContext db,
IAdminAuditService adminAuditService)
{
var session = AdminEndpointConventions.CurrentSession(context);
var clip = await db.ClipSubmissions.FirstOrDefaultAsync(item => item.Id == clipId);
if (clip is null)
{
return Results.NotFound();
}
var normalizedStatus = string.IsNullOrWhiteSpace(request.Status)
? "pending"
: request.Status.Trim().ToLowerInvariant();
if (normalizedStatus is not ("pending" or "approved" or "rejected"))
{
return Results.BadRequest(new { message = "Clip status must be pending, approved or rejected." });
}
clip.Status = normalizedStatus;
clip.ReviewNote = string.IsNullOrWhiteSpace(request.ReviewNote) ? null : request.ReviewNote.Trim();
if (normalizedStatus == "pending")
{
clip.ReviewedAt = null;
clip.ReviewedByTwitchId = null;
}
else
{
clip.ReviewedAt = DateTimeOffset.UtcNow;
clip.ReviewedByTwitchId = session.TwitchUserId;
}
adminAuditService.AddEntry(
session.TwitchUserId,
"clip.status.update",
"clip",
clip.Id.ToString(),
$"Clip-Einreichung {clip.Id} wurde auf {clip.Status} gesetzt.",
new { clip.Status, clip.ReviewNote },
RequestMetadataReader.Read(context));
await db.SaveChangesAsync(context.RequestAborted);
return Results.Ok(new { saved = true, clipId = clip.Id, status = clip.Status });
}
}