|
1 | 1 | // src/modules/creator/creator.controller.ts |
2 | | -import { Request, Response } from 'express'; |
3 | | -import { z } from 'zod'; |
| 2 | +import { RequestHandler } from 'express'; |
| 3 | + |
| 4 | +// API response helpers |
4 | 5 | import { |
5 | | - sendSuccess, |
6 | | - sendError, |
7 | | - sendValidationError, |
8 | | - ErrorCode, |
| 6 | + sendSuccess, |
| 7 | + sendError, |
| 8 | + sendValidationError, |
| 9 | + ErrorCode, |
9 | 10 | } from '../../utils/api-response.utils'; |
| 11 | + |
| 12 | +// Creator service and utilities |
10 | 13 | import { getPaginatedCreators } from './creator.service'; |
11 | 14 | import { parseCreatorSortOptions } from './creator.utils'; |
12 | | -import { safeIntParam } from '../../utils/query.utils'; |
13 | 15 | import { parsePublicQuery } from '../../utils/public-query-parse.utils'; |
14 | 16 | import { wrapPublicCreatorListResponse } from '../creators/public-creator-list-envelope.utils'; |
15 | 17 | import { buildCreatorListRequestContext } from '../creators/creator-list-context.utils'; |
16 | 18 | import { normalizeCreatorListPage } from './creator-list-page.guard'; |
17 | | -import { |
18 | | - MIN_PAGE_SIZE, |
19 | | - MAX_PAGE_SIZE, |
20 | | -} from '../../constants/pagination.constants'; |
21 | | -import { PUBLIC_PAGE_PAGINATION_DEFAULTS } from '../../utils/public-list-query-defaults'; |
22 | 19 |
|
23 | | -const LegacyCreatorQuerySchema = z.object({ |
24 | | - page: safeIntParam({ |
25 | | - defaultValue: PUBLIC_PAGE_PAGINATION_DEFAULTS.page, |
26 | | - min: MIN_PAGE_SIZE, |
27 | | - max: Number.MAX_SAFE_INTEGER, |
28 | | - label: 'Page', |
29 | | - }), |
30 | | - limit: safeIntParam({ |
31 | | - defaultValue: PUBLIC_PAGE_PAGINATION_DEFAULTS.limit, |
32 | | - min: MIN_PAGE_SIZE, |
33 | | - max: MAX_PAGE_SIZE, |
34 | | - label: 'Limit', |
35 | | - }), |
36 | | - sortBy: z.string().optional(), |
37 | | - sortOrder: z.string().optional(), |
38 | | -}); |
| 20 | +// Legacy query schema |
| 21 | +import { LegacyCreatorQuerySchema } from '../creators/creators.schemas'; |
| 22 | + |
| 23 | +// Typed Express handler |
| 24 | +export const listCreators: RequestHandler = async (req, res) => { |
| 25 | + try { |
| 26 | + // Build request context |
| 27 | + const ctx = buildCreatorListRequestContext(req); |
| 28 | + |
| 29 | + // Parse query using legacy schema |
| 30 | + const parsed = parsePublicQuery(LegacyCreatorQuerySchema, ctx.query); |
| 31 | + |
| 32 | + if (!parsed.ok) { |
| 33 | + return sendValidationError(res, 'Invalid query parameters', parsed.details); |
| 34 | + } |
| 35 | + |
| 36 | + // Destructure using schema fields |
| 37 | + const { offset, limit, sort, order: sortOrder } = parsed.data; |
39 | 38 |
|
40 | | -export async function listCreators(req: Request, res: Response) { |
41 | | - try { |
42 | | - const ctx = buildCreatorListRequestContext(req); |
43 | | - const parsed = parsePublicQuery(LegacyCreatorQuerySchema, ctx.query); |
44 | | - if (!parsed.ok) { |
45 | | - return sendValidationError( |
46 | | - res, |
47 | | - 'Invalid query parameters', |
48 | | - parsed.details |
49 | | - ); |
50 | | - } |
51 | | - const { limit, sortBy, sortOrder } = parsed.data; |
52 | | - const page = normalizeCreatorListPage(parsed.data.page); |
| 39 | + // Convert offset to page number |
| 40 | + const page = normalizeCreatorListPage(offset); |
53 | 41 |
|
54 | | - const sort = parseCreatorSortOptions(sortBy, sortOrder); |
| 42 | + // Build sort options |
| 43 | + const sortOptions = parseCreatorSortOptions(sort, sortOrder); |
55 | 44 |
|
56 | | - const { creators, meta } = await getPaginatedCreators({ |
57 | | - page, |
58 | | - limit, |
59 | | - sort, |
60 | | - }); |
| 45 | + // Fetch paginated creators |
| 46 | + const { creators, meta } = await getPaginatedCreators({ |
| 47 | + page, |
| 48 | + limit, |
| 49 | + sort: sortOptions, |
| 50 | + }); |
61 | 51 |
|
62 | | - return sendSuccess( |
63 | | - res, |
64 | | - wrapPublicCreatorListResponse(creators, meta), |
65 | | - 200, |
66 | | - 'Creators retrieved successfully' |
67 | | - ); |
68 | | - } catch (error) { |
69 | | - console.error('Error listing creators:', error); |
70 | | - return sendError( |
71 | | - res, |
72 | | - 500, |
73 | | - ErrorCode.INTERNAL_ERROR, |
74 | | - 'Failed to retrieve creators' |
75 | | - ); |
76 | | - } |
77 | | -} |
| 52 | + // Send success response |
| 53 | + return sendSuccess( |
| 54 | + res, |
| 55 | + wrapPublicCreatorListResponse(creators, meta), |
| 56 | + 200, |
| 57 | + 'Creators retrieved successfully' |
| 58 | + ); |
| 59 | + } catch (error) { |
| 60 | + console.error('Error listing creators:', error); |
| 61 | + return sendError(res, 500, ErrorCode.INTERNAL_ERROR, 'Failed to retrieve creators'); |
| 62 | + } |
| 63 | +}; |
0 commit comments