From 93b0bae204de876ebf040a9e193b029204a66815 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:56:58 +0000 Subject: [PATCH 01/25] build(deps): bump tar from 6.2.0 to 6.2.1 Bumps [tar](https://github.com/isaacs/node-tar) from 6.2.0 to 6.2.1. - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/node-tar/compare/v6.2.0...v6.2.1) --- updated-dependencies: - dependency-name: tar dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e5a62d1..a7887fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7717,9 +7717,9 @@ tar-stream@^2.0.0: readable-stream "^3.1.1" tar@^6.1.11: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" From 5069ac12da6ce9a9361f75f6ccdf33b3303c5655 Mon Sep 17 00:00:00 2001 From: Annie Huang Date: Thu, 11 Apr 2024 23:11:42 +0800 Subject: [PATCH 02/25] fix map view --- app/src/components/QuestMap.vue | 2 +- app/src/views/QuestMapPage.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/components/QuestMap.vue b/app/src/components/QuestMap.vue index 4f27cee..235edd0 100644 --- a/app/src/components/QuestMap.vue +++ b/app/src/components/QuestMap.vue @@ -177,7 +177,7 @@ onMounted(async () => { class="p-2 stroke-2 scale-y-120 justify-center items-center" />

踏上你的Linux冒險之旅吧! diff --git a/app/src/views/QuestMapPage.vue b/app/src/views/QuestMapPage.vue index cadced9..1035a00 100644 --- a/app/src/views/QuestMapPage.vue +++ b/app/src/views/QuestMapPage.vue @@ -12,7 +12,7 @@ import GameHeaderComponents from '../components/header/GameHeaderComponents.vue' class="z-50" /> -
+
From b5c601f4a9a29fd6dc316d81204bdcaf4271ecea Mon Sep 17 00:00:00 2001 From: wancat Date: Mon, 17 Jun 2024 19:23:23 +0800 Subject: [PATCH 03/25] feat: install date-fns --- server/package.json | 1 + yarn.lock | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/server/package.json b/server/package.json index 4b9b48a..aae9a82 100644 --- a/server/package.json +++ b/server/package.json @@ -20,6 +20,7 @@ "commander": "^11.0.0", "connect-mongo": "^5.0.0", "cookie-parser": "^1.4.6", + "date-fns": "^3.6.0", "dockerode": "^3.3.5", "dotenv": "^16.4.1", "express": "^4.19.2", diff --git a/yarn.lock b/yarn.lock index a7887fb..a97122d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3594,6 +3594,11 @@ date-fns@^2.30.0: dependencies: "@babel/runtime" "^7.21.0" +date-fns@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" + integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== + dayjs@^1.10.4: version "1.11.10" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" From 1d725d82aea20e7f712c7bbba352fdb43dff980a Mon Sep 17 00:00:00 2001 From: wancat Date: Mon, 17 Jun 2024 19:23:30 +0800 Subject: [PATCH 04/25] feat: add register-guest api --- server/src/api/controllers/authController.ts | 26 +++++++++++++++++++- server/src/api/routes/authRouter.ts | 3 +++ server/src/models/userManager.ts | 17 +++++++++++++ server/swagger.yaml | 20 +++++++++++++-- 4 files changed, 63 insertions(+), 3 deletions(-) diff --git a/server/src/api/controllers/authController.ts b/server/src/api/controllers/authController.ts index 258ba4f..239a6ce 100644 --- a/server/src/api/controllers/authController.ts +++ b/server/src/api/controllers/authController.ts @@ -1,7 +1,7 @@ import type { Request, Response, NextFunction, Express } from 'express' import { matchedData } from 'express-validator' import { genJWT } from '../../utils/auth.js' -import { createUser } from '../../models/userManager.js' +import { createUser, createGuestUser } from '../../models/userManager.js' import { asyncHandler } from '../../middleware/error.js' import logger from '../../utils/logger.js' @@ -39,6 +39,30 @@ export const register = asyncHandler( } ) +export const registerGuest = asyncHandler( + async (req: Request, res: Response) => { + const user = await createGuestUser() + req.login( + { + id: user.id, + username: user.username, + email: user.email, + }, + (err) => { + if (err) { + res.status(500).json({ + message: 'error logging in', + }) + return + } + res.status(201).json({ + message: 'user created', + }) + } + ) + } +) + export function logout(req: Request, res: Response) { req.logout((err) => { if (err) { diff --git a/server/src/api/routes/authRouter.ts b/server/src/api/routes/authRouter.ts index 9fabc58..318af99 100644 --- a/server/src/api/routes/authRouter.ts +++ b/server/src/api/routes/authRouter.ts @@ -9,6 +9,7 @@ import { logout, registerFromSession, socialLoginHandler, + registerGuest, } from '../controllers/authController.js' import { checkUsernameValidators, @@ -32,6 +33,8 @@ router.post( router.post('/register', authenticateRateLimit, registerValidators, register) +router.post('/register-guest', authenticateRateLimit, registerGuest) + router.post('/logout', logout) router.get( diff --git a/server/src/models/userManager.ts b/server/src/models/userManager.ts index 630ac76..539a1b3 100644 --- a/server/src/models/userManager.ts +++ b/server/src/models/userManager.ts @@ -1,4 +1,5 @@ import { Express } from 'express' +import { format } from 'date-fns' import { User, UserProfile } from '@linux-odyssey/models' import { hashPassword } from '../utils/auth.js' @@ -31,6 +32,22 @@ export async function createUser( return user } +export async function createGuestUser() { + const username = `guest_${format(new Date(), 'yyyyMMddHHmmss')}` + const user = new User({ + username, + email: `${username}@example.com`, + }) + await user.save() + + const profile = new UserProfile({ + user, + }) + await profile.save() + + return user +} + export function leaderboard() { return UserProfile.aggregate([ { diff --git a/server/swagger.yaml b/server/swagger.yaml index dfadfc2..b2a0605 100644 --- a/server/swagger.yaml +++ b/server/swagger.yaml @@ -1,14 +1,14 @@ openapi: 3.0.0 servers: - url: /api/v1 - - url: https://odyssey.wancat.cc/api/v1 + - url: https://linuxodyssey.xyz/api/v1 - url: http://localhost:3000/api/v1 info: description: Linux Odyssey API version: '1.0.0' title: Session API contact: - email: wancat@wancat.cc + email: contact@linuxodyssey.xyz license: name: Apache 2.0 url: 'http://www.apache.org/licenses/LICENSE-2.0.html' @@ -233,6 +233,22 @@ paths: type: string example: connect.sid=s%3Aq1Z; Path=/; HttpOnly; SameSite=Strict; Secure + /auth/register-guest: + post: + summary: Register a new guest user + responses: + 201: + description: User created + headers: + Set-Cookie: + schema: + type: string + example: connect.sid=s%3Aq1Z; Path=/; HttpOnly; SameSite=Strict; Secure + content: + application/json: + schema: + $ref: '#/components/schemas/User' + /auth/login: post: summary: Log in a user From 7347c37a9e442f124c6e8413545f38680af999f1 Mon Sep 17 00:00:00 2001 From: wancat Date: Mon, 17 Jun 2024 19:49:00 +0800 Subject: [PATCH 05/25] feat: add register guest button --- app/src/components/AuthForm.vue | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/src/components/AuthForm.vue b/app/src/components/AuthForm.vue index 7d05cb6..1f658af 100644 --- a/app/src/components/AuthForm.vue +++ b/app/src/components/AuthForm.vue @@ -83,6 +83,16 @@ const handleChange = () => { errorMessage.value = 'Something went wrong' } } + +const registerGuest = async () => { + try { + await api.post('/auth/register-guest') + router.push({ name: 'map' }) + } catch (err) { + console.error(err) + toast.error('Something went wrong.') + } +} From 198dcae3f8142273e21253612379e25814b01f9d Mon Sep 17 00:00:00 2001 From: wancat Date: Mon, 17 Jun 2024 19:50:58 +0800 Subject: [PATCH 06/25] feat: add isGuest field in user model --- packages/models/src/user.ts | 6 ++++++ server/src/models/userManager.ts | 1 + 2 files changed, 7 insertions(+) diff --git a/packages/models/src/user.ts b/packages/models/src/user.ts index 8ac5bcd..5e4c63f 100644 --- a/packages/models/src/user.ts +++ b/packages/models/src/user.ts @@ -28,6 +28,7 @@ export interface IUser { socialLogins: Map createdAt: Date updatedAt: Date + isGuest: boolean } export const User = model( @@ -51,6 +52,11 @@ export const User = model( default: {}, required: true, }, + isGuest: { + type: Boolean, + default: false, + required: true, + }, }, { timestamps: true, diff --git a/server/src/models/userManager.ts b/server/src/models/userManager.ts index 539a1b3..06d2a52 100644 --- a/server/src/models/userManager.ts +++ b/server/src/models/userManager.ts @@ -37,6 +37,7 @@ export async function createGuestUser() { const user = new User({ username, email: `${username}@example.com`, + isGuest: true, }) await user.save() From 443e810471a2d06cf7a44df3734d397f8510f342 Mon Sep 17 00:00:00 2001 From: wancat Date: Mon, 17 Jun 2024 20:12:32 +0800 Subject: [PATCH 07/25] feat: add isGuest migration script --- server/migrations/0001-add-isGuest.ts | 23 +++++++++++++++++++++++ server/package.json | 3 ++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 server/migrations/0001-add-isGuest.ts diff --git a/server/migrations/0001-add-isGuest.ts b/server/migrations/0001-add-isGuest.ts new file mode 100644 index 0000000..20f2266 --- /dev/null +++ b/server/migrations/0001-add-isGuest.ts @@ -0,0 +1,23 @@ +import connectDB, { User } from '@linux-odyssey/models' + +async function migrate() { + await connectDB( + process.env.MONGO_URL || 'mongodb://localhost:27017/odyssey-test' + ) + await User.updateMany( + { + isGuest: { $exists: false }, + }, + { $set: { isGuest: false } } + ) +} + +migrate() + .then(() => { + console.log('Migration completed') + process.exit(0) + }) + .catch((err) => { + console.error(err) + process.exit(1) + }) diff --git a/server/package.json b/server/package.json index aae9a82..44b869f 100644 --- a/server/package.json +++ b/server/package.json @@ -9,7 +9,8 @@ "clean": "node dist/cli/clean.js", "build": "tsc -b", "dev": "nodemon", - "build:quests": "node dist/cli/build.js" + "build:quests": "node dist/cli/build.js", + "ts-node": "node --loader ts-node/esm" }, "dependencies": { "@linux-odyssey/constants": "*", From fcb52b9d9e23534badc3e58dc0d94c09b21d42af Mon Sep 17 00:00:00 2001 From: "Chen, Tai-Lin" Date: Fri, 28 Jun 2024 02:14:22 +0800 Subject: [PATCH 08/25] fix: modify component name and title (HintPart=>DescriptionPart) --- app/src/components/game/{HintPart.vue => DescriptionPart.vue} | 2 +- app/src/views/GamePage.vue | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename app/src/components/game/{HintPart.vue => DescriptionPart.vue} (97%) diff --git a/app/src/components/game/HintPart.vue b/app/src/components/game/DescriptionPart.vue similarity index 97% rename from app/src/components/game/HintPart.vue rename to app/src/components/game/DescriptionPart.vue index 864ac7f..c5eec59 100644 --- a/app/src/components/game/HintPart.vue +++ b/app/src/components/game/DescriptionPart.vue @@ -32,7 +32,7 @@ const right = () => { :icon="['far', 'lightbulb']" class="text-yellow-200 p-2 content-center" /> -

提示

+

說明