Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#570 2025 봄 이벤트 쿠폰 기능 추가 #571

Merged
merged 5 commits into from
Feb 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/lottery/middlewares/checkBanned.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const { eventStatusModel } = require("../modules/stores/mongo");
const logger = require("../../modules/logger");
const logger = require("@/modules/logger").default;

/**
* 사용자가 차단 되었는지 여부를 판단합니다.
Expand Down
2 changes: 1 addition & 1 deletion src/lottery/modules/contracts.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const { buildQuests, completeQuest } = require("./quests");
const mongoose = require("mongoose");
import logger from "../../modules/logger";
const logger = require("@/modules/logger").default;

const { eventConfig } = require("@/loadenv");
const eventPeriod = eventConfig && {
Expand Down
4 changes: 2 additions & 2 deletions src/lottery/modules/items.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const { itemModel } = require("./stores/mongo");
const { buildRecordAction } = require("../../modules/adminResource");
const logger = require("../../modules/logger");
const { buildRecordAction } = require("@/modules/adminResource");
const logger = require("@/modules/logger").default;

const addItemStockActionHandler = (count) => async (req, res, context) => {
const itemId = context.record.params._id;
Expand Down
2 changes: 1 addition & 1 deletion src/lottery/modules/quests.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const {
itemModel,
transactionModel,
} = require("./stores/mongo");
const logger = require("../../modules/logger");
const logger = require("@/modules/logger").default;
const mongoose = require("mongoose");

const { eventConfig } = require("@/loadenv");
Expand Down
2 changes: 1 addition & 1 deletion src/lottery/modules/slackNotification.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { sendTextToReportChannel } = require("../../modules/slackNotification");
const { sendTextToReportChannel } = require("@/modules/slackNotification");

const generateContent = (name, userIds, roomIds = []) => {
if (userIds.length === 0) return "";
Expand Down
11 changes: 10 additions & 1 deletion src/lottery/modules/stores/mongo.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ const itemSchema = Schema({
}, // 상품의 실제 재고
itemType: {
type: Number,
enum: [0, 1, 2, 3],
enum: [0, 1, 2, 3, 4], // 0: 일반 상품, 1: 일반 응모권, 2: 고급 응모권, 3: 랜덤 박스, 4: 쿠폰
required: true,
},
isRandomItem: {
Expand All @@ -128,6 +128,15 @@ const itemSchema = Schema({
min: 0,
validate: integerValidator,
},
couponCode: {
type: String,
unique: true,
},
couponReward: {
type: Number,
min: 0,
validate: integerValidator,
},
});

const transactionSchema = Schema({
Expand Down
42 changes: 41 additions & 1 deletion src/lottery/routes/docs/items.js
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ itemsDocs[`${apiPrefix}/purchase/{itemId}`] = {
in: "path",
name: "itemId",
required: true,
description: "리더보드를 조회할 상품의 ObjectId",
description: "구입할 상품의 ObjectId",
example: "ITEM ID",
},
],
Expand Down Expand Up @@ -316,5 +316,45 @@ itemsDocs[`${apiPrefix}/purchase/{itemId}`] = {
},
},
};
itemsDocs[`${apiPrefix}/useCoupon/{couponCode}`] = {
post: {
tags: [`${apiPrefix}`],
summary: "쿠폰 사용",
description: "쿠폰을 사용합니다.",
parameters: [
{
in: "path",
name: "couponCode",
required: true,
description: "사용할 쿠폰의 코드",
example: "COUPON CODE",
},
],
responses: {
200: {
content: {
"application/json": {
schema: {
type: "object",
required: ["result", "reward"],
properties: {
result: {
type: "boolean",
description: "성공 여부. 항상 true입니다.",
example: true,
},
reward: {
type: "number",
description: "쿠폰의 사용 보상. 0 이상의 정수입니다.",
example: 500,
},
},
},
},
},
},
},
},
};

module.exports = itemsDocs;
3 changes: 3 additions & 0 deletions src/lottery/routes/docs/schemas/itemsSchema.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ const itemsZod = {
purchaseItemHandlerBody: z.object({
amount: z.number().int().positive(),
}),
useCouponHandlerParams: z.object({
couponCode: z.string().regex(/^[a-zA-Z0-9]+$/),
}),
};

const itemsSchema = zodToSchemaObject(itemsZod);
Expand Down
5 changes: 5 additions & 0 deletions src/lottery/routes/items.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,10 @@ router.post(
validateBody(itemsZod.purchaseItemHandlerBody),
itemsHandlers.purchaseItemHandler
);
router.post(
"/useCoupon/:couponCode",
validateParams(itemsZod.useCouponHandlerParams),
itemsHandlers.useCouponHandler
);

module.exports = router;
2 changes: 1 addition & 1 deletion src/lottery/routes/publicNotice.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const express = require("express");
const router = express.Router();
const publicNoticeHandlers = require("../services/publicNotice");

// 아래의 Endpoint들은 2024 추석 이벤트에서 사용되지 않습니다.
// 아래의 Endpoint들은 2025 봄 이벤트에서 사용되지 않습니다.
//
// router.get("/leaderboard", publicNoticeHandlers.getGroupLeaderboardHandler);

Expand Down
2 changes: 1 addition & 1 deletion src/lottery/schedules/detectAbusingUsers.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const {
const {
notifyAbuseDetectionResultToReportChannel,
} = require("../modules/slackNotification");
const logger = require("../../modules/logger");
const logger = require("@/modules/logger").default;

const { eventConfig } = require("@/loadenv");
const eventPeriod = eventConfig && {
Expand Down
4 changes: 2 additions & 2 deletions src/lottery/services/globalState.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
const { eventStatusModel } = require("../modules/stores/mongo");
const { userModel } = require("../../modules/stores/mongo");
const logger = require("../../modules/logger");
const logger = require("@/modules/logger").default;
const { isLogin, getLoginInfo } = require("../../modules/auths/login");
const { nodeEnv } = require("@/loadenv");

const { eventConfig } = require("@/loadenv");
const contracts = require("../modules/contracts");
const quests = Object.values(contracts.quests);

// 아래의 함수는 2024 추석 이벤트에서 사용되지 않습니다.
// 아래의 함수는 2025 봄 이벤트에서 사용되지 않습니다.
//
// // 유저가 이벤트에 참여할 수 있는지 확인하는 함수입니다.
// const checkIsUserEligible = (user) => {
Expand Down
2 changes: 1 addition & 1 deletion src/lottery/services/invites.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const { eventStatusModel } = require("../modules/stores/mongo");
const { userModel } = require("../../modules/stores/mongo");
const logger = require("../../modules/logger");
const logger = require("@/modules/logger").default;

const { eventConfig } = require("@/loadenv");

Expand Down
Loading
Loading