91 lines
2.5 KiB
TypeScript
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;
|