refactor: add SqlKata for SQL generation, move connection handling into ModelRepository
This commit is contained in:
@@ -24,7 +24,7 @@ namespace PluralKit.API
|
||||
[HttpGet("{aid}")]
|
||||
public async Task<ActionResult<JObject>> GetSystemByAccount(ulong aid)
|
||||
{
|
||||
var system = await _db.Execute(c => _repo.GetSystemByAccount(c, aid));
|
||||
var system = await _repo.GetSystemByAccount(aid);
|
||||
if (system == null)
|
||||
return NotFound("Account not found.");
|
||||
|
||||
|
@@ -31,7 +31,7 @@ namespace PluralKit.API
|
||||
[HttpGet("{hid}")]
|
||||
public async Task<ActionResult<JObject>> GetMember(string hid)
|
||||
{
|
||||
var member = await _db.Execute(conn => _repo.GetMemberByHid(conn, hid));
|
||||
var member = await _repo.GetMemberByHid(hid);
|
||||
if (member == null) return NotFound("Member not found.");
|
||||
|
||||
return Ok(member.ToJson(User.ContextFor(member), needsLegacyProxyTags: true));
|
||||
@@ -45,9 +45,9 @@ namespace PluralKit.API
|
||||
return BadRequest("Member name must be specified.");
|
||||
|
||||
var systemId = User.CurrentSystem();
|
||||
var systemData = await _repo.GetSystem(systemId);
|
||||
|
||||
await using var conn = await _db.Obtain();
|
||||
var systemData = await _repo.GetSystem(conn, systemId);
|
||||
|
||||
// Enforce per-system member limit
|
||||
var memberCount = await conn.QuerySingleAsync<int>("select count(*) from members where system = @System", new { System = systemId });
|
||||
@@ -56,7 +56,7 @@ namespace PluralKit.API
|
||||
return BadRequest($"Member limit reached ({memberCount} / {memberLimit}).");
|
||||
|
||||
await using var tx = await conn.BeginTransactionAsync();
|
||||
var member = await _repo.CreateMember(conn, systemId, properties.Value<string>("name"), transaction: tx);
|
||||
var member = await _repo.CreateMember(systemId, properties.Value<string>("name"), conn);
|
||||
|
||||
MemberPatch patch;
|
||||
try
|
||||
@@ -75,7 +75,7 @@ namespace PluralKit.API
|
||||
return BadRequest($"Request field '{e.Message}' is invalid.");
|
||||
}
|
||||
|
||||
member = await _repo.UpdateMember(conn, member.Id, patch, transaction: tx);
|
||||
member = await _repo.UpdateMember(member.Id, patch, conn);
|
||||
await tx.CommitAsync();
|
||||
return Ok(member.ToJson(User.ContextFor(member), needsLegacyProxyTags: true));
|
||||
}
|
||||
@@ -84,9 +84,7 @@ namespace PluralKit.API
|
||||
[Authorize]
|
||||
public async Task<ActionResult<JObject>> PatchMember(string hid, [FromBody] JObject changes)
|
||||
{
|
||||
await using var conn = await _db.Obtain();
|
||||
|
||||
var member = await _repo.GetMemberByHid(conn, hid);
|
||||
var member = await _repo.GetMemberByHid(hid);
|
||||
if (member == null) return NotFound("Member not found.");
|
||||
|
||||
var res = await _auth.AuthorizeAsync(User, member, "EditMember");
|
||||
@@ -107,7 +105,7 @@ namespace PluralKit.API
|
||||
return BadRequest($"Request field '{e.Message}' is invalid.");
|
||||
}
|
||||
|
||||
var newMember = await _repo.UpdateMember(conn, member.Id, patch);
|
||||
var newMember = await _repo.UpdateMember(member.Id, patch);
|
||||
return Ok(newMember.ToJson(User.ContextFor(newMember), needsLegacyProxyTags: true));
|
||||
}
|
||||
|
||||
@@ -115,15 +113,13 @@ namespace PluralKit.API
|
||||
[Authorize]
|
||||
public async Task<ActionResult> DeleteMember(string hid)
|
||||
{
|
||||
await using var conn = await _db.Obtain();
|
||||
|
||||
var member = await _repo.GetMemberByHid(conn, hid);
|
||||
var member = await _repo.GetMemberByHid(hid);
|
||||
if (member == null) return NotFound("Member not found.");
|
||||
|
||||
var res = await _auth.AuthorizeAsync(User, member, "EditMember");
|
||||
if (!res.Succeeded) return Unauthorized($"Member '{hid}' is not part of your system.");
|
||||
|
||||
await _repo.DeleteMember(conn, member.Id);
|
||||
await _repo.DeleteMember(member.Id);
|
||||
return Ok();
|
||||
}
|
||||
}
|
||||
|
@@ -55,14 +55,14 @@ namespace PluralKit.API
|
||||
[Authorize]
|
||||
public async Task<ActionResult<JObject>> GetOwnSystem()
|
||||
{
|
||||
var system = await _db.Execute(c => _repo.GetSystem(c, User.CurrentSystem()));
|
||||
var system = await _repo.GetSystem(User.CurrentSystem());
|
||||
return system.ToJson(User.ContextFor(system));
|
||||
}
|
||||
|
||||
[HttpGet("{hid}")]
|
||||
public async Task<ActionResult<JObject>> GetSystem(string hid)
|
||||
{
|
||||
var system = await _db.Execute(c => _repo.GetSystemByHid(c, hid));
|
||||
var system = await _repo.GetSystemByHid(hid);
|
||||
if (system == null) return NotFound("System not found.");
|
||||
return Ok(system.ToJson(User.ContextFor(system)));
|
||||
}
|
||||
@@ -70,14 +70,14 @@ namespace PluralKit.API
|
||||
[HttpGet("{hid}/members")]
|
||||
public async Task<ActionResult<IEnumerable<JObject>>> GetMembers(string hid)
|
||||
{
|
||||
var system = await _db.Execute(c => _repo.GetSystemByHid(c, hid));
|
||||
var system = await _repo.GetSystemByHid(hid);
|
||||
if (system == null)
|
||||
return NotFound("System not found.");
|
||||
|
||||
if (!system.MemberListPrivacy.CanAccess(User.ContextFor(system)))
|
||||
return StatusCode(StatusCodes.Status403Forbidden, "Unauthorized to view member list.");
|
||||
|
||||
var members = _db.Execute(c => _repo.GetSystemMembers(c, system.Id));
|
||||
var members = _repo.GetSystemMembers(system.Id);
|
||||
return Ok(await members
|
||||
.Where(m => m.MemberVisibility.CanAccess(User.ContextFor(system)))
|
||||
.Select(m => m.ToJson(User.ContextFor(system), needsLegacyProxyTags: true))
|
||||
@@ -89,40 +89,36 @@ namespace PluralKit.API
|
||||
{
|
||||
if (before == null) before = SystemClock.Instance.GetCurrentInstant();
|
||||
|
||||
await using var conn = await _db.Obtain();
|
||||
|
||||
var system = await _repo.GetSystemByHid(conn, hid);
|
||||
var system = await _repo.GetSystemByHid(hid);
|
||||
if (system == null) return NotFound("System not found.");
|
||||
|
||||
var auth = await _auth.AuthorizeAsync(User, system, "ViewFrontHistory");
|
||||
if (!auth.Succeeded) return StatusCode(StatusCodes.Status403Forbidden, "Unauthorized to view front history.");
|
||||
|
||||
var res = await conn.QueryAsync<SwitchesReturn>(
|
||||
var res = await _db.Execute(conn => conn.QueryAsync<SwitchesReturn>(
|
||||
@"select *, array(
|
||||
select members.hid from switch_members, members
|
||||
where switch_members.switch = switches.id and members.id = switch_members.member
|
||||
) as members from switches
|
||||
where switches.system = @System and switches.timestamp < @Before
|
||||
order by switches.timestamp desc
|
||||
limit 100;", new { System = system.Id, Before = before });
|
||||
limit 100;", new { System = system.Id, Before = before }));
|
||||
return Ok(res);
|
||||
}
|
||||
|
||||
[HttpGet("{hid}/fronters")]
|
||||
public async Task<ActionResult<FrontersReturn>> GetFronters(string hid)
|
||||
{
|
||||
await using var conn = await _db.Obtain();
|
||||
|
||||
var system = await _repo.GetSystemByHid(conn, hid);
|
||||
var system = await _repo.GetSystemByHid(hid);
|
||||
if (system == null) return NotFound("System not found.");
|
||||
|
||||
var auth = await _auth.AuthorizeAsync(User, system, "ViewFront");
|
||||
if (!auth.Succeeded) return StatusCode(StatusCodes.Status403Forbidden, "Unauthorized to view fronter.");
|
||||
|
||||
var sw = await _repo.GetLatestSwitch(conn, system.Id);
|
||||
var sw = await _repo.GetLatestSwitch(system.Id);
|
||||
if (sw == null) return NotFound("System has no registered switches.");
|
||||
|
||||
var members = _repo.GetSwitchMembers(conn, sw.Id);
|
||||
var members = _db.Execute(conn => _repo.GetSwitchMembers(conn, sw.Id));
|
||||
return Ok(new FrontersReturn
|
||||
{
|
||||
Timestamp = sw.Timestamp,
|
||||
@@ -134,8 +130,7 @@ namespace PluralKit.API
|
||||
[Authorize]
|
||||
public async Task<ActionResult<JObject>> EditSystem([FromBody] JObject changes)
|
||||
{
|
||||
await using var conn = await _db.Obtain();
|
||||
var system = await _repo.GetSystem(conn, User.CurrentSystem());
|
||||
var system = await _repo.GetSystem(User.CurrentSystem());
|
||||
|
||||
SystemPatch patch;
|
||||
try
|
||||
@@ -152,7 +147,7 @@ namespace PluralKit.API
|
||||
return BadRequest($"Request field '{e.Message}' is invalid.");
|
||||
}
|
||||
|
||||
system = await _repo.UpdateSystem(conn, system!.Id, patch);
|
||||
system = await _repo.UpdateSystem(system!.Id, patch);
|
||||
return Ok(system.ToJson(User.ContextFor(system)));
|
||||
}
|
||||
|
||||
@@ -166,7 +161,7 @@ namespace PluralKit.API
|
||||
await using var conn = await _db.Obtain();
|
||||
|
||||
// We get the current switch, if it exists
|
||||
var latestSwitch = await _repo.GetLatestSwitch(conn, User.CurrentSystem());
|
||||
var latestSwitch = await _repo.GetLatestSwitch(User.CurrentSystem());
|
||||
if (latestSwitch != null)
|
||||
{
|
||||
var latestSwitchMembers = _repo.GetSwitchMembers(conn, latestSwitch.Id);
|
||||
|
Reference in New Issue
Block a user