UNPKG

@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
"use strict"; 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