Skip to content

Commit

Permalink
Merge pull request #364 from sparcs-kaist/#341-detect-events
Browse files Browse the repository at this point in the history
#341 2023 가을학기 추석 홍보 이벤트 위한 transactions
  • Loading branch information
kmc7468 authored Sep 17, 2023
2 parents 12d15d7 + fdcf582 commit c8cd0e7
Show file tree
Hide file tree
Showing 19 changed files with 556 additions and 286 deletions.
27 changes: 12 additions & 15 deletions src/lottery/index.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
const express = require("express");
const {
eventStatusModel,
eventModel,
questModel,
itemModel,
transactionModel,
} = require("./modules/stores/mongo");

const { eventMode } = require("../../loadenv");
const { buildResource } = require("../modules/adminResource");
const { instagramRewardAction } = require("./modules/admin");

// [Routes] 기존 docs 라우터의 docs extend
require("./routes/docs")();

// [Middleware] 목표 달성 여부 검증
const checkReward = (req, res, next) => {
next();
};

const lotteryRouter = express.Router();

// [Middleware] 모든 API 요청에 대하여 origin 검증
Expand All @@ -28,15 +23,17 @@ lotteryRouter.use("/transactions", require("./routes/transactions"));
lotteryRouter.use("/items", require("./routes/items"));
lotteryRouter.use("/public-notice", require("./routes/publicNotice"));

const eventStatusResource = buildResource([instagramRewardAction])(
eventStatusModel
);
const otherResources = [eventModel, itemModel, transactionModel].map(
buildResource()
);
const resources = [
eventStatusModel,
questModel,
itemModel,
transactionModel,
].map(buildResource());

const contracts = eventMode && require(`./modules/contracts/${eventMode}`);

module.exports = {
checkReward,
lotteryRouter,
resources: [eventStatusResource, ...otherResources],
resources,
contracts,
};
74 changes: 0 additions & 74 deletions src/lottery/modules/admin.js

This file was deleted.

214 changes: 214 additions & 0 deletions src/lottery/modules/contracts/2023fall.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
const { buildQuests, completeQuest } = require("../quests");
const mongoose = require("mongoose");

/** 전체 퀘스트 목록입니다. */
const quests = buildQuests({
firstLogin: {
name: "이벤트 기간 첫 로그인",
description: "",
imageUrl: "",
reward: {
ticket1: 1,
},
},
payingAndSending: {
name: "2명 이상 탑승한 방에서 정산/송금 완료",
description: "",
imageUrl: "",
reward: 300,
maxCount: 3,
},
firstRoomCreation: {
name: "첫 방 개설",
description: "",
imageUrl: "",
reward: 50,
},
roomSharing: {
name: "방 공유하기",
description: "",
imageUrl: "",
reward: 50,
},
paying: {
name: "2명 이상 탑승한 방에서 정산하기",
description: "",
imageUrl: "",
reward: 100,
maxCount: 3,
},
sending: {
name: "2명 이상 탑승한 방에서 송금하기",
description: "",
imageUrl: "",
reward: 50,
maxCount: 3,
},
nicknameChaning: {
name: "닉네임 변경",
description: "",
imageUrl: "",
reward: 50,
},
accountChanging: {
name: "계좌 등록 또는 변경",
description: "",
imageUrl: "",
reward: 50,
},
adPushAgreement: {
name: "광고성 푸시 알림 수신 동의",
description: "",
imageUrl: "",
reward: 50,
},
eventSharingOnInstagram: {
name: "이벤트 인스타그램 스토리에 공유",
description: "",
imageUrl: "",
reward: 100,
},
purchaseSharingOnInstagram: {
name: "아이템 구매 후 인스타그램 스토리에 공유",
description: "",
imageUrl: "",
reward: 100,
},
});

const eventPeriod = {
start: new Date("2023-09-25T00:00:00+09:00"), // Inclusive
end: new Date("2023-10-10T00:00:00+09:00"), // Exclusive
};

/**
* firstLogin 퀘스트의 완료를 요청합니다.
* @param {string|mongoose.Types.ObjectId} userId - 퀘스트를 완료한 사용자의 ObjectId입니다.
* @returns {Promise}
*/
const completeFirstLoginQuest = async (userId) => {
return await completeQuest(userId, eventPeriod, quests.firstLogin);
};

/**
* payingAndSending 퀘스트의 완료를 요청합니다. 방의 참가자 수가 2명 미만이거나, 모든 참가자가 정산 또는 송금을 완료하지 않았다면 요청하지 않습니다.
* @param {Object} roomObject - 방의 정보입니다.
* @param {Array<{ user: mongoose.Types.ObjectId }>} roomObject.part - 참여자 목록입니다.
* @param {number} roomObject.settlementTotal - 정산 또는 송금이 완료된 참여자 수입니다.
* @returns {Promise}
* @description 정산 요청 또는 송금이 이루어질 때마다 호출해 주세요.
* @usage rooms/commitPaymentHandler, rooms/settlementHandler
*/
const completePayingAndSendingQuest = async (roomObject) => {
if (roomObject.part.length < 2) return null;
if (roomObject.part.length > roomObject.settlementTotal) return null;

return await Promise.all(
roomObject.part.map(
async (participant) =>
await completeQuest(
participant.user._id,
eventPeriod,
quests.payingAndSending
)
)
);
};

/**
* firstRoomCreation 퀘스트의 완료를 요청합니다.
* @param {string|mongoose.Types.ObjectId} userId - 퀘스트를 완료한 사용자의 ObjectId입니다.
* @returns {Promise}
* @description 방을 만들 때마다 호출해 주세요.
* @usage rooms/createHandler
*/
const completeFirstRoomCreationQuest = async (userId) => {
return await completeQuest(userId, eventPeriod, quests.firstRoomCreation);
};

const completeRoomSharingQuest = async () => {
// TODO
};

/**
* paying 퀘스트의 완료를 요청합니다. 방의 참가자 수가 2명 미만이면 요청하지 않습니다.
* @param {string|mongoose.Types.ObjectId} userId - 퀘스트를 완료한 사용자의 ObjectId입니다.
* @param {Object} roomObject - 방의 정보입니다.
* @param {Array<{ user: mongoose.Types.ObjectId }>} roomObject.part - 참여자 목록입니다.
* @returns {Promise}
* @description 정산 요청이 이루어질 때마다 호출해 주세요.
* @usage rooms/commitPaymentHandler
*/
const completePayingQuest = async (userId, roomObject) => {
if (roomObject.part.length < 2) return null;

return await completeQuest(userId, eventPeriod, quests.paying);
};

/**
* sending 퀘스트의 완료를 요청합니다. 방의 참가자 수가 2명 미만이면 요청하지 않습니다.
* @param {string|mongoose.Types.ObjectId} userId - 퀘스트를 완료한 사용자의 ObjectId입니다.
* @param {Object} roomObject - 방의 정보입니다.
* @param {Array<{ user: mongoose.Types.ObjectId }>} roomObject.part - 참여자 목록입니다.
* @returns {Promise}
* @description 송금이 이루어질 때마다 호출해 주세요.
* @usage rooms/settlementHandler
*/
const completeSendingQuest = async (userId, roomObject) => {
if (roomObject.part.length < 2) return null;

return await completeQuest(userId, eventPeriod, quests.sending);
};

/**
* nicknameChaning 퀘스트의 완료를 요청합니다.
* @param {string|mongoose.Types.ObjectId} userId - 퀘스트를 완료한 사용자의 ObjectId입니다.
* @returns {Promise}
* @description 닉네임을 변경할 때마다 호출해 주세요.
* @usage users/editNicknameHandler
*/
const completeNicknameChangingQuest = async (userId) => {
return await completeQuest(userId, eventPeriod, quests.nicknameChaning);
};

/**
* accountChanging 퀘스트의 완료를 요청합니다.
* @param {string|mongoose.Types.ObjectId} userId - 퀘스트를 완료한 사용자의 ObjectId입니다.
* @param {string} newAccount - 변경된 계좌입니다.
* @returns {Promise}
* @description 계좌를 변경할 때마다 호출해 주세요.
* @usage users/editAccountHandler
*/
const completeAccountChangingQuest = async (userId, newAccount) => {
if (newAccount === "") return null;

return await completeQuest(userId, eventPeriod, quests.accountChanging);
};

const completeAdPushAgreementQuest = async () => {
// TODO
};

const completeEventSharingOnInstagramQuest = async () => {
// TODO
};

const completePurchaseSharingOnInstagramQuest = async () => {
// TODO
};

module.exports = {
quests,
eventPeriod,
completeFirstLoginQuest,
completePayingAndSendingQuest,
completeFirstRoomCreationQuest,
completeRoomSharingQuest,
completePayingQuest,
completeSendingQuest,
completeNicknameChangingQuest,
completeAccountChangingQuest,
completeAdPushAgreementQuest,
completeEventSharingOnInstagramQuest,
completePurchaseSharingOnInstagramQuest,
};
24 changes: 0 additions & 24 deletions src/lottery/modules/credit.js

This file was deleted.

1 change: 0 additions & 1 deletion src/lottery/modules/populates/transactions.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
const transactionPopulateOption = [
{ path: "event" },
{
path: "item",
select: "name imageUrl price description isDisabled stock itemType",
Expand Down
Loading

0 comments on commit c8cd0e7

Please sign in to comment.