diff --git a/Iceshrimp.Backend/Controllers/Web/InstanceController.cs b/Iceshrimp.Backend/Controllers/Web/InstanceController.cs index 9b99cd66..5ae22e64 100644 --- a/Iceshrimp.Backend/Controllers/Web/InstanceController.cs +++ b/Iceshrimp.Backend/Controllers/Web/InstanceController.cs @@ -4,9 +4,7 @@ using Iceshrimp.Backend.Controllers.Shared.Attributes; using Iceshrimp.Backend.Controllers.Web.Renderers; using Iceshrimp.Backend.Core.Configuration; using Iceshrimp.Backend.Core.Database; -using Iceshrimp.Backend.Core.Database.Tables; using Iceshrimp.Backend.Core.Extensions; -using Iceshrimp.Backend.Core.Helpers; using Iceshrimp.Backend.Core.Middleware; using Iceshrimp.Backend.Core.Services; using Iceshrimp.Shared.Schemas.Web; @@ -26,7 +24,8 @@ public class InstanceController( UserRenderer userRenderer, IOptions instanceConfig, IOptions securityConfig, - MetaService meta + MetaService meta, + InstanceService instanceSvc ) : ControllerBase { [HttpGet] @@ -62,18 +61,7 @@ public class InstanceController( [ProducesResults(HttpStatusCode.OK)] public async Task CreateRule(RuleCreateRequest request) { - var count = await db.Rules.CountAsync(); - - var rule = new Rule - { - Id = IdHelpers.GenerateSnowflakeId(), - Order = count + 1, - Text = request.Text, - Description = request.Description - }; - - db.Add(rule); - await db.SaveChangesAsync(); + var rule = await instanceSvc.CreateRuleAsync(request.Text.Trim(), request.Description?.Trim()); 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) ?? 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; - if (order > 0 && order != rule.Order && count != 1) - { - request.Order = Math.Min(order, count); - - if (order > rule.Order) - { - var rules = await db.Rules - .Where(p => rule.Order < p.Order && p.Order <= order) - .ToListAsync(); + var text = request.Text?.Trim() ?? rule.Text; + var description = request.Description != null + ? string.IsNullOrWhiteSpace(request.Description) + ? null + : request.Description.Trim() + : rule.Description; - foreach (var r in rules) - r.Order -= 1; + var res = await instanceSvc.UpdateRuleAsync(rule, order, text, description); - 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 }; + return new RuleResponse { Id = res.Id, Text = res.Text, Description = res.Description }; } [HttpDelete("rules/{id}")] diff --git a/Iceshrimp.Backend/Core/Services/InstanceService.cs b/Iceshrimp.Backend/Core/Services/InstanceService.cs index fdd5a4f6..a0207a4f 100644 --- a/Iceshrimp.Backend/Core/Services/InstanceService.cs +++ b/Iceshrimp.Backend/Core/Services/InstanceService.cs @@ -149,4 +149,64 @@ public class InstanceService( instance.IsNotResponding = true; await db.SaveChangesAsync(); } + + public async Task 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 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; + } } \ No newline at end of file