< 페이지 흐름 및 카드 상태 파악 : 나의 판매 페이지에서도 씀 >
<aside>
[상태]
ACTIVE(그냥 내 거), ABAILABLE(판매 등록됨), PENDING(교환 제시됨), SOLDOUT(품절)
[흐름]
[스키마와 대응]
User / UserPoint / CardGenre / CardGrade / Notification
PhotoCard ― 카드 “종류” 하나의 기록… 카드 생성, 마켓 플레이스에서 이용
UserCard ― 말 그대로… + 카드의 소유주 및 상태 변경 기록
Sale ― 전체 판매 등록 정보
SaleUserCard — 판매 신청된 카드 정보
TradeRequest ― 교환 신청 정보
TradeREquestUserCard ― 교환 신청된 카드 정보 </aside>
id 하나 조회하면?
< 요구 분석 >
<aside>
만들 페이지 목록
async function findMyGallery(userId, { genre, grade, keyword, offset = 0, limit = 10 }) {
// 1. query 문자열 조건절
const whereClause = {
userCards: {
some: { ownerId: userId, status: 'ACTIVE' }
}
};
if (grade) whereClause.grade = { id: Number(grade) };
if (genre) whereClause.genre = { id: Number(genre) };
if (keyword) whereClause.name = { contains: keyword, mode: 'insensitive' };
// 2. 전체 카드 개수 (count 쿼리)
const totalItems = await prisma.photoCard.count({
where: whereClause
});
// 3. 페이지네이션 포함 쿼리 문자열 반환
const items = await prisma.photoCard.findMany({
select: {
id: true,
name: true,
imageUrl: true,
description: true,
totalQuantity: true,
grade: { select: { id: true, name: true } },
genre: { select: { id: true, name: true } },
userCards: {
where: { ownerId: userId, status: 'ACTIVE' },
select: { id: true, price: true, owner: { select: { id: true, nickname: true } } }
},
creator: { select: { id: true, nickname: true } }
},
where: whereClause,
skip: Number(offset),
take: Number(limit),
orderBy: { createdAt: 'desc' }
});
return { totalItems, items };
}