Skip to content

Commit 882849e

Browse files
authored
Merge pull request #5 from ReGreenOrg/feature/add-items
[Feature] 새로운 아이템 추가 & 커플인증내역에서 이스터에그 타입 제외
2 parents f14cf77 + ccae4bd commit 882849e

3 files changed

Lines changed: 200 additions & 108 deletions

File tree

src/domain/eco-verification/eco-verification.service.ts

Lines changed: 59 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { CoupleService } from '../couple/couple.service';
2121
import { MemberEcoVerificationSummaryResponseDto } from './dto/member-eco-verification-summary-response.dto';
2222
import { tz } from '../../common/utils/date-util';
2323
import { Member } from '../member/entities/member.entity';
24+
import { EcoVerificationType } from './constant/eco-verification-type.enum';
2425

2526
@Injectable()
2627
export class EcoVerificationService {
@@ -76,25 +77,25 @@ export class EcoVerificationService {
7677
throw new BusinessException(ErrorType.ECO_VERIFICATION_NOT_FOUND);
7778
}
7879

79-
// const existsToday = await this.memberEcoVerificationRepo
80-
// .createQueryBuilder('mev')
81-
// .where('mev.memberId = :memberId', { memberId })
82-
// .andWhere('mev.ecoVerificationId = :ecoVerificationId', {
83-
// ecoVerificationId: ecoVerificationId,
84-
// })
85-
// .andWhere('mev.status != :status', {
86-
// status: EcoVerificationStatus.REJECTED,
87-
// })
88-
// .andWhere('DATE(mev.createdAt) = :today', {
89-
// today: tz().format('YYYY-MM-DD'),
90-
// })
91-
// .getExists();
92-
//
93-
// if (existsToday) {
94-
// throw new BusinessException(
95-
// ErrorType.ALREADY_APPROVED_ECO_VERIFICATION_TODAY,
96-
// );
97-
// }
80+
const existsToday = await this.memberEcoVerificationRepo
81+
.createQueryBuilder('mev')
82+
.where('mev.memberId = :memberId', { memberId })
83+
.andWhere('mev.ecoVerificationId = :ecoVerificationId', {
84+
ecoVerificationId: ecoVerificationId,
85+
})
86+
.andWhere('mev.status != :status', {
87+
status: EcoVerificationStatus.REJECTED,
88+
})
89+
.andWhere('DATE(mev.createdAt) = :today', {
90+
today: tz().format('YYYY-MM-DD'),
91+
})
92+
.getExists();
93+
94+
if (existsToday) {
95+
throw new BusinessException(
96+
ErrorType.ALREADY_APPROVED_ECO_VERIFICATION_TODAY,
97+
);
98+
}
9899

99100
const { isValid, reason } = await this.openaiService.verifyImageByType(
100101
imageUrl,
@@ -269,63 +270,55 @@ export class EcoVerificationService {
269270
Logger.debug(`Today >>> ${tz().format()} >>> ${todayDate}`);
270271
const yesterdayDate = dayjs(date).subtract(1, 'day').format('YYYY-MM-DD');
271272

272-
const memberEcoVerifications = await this.memberEcoVerificationRepo.find({
273-
where: [
274-
{
275-
member: { id: me.id },
276-
createdAt: Raw(
277-
(alias) => `DATE(${alias}) IN ('${yesterdayDate}', '${todayDate}')`,
278-
),
279-
},
280-
{
281-
member: { id: lover.id },
282-
createdAt: Raw(
283-
(alias) => `DATE(${alias}) IN ('${yesterdayDate}', '${todayDate}')`,
284-
),
285-
},
286-
],
287-
relations: ['ecoVerification', 'member'],
288-
});
289-
290-
type VerMap = Record<string, MemberEcoVerification[]>;
291-
const groupedByDateAndMember: VerMap = {};
292-
293-
for (const recMev of memberEcoVerifications) {
294-
const recDate = dayjs(recMev.createdAt).format('YYYY-MM-DD');
295-
const key = `${recDate}|${recMev.member.id}`;
296-
if (!groupedByDateAndMember[key]) {
297-
groupedByDateAndMember[key] = [];
298-
}
299-
groupedByDateAndMember[key].push(recMev);
300-
}
273+
const rawRecs = await this.memberEcoVerificationRepo
274+
.createQueryBuilder('mev')
275+
.innerJoinAndSelect('mev.ecoVerification', 'ev')
276+
.innerJoinAndSelect('mev.member', 'm')
277+
.where('m.id IN (:...ids)', { ids: [me.id, lover.id] })
278+
.andWhere('DATE(mev.createdAt) IN (:...dates)', {
279+
dates: [yesterdayDate, todayDate],
280+
})
281+
.andWhere('ev.type != :eggType', {
282+
eggType: EcoVerificationType.EASTER_EGG,
283+
})
284+
.getMany();
285+
286+
const grouped = rawRecs.reduce<Record<string, MemberEcoVerification[]>>(
287+
(acc, rec) => {
288+
const d = dayjs(rec.createdAt).format('YYYY-MM-DD');
289+
const key = `${d}|${rec.member.id}`;
290+
(acc[key] = acc[key] || []).push(rec);
291+
return acc;
292+
},
293+
{},
294+
);
301295

302-
const buildResultForDate = (targetDate: string) => {
303-
const memberGroupedResult: MemberEcoVerificationGroupedDto[] =
304-
members.map((m) => {
305-
const key = `${targetDate}|${m.id}`;
306-
const recs = groupedByDateAndMember[key] || [];
307-
const items: MemberEcoVerificationDto[] = recs.map((mev) => ({
296+
const build = (targetDate: string) => ({
297+
date: targetDate,
298+
members: members.map((m) => {
299+
const key = `${targetDate}|${m.id}`;
300+
const items =
301+
(grouped[key] || []).map((mev) => ({
308302
memberEcoVerificationId: mev.id,
309303
type: mev.ecoVerification.type,
310304
ecoLovePoint: mev.ecoVerification.ecoLovePoint,
311305
breakupBufferPoint: mev.ecoVerification.breakupBufferPoint,
312306
linkUrl: mev.linkUrl,
313307
status: mev.status,
314308
imageUrl: mev.imageUrl,
315-
}));
316-
return {
317-
isMe: m.id === memberId,
318-
memberId: m.id,
319-
nickname: m.id === memberId ? `${m.nickname}(나)` : m.nickname,
320-
memberEcoVerifications: items,
321-
};
322-
});
323-
return { date: targetDate, members: memberGroupedResult };
324-
};
309+
})) || [];
310+
return {
311+
isMe: m.id === memberId,
312+
memberId: m.id,
313+
nickname: m.id === memberId ? `${m.nickname}(나)` : m.nickname,
314+
memberEcoVerifications: items,
315+
};
316+
}),
317+
});
325318

326319
return {
327-
today: buildResultForDate(todayDate),
328-
yesterday: buildResultForDate(yesterdayDate),
320+
today: build(todayDate),
321+
yesterday: build(yesterdayDate),
329322
};
330323
}
331324

src/domain/item/constant/item-seed-data.ts

Lines changed: 138 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { DeepPartial } from 'typeorm';
33
import { Item } from '../entities/item.entity';
44

55
export const ITEM_SEEDS: DeepPartial<Item>[] = [
6+
/*-- 바닥 --*/
67
{
78
code: '20250524-00',
89
name: '기본 바닥재',
@@ -14,6 +15,52 @@ export const ITEM_SEEDS: DeepPartial<Item>[] = [
1415
previewImageUrl:
1516
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-00.png',
1617
},
18+
{
19+
code: '20250531-04',
20+
name: '스폰지밥 바닥재',
21+
price: 15,
22+
category: ItemCategory.FLOOR,
23+
zIndex: 0,
24+
imageUrl:
25+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250531-04.png',
26+
previewImageUrl:
27+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250531-04.png',
28+
},
29+
{
30+
code: '20250531-05',
31+
name: '우드 바닥재',
32+
price: 10,
33+
category: ItemCategory.FLOOR,
34+
zIndex: 0,
35+
imageUrl:
36+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250531-05.png',
37+
previewImageUrl:
38+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250531-05.png',
39+
},
40+
{
41+
code: '20250531-06',
42+
name: '버건디 바닥재',
43+
price: 10,
44+
category: ItemCategory.FLOOR,
45+
zIndex: 0,
46+
imageUrl:
47+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250531-06.png',
48+
previewImageUrl:
49+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250531-06.png',
50+
},
51+
{
52+
code: '20250531-07',
53+
name: '시크블랙 바닥재',
54+
price: 10,
55+
category: ItemCategory.FLOOR,
56+
zIndex: 0,
57+
imageUrl:
58+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250531-07.png',
59+
previewImageUrl:
60+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250531-07.png',
61+
},
62+
63+
/*-- 벽지 --*/
1764
{
1865
code: '20250524-01',
1966
name: '기본 벽지',
@@ -30,12 +77,58 @@ export const ITEM_SEEDS: DeepPartial<Item>[] = [
3077
name: '에코 벽지',
3178
price: 5,
3279
category: ItemCategory.WALL_PAPER,
33-
zIndex: 10,
80+
zIndex: 5,
3481
imageUrl:
3582
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250524-02.png',
3683
previewImageUrl:
3784
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-02.png',
3885
},
86+
{
87+
code: '20250531-00',
88+
name: '초콜릿 벽지',
89+
price: 10,
90+
category: ItemCategory.WALL_PAPER,
91+
zIndex: 5,
92+
imageUrl:
93+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250531-00.png',
94+
previewImageUrl:
95+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250531-00.png',
96+
},
97+
{
98+
code: '20250531-01',
99+
name: '오션 벽지',
100+
price: 10,
101+
category: ItemCategory.WALL_PAPER,
102+
zIndex: 5,
103+
imageUrl:
104+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250531-01.png',
105+
previewImageUrl:
106+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250531-01.png',
107+
},
108+
{
109+
code: '20250531-02',
110+
name: '공주 벽지',
111+
price: 30,
112+
category: ItemCategory.WALL_PAPER,
113+
zIndex: 5,
114+
imageUrl:
115+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250531-02.png',
116+
previewImageUrl:
117+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250531-02.png',
118+
},
119+
{
120+
code: '20250531-03',
121+
name: '병아리 벽지',
122+
price: 10,
123+
category: ItemCategory.WALL_PAPER,
124+
zIndex: 5,
125+
imageUrl:
126+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250531-03.png',
127+
previewImageUrl:
128+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250531-03.png',
129+
},
130+
131+
/*-- 가구 --*/
39132
{
40133
code: '20250524-03',
41134
name: '에코 선반 세트',
@@ -47,6 +140,41 @@ export const ITEM_SEEDS: DeepPartial<Item>[] = [
47140
previewImageUrl:
48141
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-03.png',
49142
},
143+
{
144+
code: '20250524-09',
145+
name: '에코 침대',
146+
price: 50,
147+
category: ItemCategory.FURNITURE,
148+
zIndex: 45,
149+
imageUrl:
150+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250524-09.png',
151+
previewImageUrl:
152+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-09.png',
153+
},
154+
{
155+
code: '20250524-12',
156+
name: '에코 책상 세트',
157+
price: 300,
158+
category: ItemCategory.FURNITURE,
159+
zIndex: 60,
160+
imageUrl:
161+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250524-12.png',
162+
previewImageUrl:
163+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-12.png',
164+
},
165+
{
166+
code: '20250524-13',
167+
name: '에코 의자',
168+
price: 100,
169+
category: ItemCategory.FURNITURE,
170+
zIndex: 65,
171+
imageUrl:
172+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250524-13.png',
173+
previewImageUrl:
174+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-13.png',
175+
},
176+
177+
/*-- 소품 --*/
50178
{
51179
code: '20250524-04',
52180
name: '에코 캘린더',
@@ -58,17 +186,6 @@ export const ITEM_SEEDS: DeepPartial<Item>[] = [
58186
previewImageUrl:
59187
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-04.png',
60188
},
61-
{
62-
code: '20250524-05',
63-
name: '에코 창문',
64-
price: 60,
65-
category: ItemCategory.WINDOW,
66-
zIndex: 25,
67-
imageUrl:
68-
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250524-05.png',
69-
previewImageUrl:
70-
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-05.png',
71-
},
72189
{
73190
code: '20250524-06',
74191
name: '에코 러그',
@@ -102,17 +219,6 @@ export const ITEM_SEEDS: DeepPartial<Item>[] = [
102219
previewImageUrl:
103220
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-08.png',
104221
},
105-
{
106-
code: '20250524-09',
107-
name: '에코 침대',
108-
price: 50,
109-
category: ItemCategory.FURNITURE,
110-
zIndex: 45,
111-
imageUrl:
112-
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250524-09.png',
113-
previewImageUrl:
114-
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-09.png',
115-
},
116222
{
117223
code: '20250524-10',
118224
name: '에코 스탠드',
@@ -135,26 +241,17 @@ export const ITEM_SEEDS: DeepPartial<Item>[] = [
135241
previewImageUrl:
136242
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-11.png',
137243
},
244+
245+
/*-- 창문 --*/
138246
{
139-
code: '20250524-12',
140-
name: '에코 책상 세트',
141-
price: 300,
142-
category: ItemCategory.FURNITURE,
143-
zIndex: 60,
144-
imageUrl:
145-
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250524-12.png',
146-
previewImageUrl:
147-
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-12.png',
148-
},
149-
{
150-
code: '20250524-13',
151-
name: '에코 의자',
152-
price: 100,
153-
category: ItemCategory.FURNITURE,
154-
zIndex: 65,
247+
code: '20250524-05',
248+
name: '에코 창문',
249+
price: 60,
250+
category: ItemCategory.WINDOW,
251+
zIndex: 25,
155252
imageUrl:
156-
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250524-13.png',
253+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/20250524-05.png',
157254
previewImageUrl:
158-
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-13.png',
255+
'https://regreen-bucket.s3.ap-northeast-2.amazonaws.com/images/constant/furniture/preview/20250524-05.png',
159256
},
160257
];

0 commit comments

Comments
 (0)