Skip to content

Commit

Permalink
Merge pull request #571 from sparcs-kaist/570-2025-spring-event-coupo…
Browse files Browse the repository at this point in the history
…n-system

#570 2025 봄 이벤트 쿠폰 기능 추가
  • Loading branch information
kmc7468 authored Feb 19, 2025
2 parents 96352af + 809b526 commit 5fe2a8b
Show file tree
Hide file tree
Showing 19 changed files with 236 additions and 124 deletions.
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

0 comments on commit 5fe2a8b

Please sign in to comment.