feat: 업무 상세 부속·활동 피드·내 업무 집계 + 페이지네이션 (5~8단계)
- 5단계(업무 상세 부속): 체크리스트(상세 읽기전용/수정폼 추가·삭제)·댓글/답글·파일 첨부(서버 로컬 업로드 폴더)·승인 워크플로우(요청/승인/수정요청 노트) - 6단계(활동 피드): 저장소/멤버/업무 행위를 이벤트로 자동 적재, 저장소 활동 피드·업무 활동 탭 실연동(프론트가 type+payload로 문구 조립) - 7단계(내 업무): 담당/지시 저장소 횡단 집계, MyTasksPage 실연동, TaskAssigneePage(/view) 제거 - 8단계(진행): 목록 페이지네이션 통일 — 백엔드 전체(공통 유틸 + 5개 목록, 저장소 업무는 세그먼트/검색/카운트) + 프론트 더보기(저장소 목록·내 업무 완료, 멤버·저장소 업무 대기) - UI 보강: 업무 목록 댓글/첨부 분리표기, 첨부 배지 색상·라벨 통일, 완료 업무 D-Day 배지, 활동 이벤트 점검·보강(업무 수정/삭제·답글·첨부 삭제) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
// 목록 페이지네이션 공통 — 오프셋 기반(?page&size), 표준 응답 { items, total, page, size }
|
||||
|
||||
// 페이지 응답 형태
|
||||
export interface PaginatedResult<T> {
|
||||
items: T[];
|
||||
total: number;
|
||||
page: number;
|
||||
size: number;
|
||||
}
|
||||
|
||||
// 정규화된 페이지 파라미터(+ DB skip/take)
|
||||
export interface PageParams {
|
||||
page: number;
|
||||
size: number;
|
||||
skip: number;
|
||||
take: number;
|
||||
}
|
||||
|
||||
const DEFAULT_SIZE = 20;
|
||||
const MAX_SIZE = 100;
|
||||
|
||||
// page/size 정규화(범위 보정) + skip/take 계산
|
||||
export function resolvePage(page?: number, size?: number): PageParams {
|
||||
const p =
|
||||
Number.isFinite(page) && (page as number) > 0
|
||||
? Math.floor(page as number)
|
||||
: 1;
|
||||
const s =
|
||||
Number.isFinite(size) && (size as number) > 0
|
||||
? Math.min(Math.floor(size as number), MAX_SIZE)
|
||||
: DEFAULT_SIZE;
|
||||
return { page: p, size: s, skip: (p - 1) * s, take: s };
|
||||
}
|
||||
|
||||
// items + total → 표준 페이지 응답
|
||||
export function paginated<T>(
|
||||
items: T[],
|
||||
total: number,
|
||||
params: PageParams,
|
||||
): PaginatedResult<T> {
|
||||
return { items, total, page: params.page, size: params.size };
|
||||
}
|
||||
Reference in New Issue
Block a user