[backend/api] Move rule create/update functionality to instance service
This commit is contained in:
parent
d3b8df77ce
commit
b962fafdf8
2 changed files with 71 additions and 55 deletions
|
@ -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}")]
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue