diff --git a/src/index.ts b/src/index.ts index ced953e8..18a0fcfb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,12 @@ import express from "express"; import cookieParser from "cookie-parser"; import http from "http"; -import { nodeEnv, mongo as mongoUrl, port as httpPort } from "@/loadenv"; +import { + nodeEnv, + mongo as mongoUrl, + port as httpPort, + eventConfig, +} from "@/loadenv"; import { corsMiddleware, errorHandler, @@ -33,6 +38,7 @@ import logger from "@/modules/logger"; import { startSocketServer } from "@/modules/socket"; import { connectDatabase } from "@/modules/stores/mongo"; import registerSchedules from "@/schedules"; +import { lotteryRouter } from "@/lottery"; // Firebase Admin 초기설정 initializeFirebase(); @@ -73,8 +79,9 @@ app.use(limitRateMiddleware); app.use("/docs", docsRouter); // [Router] 이벤트 전용 라우터입니다. -// eventConfig && -// app.use(`/events/${eventConfig.mode}`, require("@/lottery").lotteryRouter); +if (eventConfig) { + app.use("/events", lotteryRouter); +} // [Middleware] 모든 API 요청에 대하여 origin 검증 app.use(originValidatorMiddleware); diff --git a/src/loadenv.ts b/src/loadenv.ts index 4e6f649b..ea79bb92 100644 --- a/src/loadenv.ts +++ b/src/loadenv.ts @@ -61,8 +61,8 @@ export const testAccounts = export const slackWebhookUrl = { report: process.env.SLACK_REPORT_WEBHOOK_URL || "", // optional }; -// export const eventConfig = -// process.env.EVENT_CONFIG && JSON.parse(process.env.EVENT_CONFIG); // optional +export const eventConfig = + process.env.EVENT_CONFIG && JSON.parse(process.env.EVENT_CONFIG); // optional export const naverMap = { apiId: process.env.NAVER_MAP_API_ID || "", // optional apiKey: process.env.NAVER_MAP_API_KEY || "", // optional diff --git a/src/lottery/index.js b/src/lottery/index.js index a00e3598..96294fdf 100644 --- a/src/lottery/index.js +++ b/src/lottery/index.js @@ -12,7 +12,7 @@ const { addFiveItemStockAction, } = require("./modules/items"); -const { eventConfig } = require("../../loadenv"); +const { eventConfig } = require("@/loadenv"); const contracts = eventConfig && require("./modules/contracts"); // [Routes] 기존 docs 라우터의 docs extend @@ -24,7 +24,7 @@ eventConfig && require("./schedules")(); const lotteryRouter = express.Router(); // [Middleware] 모든 API 요청에 대하여 origin 검증 -lotteryRouter.use(require("../middlewares/originValidator")); +lotteryRouter.use(require("../middlewares/originValidator").default); // [Router] APIs lotteryRouter.use("/globalState", require("./routes/globalState")); diff --git a/src/lottery/middlewares/timestampValidator.js b/src/lottery/middlewares/timestampValidator.js index 5df2973c..09f5c60b 100644 --- a/src/lottery/middlewares/timestampValidator.js +++ b/src/lottery/middlewares/timestampValidator.js @@ -1,4 +1,4 @@ -const { eventConfig } = require("../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const eventPeriod = eventConfig && { startAt: new Date(eventConfig.period.startAt), endAt: new Date(eventConfig.period.endAt), diff --git a/src/lottery/modules/contracts.js b/src/lottery/modules/contracts.js index 6281bec7..0ef3d893 100644 --- a/src/lottery/modules/contracts.js +++ b/src/lottery/modules/contracts.js @@ -1,8 +1,8 @@ const { buildQuests, completeQuest } = require("./quests"); const mongoose = require("mongoose"); -const logger = require("../../modules/logger"); +import logger from "../../modules/logger"; -const { eventConfig } = require("../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const eventPeriod = eventConfig && { startAt: new Date(eventConfig.period.startAt), endAt: new Date(eventConfig.period.endAt), diff --git a/src/lottery/modules/quests.js b/src/lottery/modules/quests.js index 6bf162fb..95a52a6b 100644 --- a/src/lottery/modules/quests.js +++ b/src/lottery/modules/quests.js @@ -7,7 +7,7 @@ const { const logger = require("../../modules/logger"); const mongoose = require("mongoose"); -const { eventConfig } = require("../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const eventPeriod = eventConfig && { startAt: new Date(eventConfig.period.startAt), endAt: new Date(eventConfig.period.endAt), diff --git a/src/lottery/modules/stores/mongo.js b/src/lottery/modules/stores/mongo.js index 09b6c80e..0fd78b74 100644 --- a/src/lottery/modules/stores/mongo.js +++ b/src/lottery/modules/stores/mongo.js @@ -2,7 +2,7 @@ const mongoose = require("mongoose"); const Schema = mongoose.Schema; // 이벤트마다 사용된 모델을 구분하기 위해 이름에 Prefix를 붙입니다. -const { eventConfig } = require("../../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const modelNamePrefix = eventConfig?.mode ?? ""; const integerValidator = { diff --git a/src/lottery/routes/docs/globalState.js b/src/lottery/routes/docs/globalState.js index 44b62384..d22b86ac 100644 --- a/src/lottery/routes/docs/globalState.js +++ b/src/lottery/routes/docs/globalState.js @@ -1,4 +1,4 @@ -const { eventConfig } = require("../../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const apiPrefix = `/events/${eventConfig?.mode}/globalState`; const globalStateDocs = {}; diff --git a/src/lottery/routes/docs/invites.js b/src/lottery/routes/docs/invites.js index cfe37214..f381ee61 100644 --- a/src/lottery/routes/docs/invites.js +++ b/src/lottery/routes/docs/invites.js @@ -1,4 +1,4 @@ -const { eventConfig } = require("../../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const apiPrefix = `/events/${eventConfig?.mode}/invites`; const invitesDocs = {}; diff --git a/src/lottery/routes/docs/items.js b/src/lottery/routes/docs/items.js index 28ecd53d..f9492a47 100644 --- a/src/lottery/routes/docs/items.js +++ b/src/lottery/routes/docs/items.js @@ -1,4 +1,4 @@ -const { eventConfig } = require("../../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const apiPrefix = `/events/${eventConfig?.mode}/items`; const itemsDocs = {}; diff --git a/src/lottery/routes/docs/publicNotice.js b/src/lottery/routes/docs/publicNotice.js index bcf2cc78..725f644a 100644 --- a/src/lottery/routes/docs/publicNotice.js +++ b/src/lottery/routes/docs/publicNotice.js @@ -1,4 +1,4 @@ -const { eventConfig } = require("../../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const apiPrefix = `/events/${eventConfig?.mode}/publicNotice`; const publicNoticeDocs = {}; diff --git a/src/lottery/routes/docs/quests.js b/src/lottery/routes/docs/quests.js index 42a9c022..76b07d0a 100644 --- a/src/lottery/routes/docs/quests.js +++ b/src/lottery/routes/docs/quests.js @@ -1,4 +1,4 @@ -const { eventConfig } = require("../../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const apiPrefix = `/events/${eventConfig?.mode}/quests`; const questsDocs = {}; diff --git a/src/lottery/routes/docs/swaggerDocs.js b/src/lottery/routes/docs/swaggerDocs.js index 0b6702da..4e653bf0 100644 --- a/src/lottery/routes/docs/swaggerDocs.js +++ b/src/lottery/routes/docs/swaggerDocs.js @@ -10,7 +10,7 @@ const { invitesSchema } = require("./schemas/invitesSchema"); const { itemsSchema } = require("./schemas/itemsSchema"); const { questsSchema } = require("./schemas/questsSchema"); -const { eventConfig } = require("../../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const apiPrefix = `/events/${eventConfig?.mode}`; const eventSwaggerDocs = { diff --git a/src/lottery/routes/docs/transactions.js b/src/lottery/routes/docs/transactions.js index a041b949..ad540b9c 100644 --- a/src/lottery/routes/docs/transactions.js +++ b/src/lottery/routes/docs/transactions.js @@ -1,4 +1,4 @@ -const { eventConfig } = require("../../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const apiPrefix = `/events/${eventConfig?.mode}/transactions`; const transactionsDocs = {}; diff --git a/src/lottery/routes/globalState.js b/src/lottery/routes/globalState.js index c4f37d39..a1c6280d 100644 --- a/src/lottery/routes/globalState.js +++ b/src/lottery/routes/globalState.js @@ -8,7 +8,7 @@ const globalStateHandlers = require("../services/globalState"); router.get("/", globalStateHandlers.getUserGlobalStateHandler); // 아래의 Endpoint 접근 시 로그인 및 시각 체크 필요 -router.use(require("../../middlewares/auth")); +router.use(require("../../middlewares/auth").default); router.use(require("../middlewares/timestampValidator")); router.post( diff --git a/src/lottery/routes/invites.js b/src/lottery/routes/invites.js index 65e4271e..26e4bcec 100644 --- a/src/lottery/routes/invites.js +++ b/src/lottery/routes/invites.js @@ -12,7 +12,7 @@ router.get( ); // 아래의 Endpoint 접근 시 로그인, 차단 여부 및 시각 체크 필요 -router.use(require("../../middlewares/auth")); +router.use(require("../../middlewares/auth").default); router.use(require("../middlewares/checkBanned")); router.use(require("../middlewares/timestampValidator")); diff --git a/src/lottery/routes/items.js b/src/lottery/routes/items.js index 0de8be18..a25f1a93 100644 --- a/src/lottery/routes/items.js +++ b/src/lottery/routes/items.js @@ -18,7 +18,7 @@ router.get( ); // 아래의 Endpoint 접근 시 로그인, 차단 여부 및 시각 체크 필요 -router.use(require("../../middlewares/auth")); +router.use(require("../../middlewares/auth").default); router.use(require("../middlewares/checkBanned")); router.use(require("../middlewares/timestampValidator")); diff --git a/src/lottery/routes/quests.js b/src/lottery/routes/quests.js index e9845434..a008e5f6 100644 --- a/src/lottery/routes/quests.js +++ b/src/lottery/routes/quests.js @@ -6,7 +6,7 @@ const { questsZod } = require("./docs/schemas/questsSchema"); const questsHandlers = require("../services/quests"); // 아래의 Endpoint 접근 시 로그인, 차단 여부 및 시각 체크 필요 -router.use(require("../../middlewares/auth")); +router.use(require("../../middlewares/auth").default); router.use(require("../middlewares/checkBanned")); router.use(require("../middlewares/timestampValidator")); diff --git a/src/lottery/routes/transactions.js b/src/lottery/routes/transactions.js index f9e375ca..106a4542 100644 --- a/src/lottery/routes/transactions.js +++ b/src/lottery/routes/transactions.js @@ -4,7 +4,7 @@ const router = express.Router(); const transactionsHandlers = require("../services/transactions"); // 아래의 Endpoint 접근 시 로그인 필요 -router.use(require("../../middlewares/auth")); +router.use(require("../../middlewares/auth").default); router.get("/", transactionsHandlers.getUserTransactionsHandler); diff --git a/src/lottery/schedules/detectAbusingUsers.js b/src/lottery/schedules/detectAbusingUsers.js index e5b910aa..cac2d775 100644 --- a/src/lottery/schedules/detectAbusingUsers.js +++ b/src/lottery/schedules/detectAbusingUsers.js @@ -9,7 +9,7 @@ const { } = require("../modules/slackNotification"); const logger = require("../../modules/logger"); -const { eventConfig } = require("../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const eventPeriod = eventConfig && { startAt: new Date(eventConfig.period.startAt), endAt: new Date(eventConfig.period.endAt), diff --git a/src/lottery/services/globalState.js b/src/lottery/services/globalState.js index 7a16d0e7..f467ef9c 100644 --- a/src/lottery/services/globalState.js +++ b/src/lottery/services/globalState.js @@ -2,9 +2,9 @@ const { eventStatusModel } = require("../modules/stores/mongo"); const { userModel } = require("../../modules/stores/mongo"); const logger = require("../../modules/logger"); const { isLogin, getLoginInfo } = require("../../modules/auths/login"); -const { nodeEnv } = require("../../../loadenv"); +const { nodeEnv } = require("@/loadenv"); -const { eventConfig } = require("../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const contracts = require("../modules/contracts"); const quests = Object.values(contracts.quests); diff --git a/src/lottery/services/invites.js b/src/lottery/services/invites.js index 935e158e..4d67611e 100644 --- a/src/lottery/services/invites.js +++ b/src/lottery/services/invites.js @@ -2,7 +2,7 @@ const { eventStatusModel } = require("../modules/stores/mongo"); const { userModel } = require("../../modules/stores/mongo"); const logger = require("../../modules/logger"); -const { eventConfig } = require("../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const searchInviterHandler = async (req, res) => { try { diff --git a/src/lottery/services/items.js b/src/lottery/services/items.js index c5f5a2c5..2ed24e0b 100644 --- a/src/lottery/services/items.js +++ b/src/lottery/services/items.js @@ -7,7 +7,7 @@ const { userModel } = require("../../modules/stores/mongo"); const { isLogin, getLoginInfo } = require("../../modules/auths/login"); const logger = require("../../modules/logger"); -const { eventConfig } = require("../../../loadenv"); +const { eventConfig } = require("@/loadenv"); const contracts = require("../modules/contracts"); const getItemsHandler = async (req, res) => { diff --git a/src/lottery/services/publicNotice.js b/src/lottery/services/publicNotice.js index f0244421..23289585 100644 --- a/src/lottery/services/publicNotice.js +++ b/src/lottery/services/publicNotice.js @@ -9,7 +9,7 @@ const { publicNoticePopulateOption, } = require("../modules/populates/transactions"); -const { eventConfig } = require("../../../loadenv"); +const { eventConfig } = require("@/loadenv"); /** * getValueRank 사용자의 상품 구매 내역 또는 경품 추첨 내역의 순위 결정을 위한 가치를 평가하는 함수 diff --git a/src/routes/admin.js b/src/routes/admin.js index d1502a03..643f9e1d 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -40,7 +40,7 @@ const resources = [ taxiFareModel, ] .map(buildResource()) - .concat(/*require("@/lottery").resources*/ []); + .concat(require("@/lottery").resources); // Create router for admin page const adminJS = new AdminJS({ resources }); diff --git a/src/services/notifications.js b/src/services/notifications.js index f0c4bf94..7a8d1706 100644 --- a/src/services/notifications.js +++ b/src/services/notifications.js @@ -5,7 +5,7 @@ const logger = require("@/modules/logger").default; const { registerDeviceToken, validateDeviceToken } = require("@/modules/fcm"); // 이벤트 코드입니다. -// const { contracts } = require("@/lottery"); +import { contracts } from "@/lottery"; const registerDeviceTokenHandler = async (req, res) => { try { @@ -111,11 +111,11 @@ const editOptionsHandler = async (req, res) => { } // 이벤트 코드입니다. - // await contracts?.completeAdPushAgreementQuest( - // req.userOid, - // req.timestamp, - // options.advertisement - // ); + await contracts?.completeAdPushAgreementQuest( + req.userOid, + req.timestamp, + options.advertisement + ); res.status(200).json(updatedNotificationOptions); } catch (err) { diff --git a/src/services/rooms.js b/src/services/rooms.js index 7cc1370b..10661d9f 100644 --- a/src/services/rooms.js +++ b/src/services/rooms.js @@ -15,12 +15,12 @@ const { } = require("@/modules/slackNotification"); // 이벤트 코드입니다. -// const { eventConfig } = require("@/loadenv"); -// const eventPeriod = eventConfig && { -// startAt: new Date(eventConfig.period.startAt), -// endAt: new Date(eventConfig.period.endAt), -// }; -// const { contracts } = require("@/lottery"); +const { eventConfig } = require("@/loadenv"); +const eventPeriod = eventConfig && { + startAt: new Date(eventConfig.period.startAt), + endAt: new Date(eventConfig.period.endAt), +}; +import { contracts } from "@/lottery"; const createHandler = async (req, res) => { const { name, from, to, time, maxPartLength } = req.body; @@ -110,7 +110,7 @@ const createHandler = async (req, res) => { const roomObjectFormated = formatSettlement(roomObject); // 이벤트 코드입니다. - // await contracts?.completeFirstRoomCreationQuest(req.userOid, req.timestamp); + await contracts?.completeFirstRoomCreationQuest(req.userOid, req.timestamp); return res.send(roomObjectFormated); } catch (err) { @@ -128,58 +128,58 @@ const createTestHandler = async (req, res) => { try { // 이벤트 코드입니다. - // if ( - // !eventPeriod || - // req.timestamp >= eventPeriod.endAt || - // req.timestamp < eventPeriod.startAt - // ) - // return res.json({ result: true }); - - // const countRecentlyMadeRooms = await roomModel.countDocuments({ - // madeat: { $gte: new Date(req.timestamp - 86400000) }, // 밀리초 단위로 24시간을 나타냅니다. - // "part.0.user": req.userOid, // 방 최초 생성자를 저장하는 필드가 없으므로, 첫 번째 참여자를 생성자로 간주합니다. - // }); - // if (!countRecentlyMadeRooms && countRecentlyMadeRooms !== 0) - // return res - // .status(500) - // .json({ error: "Rooms/create/test : internal server error" }); - - // const dateTime = new Date(time); - // const candidateRooms = await roomModel - // .find( - // { - // time: { - // $gte: new Date(dateTime.getTime() - 43200000), - // $lte: new Date(dateTime.getTime() + 43200000), - // }, - // part: { $elemMatch: { user: req.userOid } }, - // }, - // "from to time maxPartLength" - // ) - // .limit(2) - // .lean(); - // if (!candidateRooms) - // return res - // .status(500) - // .json({ error: "Rooms/create/test : internal server error" }); - - // const isAbusing = checkIsAbusing( - // req.body, - // countRecentlyMadeRooms, - // candidateRooms - // ); - // if (isAbusing) { - // const user = await userModel - // .findOne({ _id: req.userOid, withdraw: false }) - // .lean(); - // notifyRoomCreationAbuseToReportChannel( - // req.userOid, - // user?.nickname ?? req.userOid, - // req.body - // ); - // } + if ( + !eventPeriod || + req.timestamp >= eventPeriod.endAt || + req.timestamp < eventPeriod.startAt + ) + return res.json({ result: true }); - // return res.json({ result: !isAbusing }); + const countRecentlyMadeRooms = await roomModel.countDocuments({ + madeat: { $gte: new Date(req.timestamp - 86400000) }, // 밀리초 단위로 24시간을 나타냅니다. + "part.0.user": req.userOid, // 방 최초 생성자를 저장하는 필드가 없으므로, 첫 번째 참여자를 생성자로 간주합니다. + }); + if (!countRecentlyMadeRooms && countRecentlyMadeRooms !== 0) + return res + .status(500) + .json({ error: "Rooms/create/test : internal server error" }); + + const dateTime = new Date(time); + const candidateRooms = await roomModel + .find( + { + time: { + $gte: new Date(dateTime.getTime() - 43200000), + $lte: new Date(dateTime.getTime() + 43200000), + }, + part: { $elemMatch: { user: req.userOid } }, + }, + "from to time maxPartLength" + ) + .limit(2) + .lean(); + if (!candidateRooms) + return res + .status(500) + .json({ error: "Rooms/create/test : internal server error" }); + + const isAbusing = checkIsAbusing( + req.body, + countRecentlyMadeRooms, + candidateRooms + ); + if (isAbusing) { + const user = await userModel + .findOne({ _id: req.userOid, withdraw: false }) + .lean(); + notifyRoomCreationAbuseToReportChannel( + req.userOid, + user?.nickname ?? req.userOid, + req.body + ); + } + + return res.json({ result: !isAbusing }); return res.json({ result: true }); } catch (err) { logger.error(err); @@ -590,11 +590,11 @@ const commitSettlementHandler = async (req, res) => { }); // 이벤트 코드입니다. - // await contracts?.completeFareSettlementQuest( - // req.userOid, - // req.timestamp, - // roomObject - // ); + await contracts?.completeFareSettlementQuest( + req.userOid, + req.timestamp, + roomObject + ); // 수정한 방 정보를 반환합니다. res.send(formatSettlement(roomObject, { isOver: true })); @@ -663,11 +663,11 @@ const commitPaymentHandler = async (req, res) => { }); // 이벤트 코드입니다. - // await contracts?.completeFarePaymentQuest( - // req.userOid, - // req.timestamp, - // roomObject - // ); + await contracts?.completeFarePaymentQuest( + req.userOid, + req.timestamp, + roomObject + ); // 수정한 방 정보를 반환합니다. res.send(formatSettlement(roomObject, { isOver: true })); diff --git a/src/services/users.ts b/src/services/users.ts index bfc37e30..561680e9 100644 --- a/src/services/users.ts +++ b/src/services/users.ts @@ -10,7 +10,7 @@ import * as aws from "@/modules/stores/aws"; import { userModel, banModel } from "@/modules/stores/mongo"; // 이벤트 코드입니다. -// const { contracts } = require("@/lottery"); +import { contracts } from "@/lottery"; export const agreeOnTermsOfServiceHandler: RequestHandler = async ( req, @@ -73,10 +73,10 @@ export const editNicknameHandler: RequestHandler = async (req, res) => { if (result) { // 이벤트 코드입니다. - // await contracts?.completeNicknameChangingQuest( - // req.userOid, - // req.timestamp - // ); + await contracts?.completeNicknameChangingQuest( + req.userOid, + req.timestamp + ); return res .status(200) @@ -102,11 +102,11 @@ export const editAccountHandler: RequestHandler = async (req, res) => { if (result) { // 이벤트 코드입니다. - // await contracts?.completeAccountChangingQuest( - // req.userOid, - // req.timestamp, - // newAccount - // ); + await contracts?.completeAccountChangingQuest( + req.userOid, + req.timestamp, + newAccount + ); return res .status(200)