This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

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}