[backend/api] Move rule create/update functionality to instance service

This commit is contained in:
pancakes 2025-01-07 00:52:13 +10:00 committed by Laura Hausmann
parent d3b8df77ce
commit b962fafdf8
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
2 changed files with 71 additions and 55 deletions

View file

@ -4,9 +4,7 @@ using Iceshrimp.Backend.Controllers.Shared.Attributes;
using Iceshrimp.Backend.Controllers.Web.Renderers; using Iceshrimp.Backend.Controllers.Web.Renderers;
using Iceshrimp.Backend.Core.Configuration; using Iceshrimp.Backend.Core.Configuration;
using Iceshrimp.Backend.Core.Database; using Iceshrimp.Backend.Core.Database;
using Iceshrimp.Backend.Core.Database.Tables;
using Iceshrimp.Backend.Core.Extensions; using Iceshrimp.Backend.Core.Extensions;
using Iceshrimp.Backend.Core.Helpers;
using Iceshrimp.Backend.Core.Middleware; using Iceshrimp.Backend.Core.Middleware;
using Iceshrimp.Backend.Core.Services; using Iceshrimp.Backend.Core.Services;
using Iceshrimp.Shared.Schemas.Web; using Iceshrimp.Shared.Schemas.Web;
@ -26,7 +24,8 @@ public class InstanceController(
UserRenderer userRenderer, UserRenderer userRenderer,
IOptions<Config.InstanceSection> instanceConfig, IOptions<Config.InstanceSection> instanceConfig,
IOptions<Config.SecuritySection> securityConfig, IOptions<Config.SecuritySection> securityConfig,
MetaService meta MetaService meta,
InstanceService instanceSvc
) : ControllerBase ) : ControllerBase
{ {
[HttpGet] [HttpGet]
@ -62,18 +61,7 @@ public class InstanceController(
[ProducesResults(HttpStatusCode.OK)] [ProducesResults(HttpStatusCode.OK)]
public async Task<RuleResponse> CreateRule(RuleCreateRequest request) public async Task<RuleResponse> CreateRule(RuleCreateRequest request)
{ {
var count = await db.Rules.CountAsync(); var rule = await instanceSvc.CreateRuleAsync(request.Text.Trim(), request.Description?.Trim());
var rule = new Rule
{
Id = IdHelpers.GenerateSnowflakeId(),
Order = count + 1,
Text = request.Text,
Description = request.Description
};
db.Add(rule);
await db.SaveChangesAsync();
return new RuleResponse { Id = rule.Id, Text = rule.Text, Description = rule.Description }; return new RuleResponse { Id = rule.Id, Text = rule.Text, Description = rule.Description };
} }
@ -88,49 +76,17 @@ public class InstanceController(
var rule = await db.Rules.FirstOrDefaultAsync(p => p.Id == id) var rule = await db.Rules.FirstOrDefaultAsync(p => p.Id == id)
?? throw GracefulException.RecordNotFound(); ?? throw GracefulException.RecordNotFound();
var count = await db.Rules.CountAsync();
// order is defined here because I don't know why but request.Order is still nullable even if the if statement checks it isn't null
var order = request.Order ?? 0; var order = request.Order ?? 0;
if (order > 0 && order != rule.Order && count != 1) var text = request.Text?.Trim() ?? rule.Text;
{ var description = request.Description != null
request.Order = Math.Min(order, count); ? string.IsNullOrWhiteSpace(request.Description)
? null
: request.Description.Trim()
: rule.Description;
if (order > rule.Order) var res = await instanceSvc.UpdateRuleAsync(rule, order, text, description);
{
var rules = await db.Rules
.Where(p => rule.Order < p.Order && p.Order <= order)
.ToListAsync();
foreach (var r in rules) return new RuleResponse { Id = res.Id, Text = res.Text, Description = res.Description };
r.Order -= 1;
db.UpdateRange(rules);
}
else
{
var rules = await db.Rules
.Where(p => order <= p.Order && p.Order < rule.Order)
.ToListAsync();
foreach (var r in rules)
r.Order += 1;
db.UpdateRange(rules);
}
rule.Order = order;
}
if (request.Text != null)
rule.Text = request.Text.Trim();
if (request.Description != null)
rule.Description = string.IsNullOrWhiteSpace(request.Description) ? null : request.Description.Trim();
db.Update(rule);
await db.SaveChangesAsync();
return new RuleResponse { Id = rule.Id, Text = rule.Text, Description = rule.Description };
} }
[HttpDelete("rules/{id}")] [HttpDelete("rules/{id}")]

View file

@ -149,4 +149,64 @@ public class InstanceService(
instance.IsNotResponding = true; instance.IsNotResponding = true;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
} }
public async Task<Rule> CreateRuleAsync(string text, string? description)
{
var count = await db.Rules.CountAsync();
var rule = new Rule
{
Id = IdHelpers.GenerateSnowflakeId(),
Order = count + 1,
Text = text,
Description = description
};
db.Add(rule);
await db.SaveChangesAsync();
return rule;
}
public async Task<Rule> UpdateRuleAsync(Rule rule, int order, string text, string? description)
{
var count = await db.Rules.CountAsync();
if (order > 0 && order != rule.Order && count != 1)
{
order = Math.Min(order, count);
if (order > rule.Order)
{
var rules = await db.Rules
.Where(p => rule.Order < p.Order && p.Order <= order)
.ToListAsync();
foreach (var r in rules)
r.Order -= 1;
db.UpdateRange(rules);
}
else
{
var rules = await db.Rules
.Where(p => order <= p.Order && p.Order < rule.Order)
.ToListAsync();
foreach (var r in rules)
r.Order += 1;
db.UpdateRange(rules);
}
rule.Order = order;
}
rule.Text = text;
rule.Description = description;
await db.SaveChangesAsync();
return rule;
}
} }