-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy path+server.ts
More file actions
90 lines (77 loc) · 2.56 KB
/
Copy path+server.ts
File metadata and controls
90 lines (77 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import type { RequestHandler } from '@sveltejs/kit';
import { json } from '@sveltejs/kit';
import type { CollectionFindManyArgs } from '$lib/server/db.js';
import { db } from '$lib/server/db.js';
import {
composeMiddleware,
withInternalApiKey,
withIpWhitelist,
} from '$lib/server/middleware/index.js';
import {
buildPagination,
buildUpdatedAtFilters,
buildUpdatedAtWhere,
DEFAULT_PAGE,
DEFAULT_PAGE_SIZE,
MAX_PAGE_SIZE,
parseDate,
parsePositiveInteger,
} from '../helpers.js';
const getCollectionsApi: RequestHandler = async (event) => {
const logger = event.locals.logger.child({ handler: 'api_extract_collections' });
const pageResult = parsePositiveInteger(event.url.searchParams.get('page'), DEFAULT_PAGE, 'page');
if ('error' in pageResult) {
return json({ message: pageResult.error }, { status: 400 });
}
const pageSizeResult = parsePositiveInteger(
event.url.searchParams.get('pageSize'),
DEFAULT_PAGE_SIZE,
'pageSize',
);
if ('error' in pageSizeResult) {
return json({ message: pageSizeResult.error }, { status: 400 });
}
const lastUpdatedStartResult = parseDate(
event.url.searchParams.get('lastUpdatedStart'),
'lastUpdatedStart',
);
if ('error' in lastUpdatedStartResult) {
return json({ message: lastUpdatedStartResult.error }, { status: 400 });
}
const lastUpdatedEndResult = parseDate(
event.url.searchParams.get('lastUpdatedEnd'),
'lastUpdatedEnd',
);
if ('error' in lastUpdatedEndResult) {
return json({ message: lastUpdatedEndResult.error }, { status: 400 });
}
const page = pageResult.value;
const pageSize = Math.min(pageSizeResult.value, MAX_PAGE_SIZE);
const skip = (page - 1) * pageSize;
const where = buildUpdatedAtWhere(lastUpdatedStartResult.value, lastUpdatedEndResult.value);
const collectionArgs = {
where,
orderBy: {
updatedAt: 'asc',
},
skip,
take: pageSize,
} satisfies CollectionFindManyArgs;
try {
const [collections, totalCount] = await Promise.all([
db.collection.findMany(collectionArgs),
db.collection.count({ where }),
]);
return json({
data: collections,
pagination: buildPagination(page, pageSize, totalCount),
filters: buildUpdatedAtFilters(lastUpdatedStartResult.value, lastUpdatedEndResult.value),
});
} catch (err) {
logger.error({ err }, 'Failed to extract collections');
return json({ message: 'Failed to extract collections.' }, { status: 500 });
}
};
export const GET: RequestHandler = composeMiddleware([withIpWhitelist, withInternalApiKey])(
getCollectionsApi,
);