49 lines
1.5 KiB
C#
49 lines
1.5 KiB
C#
using Iceshrimp.Backend.Core.Database;
|
|
using Iceshrimp.Backend.Core.Database.Tables;
|
|
using Iceshrimp.Backend.Core.Extensions;
|
|
using Iceshrimp.Backend.Core.Helpers;
|
|
|
|
namespace Iceshrimp.Backend.Core.Services;
|
|
|
|
public class ReportService(
|
|
ActivityPub.ActivityDeliverService deliverSvc,
|
|
ActivityPub.ActivityRenderer activityRenderer,
|
|
SystemUserService sysUserSvc,
|
|
DatabaseContext db
|
|
) : IScopedService
|
|
{
|
|
public async Task ForwardReportAsync(Report report, string? comment)
|
|
{
|
|
if (report.TargetUser.IsLocalUser)
|
|
throw new Exception("Refusing to forward report to local instance");
|
|
|
|
var actor = await sysUserSvc.GetInstanceActorAsync();
|
|
var activity = activityRenderer.RenderFlag(actor, report.TargetUser, report.Notes, comment ?? report.Comment);
|
|
|
|
var inbox = report.TargetUser.SharedInbox
|
|
?? report.TargetUser.Inbox
|
|
?? throw new Exception("Target user does not have inbox");
|
|
|
|
await deliverSvc.DeliverToAsync(activity, actor, inbox);
|
|
}
|
|
|
|
public async Task<Report> CreateReportAsync(User reporter, User target, IEnumerable<Note> notes, string comment)
|
|
{
|
|
var report = new Report
|
|
{
|
|
Id = IdHelpers.GenerateSnowflakeId(),
|
|
CreatedAt = DateTime.UtcNow,
|
|
TargetUser = target,
|
|
TargetUserHost = target.Host,
|
|
Reporter = reporter,
|
|
ReporterHost = reporter.Host,
|
|
Notes = notes.ToArray(),
|
|
Comment = comment
|
|
};
|
|
|
|
db.Add(report);
|
|
await db.SaveChangesAsync();
|
|
await db.ReloadEntityRecursivelyAsync(report);
|
|
return report;
|
|
}
|
|
}
|