feat(api): try harder at checking whether user is in guild

This commit is contained in:
alyssa 2025-06-08 20:27:35 +00:00
parent 539fc82342
commit 6fea94f990
4 changed files with 45 additions and 11 deletions

View file

@ -7,4 +7,5 @@ public class ApiConfig
public string? ClientSecret { get; set; }
public bool TrustAuth { get; set; } = false;
public string? AvatarServiceUrl { get; set; }
public bool SearchGuildSettings = false;
}

View file

@ -20,7 +20,7 @@ public class DiscordControllerV2: PKControllerBase
if (ContextFor(system) != LookupContext.ByOwner)
throw Errors.GenericMissingPermissions;
var settings = await _repo.GetSystemGuild(guild_id, system.Id, false);
var settings = await _repo.GetSystemGuild(guild_id, system.Id, false, _config.SearchGuildSettings);
if (settings == null)
throw Errors.SystemGuildNotFound;
@ -34,7 +34,7 @@ public class DiscordControllerV2: PKControllerBase
if (ContextFor(system) != LookupContext.ByOwner)
throw Errors.GenericMissingPermissions;
var settings = await _repo.GetSystemGuild(guild_id, system.Id, false);
var settings = await _repo.GetSystemGuild(guild_id, system.Id, false, _config.SearchGuildSettings);
if (settings == null)
throw Errors.SystemGuildNotFound;
@ -58,7 +58,7 @@ public class DiscordControllerV2: PKControllerBase
if (member.System != system.Id)
throw Errors.NotOwnMemberError;
var settings = await _repo.GetMemberGuild(guild_id, member.Id, false);
var settings = await _repo.GetMemberGuild(guild_id, member.Id, false, _config.SearchGuildSettings ? system.Id : null);
if (settings == null)
throw Errors.MemberGuildNotFound;
@ -75,7 +75,7 @@ public class DiscordControllerV2: PKControllerBase
if (member.System != system.Id)
throw Errors.NotOwnMemberError;
var settings = await _repo.GetMemberGuild(guild_id, member.Id, false);
var settings = await _repo.GetMemberGuild(guild_id, member.Id, false, _config.SearchGuildSettings ? system.Id : null);
if (settings == null)
throw Errors.MemberGuildNotFound;

View file

@ -19,16 +19,40 @@ public partial class ModelRepository
}
public Task<SystemGuildSettings> GetSystemGuild(ulong guild, SystemId system, bool defaultInsert = true)
public async Task<SystemGuildSettings> GetSystemGuild(ulong guild, SystemId system, bool defaultInsert = true, bool search = false)
{
if (!defaultInsert)
return _db.QueryFirst<SystemGuildSettings>(new Query("system_guild")
{
var simpleRes = await _db.QueryFirst<SystemGuildSettings>(new Query("system_guild")
.Where("guild", guild)
.Where("system", system)
);
if (simpleRes != null || !search)
return simpleRes;
var accounts = await GetSystemAccounts(system);
var searchRes = await _db.QueryFirst<bool>(
"select exists(select 1 from command_messages where guild = @guild and sender = any(@accounts))",
new { guild = guild, accounts = accounts.Select(u => (long)u).ToArray() },
queryName: "find_system_from_commands",
messages: true
);
if (!searchRes)
searchRes = await _db.QueryFirst<bool>(
"select exists(select 1 from command_messages where guild = @guild and sender = any(@accounts))",
new { guild = guild, accounts = accounts.Select(u => (long)u).ToArray() },
queryName: "find_system_from_messages",
messages: true
);
if (!searchRes)
return null;
}
var query = new Query("system_guild").AsInsert(new { guild, system });
return _db.QueryFirst<SystemGuildSettings>(query,
return await _db.QueryFirst<SystemGuildSettings>(query,
"on conflict (guild, system) do update set guild = $1, system = $2 returning *"
);
}
@ -42,16 +66,25 @@ public partial class ModelRepository
return settings;
}
public Task<MemberGuildSettings> GetMemberGuild(ulong guild, MemberId member, bool defaultInsert = true)
public async Task<MemberGuildSettings> GetMemberGuild(ulong guild, MemberId member, bool defaultInsert = true, SystemId? search = null)
{
if (!defaultInsert)
return _db.QueryFirst<MemberGuildSettings>(new Query("member_guild")
{
var simpleRes = await _db.QueryFirst<MemberGuildSettings>(new Query("member_guild")
.Where("guild", guild)
.Where("member", member)
);
if (simpleRes != null || !search.HasValue)
return simpleRes;
var systemConfig = await GetSystemGuild(guild, search.Value, defaultInsert: false, search: true);
if (systemConfig == null)
return null;
}
var query = new Query("member_guild").AsInsert(new { guild, member });
return _db.QueryFirst<MemberGuildSettings>(query,
return await _db.QueryFirst<MemberGuildSettings>(query,
"on conflict (guild, member) do update set guild = $1, member = $2 returning *"
);
}

View file

@ -9,7 +9,7 @@ namespace PluralKit.Core;
internal class DatabaseMigrator
{
private const string RootPath = "PluralKit.Core.Database"; // "resource path" root for SQL files
private const int TargetSchemaVersion = 51;
private const int TargetSchemaVersion = 52;
private readonly ILogger _logger;
public DatabaseMigrator(ILogger logger)