From 99f905de4c3f5cd537d9e078b4057d7bf4eaf5a7 Mon Sep 17 00:00:00 2001 From: ashe Date: Tue, 13 Feb 2024 02:55:21 -0700 Subject: [PATCH] fix(api): refactor autoproxy controller so unlatching can work (#615) --- .../Controllers/v2/AutoproxyControllerV2.cs | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/PluralKit.API/Controllers/v2/AutoproxyControllerV2.cs b/PluralKit.API/Controllers/v2/AutoproxyControllerV2.cs index d72c6d78..2f42b5f5 100644 --- a/PluralKit.API/Controllers/v2/AutoproxyControllerV2.cs +++ b/PluralKit.API/Controllers/v2/AutoproxyControllerV2.cs @@ -53,7 +53,7 @@ public class AutoproxyControllerV2: PKControllerBase private async Task Patch(PKSystem system, ulong? guildId, ulong? channelId, JObject data, AutoproxySettings oldData) { - var updateMember = data.ContainsKey("autoproxy_member"); + var updateMember = data.ContainsKey("autoproxy_member") && data.Value("autoproxy_member") != null; PKMember? member = null; if (updateMember) @@ -64,15 +64,37 @@ public class AutoproxyControllerV2: PKControllerBase } var patch = AutoproxyPatch.FromJson(data, member?.Id); - patch.AssertIsValid(); + + var newAutoproxyMode = patch.AutoproxyMode.IsPresent ? patch.AutoproxyMode : oldData.AutoproxyMode; + var newAutoproxyMember = patch.AutoproxyMember.IsPresent ? patch.AutoproxyMember : oldData.AutoproxyMember; + if (updateMember && member == null) + { patch.Errors.Add(new("autoproxy_member", "Member not found.")); - if (updateMember && !( - (patch.AutoproxyMode.IsPresent && patch.AutoproxyMode.Value == AutoproxyMode.Member) - || (!patch.AutoproxyMode.IsPresent && oldData.AutoproxyMode == AutoproxyMode.Member)) - ) - patch.Errors.Add(new("autoproxy_member", "Cannot update autoproxy member if autoproxy mode is set to latch")); + } + + if (newAutoproxyMode.Value == AutoproxyMode.Member) + { + if (!updateMember) + { + patch.Errors.Add(new("autoproxy_member", "An autoproxy member must be supplied for autoproxy mode 'member'")); + } + + patch.AutoproxyMode = newAutoproxyMode; + patch.AutoproxyMember = newAutoproxyMember; + } + else + { + if (updateMember) + { + patch.Errors.Add(new("autoproxy_member", "Cannot update autoproxy member if autoproxy mode is not set to 'member'")); + } + + patch.AutoproxyMode = newAutoproxyMode; + patch.AutoproxyMember = null; + } + if (patch.Errors.Count > 0) throw new ModelParseError(patch.Errors);