|
|
|
|
@@ -455,7 +455,7 @@ router.get('/aliases-all', authMiddleware, teamManagerMiddleware, async (req, re
|
|
|
|
|
router.get('/me/partner', authMiddleware, async (req, res) => {
|
|
|
|
|
try {
|
|
|
|
|
const partner = await queryOne(req.schema,
|
|
|
|
|
`SELECT u.id, u.name, u.display_name, u.avatar
|
|
|
|
|
`SELECT u.id, u.name, u.display_name, u.avatar, gp.respond_separately
|
|
|
|
|
FROM guardian_partners gp
|
|
|
|
|
JOIN users u ON u.id = CASE WHEN gp.user_id_1=$1 THEN gp.user_id_2 ELSE gp.user_id_1 END
|
|
|
|
|
WHERE gp.user_id_1=$1 OR gp.user_id_2=$1`,
|
|
|
|
|
@@ -466,26 +466,52 @@ router.get('/me/partner', authMiddleware, async (req, res) => {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Set partner (replaces any existing partnership for this user)
|
|
|
|
|
// If the partner is changing to a different person, the user's child aliases are also removed.
|
|
|
|
|
router.post('/me/partner', authMiddleware, async (req, res) => {
|
|
|
|
|
const userId = req.user.id;
|
|
|
|
|
const partnerId = parseInt(req.body.partnerId);
|
|
|
|
|
const respondSeparately = !!req.body.respondSeparately;
|
|
|
|
|
if (!partnerId || partnerId === userId) return res.status(400).json({ error: 'Invalid partner' });
|
|
|
|
|
const uid1 = Math.min(userId, partnerId);
|
|
|
|
|
const uid2 = Math.max(userId, partnerId);
|
|
|
|
|
try {
|
|
|
|
|
// Check current partner before replacing
|
|
|
|
|
const currentRow = await queryOne(req.schema,
|
|
|
|
|
`SELECT CASE WHEN user_id_1=$1 THEN user_id_2 ELSE user_id_1 END AS partner_id
|
|
|
|
|
FROM guardian_partners WHERE user_id_1=$1 OR user_id_2=$1`,
|
|
|
|
|
[userId]
|
|
|
|
|
);
|
|
|
|
|
const currentPartnerId = currentRow?.partner_id ? parseInt(currentRow.partner_id) : null;
|
|
|
|
|
await exec(req.schema, 'DELETE FROM guardian_partners WHERE user_id_1=$1 OR user_id_2=$1', [userId]);
|
|
|
|
|
await exec(req.schema, 'INSERT INTO guardian_partners (user_id_1,user_id_2) VALUES ($1,$2)', [uid1, uid2]);
|
|
|
|
|
// If switching to a different partner, remove user's own child aliases
|
|
|
|
|
if (currentPartnerId && currentPartnerId !== partnerId) {
|
|
|
|
|
await exec(req.schema, 'DELETE FROM guardian_aliases WHERE guardian_id=$1', [userId]);
|
|
|
|
|
}
|
|
|
|
|
await exec(req.schema, 'INSERT INTO guardian_partners (user_id_1,user_id_2,respond_separately) VALUES ($1,$2,$3)', [uid1, uid2, respondSeparately]);
|
|
|
|
|
const partner = await queryOne(req.schema,
|
|
|
|
|
'SELECT id,name,display_name,avatar FROM users WHERE id=$1',
|
|
|
|
|
[partnerId]
|
|
|
|
|
);
|
|
|
|
|
res.json({ partner });
|
|
|
|
|
res.json({ partner: { ...partner, respond_separately: respondSeparately } });
|
|
|
|
|
} catch (e) { res.status(500).json({ error: e.message }); }
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Remove partner
|
|
|
|
|
// Update respond_separately on existing partnership
|
|
|
|
|
router.patch('/me/partner', authMiddleware, async (req, res) => {
|
|
|
|
|
const respondSeparately = !!req.body.respondSeparately;
|
|
|
|
|
try {
|
|
|
|
|
await exec(req.schema,
|
|
|
|
|
'UPDATE guardian_partners SET respond_separately=$1 WHERE user_id_1=$2 OR user_id_2=$2',
|
|
|
|
|
[respondSeparately, req.user.id]
|
|
|
|
|
);
|
|
|
|
|
res.json({ success: true });
|
|
|
|
|
} catch (e) { res.status(500).json({ error: e.message }); }
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Remove partner — also removes the requesting user's child aliases
|
|
|
|
|
router.delete('/me/partner', authMiddleware, async (req, res) => {
|
|
|
|
|
try {
|
|
|
|
|
await exec(req.schema, 'DELETE FROM guardian_aliases WHERE guardian_id=$1', [req.user.id]);
|
|
|
|
|
await exec(req.schema, 'DELETE FROM guardian_partners WHERE user_id_1=$1 OR user_id_2=$1', [req.user.id]);
|
|
|
|
|
res.json({ success: true });
|
|
|
|
|
} catch (e) { res.status(500).json({ error: e.message }); }
|
|
|
|
|
|