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.Database.Tables; 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] [LinkPagination(20, 80)] [EnableRateLimiting("sliding")] [Route("/api/iceshrimp/timelines")] [Produces(MediaTypeNames.Application.Json)] public class TimelineController(DatabaseContext db, NoteRenderer noteRenderer, CacheService cache) : ControllerBase { [HttpGet("home")] [ProducesResults(HttpStatusCode.OK)] public async Task> GetHomeTimeline(PaginationQuery pq) { var user = HttpContext.GetUserOrFail(); var heuristic = await QueryableTimelineExtensions.GetHeuristicAsync(user, db, cache); var notes = await db.Notes.IncludeCommonProperties() .FilterByFollowingAndOwn(user, db, heuristic) .EnsureVisibleFor(user) .FilterHidden(user, db, filterHiddenListMembers: true) .FilterMutedThreads(user, db) .Paginate(pq, ControllerContext) .PrecomputeVisibilities(user) .ToListAsync(); return await noteRenderer.RenderManyAsync(notes.EnforceRenoteReplyVisibility(), user, Filter.FilterContext.Home); } }