Skip to content

Commit dd6e851

Browse files
committed
Merge branch 'dev' into #159-add-typescript-support
Compile errors will be fixed later
2 parents a6db7d9 + f89a1ab commit dd6e851

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+2005
-939
lines changed

.env.example

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ CORS_WHITELIST=[CORS 정책에서 허용하는 도메인의 목록(e.g. ["http:/
1616
GOOGLE_APPLICATION_CREDENTIALS=[GOOGLE_APPLICATION_CREDENTIALS JSON]
1717
TEST_ACCOUNTS=[스팍스SSO로 로그인시 무조건 테스트로 로그인이 가능한 허용 아이디 목록]
1818
SLACK_REPORT_WEBHOOK_URL=[Slack 웹훅 URL들이 담긴 JSON]
19+
NAVER_MAP_API_ID=[네이버 지도 API ID]
20+
NAVER_MAP_API_KEY=[네이버 지도 API KEY]
1921

2022
# optional environment variables for taxiSampleGenerator
2123
SAMPLE_NUM_OF_ROOMS=[방의 개수]

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"express-rate-limit": "^7.1.0",
4242
"express-session": "^1.17.3",
4343
"express-validator": "^6.14.0",
44-
"firebase-admin": "^11.4.1",
44+
"firebase-admin": "^11.11.1",
4545
"jsonwebtoken": "^9.0.2",
4646
"mongoose": "^6.12.0",
4747
"node-cron": "3.0.2",

pnpm-lock.yaml

+6-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Issue #449-1을 해결하기 위한 DB 마이그레이션 스크립트입니다.
2+
// chat type 중 settlement와 payment를 서로 교체합니다.
3+
// https://github.com/sparcs-kaist/taxi-back/issues/449
4+
5+
const { MongoClient } = require("mongodb");
6+
const { mongo: mongoUrl } = require("../loadenv");
7+
8+
const client = new MongoClient(mongoUrl);
9+
const db = client.db("taxi");
10+
const chats = db.collection("chats");
11+
12+
async function run() {
13+
try {
14+
for await (const doc of chats.find()) {
15+
if (doc.type === "settlement" || doc.type === "payment") {
16+
await chats.findOneAndUpdate(
17+
{ _id: doc._id },
18+
{
19+
$set: {
20+
type: doc.type === "settlement" ? "payment" : "settlement",
21+
},
22+
}
23+
);
24+
}
25+
}
26+
} catch (err) {
27+
console.log(err);
28+
} finally {
29+
await client.close();
30+
}
31+
}
32+
run().then(() => {
33+
console.log("Done!");
34+
});

src/lottery/index.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ lotteryRouter.use(require("../middlewares/originValidator"));
2828

2929
// [Router] APIs
3030
lotteryRouter.use("/globalState", require("./routes/globalState"));
31-
lotteryRouter.use("/invite", require("./routes/invite"));
31+
lotteryRouter.use("/invites", require("./routes/invites"));
3232
lotteryRouter.use("/transactions", require("./routes/transactions"));
3333
lotteryRouter.use("/items", require("./routes/items"));
34-
lotteryRouter.use("/publicNotice", require("./routes/publicNotice"));
34+
// lotteryRouter.use("/publicNotice", require("./routes/publicNotice"));
3535
lotteryRouter.use("/quests", require("./routes/quests"));
3636

3737
// [AdminJS] AdminJS에 표시할 Resource 생성

src/lottery/modules/contracts.js

+76-106
Large diffs are not rendered by default.

src/lottery/modules/populates/transactions.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
const transactionPopulateOption = [
22
{
3-
path: "item",
4-
select:
5-
"name imageUrl instagramStoryStickerImageUrl price description isDisabled stock itemType",
3+
path: "itemId",
4+
select: "name imageUrl",
65
},
76
];
87

src/lottery/modules/quests.js

+8-4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const eventPeriod = eventConfig && {
1414
};
1515

1616
const requiredQuestFields = ["name", "description", "imageUrl", "reward"];
17+
1718
const buildQuests = (quests) => {
1819
for (const [id, quest] of Object.entries(quests)) {
1920
// quest에 필수 필드가 모두 포함되어 있는지 확인합니다.
@@ -61,7 +62,7 @@ const buildQuests = (quests) => {
6162
* @param {number} quest.reward.credit - 퀘스트의 완료 보상 중 재화의 양입니다.
6263
* @param {number} quest.reward.ticket1 - 퀘스트의 완료 보상 중 일반 티켓의 개수입니다.
6364
* @param {number} quest.maxCount - 퀘스트의 최대 완료 가능 횟수입니다.
64-
* @returns {Object|null} 성공한 경우 Object를, 실패한 경우 null을 반환합니다. 이미 최대 완료 횟수에 도달했거나, 퀘스트가 원격으로 비활성화 된 경우에도 실패로 처리됩니다.
65+
* @returns {Object|null} 성공한 경우 Object를, 실패한 경우 null을 반환합니다. 이미 최대 완료 횟수에 도달했거나, 퀘스트가 원격으로 비활성화된 경우에도 실패로 처리됩니다.
6566
*/
6667
const completeQuest = async (userId, timestamp, quest) => {
6768
try {
@@ -84,7 +85,7 @@ const completeQuest = async (userId, timestamp, quest) => {
8485
// 3단계: 유저의 퀘스트 완료 횟수를 확인합니다.
8586
// maxCount가 0인 경우, 무제한으로 퀘스트를 완료할 수 있습니다.
8687
const questCount = eventStatus.completedQuests.filter(
87-
(completedQuestId) => completedQuestId === quest.id
88+
({ questId }) => questId === quest.id
8889
).length;
8990
if (quest.maxCount > 0 && questCount >= quest.maxCount) {
9091
logger.info(
@@ -118,7 +119,10 @@ const completeQuest = async (userId, timestamp, quest) => {
118119
ticket1Amount: quest.reward.ticket1,
119120
},
120121
$push: {
121-
completedQuests: quest.id,
122+
completedQuests: {
123+
questId: quest.id,
124+
completedAt: timestamp,
125+
},
122126
},
123127
}
124128
);
@@ -143,7 +147,7 @@ const completeQuest = async (userId, timestamp, quest) => {
143147
amount: 0,
144148
userId,
145149
questId: quest.id,
146-
item: ticket1._id,
150+
itemId: ticket1._id,
147151
comment: `"${quest.name}" 퀘스트를 완료해 "${ticket1.name}" ${quest.reward.ticket1}개를 획득했습니다.`,
148152
});
149153
await transaction.save();

src/lottery/modules/stores/mongo.js

+30-18
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,25 @@ const integerValidator = {
1010
message: "{VALUE} is not an integer value",
1111
};
1212

13+
const completedQuestSchema = Schema({
14+
questId: {
15+
type: String,
16+
required: true,
17+
},
18+
completedAt: {
19+
type: Date,
20+
required: true,
21+
},
22+
});
23+
1324
const eventStatusSchema = Schema({
1425
userId: {
1526
type: Schema.Types.ObjectId,
1627
ref: "User",
1728
required: true,
1829
},
1930
completedQuests: {
20-
type: [String],
31+
type: [completedQuestSchema],
2132
default: [],
2233
},
2334
creditAmount: {
@@ -42,17 +53,11 @@ const eventStatusSchema = Schema({
4253
type: Boolean,
4354
default: false,
4455
},
45-
group: {
46-
type: Number,
47-
required: true,
48-
min: 1,
49-
validate: integerValidator,
50-
}, // 소속된 새터반
5156
inviter: {
5257
type: Schema.Types.ObjectId,
5358
ref: "User",
5459
}, // 이 사용자를 초대한 사용자
55-
isEnabledInviteUrl: {
60+
isInviteUrlEnabled: {
5661
type: Boolean,
5762
default: false,
5863
}, // 초대 링크 활성화 여부
@@ -101,7 +106,13 @@ const itemSchema = Schema({
101106
required: true,
102107
min: 0,
103108
validate: integerValidator,
104-
},
109+
}, // 의미 없는 값, 기존 코드와의 호환성을 위해 남겨둡니다.
110+
realStock: {
111+
type: Number,
112+
required: true,
113+
min: 1,
114+
validate: integerValidator,
115+
}, // 상품의 실제 재고
105116
itemType: {
106117
type: Number,
107118
enum: [0, 1, 2, 3],
@@ -124,36 +135,37 @@ const transactionSchema = Schema({
124135
type: String,
125136
enum: ["get", "use"],
126137
required: true,
127-
},
138+
}, // get: 재화 획득, use: 재화 사용
128139
amount: {
129140
type: Number,
130141
required: true,
131142
min: 0,
132143
validate: integerValidator,
133-
},
144+
}, // 재화의 변화량의 절댓값
134145
userId: {
135146
type: Schema.Types.ObjectId,
136147
ref: "User",
137148
required: true,
138149
},
139150
questId: {
140151
type: String,
141-
},
142-
item: {
152+
}, // 완료한 퀘스트의 ID
153+
itemId: {
143154
type: Schema.Types.ObjectId,
144155
ref: `${modelNamePrefix}Item`,
145-
},
146-
itemType: {
156+
}, // 획득한 상품의 ID
157+
itemAmount: {
147158
type: Number,
148-
enum: [0, 1, 2, 3],
149-
},
159+
min: 1,
160+
validate: integerValidator,
161+
}, // 획득한 상품의 개수
150162
comment: {
151163
type: String,
152164
required: true,
153165
},
154166
});
155167
transactionSchema.set("timestamps", {
156-
createdAt: "createAt",
168+
createdAt: "createdAt",
157169
updatedAt: false,
158170
});
159171

0 commit comments

Comments
 (0)