diff --git a/PluralKit.API/Controllers/PKControllerBase.cs b/PluralKit.API/Controllers/PKControllerBase.cs index f28a3832..00856775 100644 --- a/PluralKit.API/Controllers/PKControllerBase.cs +++ b/PluralKit.API/Controllers/PKControllerBase.cs @@ -29,5 +29,33 @@ namespace PluralKit.API _db = svc.GetRequiredService(); _repo = svc.GetRequiredService(); } + + protected Task ResolveSystem(string systemRef) + { + if (systemRef == "@me") + { + HttpContext.Items.TryGetValue("SystemId", out var systemId); + if (systemId == null) return null; + return _repo.GetSystem((SystemId)systemId); + } + + if (Guid.TryParse(systemRef, out var guid)) + return _repo.GetSystemByGuid(guid); + + if (_snowflakeRegex.IsMatch(systemRef)) + return _repo.GetSystemByAccount(ulong.Parse(systemRef)); + + if (_shortIdRegex.IsMatch(systemRef)) + return _repo.GetSystemByHid(systemRef); + + return null; + } + + public LookupContext LookupContextFor(PKSystem target) + { + HttpContext.Items.TryGetValue("SystemId", out var systemId); + if (systemId == null) return LookupContext.ByNonOwner; + return target.Id == (SystemId)systemId ? LookupContext.ByOwner : LookupContext.ByNonOwner; + } } } \ No newline at end of file diff --git a/PluralKit.API/Controllers/v2/GroupControllerV2.cs b/PluralKit.API/Controllers/v2/GroupControllerV2.cs new file mode 100644 index 00000000..ab1ff635 --- /dev/null +++ b/PluralKit.API/Controllers/v2/GroupControllerV2.cs @@ -0,0 +1,66 @@ +using System; +using System.Threading.Tasks; + +using Microsoft.AspNetCore.Mvc; + +using Newtonsoft.Json.Linq; + +using PluralKit.Core; + +namespace PluralKit.API +{ + [ApiController] + [ApiVersion("2.0")] + [Route("v{version:apiVersion}")] + public class GroupControllerV2: PKControllerBase + { + public GroupControllerV2(IServiceProvider svc) : base(svc) { } + + [HttpGet("systems/{system_id}/groups")] + public async Task GetSystemGroups(string system_id) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + [HttpPost("groups")] + public async Task GroupCreate(string group_id) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + [HttpGet("groups/{group_id}")] + public async Task GroupGet(string group_id) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + [HttpPatch("groups/{group_id}")] + public async Task GroupPatch(string group_id) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + [HttpDelete("groups/{group_id}")] + public async Task GroupDelete(string group_id) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + + } +} \ No newline at end of file diff --git a/PluralKit.API/Controllers/v2/GroupMemberControllerV2.cs b/PluralKit.API/Controllers/v2/GroupMemberControllerV2.cs new file mode 100644 index 00000000..97a971c7 --- /dev/null +++ b/PluralKit.API/Controllers/v2/GroupMemberControllerV2.cs @@ -0,0 +1,90 @@ +using System; +using System.Threading.Tasks; + +using Microsoft.AspNetCore.Mvc; + +using Newtonsoft.Json.Linq; + +namespace PluralKit.API +{ + [ApiController] + [ApiVersion("2.0")] + [Route("v{version:apiVersion}")] + public class GroupMemberControllerV2: PKControllerBase + { + public GroupMemberControllerV2(IServiceProvider svc) : base(svc) { } + + [HttpGet("groups/{group_id}/members")] + public async Task GetGroupMembers(string group_id) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + [HttpGet("members/{member_id}/groups")] + public async Task GetMemberGroups(string member_id) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + [HttpPut("groups/{group_id}/members/{member_id}")] + public async Task GroupMemberPut(string group_id, string member_id) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + [HttpPut("groups/{group_id}/members")] + public async Task GroupMembersPut(string group_id, [FromBody] JArray members) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + [HttpDelete("groups/{group_id}/members/{member_id}")] + public async Task GroupMemberDelete(string group_id, string member_id) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + [HttpDelete("groups/{group_id}/members")] + public async Task GroupMembersDelete(string group_id, [FromBody] JArray members) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + [HttpPut("members/{member_id}/groups")] + public async Task MemberGroupsPut(string member_id, [FromBody] JArray groups) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + [HttpDelete("members/{member_id}/groups")] + public async Task MemberGroupsDelete(string member_id, [FromBody] JArray groups) + { + return new ObjectResult("Unimplemented") + { + StatusCode = 501 + }; + } + + } +} \ No newline at end of file diff --git a/PluralKit.API/Controllers/v2/SystemControllerV2.cs b/PluralKit.API/Controllers/v2/SystemControllerV2.cs index 93e579c2..f58b1c02 100644 --- a/PluralKit.API/Controllers/v2/SystemControllerV2.cs +++ b/PluralKit.API/Controllers/v2/SystemControllerV2.cs @@ -16,13 +16,12 @@ namespace PluralKit.API { public SystemControllerV2(IServiceProvider svc) : base(svc) { } - [HttpGet("{system}")] - public async Task SystemGet(string system) + [HttpGet("{systemRef}")] + public async Task SystemGet(string systemRef) { - return new ObjectResult("Unimplemented") - { - StatusCode = 501 - }; + var system = await ResolveSystem(systemRef); + if (system == null) return NotFound(); + else return Ok(system.ToJson(LookupContextFor(system))); } [HttpPatch("{system}")] diff --git a/PluralKit.API/Middleware/AuthorizationTokenHandlerMiddleware.cs b/PluralKit.API/Middleware/AuthorizationTokenHandlerMiddleware.cs new file mode 100644 index 00000000..2c9bf0b6 --- /dev/null +++ b/PluralKit.API/Middleware/AuthorizationTokenHandlerMiddleware.cs @@ -0,0 +1,36 @@ +using System.Threading.Tasks; + +using Microsoft.AspNetCore.Http; + +using Dapper; + +using PluralKit.Core; + +namespace PluralKit.API +{ + public class AuthorizationTokenHandlerMiddleware + { + private readonly RequestDelegate _next; + public AuthorizationTokenHandlerMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task Invoke(HttpContext ctx, IDatabase db) + { + ctx.Request.Headers.TryGetValue("authorization", out var authHeaders); + if (authHeaders.Count > 0) + { + var systemId = await db.Execute(conn => conn.QuerySingleOrDefaultAsync( + "select id from systems where token = @token", + new { token = authHeaders[0] } + )); + + if (systemId != null) + ctx.Items.Add("SystemId", systemId); + } + + await _next.Invoke(ctx); + } + } +} \ No newline at end of file diff --git a/PluralKit.API/Startup.cs b/PluralKit.API/Startup.cs index 22dce95c..a19b67de 100644 --- a/PluralKit.API/Startup.cs +++ b/PluralKit.API/Startup.cs @@ -124,6 +124,8 @@ namespace PluralKit.API return next(); }); + app.UseMiddleware(); + //app.UseHttpsRedirection(); app.UseCors(opts => opts.AllowAnyMethod().AllowAnyOrigin().WithHeaders("Content-Type", "Authorization"));