@tomisakae/syosetu-api
Version:
Enterprise-grade Fastify TypeScript API for Syosetu.com data extraction using official API and web scraping. Run instantly with 'npx @tomisakae/syosetu-api'
130 lines • 4.75 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.rankingQuerySchema = exports.searchQuerySchema = exports.multipleChaptersBodySchema = exports.chapterParamsSchema = exports.ncodeParamsSchema = exports.validateGzipLevel = exports.validateStartPosition = exports.validateLimit = exports.validateRankingOrder = exports.validateSearchOrder = exports.validateChapterNumber = exports.validateNcode = void 0;
const zod_1 = require("zod");
const validateNcode = (ncode) => {
return /^[a-z0-9]+$/i.test(ncode);
};
exports.validateNcode = validateNcode;
const validateChapterNumber = (chapter) => {
const chapterNumber = parseInt(chapter, 10);
if (isNaN(chapterNumber) || chapterNumber < 1) {
return null;
}
return chapterNumber;
};
exports.validateChapterNumber = validateChapterNumber;
const validateSearchOrder = (order) => {
const validOrders = [
'new',
'favnovelcnt',
'reviewcnt',
'hyoka',
'hyokaasc',
'dailypoint',
'weeklypoint',
'monthlypoint',
'quarterpoint',
'yearlypoint',
'impressioncnt',
'hyokacnt',
'hyokacntasc',
'weekly',
'lengthdesc',
'lengthasc',
'generalfirstup',
'ncodeasc',
'ncodedesc',
'old',
];
return validOrders.includes(order);
};
exports.validateSearchOrder = validateSearchOrder;
const validateRankingOrder = (order) => {
const validOrders = [
'hyoka',
'favnovelcnt',
'reviewcnt',
'dailypoint',
'weeklypoint',
'monthlypoint',
'quarterpoint',
'yearlypoint',
];
return validOrders.includes(order);
};
exports.validateRankingOrder = validateRankingOrder;
const validateLimit = (limit, max = 500) => {
return limit >= 1 && limit <= max;
};
exports.validateLimit = validateLimit;
const validateStartPosition = (start) => {
return start >= 1 && start <= 2000;
};
exports.validateStartPosition = validateStartPosition;
const validateGzipLevel = (gzip) => {
return gzip >= 1 && gzip <= 5;
};
exports.validateGzipLevel = validateGzipLevel;
exports.ncodeParamsSchema = zod_1.z.object({
ncode: zod_1.z.string().regex(/^[a-z0-9]+$/i, 'Ncode không hợp lệ'),
});
exports.chapterParamsSchema = zod_1.z.object({
ncode: zod_1.z.string().regex(/^[a-z0-9]+$/i, 'Ncode không hợp lệ'),
chapter: zod_1.z.string().regex(/^\d+$/, 'Chapter phải là số nguyên dương'),
});
exports.multipleChaptersBodySchema = zod_1.z.object({
chapters: zod_1.z.array(zod_1.z.number().int().positive()).min(1).max(10),
});
exports.searchQuerySchema = zod_1.z.object({
keyword: zod_1.z.string().min(1, 'Keyword là bắt buộc'),
order: zod_1.z.string().optional(),
limit: zod_1.z.string().optional(),
start: zod_1.z.string().optional(),
gzip: zod_1.z.string().optional(),
fields: zod_1.z.string().optional(),
notword: zod_1.z.string().optional(),
title: zod_1.z.string().optional(),
ex: zod_1.z.string().optional(),
wname: zod_1.z.string().optional(),
biggenre: zod_1.z.string().optional(),
genre: zod_1.z.string().optional(),
notbiggenre: zod_1.z.string().optional(),
notgenre: zod_1.z.string().optional(),
userid: zod_1.z.string().optional(),
isr15: zod_1.z.string().optional(),
isbl: zod_1.z.string().optional(),
isgl: zod_1.z.string().optional(),
iszankoku: zod_1.z.string().optional(),
istensei: zod_1.z.string().optional(),
istenni: zod_1.z.string().optional(),
istt: zod_1.z.string().optional(),
notr15: zod_1.z.string().optional(),
notbl: zod_1.z.string().optional(),
notgl: zod_1.z.string().optional(),
notzankoku: zod_1.z.string().optional(),
nottensei: zod_1.z.string().optional(),
nottenni: zod_1.z.string().optional(),
minlen: zod_1.z.string().optional(),
maxlen: zod_1.z.string().optional(),
length: zod_1.z.string().optional(),
mintime: zod_1.z.string().optional(),
maxtime: zod_1.z.string().optional(),
time: zod_1.z.string().optional(),
kaiwaritu: zod_1.z.string().optional(),
sasie: zod_1.z.string().optional(),
type: zod_1.z.string().optional(),
buntai: zod_1.z.string().optional(),
stop: zod_1.z.string().optional(),
lastup: zod_1.z.string().optional(),
lastupdate: zod_1.z.string().optional(),
ispickup: zod_1.z.string().optional(),
opt: zod_1.z.string().optional(),
});
exports.rankingQuerySchema = zod_1.z.object({
order: zod_1.z.string().optional(),
biggenre: zod_1.z.string().optional(),
genre: zod_1.z.string().optional(),
limit: zod_1.z.string().optional(),
});
//# sourceMappingURL=validation.js.map