From 50bf514805a900f23ad3e98fc2855740bfa7c726 Mon Sep 17 00:00:00 2001 From: wancat Date: Sun, 8 Oct 2023 18:04:24 +0800 Subject: [PATCH] feat: separate db models from server --- docker-compose.yml | 4 +++ {server/src => packages}/models/command.js | 0 packages/models/index.js | 22 ++++++++++++ packages/models/package.json | 12 +++++++ {server/src => packages}/models/quest.js | 0 {server/src => packages}/models/session.js | 0 {server/src => packages}/models/user.js | 0 server/Dockerfile | 2 ++ server/Dockerfile.dev | 1 + server/package.json | 1 + server/src/api/controllers/authController.js | 2 +- .../src/api/controllers/commandController.js | 3 +- server/src/api/controllers/questController.js | 2 +- .../src/api/controllers/sessionController.js | 3 +- server/src/api/socket.js | 2 +- server/src/auth/passwordStrategy.js | 2 +- server/src/containers/expiryChecker.js | 2 +- server/src/db.js | 17 --------- server/src/game/commandHandler.js | 2 +- server/src/index.js | 4 +-- server/src/utils/auth.js | 2 +- server/src/utils/quest.js | 2 +- yarn.lock | 36 +++++++++++++++++++ 23 files changed, 90 insertions(+), 31 deletions(-) rename {server/src => packages}/models/command.js (100%) create mode 100644 packages/models/index.js create mode 100644 packages/models/package.json rename {server/src => packages}/models/quest.js (100%) rename {server/src => packages}/models/session.js (100%) rename {server/src => packages}/models/user.js (100%) delete mode 100644 server/src/db.js diff --git a/docker-compose.yml b/docker-compose.yml index 93ca8c9..30253cf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,8 @@ version: '3' services: app: + depends_on: + - backend build: context: . dockerfile: app/Dockerfile.dev @@ -12,6 +14,8 @@ services: - ./app:/app/app - ./packages:/app/packages backend: + depends_on: + - db build: context: . dockerfile: server/Dockerfile.dev diff --git a/server/src/models/command.js b/packages/models/command.js similarity index 100% rename from server/src/models/command.js rename to packages/models/command.js diff --git a/packages/models/index.js b/packages/models/index.js new file mode 100644 index 0000000..e84cac8 --- /dev/null +++ b/packages/models/index.js @@ -0,0 +1,22 @@ +import mongoose from 'mongoose' + +export { default as User } from './user.js' +export { default as Quest } from './quest.js' +export { default as Session } from './session.js' +export { default as Command } from './command.js' + +export default async function connectDB(uri) { + try { + const db = await mongoose.connect(uri, { + useNewUrlParser: true, + useUnifiedTopology: true, + }) + console.log('Connected to MongoDB') + console.log(mongoose.models) + return db.connection.getClient() + } catch (err) { + console.error(err) + process.exit(1) + return null + } +} diff --git a/packages/models/package.json b/packages/models/package.json new file mode 100644 index 0000000..1dd49ae --- /dev/null +++ b/packages/models/package.json @@ -0,0 +1,12 @@ +{ + "name": "@linux-odyssey/models", + "type": "module", + "version": "1.0.0", + "main": "index.js", + "license": "GPL", + "exports": "./index.js", + "dependencies": { + "@linux-odyssey/file-graph": "*", + "mongoose": "^7.6.0" + } +} diff --git a/server/src/models/quest.js b/packages/models/quest.js similarity index 100% rename from server/src/models/quest.js rename to packages/models/quest.js diff --git a/server/src/models/session.js b/packages/models/session.js similarity index 100% rename from server/src/models/session.js rename to packages/models/session.js diff --git a/server/src/models/user.js b/packages/models/user.js similarity index 100% rename from server/src/models/user.js rename to packages/models/user.js diff --git a/server/Dockerfile b/server/Dockerfile index 5bee61f..657c8e7 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -5,11 +5,13 @@ COPY ./package.json yarn.lock ./ COPY server/package.json ./server/package.json COPY packages/file-graph/package.json ./packages/file-graph/package.json COPY packages/utils/package.json ./packages/utils/package.json +COPY packages/models/package.json ./packages/models/package.json RUN yarn install --frozen-lockfile --production COPY ./server ./server COPY packages/file-graph ./packages/file-graph COPY packages/utils ./packages/utils +COPY packages/models ./packages/models COPY quests ./quests WORKDIR /app/server diff --git a/server/Dockerfile.dev b/server/Dockerfile.dev index 488c1ca..a68525a 100644 --- a/server/Dockerfile.dev +++ b/server/Dockerfile.dev @@ -5,6 +5,7 @@ COPY package.json yarn.lock ./ COPY server/package.json ./server/package.json COPY packages/file-graph/package.json ./packages/file-graph/package.json COPY packages/utils/package.json ./packages/utils/package.json +COPY packages/models/package.json ./packages/models/package.json RUN yarn install --frozen-lockfile COPY server/nodemon.json ./server/nodemon.json diff --git a/server/package.json b/server/package.json index 7ba551b..9e3b98a 100644 --- a/server/package.json +++ b/server/package.json @@ -12,6 +12,7 @@ "dependencies": { "@linux-odyssey/file-graph": "*", "@linux-odyssey/utils": "*", + "@linux-odyssey/models": "*", "bcrypt": "^5.1.1", "commander": "^11.0.0", "connect-mongo": "^5.0.0", diff --git a/server/src/api/controllers/authController.js b/server/src/api/controllers/authController.js index 1a12555..7a87a53 100644 --- a/server/src/api/controllers/authController.js +++ b/server/src/api/controllers/authController.js @@ -1,5 +1,5 @@ import { isValidEmail, isValidUsername } from '@linux-odyssey/utils' -import User from '../../models/user.js' +import { User } from '@linux-odyssey/models' import { genJWT, hashPassword } from '../../utils/auth.js' export async function issueToken(req, res) { diff --git a/server/src/api/controllers/commandController.js b/server/src/api/controllers/commandController.js index 5b3465c..ffd7973 100644 --- a/server/src/api/controllers/commandController.js +++ b/server/src/api/controllers/commandController.js @@ -1,6 +1,5 @@ /* eslint-disable import/prefer-default-export */ -import Command from '../../models/command.js' -import Session from '../../models/session.js' +import { Command, Session } from '@linux-odyssey/models' import CommandHandler from '../../game/commandHandler.js' export async function newCommand(req, res) { diff --git a/server/src/api/controllers/questController.js b/server/src/api/controllers/questController.js index 059490e..745756d 100644 --- a/server/src/api/controllers/questController.js +++ b/server/src/api/controllers/questController.js @@ -1,4 +1,4 @@ -import Quest from '../../models/quest.js' +import { Quest } from '@linux-odyssey/models' export async function getQuests(req, res) { const quests = await Quest.find({}).sort({ order: 1 }) diff --git a/server/src/api/controllers/sessionController.js b/server/src/api/controllers/sessionController.js index 444f1ce..6cdb4df 100644 --- a/server/src/api/controllers/sessionController.js +++ b/server/src/api/controllers/sessionController.js @@ -1,5 +1,4 @@ -import Session from '../../models/session.js' -import Quest from '../../models/quest.js' +import { Session, Quest } from '@linux-odyssey/models' import { createContainer } from '../../containers/docker.js' import SessionHandler from '../../game/sessionHandler.js' diff --git a/server/src/api/socket.js b/server/src/api/socket.js index 4bdc6bb..1c09ce4 100644 --- a/server/src/api/socket.js +++ b/server/src/api/socket.js @@ -1,6 +1,6 @@ import { Server } from 'socket.io' +import { Session } from '@linux-odyssey/models' import { getAndStartContainer, attachContainer } from '../containers/docker.js' -import Session from '../models/session.js' import SessionMiddleware from '../middleware/session.js' import { genJWT } from '../utils/auth.js' diff --git a/server/src/auth/passwordStrategy.js b/server/src/auth/passwordStrategy.js index b89d18e..0993a9b 100644 --- a/server/src/auth/passwordStrategy.js +++ b/server/src/auth/passwordStrategy.js @@ -1,6 +1,6 @@ import bcrypt from 'bcrypt' import LocalStrategy from 'passport-local' -import User from '../models/user.js' +import { User } from '@linux-odyssey/models' async function verifyPassword(username, password, done) { try { diff --git a/server/src/containers/expiryChecker.js b/server/src/containers/expiryChecker.js index 1f5fd73..41699cc 100644 --- a/server/src/containers/expiryChecker.js +++ b/server/src/containers/expiryChecker.js @@ -1,6 +1,6 @@ import schedule from 'node-schedule' +import { Session } from '@linux-odyssey/models' import config from '../config.js' -import Session from '../models/session.js' import { deleteContainer } from './docker.js' export async function removeExpired() { diff --git a/server/src/db.js b/server/src/db.js deleted file mode 100644 index 7522e35..0000000 --- a/server/src/db.js +++ /dev/null @@ -1,17 +0,0 @@ -import mongoose from 'mongoose' -import config from './config.js' - -export default async function connectDB() { - try { - const db = await mongoose.connect(config.db, { - useNewUrlParser: true, - useUnifiedTopology: true, - }) - console.log('Connected to MongoDB') - return db.connection.getClient() - } catch (err) { - console.error(err) - process.exit(1) - return null - } -} diff --git a/server/src/game/commandHandler.js b/server/src/game/commandHandler.js index f18900c..baa3f4b 100644 --- a/server/src/game/commandHandler.js +++ b/server/src/game/commandHandler.js @@ -1,6 +1,6 @@ import minimist from 'minimist' import { FileGraph } from '@linux-odyssey/file-graph' -import Quest from '../models/quest.js' +import { Quest } from '@linux-odyssey/models' import { pushToSession } from '../api/socket.js' import SessionHandler from './sessionHandler.js' diff --git a/server/src/index.js b/server/src/index.js index b2b57f6..3bb154a 100644 --- a/server/src/index.js +++ b/server/src/index.js @@ -4,10 +4,10 @@ import http from 'http' import YAML from 'yaml' import swaggerUI from 'swagger-ui-express' import passport from 'passport' +import connectDB from '@linux-odyssey/models' import './auth/passport.js' import socketServer from './api/socket.js' -import connectDB from './db.js' import apiRouter from './api/routes/index.js' import loadAndUpdateQuests from './utils/quest.js' import config from './config.js' @@ -17,7 +17,7 @@ import expiryRemovalScheduler from './containers/expiryChecker.js' import { createTestUser } from './utils/auth.js' async function main() { - await connectDB() + await connectDB(config.db) await createTestUser() diff --git a/server/src/utils/auth.js b/server/src/utils/auth.js index 66fe0cb..4f215f6 100644 --- a/server/src/utils/auth.js +++ b/server/src/utils/auth.js @@ -1,7 +1,7 @@ import jwt from 'jsonwebtoken' +import { User } from '@linux-odyssey/models' import bcrypt from 'bcrypt' import config from '../config.js' -import User from '../models/user.js' export function hashPassword(password) { return bcrypt.hash(password, 10) diff --git a/server/src/utils/quest.js b/server/src/utils/quest.js index 315528f..58d4c00 100644 --- a/server/src/utils/quest.js +++ b/server/src/utils/quest.js @@ -2,7 +2,7 @@ import fs from 'fs/promises' import path from 'path' import yaml from 'yaml' -import Quest from '../models/quest.js' +import { Quest } from '@linux-odyssey/models' const questDirectory = path.join(process.cwd(), '..', 'quests') diff --git a/yarn.lock b/yarn.lock index 8465be9..33272f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -807,6 +807,13 @@ semver "^7.3.5" tar "^6.1.11" +"@mongodb-js/saslprep@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz#022fa36620a7287d17acd05c4aae1e5f390d250d" + integrity sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw== + dependencies: + sparse-bitfield "^3.0.3" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1569,6 +1576,11 @@ bson@^5.4.0: resolved "https://registry.yarnpkg.com/bson/-/bson-5.4.0.tgz#0eea77276d490953ad8616b483298dbff07384c6" integrity sha512-WRZ5SQI5GfUuKnPTNmAYPiKIof3ORXAF4IRU5UcgmivNIon01rWQlw5RUH954dpu8yGL8T59YShVddIPaU/gFA== +bson@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/bson/-/bson-5.5.0.tgz#a419cc69f368d2def3b8b22ea03ed1c9be40e53f" + integrity sha512-B+QB4YmDx9RStKv8LLSl/aVIEV3nYJc3cJNNTK2Cd1TL+7P+cNpw9mAPeCgc5K+j01Dv6sxUzcITXDx7ZU3F0w== + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -4323,6 +4335,17 @@ mongodb@5.7.0: optionalDependencies: saslprep "^1.0.3" +mongodb@5.9.0: + version "5.9.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-5.9.0.tgz#5a22065fa8cfaf1d58bf2e3c451cd2c4bfa983a2" + integrity sha512-g+GCMHN1CoRUA+wb1Agv0TI4YTSiWr42B5ulkiAfLLHitGK1R+PkSAf3Lr5rPZwi/3F04LiaZEW0Kxro9Fi2TA== + dependencies: + bson "^5.5.0" + mongodb-connection-string-url "^2.6.0" + socks "^2.7.1" + optionalDependencies: + "@mongodb-js/saslprep" "^1.1.0" + mongoose@^7.4.0: version "7.4.0" resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-7.4.0.tgz#3726a8dea0c9e2d54651845cc84c813a6507906a" @@ -4336,6 +4359,19 @@ mongoose@^7.4.0: ms "2.1.3" sift "16.0.1" +mongoose@^7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-7.6.0.tgz#3037b754ccdf168385e52d4bcabeb7f5c3b17a5f" + integrity sha512-ztQ12rm0BQN5i7LB6xhWX4l9a9w2aa3jEwa/mM2vAutYJRyAwOzcusvKJBULMzFHyUDBOVW15grisexypgMIWA== + dependencies: + bson "^5.4.0" + kareem "2.5.1" + mongodb "5.9.0" + mpath "0.9.0" + mquery "5.0.0" + ms "2.1.3" + sift "16.0.1" + mpath@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904"