From 655a79279067cfe2cd4ea76f5c5c0f123ce10e9c Mon Sep 17 00:00:00 2001 From: Yeonseo-Jo Date: Fri, 28 Nov 2025 00:32:41 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20pr=20=EB=A6=AC=EB=B7=B0=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EA=B8=80=20=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20api=20=EB=8B=A8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../list/apis/query-pr-reviews.ts | 49 +++++++++++++++++++ .../list/hooks/apis/querykeys.ts | 6 +++ .../list/hooks/apis/useQueryPrReviews.ts | 15 ++++++ 3 files changed, 70 insertions(+) create mode 100644 src/ReviewRequest/list/apis/query-pr-reviews.ts create mode 100644 src/ReviewRequest/list/hooks/apis/querykeys.ts create mode 100644 src/ReviewRequest/list/hooks/apis/useQueryPrReviews.ts diff --git a/src/ReviewRequest/list/apis/query-pr-reviews.ts b/src/ReviewRequest/list/apis/query-pr-reviews.ts new file mode 100644 index 0000000..f3c9e44 --- /dev/null +++ b/src/ReviewRequest/list/apis/query-pr-reviews.ts @@ -0,0 +1,49 @@ +import { apiClient } from "@/common/api"; +import type { ApiResponse } from "@/common/types/api"; + +export interface QueryPrReviewsQueryParams { + /** PR 현재 상태 : 보내지 않을시 모든 상태 조회 */ + status?: "open" | "closed"; + /** 정렬 순서 */ + order?: "createdAt-desc" | "createdAt-asc" | "hitCount-desc" | "hitCount-asc"; + /** 직군별 필터링 */ + position?: "BACKEND" | "FRONTEND"; + /** 마지막으로 조회된 요청글 id */ + lastReviewId?: number; + /** 페이지 사이즈 (기본 20) */ + size?: number; +} + +/** + * PR 리뷰 요청글 리스트 아이템 + * @ + */ +export interface PrReviewListItem { + /** 작성자 프로필 사진 URL */ + profileImageUrl: string; + /** 작성자 유저 태그 */ + username: string; + /** 요청글 상태 */ + status: string; + /** 분야 태그 */ + position: string; + /** PR 리뷰 요청글 제목 */ + title: string; + /** 조회수 */ + hitCount: number; + /** 작성일자/시각 */ + createdAt: string; +} + +export interface QueryPrReviewsResponse { + /** PR 리뷰 요청글 리스트 */ + prReviews: PrReviewListItem[]; + /** 마지막 페이지 여부 */ + isLast: boolean; +} + +export async function queryPrReviews(params?: QueryPrReviewsQueryParams): Promise> { + return apiClient.get("api/v1/pr-reviews", { + searchParams: params as Record, + }); +} diff --git a/src/ReviewRequest/list/hooks/apis/querykeys.ts b/src/ReviewRequest/list/hooks/apis/querykeys.ts new file mode 100644 index 0000000..aaf6ac5 --- /dev/null +++ b/src/ReviewRequest/list/hooks/apis/querykeys.ts @@ -0,0 +1,6 @@ +import type { QueryPrReviewsQueryParams } from "../../apis/query-pr-reviews"; + +export const prListQueryKeys = { + all: () => ["pr-list"], + prReviews: (params?: QueryPrReviewsQueryParams) => [...prListQueryKeys.all(), "pr-reviews", params], +}; diff --git a/src/ReviewRequest/list/hooks/apis/useQueryPrReviews.ts b/src/ReviewRequest/list/hooks/apis/useQueryPrReviews.ts new file mode 100644 index 0000000..d12fa5e --- /dev/null +++ b/src/ReviewRequest/list/hooks/apis/useQueryPrReviews.ts @@ -0,0 +1,15 @@ +import type { ApiResponse } from "@/common/types/api"; +import { useQuery } from "@tanstack/react-query"; +import { + type QueryPrReviewsQueryParams, + type QueryPrReviewsResponse, + queryPrReviews, +} from "../../apis/query-pr-reviews"; +import { prListQueryKeys } from "./querykeys"; + +export const useQueryPrReviews = (params?: QueryPrReviewsQueryParams) => { + return useQuery, Error>({ + queryFn: () => queryPrReviews(params), + queryKey: prListQueryKeys.prReviews(params), + }); +};