@zeushq/nextjs-zapi
Version:
Next.js SDK for creating a Zeus API
55 lines (45 loc) • 1.7 kB
text/typescript
// import { IncomingMessage, ServerResponse } from 'http';
import { NextApiRequest, NextApiResponse } from 'next';
import { ZApiResource } from '../../handlers/resource';
// import { ListOptions } from '../config';
import createDebug from '../utils/debug';
const debug = createDebug('handlers');
export type HandleList = (req: NextApiRequest, res: NextApiResponse) => Promise<void>;
export default function listHandlerFactory(): HandleList {
return async (req, res) => {
const zapi = (res as any).zapi as ZApiResource;
debug('list', zapi);
// Handle pagination
let paginationOptions = {};
if (zapi.params.skip && zapi.params.take) {
paginationOptions = { skip: parseInt(zapi.params.skip), take: parseInt(zapi.params.take) };
} else if (zapi.params.cursor && zapi.params.take) {
paginationOptions = { cursor: zapi.params.cursor, take: parseInt(zapi.params.take) };
}
// Handle sorting
let orderBy = {} as any;
if (zapi.params.orderBy && zapi.params.orderByDirection) {
orderBy = {};
orderBy[zapi.params.orderBy] = zapi.params.orderByDirection;
} else {
orderBy.id = 'desc';
}
// Remove pagination and sorting params
delete zapi.params.skip;
delete zapi.params.cursor;
delete zapi.params.take;
delete zapi.params.orderBy;
delete zapi.params.orderByDirection;
let where = { ...zapi.params } as any;
if (zapi.scope?.on && zapi.scope?.with) {
where[zapi.scope.on] = { some: await zapi?.scope.with(req, res) };
}
const objects = await zapi.model.findMany({
where,
orderBy,
...paginationOptions
});
res.json({ objects });
res.end();
};
}