feat: Add a large collection of emoji and other frontend assets, including a sound file, and a backend package.json.
This commit is contained in:
75
Backend/routes/invites.js
Normal file
75
Backend/routes/invites.js
Normal file
@@ -0,0 +1,75 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const db = require('../db');
|
||||
|
||||
// Create a new invite
|
||||
router.post('/create', async (req, res) => {
|
||||
const { code, encryptedPayload, createdBy, maxUses, expiresAt, keyVersion } = req.body;
|
||||
|
||||
if (!code || !encryptedPayload || !createdBy || !keyVersion) {
|
||||
return res.status(400).json({ error: 'Missing required fields' });
|
||||
}
|
||||
|
||||
try {
|
||||
await db.query(
|
||||
`INSERT INTO invites (code, encrypted_payload, created_by, max_uses, expires_at, key_version)
|
||||
VALUES ($1, $2, $3, $4, $5, $6)`,
|
||||
[code, encryptedPayload, createdBy, maxUses || null, expiresAt || null, keyVersion]
|
||||
);
|
||||
res.json({ success: true });
|
||||
} catch (err) {
|
||||
console.error('Error creating invite:', err);
|
||||
res.status(500).json({ error: 'Server error' });
|
||||
}
|
||||
});
|
||||
|
||||
// Fetch an invite (and validate it)
|
||||
router.get('/:code', async (req, res) => {
|
||||
const { code } = req.params;
|
||||
|
||||
try {
|
||||
const result = await db.query('SELECT * FROM invites WHERE code = $1', [code]);
|
||||
if (result.rows.length === 0) {
|
||||
return res.status(404).json({ error: 'Invite not found' });
|
||||
}
|
||||
|
||||
const invite = result.rows[0];
|
||||
|
||||
// Check Expiration
|
||||
if (invite.expires_at && new Date() > new Date(invite.expires_at)) {
|
||||
return res.status(410).json({ error: 'Invite expired' });
|
||||
}
|
||||
|
||||
// Check Usage Limits
|
||||
if (invite.max_uses !== null && invite.uses >= invite.max_uses) {
|
||||
return res.status(410).json({ error: 'Invite max uses reached' });
|
||||
}
|
||||
|
||||
// Increment Uses
|
||||
await db.query('UPDATE invites SET uses = uses + 1 WHERE code = $1', [code]);
|
||||
|
||||
res.json({
|
||||
encryptedPayload: invite.encrypted_payload,
|
||||
keyVersion: invite.key_version
|
||||
});
|
||||
|
||||
} catch (err) {
|
||||
console.error('Error fetching invite:', err);
|
||||
res.status(500).json({ error: 'Server error' });
|
||||
}
|
||||
});
|
||||
|
||||
// Delete an invite (Revoke) -> Triggers client-side key rotation policy warning?
|
||||
// The client should call this, then rotate keys.
|
||||
router.delete('/:code', async (req, res) => {
|
||||
const { code } = req.params;
|
||||
try {
|
||||
await db.query('DELETE FROM invites WHERE code = $1', [code]);
|
||||
res.json({ success: true });
|
||||
} catch (err) {
|
||||
console.error('Error deleting invite:', err);
|
||||
res.status(500).json({ error: 'Server error' });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user