Files
carry-your-live/backend/src/routes/repeatProfiles.ts
T
2026-08-06 11:16:47 +02:00

91 lines
2.5 KiB
TypeScript

import { Router, Request, Response } from 'express';
import { asyncHandler } from '../utils/asyncHandler';
import { db } from '../db';
import { repeatProfiles } from '../db/schema';
import { eq, and, asc } from 'drizzle-orm';
import { authMiddleware } from '../utils/auth';
import { generateId } from '../utils/auth';
import { AppError } from '../middleware/errorHandler';
import { repeatProfileSchema, repeatProfileUpdateSchema } from '../utils/validation';
const router = Router();
router.use(authMiddleware);
router.get('/', asyncHandler(async (req: Request, res: Response) => {
const profiles = await db
.select()
.from(repeatProfiles)
.where(eq(repeatProfiles.userId, req.user!.userId))
.orderBy(asc(repeatProfiles.createdAt));
res.json({ profiles });
}));
router.post('/', asyncHandler(async (req: Request, res: Response) => {
const data = repeatProfileSchema.parse(req.body);
const userId = req.user!.userId;
const now = Date.now();
const newProfile = {
id: generateId('rp'),
userId,
name: data.name,
repeat: data.repeat,
repeatInterval: data.repeatInterval,
repeatDays: data.repeatDays,
createdAt: now,
updatedAt: now,
};
await db.insert(repeatProfiles).values(newProfile);
res.status(201).json(newProfile);
}));
router.patch('/:id', asyncHandler(async (req: Request, res: Response) => {
const data = repeatProfileUpdateSchema.parse(req.body);
const userId = req.user!.userId;
const existing = await db
.select()
.from(repeatProfiles)
.where(and(eq(repeatProfiles.id, req.params.id), eq(repeatProfiles.userId, userId)))
.limit(1);
if (existing.length === 0) {
throw new AppError('NOT_FOUND', 'Repeat profile not found', 404);
}
const now = Date.now();
const updated = await db
.update(repeatProfiles)
.set({ ...data, updatedAt: now })
.where(and(eq(repeatProfiles.id, req.params.id), eq(repeatProfiles.userId, userId)))
.returning();
res.json(updated[0]);
}));
router.delete('/:id', asyncHandler(async (req: Request, res: Response) => {
const userId = req.user!.userId;
const existing = await db
.select()
.from(repeatProfiles)
.where(and(eq(repeatProfiles.id, req.params.id), eq(repeatProfiles.userId, userId)))
.limit(1);
if (existing.length === 0) {
throw new AppError('NOT_FOUND', 'Repeat profile not found', 404);
}
await db
.delete(repeatProfiles)
.where(and(eq(repeatProfiles.id, req.params.id), eq(repeatProfiles.userId, userId)));
res.status(204).send();
}));
export default router;