Refactor skin selection logic and remove DB trigger

Removed the 'unique_active_skin' database trigger from setupDatabase and updated setSkin in userRepository to handle skin selection logic in application code. This change centralizes the logic for ensuring only one active skin per user, improving maintainability and error handling.
This commit is contained in:
Gilles Lazures 2026-01-23 23:07:10 +01:00
parent aea0b7b016
commit dbcb436c9f
2 changed files with 15 additions and 27 deletions

View File

@ -242,20 +242,6 @@ async function setupDatabase() {
logger.log(`defaults skins (steve, alex) ready`, ["MariaDB", "yellow"]) logger.log(`defaults skins (steve, alex) ready`, ["MariaDB", "yellow"])
await conn.query(`DROP TRIGGER IF EXISTS unique_active_skin`) await conn.query(`DROP TRIGGER IF EXISTS unique_active_skin`)
await conn.query(`
CREATE TRIGGER unique_active_skin
AFTER UPDATE ON playersSkins
FOR EACH ROW
BEGIN
IF NEW.isSelected = 1 THEN
UPDATE playersSkins
SET isSelected = 0
WHERE playerUuid = NEW.playerUuid
AND assetHash != NEW.assetHash;
END IF;
END;
`)
logger.log(`${"unique_active_skin".bold} trigger ready`, ["MariaDB", "yellow"])
await conn.query(`DROP TRIGGER IF EXISTS unique_active_cape`) await conn.query(`DROP TRIGGER IF EXISTS unique_active_cape`)

View File

@ -656,19 +656,21 @@ async function getNameHistory(uuid) {
} }
async function setSkin(uuid, hash, variant) { async function setSkin(uuid, hash, variant) {
const insertSql = ` try {
INSERT INTO playersSkins (playerUuid, assetHash, variant, isSelected) const resetSql = `UPDATE playersSkins SET isSelected = 0 WHERE playerUuid = ?`
VALUES (?, ?, ?, 1) await database.query(resetSql, [uuid])
ON DUPLICATE KEY UPDATE isSelected = 1, variant = ?
` const upsertSql = `
await database.query(insertSql, [uuid, hash, variant, variant]) INSERT INTO playersSkins (playerUuid, assetHash, variant, isSelected)
const updateSql = ` VALUES (?, ?, ?, 1)
UPDATE playersSkins ON DUPLICATE KEY UPDATE isSelected = 1, variant = VALUES(variant)
SET isSelected = 0 `
WHERE playerUuid = ? AND assetHash != ? await database.query(upsertSql, [uuid, hash, variant.toLowerCase()])
`
await database.query(updateSql, [uuid, hash]) return true
return true } catch (error) {
return utils.handleDBError(error)
}
} }
async function updatePassword(uuid, hashedPassword) { async function updatePassword(uuid, hashedPassword) {