Iceshrimp.NET/Iceshrimp.Backend/Controllers/Web/FollowRequestController.cs
2024-11-20 00:48:29 +01:00

76 lines
No EOL
2.6 KiB
C#

using System.Net;
using System.Net.Mime;
using Iceshrimp.Backend.Controllers.Shared.Attributes;
using Iceshrimp.Backend.Controllers.Shared.Schemas;
using Iceshrimp.Backend.Controllers.Web.Renderers;
using Iceshrimp.Backend.Core.Database;
using Iceshrimp.Backend.Core.Extensions;
using Iceshrimp.Backend.Core.Middleware;
using Iceshrimp.Backend.Core.Services;
using Iceshrimp.Shared.Schemas.Web;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.RateLimiting;
using Microsoft.EntityFrameworkCore;
namespace Iceshrimp.Backend.Controllers.Web;
[ApiController]
[Authenticate]
[Authorize]
[EnableRateLimiting("sliding")]
[Route("/api/iceshrimp/follow_requests")]
[Produces(MediaTypeNames.Application.Json)]
public class FollowRequestController(
DatabaseContext db,
UserRenderer userRenderer,
UserService userSvc
) : ControllerBase
{
[HttpGet]
[LinkPagination(20, 40)]
[ProducesResults(HttpStatusCode.OK)]
public async Task<IEnumerable<FollowRequestResponse>> GetFollowRequests(PaginationQuery pq)
{
var user = HttpContext.GetUserOrFail();
var requests = await db.FollowRequests
.IncludeCommonProperties()
.Where(p => p.Followee == user)
.Paginate(pq, ControllerContext)
.Select(p => new { p.Id, p.Follower })
.ToListAsync();
var users = await userRenderer.RenderManyAsync(requests.Select(p => p.Follower));
return requests.Select(p => new FollowRequestResponse
{
Id = p.Id, User = users.First(u => u.Id == p.Follower.Id)
});
}
[HttpPost("{id}/accept")]
[ProducesResults(HttpStatusCode.OK)]
[ProducesErrors(HttpStatusCode.NotFound)]
public async Task AcceptFollowRequest(string id)
{
var user = HttpContext.GetUserOrFail();
var request = await db.FollowRequests
.IncludeCommonProperties()
.FirstOrDefaultAsync(p => p.Followee == user && p.Id == id) ??
throw GracefulException.NotFound("Follow request not found");
await userSvc.AcceptFollowRequestAsync(request);
}
[HttpPost("{id}/reject")]
[ProducesResults(HttpStatusCode.OK)]
[ProducesErrors(HttpStatusCode.NotFound)]
public async Task RejectFollowRequest(string id)
{
var user = HttpContext.GetUserOrFail();
var request = await db.FollowRequests
.IncludeCommonProperties()
.FirstOrDefaultAsync(p => p.Followee == user && p.Id == id) ??
throw GracefulException.NotFound("Follow request not found");
await userSvc.RejectFollowRequestAsync(request);
}
}