Public Source Viewer
비나래아카이브 개발자 포털
실제 서비스 구조를 살펴볼 수 있는 공개용 코드 뷰어입니다. 인증, 세션, 외부 연동, 토큰, 관리자 식별 등 보안상 민감한 구현은 파일 단위 또는 줄 단위로 검열됩니다.
src/routes/hinana-pedia.routes.ts
공개 가능
1
import { Router, Request, Response } from 'express';
2
import { deleteHinanaPediaReview, getHinanaPediaStats, getHinanaPediaWorks } from '../services/hinana-pedia.service';
3
4
const router = Router();
5
const SORTS = new Set(['recent', 'rating', 'reviews', 'title']);
6
const PAGE_SIZE = 20;
7
8
router.get('/hinana/pedia', (req: Request, res: Response) => {
9
const search = typeof req.query.q === 'string' ? req.query.q.trim().slice(0, 100) : '';
10
const requestedSort = typeof req.query.sort === 'string' ? req.query.sort : 'recent';
11
const sort = SORTS.has(requestedSort) ? requestedSort : 'recent';
12
const works = getHinanaPediaWorks(search, sort);
13
const totalPages = Math.max(1, Math.ceil(works.length / PAGE_SIZE));
14
const requestedPage = Number.parseInt(String(req.query.page || '1'), 10);
15
const page = Math.min(Math.max(Number.isFinite(requestedPage) ? requestedPage : 1, 1), totalPages);
16
17
res.render('./hinana/pedia', {
18
username: req.session.username || null,
19
[SECURITY REDACTED] 민감한 설정/인증/토큰 관련 코드입니다.
20
theme: req.session.theme || req.cookies.theme || 'light',
21
[SECURITY REDACTED] 민감한 설정/인증/토큰 관련 코드입니다.
22
works: works.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE),
23
stats: getHinanaPediaStats(),
24
search,
25
sort,
26
page,
27
totalPages
28
});
29
});
30
31
router.post('/hinana/pedia/review/:id/delete', (req: Request, res: Response) => {
32
[SECURITY REDACTED] 민감한 설정/인증/토큰 관련 코드입니다.
33
return res.status(403).send('관리자만 사용할 수 있습니다.');
34
}
35
deleteHinanaPediaReview(String(req.params.id || ''));
36
return res.redirect('/hinana/pedia');
37
});
38
39
export default router;
40