diff --git a/src/lottery/modules/contracts.js b/src/lottery/modules/contracts.js
index a415b0af..6281bec7 100644
--- a/src/lottery/modules/contracts.js
+++ b/src/lottery/modules/contracts.js
@@ -15,15 +15,15 @@ const quests = buildQuests({
description:
"이벤트 참여만 해도 송편코인을 얻을 수 있다고?? 이벤트 참여에 동의하고 송편코인을 받아 보세요.",
imageUrl:
- "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024spring/quest_firstLogin.png",
+ "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024fall/quest_firstLogin.png",
reward: 200,
},
firstRoomCreation: {
name: "첫 방 개설",
description:
- "원하는 택시팟을 찾을 수 없다면? 원하는 조건으로 방 개설 페이지에서 방을 직접 개설해보세요.",
+ "원하는 택시팟을 찾을 수 없다면? 원하는 조건으로 방 개설 페이지에서 방을 직접 개설해 보세요.",
imageUrl:
- "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024spring/quest_firstRoomCreation.png",
+ "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024fall/quest_firstRoomCreation.png",
reward: 500,
},
roomSharing: {
@@ -31,7 +31,7 @@ const quests = buildQuests({
description:
"방을 공유해 친구들을 택시팟에 초대해 보세요. 채팅창 상단의 햄버거(☰) 버튼을 누르면 공유하기 버튼을 찾을 수 있어요.",
imageUrl:
- "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024spring/quest_roomSharing.png",
+ "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024fall/quest_roomSharing.png",
reward: 500,
isApiRequired: true,
},
@@ -40,64 +40,68 @@ const quests = buildQuests({
description:
"2명 이상과 함께 택시를 타고 택시비를 결제한 후 정산을 요청해 보세요. 정산하기 버튼은 채팅 페이지 좌측 하단의 + 버튼을 눌러 찾을 수 있어요.",
imageUrl:
- "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024spring/quest_paying.png",
+ "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024fall/quest_fareSettlement.png",
reward: 2000,
maxCount: 0,
},
farePayment: {
name: "송금 완료면 I am 신뢰에요",
description:
- "2명 이상과 함께 택시를 타고 택시비를 결제한 분께 송금해주세요. 송금하기 버튼은 채팅 페이지 좌측 하단의 +버튼을 눌러 확인할 수 있어요.",
+ "2명 이상과 함께 택시를 타고 택시비를 결제한 분께 송금해 주세요. 송금하기 버튼은 채팅 페이지 좌측 하단의 + 버튼을 눌러 찾을 수 있어요.",
imageUrl:
- "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024spring/quest_sending.png",
+ "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024fall/quest_farePayment.png",
reward: 2000,
maxCount: 0,
},
nicknameChanging: {
name: "닉네임 폼 미쳤다",
description:
- "닉네임을 변경하여 자신을 표현하세요. 마이페이지의 수정하기 버튼을 눌러 닉네임을 수정할 수 있어요.",
+ "닉네임을 변경하여 자신을 표현하세요. 마이 페이지의 수정하기 버튼을 눌러 닉네임을 수정할 수 있어요.",
imageUrl:
- "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024spring/quest_nicknameChanging.png",
+ "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024fall/quest_nicknameChanging.png",
reward: 500,
},
accountChanging: {
name: "계좌 등록을 해야 능률이 올라갑니다",
description:
- "정산하기 기능을 더욱 빠르고 이용할 수 있다고? 계좌번호를 등록하면 정산하기를 할 때 계좌가 자동으로 입력돼요. 마이페이지의 수정하기 버튼을 눌러 계좌번호를 등록 또는 수정할 수 있어요.",
+ "정산하기 기능을 더욱 빠르게 이용할 수 있다고? 계좌 번호를 등록하면 정산하기를 할 때 계좌가 자동으로 입력돼요. 마이 페이지의 수정하기 버튼을 눌러 계좌 번호를 등록 또는 수정할 수 있어요.",
imageUrl:
- "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024spring/quest_accountChanging.png",
+ "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024fall/quest_accountChanging.png",
reward: 500,
},
adPushAgreement: {
name: "Taxi의 소울메이트",
description:
- "Taxi 서비스를 잊지 않도록 가끔 찾아갈게요! 광고성 푸시 알림 수신 동의를 해주시면 방이 많이 모이는 시즌, 주변에 택시앱 사용자가 있을 때 알려드릴 수 있어요.",
+ "Taxi 서비스를 잊지 않도록 가끔 찾아갈게요! 광고성 푸시 알림 수신 동의를 해주시면 방이 많이 모이는 시즌, 주변에 Taxi 앱 사용자가 있을 때 알려드릴 수 있어요.",
imageUrl:
- "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024spring/quest_adPushAgreement.png",
+ "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024fall/quest_adPushAgreement.png",
reward: 500,
},
eventSharing: {
name: "Taxi를 아십니까",
- description: "내가 초대한 사람이 이벤트에 참여하면 송편코인을 드려요.",
+ description:
+ "내가 초대한 사람이 이벤트에 참여하면 송편코인을 드려요. 다른 사람의 초대를 받아 이벤트에 참여한 경우에도 이 퀘스트가 달성돼요.",
imageUrl:
- "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024spring/quest_eventSharing.png",
+ "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024fall/quest_eventSharing.png",
reward: 700,
maxCount: 0,
},
dailyAttendance: {
- name: "하루 한 번 Taxi!",
+ name: "매일매일 출석 췤!",
description:
- "매일 Taxi에 접속하여 출석 체크를 하면 송편코인을 드려요! 하루에 한 번, 택시팟도 둘러보고 송편코인도 받아 가세요. 송편코인을 얻으려면 출석 체크 페이지에서 출석 버튼을 눌러야 해요.",
- imageUrl: "",
+ "매일 Taxi에 접속하면 하루 한 번 송편코인을 드려요! 하루에 한 번, 택시팟도 둘러보고 송편코인도 받아 가세요.",
+ imageUrl:
+ "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024fall/quest_dailyAttendance.png",
reward: 700,
maxCount: 17,
isApiRequired: true,
},
itemPurchase: {
- name: "itemPurchase",
- description: "itemPurchase",
- imageUrl: "",
+ name: "Taxi에서 산 응모권",
+ description:
+ "응모권 교환소에서 아무 경품 응모권이나 구매해 보세요. Taxi에서 판매하는 응모권은 모두 정품이니 안심해도 좋아요.",
+ imageUrl:
+ "https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com/assets/event-2024fall/quest_itemPurchase.png",
reward: 500,
},
});
diff --git a/src/lottery/modules/quests.js b/src/lottery/modules/quests.js
index 0d79ac81..6bf162fb 100644
--- a/src/lottery/modules/quests.js
+++ b/src/lottery/modules/quests.js
@@ -85,7 +85,7 @@ const completeQuest = async (userId, timestamp, quest) => {
// 3단계: 유저의 퀘스트 완료 횟수를 확인합니다.
// maxCount가 0인 경우, 무제한으로 퀘스트를 완료할 수 있습니다.
const questCount = eventStatus.completedQuests.filter(
- (completedQuestId) => completedQuestId === quest.id
+ ({ questId }) => questId === quest.id
).length;
if (quest.maxCount > 0 && questCount >= quest.maxCount) {
logger.info(
diff --git a/src/lottery/routes/docs/globalState.js b/src/lottery/routes/docs/globalState.js
index 1bbf23f4..44b62384 100644
--- a/src/lottery/routes/docs/globalState.js
+++ b/src/lottery/routes/docs/globalState.js
@@ -103,9 +103,9 @@ globalStateDocs[`${apiPrefix}/`] = {
"유저가 완료한 퀘스트의 배열. 여러 번 완료한 퀘스트의 경우 배열 내에 같은 퀘스트가 여러 번 포함됩니다.",
items: {
type: "object",
- required: ["id", "completedAt"],
+ required: ["questId", "completedAt"],
properties: {
- id: {
+ questId: {
type: "string",
description: "퀘스트의 Id",
example: "QUEST ID",
diff --git a/src/lottery/routes/docs/items.js b/src/lottery/routes/docs/items.js
index 063e5f45..28ecd53d 100644
--- a/src/lottery/routes/docs/items.js
+++ b/src/lottery/routes/docs/items.js
@@ -28,6 +28,7 @@ itemsDocs[`${apiPrefix}/`] = {
"price",
"isDisabled",
"itemType",
+ "realStock",
],
properties: {
_id: {
@@ -50,11 +51,6 @@ itemsDocs[`${apiPrefix}/`] = {
description: "상품의 썸네일 이미지 URL",
example: "THUMBNAIL URL",
},
- instagramStoryStickerImageUrl: {
- type: "string",
- description: "인스타그램 스토리 스티커 이미지 URL",
- example: "STICKER URL",
- },
price: {
type: "number",
description: "상품의 가격. 0 이상의 정수입니다.",
@@ -71,6 +67,11 @@ itemsDocs[`${apiPrefix}/`] = {
"상품의 유형. 0: 일반 상품, 1: 일반 티켓, 2: 고급 티켓, 3: 랜덤박스입니다.",
example: 0,
},
+ realStock: {
+ type: "number",
+ description: "상품의 실제 재고",
+ example: 30,
+ },
},
},
},
@@ -92,7 +93,7 @@ itemsDocs[`${apiPrefix}/{itemId}`] = {
in: "path",
name: "itemId",
required: true,
- description: "상품 정보를 조회할 ObjectId",
+ description: "정보를 조회할 상품의 ObjectId",
example: "ITEM ID",
},
],
@@ -114,6 +115,7 @@ itemsDocs[`${apiPrefix}/{itemId}`] = {
"price",
"isDisabled",
"itemType",
+ "realStock",
],
description: "상품의 정보",
properties: {
@@ -137,11 +139,6 @@ itemsDocs[`${apiPrefix}/{itemId}`] = {
description: "상품의 썸네일 이미지 URL",
example: "THUMBNAIL URL",
},
- instagramStoryStickerImageUrl: {
- type: "string",
- description: "인스타그램 스토리 스티커 이미지 URL",
- example: "STICKER URL",
- },
price: {
type: "number",
description: "상품의 가격. 0 이상의 정수입니다.",
@@ -158,6 +155,11 @@ itemsDocs[`${apiPrefix}/{itemId}`] = {
"상품의 유형. 0: 일반 상품, 1: 일반 티켓, 2: 고급 티켓, 3: 랜덤박스입니다.",
example: 0,
},
+ realStock: {
+ type: "number",
+ description: "상품의 실제 재고",
+ example: 30,
+ },
},
},
},
diff --git a/src/lottery/services/items.js b/src/lottery/services/items.js
index eb00535d..07730574 100644
--- a/src/lottery/services/items.js
+++ b/src/lottery/services/items.js
@@ -15,7 +15,7 @@ const getItemsHandler = async (req, res) => {
const items = await itemModel
.find(
{},
- "_id name description imageUrl instagramStoryStickerImageUrl price isDisabled itemType"
+ "_id name description imageUrl price isDisabled itemType realStock"
)
.lean();
res.json({ items });
@@ -31,7 +31,7 @@ const getItemHandler = async (req, res) => {
const item = await itemModel
.findById(
itemId,
- "_id name description imageUrl instagramStoryStickerImageUrl price isDisabled itemType"
+ "_id name description imageUrl price isDisabled itemType realStock"
)
.lean();
if (!item) return res.status(400).json({ error: "Items/ : invalid item" });
@@ -337,7 +337,7 @@ const purchaseItemHandler = async (req, res) => {
} else {
const transaction = new transactionModel({
type: "use",
- amount: creditDelta,
+ amount: -creditDelta,
userId: req.userOid,
itemId: item._id,
itemAmount: amount,