const { query } = require('../../utils/db') // Find the identity row for an external (provider, subject) pair. This is the // link-only login lookup: no row → no account → login refused. async function findByProviderSubject(provider, subject) { const rows = await query( 'SELECT * FROM user_identities WHERE provider = ? AND subject = ? LIMIT 1', [provider, subject], ) return rows[0] || null } // All identities linked to a given internal user (for the Account page). async function listForUser(userId) { return query( `SELECT id, provider, subject, email, display_name, avatar_url, created_at FROM user_identities WHERE user_id = ? ORDER BY provider, created_at`, [userId], ) } async function insert({ userId, provider, subject, email = null, displayName = null, avatarUrl = null }) { const res = await query( `INSERT INTO user_identities (user_id, provider, subject, email, display_name, avatar_url) VALUES (?, ?, ?, ?, ?, ?)`, [userId, provider, subject, email, displayName, avatarUrl], ) return res.insertId } // Refresh the name and avatar a provider reported at sign-in (Steam, D394). Only // what the provider sent is written: a lookup that failed leaves the last good // values in place rather than blanking them. async function updateProfile(id, { displayName, avatarUrl }) { const sets = [] const vals = [] if (displayName) { sets.push('display_name = ?'); vals.push(displayName) } if (avatarUrl) { sets.push('avatar_url = ?'); vals.push(avatarUrl) } if (!sets.length) return 0 const res = await query(`UPDATE user_identities SET ${sets.join(', ')} WHERE id = ?`, [...vals, id]) return Number(res.affectedRows || 0) } // Remove a user's link to a provider — every identity of it, or, given an // identity id, that one only (a user may hold several Steam accounts). Returns // rows deleted. async function deleteForUserProvider(userId, provider, identityId = null) { if (identityId != null) { const res = await query( 'DELETE FROM user_identities WHERE user_id = ? AND provider = ? AND id = ?', [userId, provider, identityId], ) return Number(res.affectedRows || 0) } const res = await query( 'DELETE FROM user_identities WHERE user_id = ? AND provider = ?', [userId, provider], ) return Number(res.affectedRows || 0) } module.exports = { findByProviderSubject, listForUser, insert, updateProfile, deleteForUserProvider }