Files
Kavita/Kavita.Server/Controllers/KavitaPlusAuditController.cs
T
Joe Milazzo 28f082b653 Kavita+ Audit Log (#4711)
Co-authored-by: Ansh Raj <anshraj220109+github@proton.me>
Co-authored-by: Amelia <77553571+Fesaa@users.noreply.github.com>
Co-authored-by: Weblate (bot) <hosted@weblate.org>
Co-authored-by: Adam Havránek <adamhavra@seznam.cz>
Co-authored-by: Gregory.Open <gregory.open@proton.me>
Co-authored-by: Lyrq <lyrq.ku@gmail.com>
Co-authored-by: oxygen44k <iiccpp@outlook.com>
Co-authored-by: Grez Kull <grezkull@users.noreply.hosted.weblate.org>
2026-05-21 06:09:15 -07:00

73 lines
2.5 KiB
C#

using System.Threading.Tasks;
using Kavita.API.Database;
using Kavita.Common.Helpers;
using Kavita.Models.Constants;
using Kavita.Models.DTOs.KavitaPlus;
using Kavita.Server.Attributes;
using Kavita.Server.Extensions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Kavita.Server.Controllers;
[KPlus]
[Route("api/kavita-plus-audit")]
public class KavitaPlusAuditController(IUnitOfWork unitOfWork) : BaseApiController
{
/// <summary>
/// Returns a paged, filtered list of all Kavita+ audit events. Admin only.
/// </summary>
[HttpPost("entries")]
[Authorize(Policy = PolicyGroups.AdminPolicy)]
public async Task<ActionResult<PagedList<KavitaPlusAuditEntryDto>>> GetEntries(
KavitaPlusAuditFilterDto filter, [FromQuery] UserParams? userParams)
{
userParams ??= UserParams.Default;
var res = await unitOfWork.KavitaPlusAuditRepository.GetPagedAsync(filter, userParams);
Response.AddPaginationHeader(res);
return Ok(res);
}
/// <summary>
/// Returns Kavita+ audit info scoped to a single series, for the popover.
/// Scrobble events are filtered to the calling user unless they are an admin.
/// </summary>
[HttpGet("entries/series/{seriesId:int}")]
[SeriesAccess]
public async Task<ActionResult<KavitaPlusAuditSeriesInfoDto>> GetSeriesInfo(int seriesId)
{
var isAdmin = User.IsInRole(PolicyConstants.AdminRole);
var result = await unitOfWork.KavitaPlusAuditRepository
.GetSeriesInfoAsync(seriesId, UserId, isAdmin);
return Ok(result);
}
/// <summary>
/// Returns aggregate stats for the admin audit feed header strip.
/// </summary>
[HttpGet("stats")]
[Authorize(Policy = PolicyGroups.AdminPolicy)]
public async Task<ActionResult<KavitaPlusAuditStatsDto>> GetStats()
{
return Ok(await unitOfWork.KavitaPlusAuditRepository.GetStatsAsync());
}
/// <summary>
/// Returns the calling user's own Kavita+ activity, paged and filtered.
/// </summary>
[HttpPost("my-activity")]
public async Task<ActionResult<PagedList<KavitaPlusAuditEntryDto>>> GetMyActivity(
KavitaPlusAuditFilterDto filter, [FromQuery] UserParams? userParams)
{
userParams ??= UserParams.Default;
var res = await unitOfWork.KavitaPlusAuditRepository
.GetMyActivityAsync(UserId, filter, userParams);
Response.AddPaginationHeader(res);
return Ok(res);
}
}