mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-20 22:01:45 +00:00
62 lines
2.5 KiB
TypeScript
62 lines
2.5 KiB
TypeScript
import express, { Request, Response } from 'express';
|
|
import { canAccessTrip } from '../db/database';
|
|
import { authenticate } from '../middleware/auth';
|
|
import { checkPermission } from '../services/permissions';
|
|
import { AuthRequest } from '../types';
|
|
import * as shareService from '../services/shareService';
|
|
|
|
const router = express.Router();
|
|
|
|
// Create a share link for a trip (owner/member only)
|
|
router.post('/trips/:tripId/share-link', authenticate, (req: Request, res: Response) => {
|
|
const authReq = req as AuthRequest;
|
|
const { tripId } = req.params;
|
|
const access = canAccessTrip(tripId, authReq.user.id);
|
|
if (!access) return res.status(404).json({ error: 'Trip not found' });
|
|
if (!checkPermission('share_manage', authReq.user.role, access.user_id, authReq.user.id, access.user_id !== authReq.user.id))
|
|
return res.status(403).json({ error: 'No permission' });
|
|
|
|
const { share_map, share_bookings, share_packing, share_budget, share_collab } = req.body || {};
|
|
const result = shareService.createOrUpdateShareLink(tripId, authReq.user.id, {
|
|
share_map, share_bookings, share_packing, share_budget, share_collab,
|
|
});
|
|
|
|
if (result.created) {
|
|
return res.status(201).json({ token: result.token });
|
|
}
|
|
return res.json({ token: result.token });
|
|
});
|
|
|
|
// Get share link status
|
|
router.get('/trips/:tripId/share-link', authenticate, (req: Request, res: Response) => {
|
|
const authReq = req as AuthRequest;
|
|
const { tripId } = req.params;
|
|
if (!canAccessTrip(tripId, authReq.user.id)) return res.status(404).json({ error: 'Trip not found' });
|
|
|
|
const info = shareService.getShareLink(tripId);
|
|
res.json(info ? info : { token: null });
|
|
});
|
|
|
|
// Delete share link
|
|
router.delete('/trips/:tripId/share-link', authenticate, (req: Request, res: Response) => {
|
|
const authReq = req as AuthRequest;
|
|
const { tripId } = req.params;
|
|
const access = canAccessTrip(tripId, authReq.user.id);
|
|
if (!access) return res.status(404).json({ error: 'Trip not found' });
|
|
if (!checkPermission('share_manage', authReq.user.role, access.user_id, authReq.user.id, access.user_id !== authReq.user.id))
|
|
return res.status(403).json({ error: 'No permission' });
|
|
|
|
shareService.deleteShareLink(tripId);
|
|
res.json({ success: true });
|
|
});
|
|
|
|
// Public read-only trip data (no auth required)
|
|
router.get('/shared/:token', (req: Request, res: Response) => {
|
|
const { token } = req.params;
|
|
const data = shareService.getSharedTripData(token);
|
|
if (!data) return res.status(404).json({ error: 'Invalid or expired link' });
|
|
res.json(data);
|
|
});
|
|
|
|
export default router;
|