mirror of
https://github.com/HeyPuter/puter.git
synced 2026-09-12 16:25:51 +00:00
\`jct_user_group\` had no unique constraint on (user_id, group_id) and \`GroupStore.addUsers\` had no conflict clause, so re-adding a member inserted a second row. \`readUserGroupPerms\` joins the junction table on group_id alone, so each duplicate returned another copy of every group permission the user holds. Deduplicate keeping the lowest id, add the unique pair index, and make \`addUsers\` ignore conflicts via the existing \`insertIgnoreInto\` helpers -- without that last part the index turns a re-add into a raised error, which five call sites would log as a failed signup step. mysql cannot delete from a table it reads in a subquery (error 1093), so it uses a self-join with the same lowest-id-wins semantics.
29 lines
1.1 KiB
SQL
29 lines
1.1 KiB
SQL
-- Copyright (C) 2024-present Puter Technologies Inc.
|
|
--
|
|
-- This file is part of Puter.
|
|
--
|
|
-- Puter is free software: you can redistribute it and/or modify
|
|
-- it under the terms of the GNU Affero General Public License as published
|
|
-- by the Free Software Foundation, either version 3 of the License, or
|
|
-- (at your option) any later version.
|
|
--
|
|
-- This program is distributed in the hope that it will be useful,
|
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
-- GNU Affero General Public License for more details.
|
|
--
|
|
-- You should have received a copy of the GNU Affero General Public License
|
|
-- along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
-- Deduplicate then constrain. See sqlite/0072 for why duplicates exist and why
|
|
-- dropping the higher-id row is lossless.
|
|
-- Idempotent: the delete is a no-op once unique, and the index guards itself.
|
|
|
|
DELETE FROM jct_user_group
|
|
WHERE id NOT IN (
|
|
SELECT MIN(id) FROM jct_user_group GROUP BY user_id, group_id
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_jct_user_group_pair
|
|
ON jct_user_group (user_id, group_id);
|