This repository has no description
semble
/
src
/
modules
/
cards
/
infrastructure
/
http
/
controllers
/
GetCollectionsForUrlController.ts
1.8 kB
56 lines
1import { Controller } from '../../../../../shared/infrastructure/http/Controller';
2import { Request, Response } from 'express';
3import { z } from 'zod';
4import { GetCollectionsForUrlUseCase } from '../../../application/useCases/queries/GetCollectionsForUrlUseCase';
5import { GetCollectionsForUrlResponse } from '@semble/types';
6import {
7 CollectionSortField,
8 SortOrder,
9} from '../../../domain/ICollectionQueryRepository';
10
11// Zod schema for request validation
12const querySchema = z.object({
13 url: z.string().min(1, 'URL is required'),
14 page: z.coerce.number().int().positive().optional(),
15 limit: z.coerce.number().int().positive().max(100).optional(),
16 sortBy: z
17 .enum(['name', 'createdAt', 'updatedAt', 'cardCount'])
18 .optional(),
19 sortOrder: z.enum(['asc', 'desc']).optional(),
20});
21
22export class GetCollectionsForUrlController extends Controller {
23 constructor(
24 private getCollectionsForUrlUseCase: GetCollectionsForUrlUseCase,
25 ) {
26 super();
27 }
28
29 async executeImpl(req: Request, res: Response): Promise<any> {
30 try {
31 // Validate request with Zod
32 const validation = querySchema.safeParse(req.query);
33 if (!validation.success) {
34 return this.badRequest(res, JSON.stringify(validation.error.format()));
35 }
36
37 const params = validation.data;
38
39 const result = await this.getCollectionsForUrlUseCase.execute({
40 url: params.url,
41 page: params.page,
42 limit: params.limit,
43 sortBy: params.sortBy as CollectionSortField | undefined,
44 sortOrder: params.sortOrder as SortOrder | undefined,
45 });
46
47 if (result.isErr()) {
48 return this.fail(res, result.error);
49 }
50
51 return this.ok<GetCollectionsForUrlResponse>(res, result.value);
52 } catch (error: any) {
53 return this.fail(res, error);
54 }
55 }
56}