fix: better entity resolving in group member endpoints
This commit is contained in:
@@ -12,6 +12,9 @@ public class PKControllerBase: ControllerBase
|
||||
private readonly Regex _shortIdRegex = new("^[a-z]{5}$");
|
||||
private readonly Regex _snowflakeRegex = new("^[0-9]{17,19}$");
|
||||
|
||||
private List<PKMember>? _memberLookupCache { get; set; }
|
||||
private List<PKGroup>? _groupLookupCache { get; set; }
|
||||
|
||||
protected readonly ApiConfig _config;
|
||||
protected readonly IDatabase _db;
|
||||
protected readonly ModelRepository _repo;
|
||||
@@ -47,26 +50,54 @@ public class PKControllerBase: ControllerBase
|
||||
return Task.FromResult<PKSystem?>(null);
|
||||
}
|
||||
|
||||
protected Task<PKMember?> ResolveMember(string memberRef)
|
||||
protected async Task<PKMember?> ResolveMember(string memberRef, bool cache = false)
|
||||
{
|
||||
if (cache)
|
||||
{
|
||||
if (_memberLookupCache == null)
|
||||
{
|
||||
HttpContext.Items.TryGetValue("SystemId", out var systemId);
|
||||
if (systemId == null)
|
||||
throw new Exception("Authenticated user must not be null to use lookup cache!");
|
||||
|
||||
_memberLookupCache = await _repo.GetSystemMembers((SystemId)systemId).ToListAsync();
|
||||
}
|
||||
|
||||
return _memberLookupCache.FirstOrDefault(x => x.Hid == memberRef || x.Uuid.ToString() == memberRef);
|
||||
}
|
||||
|
||||
if (Guid.TryParse(memberRef, out var guid))
|
||||
return _repo.GetMemberByGuid(guid);
|
||||
return await _repo.GetMemberByGuid(guid);
|
||||
|
||||
if (_shortIdRegex.IsMatch(memberRef))
|
||||
return _repo.GetMemberByHid(memberRef);
|
||||
return await _repo.GetMemberByHid(memberRef);
|
||||
|
||||
return Task.FromResult<PKMember?>(null);
|
||||
return null;
|
||||
}
|
||||
|
||||
protected Task<PKGroup?> ResolveGroup(string groupRef)
|
||||
protected async Task<PKGroup?> ResolveGroup(string groupRef, bool cache = true)
|
||||
{
|
||||
if (cache)
|
||||
{
|
||||
if (_groupLookupCache == null)
|
||||
{
|
||||
HttpContext.Items.TryGetValue("SystemId", out var systemId);
|
||||
if (systemId == null)
|
||||
throw new Exception("Authenticated user must not be null to use lookup cache!");
|
||||
|
||||
_groupLookupCache = await _repo.GetSystemGroups((SystemId)systemId).ToListAsync();
|
||||
}
|
||||
|
||||
return _groupLookupCache.FirstOrDefault(x => x.Hid == groupRef || x.Uuid.ToString() == groupRef);
|
||||
}
|
||||
|
||||
if (Guid.TryParse(groupRef, out var guid))
|
||||
return _repo.GetGroupByGuid(guid);
|
||||
return await _repo.GetGroupByGuid(guid);
|
||||
|
||||
if (_shortIdRegex.IsMatch(groupRef))
|
||||
return _repo.GetGroupByHid(groupRef);
|
||||
return await _repo.GetGroupByHid(groupRef);
|
||||
|
||||
return Task.FromResult<PKGroup?>(null);
|
||||
return null;
|
||||
}
|
||||
|
||||
protected LookupContext ContextFor(PKSystem system)
|
||||
|
||||
Reference in New Issue
Block a user