From 7dd207396f58af50332626a76b06025475f27a1a Mon Sep 17 00:00:00 2001 From: static Date: Wed, 4 Sep 2024 11:26:22 +0900 Subject: [PATCH 1/5] Add: realStock field in item info endpoint --- src/lottery/routes/docs/items.js | 24 +++++++----------------- src/lottery/services/items.js | 7 ++----- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/lottery/routes/docs/items.js b/src/lottery/routes/docs/items.js index 063e5f45..8ca28359 100644 --- a/src/lottery/routes/docs/items.js +++ b/src/lottery/routes/docs/items.js @@ -23,7 +23,6 @@ itemsDocs[`${apiPrefix}/`] = { required: [ "_id", "name", - "description", "imageUrl", "price", "isDisabled", @@ -40,21 +39,11 @@ itemsDocs[`${apiPrefix}/`] = { description: "상품의 이름", example: "진짜 송편", }, - description: { - type: "string", - description: "상품의 설명", - example: "먹을 수 있는 송편입니다.", - }, imageUrl: { type: "string", description: "상품의 썸네일 이미지 URL", example: "THUMBNAIL URL", }, - instagramStoryStickerImageUrl: { - type: "string", - description: "인스타그램 스토리 스티커 이미지 URL", - example: "STICKER URL", - }, price: { type: "number", description: "상품의 가격. 0 이상의 정수입니다.", @@ -92,7 +81,7 @@ itemsDocs[`${apiPrefix}/{itemId}`] = { in: "path", name: "itemId", required: true, - description: "상품 정보를 조회할 ObjectId", + description: "정보를 조회할 상품의 ObjectId", example: "ITEM ID", }, ], @@ -114,6 +103,7 @@ itemsDocs[`${apiPrefix}/{itemId}`] = { "price", "isDisabled", "itemType", + "realStock", ], description: "상품의 정보", properties: { @@ -137,11 +127,6 @@ itemsDocs[`${apiPrefix}/{itemId}`] = { description: "상품의 썸네일 이미지 URL", example: "THUMBNAIL URL", }, - instagramStoryStickerImageUrl: { - type: "string", - description: "인스타그램 스토리 스티커 이미지 URL", - example: "STICKER URL", - }, price: { type: "number", description: "상품의 가격. 0 이상의 정수입니다.", @@ -158,6 +143,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..33c95c58 100644 --- a/src/lottery/services/items.js +++ b/src/lottery/services/items.js @@ -13,10 +13,7 @@ const contracts = require("../modules/contracts"); const getItemsHandler = async (req, res) => { try { const items = await itemModel - .find( - {}, - "_id name description imageUrl instagramStoryStickerImageUrl price isDisabled itemType" - ) + .find({}, "_id name imageUrl price isDisabled itemType") .lean(); res.json({ items }); } catch (err) { @@ -31,7 +28,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" }); From 12f9bcf65c1ddba14276c67517a554f9f3591a4d Mon Sep 17 00:00:00 2001 From: static Date: Wed, 4 Sep 2024 11:35:50 +0900 Subject: [PATCH 2/5] Fix: quest can be achieved infinitely --- src/lottery/modules/quests.js | 2 +- src/lottery/routes/docs/globalState.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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", From eb051110bf71552be49e170baa838ddf88092538 Mon Sep 17 00:00:00 2001 From: static Date: Thu, 5 Sep 2024 01:10:42 +0900 Subject: [PATCH 3/5] Fix: validation error when random box result is jjokbak --- src/lottery/services/items.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottery/services/items.js b/src/lottery/services/items.js index 33c95c58..cffd28f7 100644 --- a/src/lottery/services/items.js +++ b/src/lottery/services/items.js @@ -334,7 +334,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, From ec52dff6c01ae8a4a8aa2615825d738aede9ba00 Mon Sep 17 00:00:00 2001 From: static Date: Thu, 5 Sep 2024 01:22:38 +0900 Subject: [PATCH 4/5] Refactor: use same response format in two querying item info endpoints --- src/lottery/routes/docs/items.js | 12 ++++++++++++ src/lottery/services/items.js | 5 ++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/lottery/routes/docs/items.js b/src/lottery/routes/docs/items.js index 8ca28359..28ecd53d 100644 --- a/src/lottery/routes/docs/items.js +++ b/src/lottery/routes/docs/items.js @@ -23,10 +23,12 @@ itemsDocs[`${apiPrefix}/`] = { required: [ "_id", "name", + "description", "imageUrl", "price", "isDisabled", "itemType", + "realStock", ], properties: { _id: { @@ -39,6 +41,11 @@ itemsDocs[`${apiPrefix}/`] = { description: "상품의 이름", example: "진짜 송편", }, + description: { + type: "string", + description: "상품의 설명", + example: "먹을 수 있는 송편입니다.", + }, imageUrl: { type: "string", description: "상품의 썸네일 이미지 URL", @@ -60,6 +67,11 @@ itemsDocs[`${apiPrefix}/`] = { "상품의 유형. 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 cffd28f7..07730574 100644 --- a/src/lottery/services/items.js +++ b/src/lottery/services/items.js @@ -13,7 +13,10 @@ const contracts = require("../modules/contracts"); const getItemsHandler = async (req, res) => { try { const items = await itemModel - .find({}, "_id name imageUrl price isDisabled itemType") + .find( + {}, + "_id name description imageUrl price isDisabled itemType realStock" + ) .lean(); res.json({ items }); } catch (err) { From 69565147a776ec2eae227ff76c0a9f6afaeb0e0b Mon Sep 17 00:00:00 2001 From: static Date: Sat, 7 Sep 2024 04:55:22 +0900 Subject: [PATCH 5/5] Refactor: update quest information --- src/lottery/modules/contracts.js | 46 +++++++++++++++++--------------- 1 file changed, 25 insertions(+), 21 deletions(-) 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, }, });