From 88cdce819ba1d3c5fbcac510a47cbf320ed7c285 Mon Sep 17 00:00:00 2001 From: Sugui Date: Mon, 25 Dec 2023 07:47:16 +0100 Subject: [PATCH] Adding docker compose to test api with mongodb --- .dockerignore | 16 ++++++++++++++++ Dockerfile | 4 ++-- compose.yaml | 34 ++++++++++++++++++++++++++++++++++ index.ts | 13 ------------- mongo-init.js | 24 ++++++++++++++++++++++++ package.json | 3 +++ src/ImageModel.ts | 20 ++++++++++++++++++++ src/index.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 144 insertions(+), 15 deletions(-) create mode 100644 .dockerignore create mode 100644 compose.yaml delete mode 100644 index.ts create mode 100644 mongo-init.js create mode 100644 src/ImageModel.ts create mode 100644 src/index.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..5eef660 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,16 @@ +compose.yaml +node_modules +Dockerfile* +docker-compose* +.dockerignore +.git +.gitignore +README.md +LICENSE +.vscode +Makefile +helm-charts +.env +.editorconfig +.idea +coverage* diff --git a/Dockerfile b/Dockerfile index 1f136b0..7ecabac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -36,5 +36,5 @@ COPY --from=prerelease /usr/src/app/package.json . # run the app USER bun -EXPOSE 3000/tcp -CMD ["bun", "run", "index.ts"] +EXPOSE 8080/tcp +CMD ["bun", "run", "start"] diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..386c4a3 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,34 @@ +version: '3' + +services: + mongodb: + image: mongo + container_name: mongodb + ports: + - "27017:27017" + environment: + MONGO_INITDB_ROOT_USERNAME: root + MONGO_INITDB_ROOT_PASSWORD: password + MONGO_INITDB_DATABASE: bot + volumes: + - mongodb_data:/data/db + - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro + + bot-api: + image: oven/bun:1 + container_name: bot-api + command: bun run dev + working_dir: /usr/src/app + ports: + - "8080:8080" + depends_on: + - mongodb + environment: + MONGODB_URI: "mongodb://mongodb:27017/bot" + MONGODB_USER: "root" + MONGODB_PASS: "password" + volumes: + - ./:/usr/src/app:ro + +volumes: + mongodb_data: diff --git a/index.ts b/index.ts deleted file mode 100644 index fd96f7b..0000000 --- a/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import express from "express"; - -const app = express(); - -// Hello World GET endpoint -app.get("/", (_, res) => { - res.send("Hello World!"); -}); - -// Set the default port to 3000, or use the PORT environment variable -const port = process.env.PORT || 3000; - -app.listen(port, () => console.log(`Express server listening on port ${port}`)); \ No newline at end of file diff --git a/mongo-init.js b/mongo-init.js new file mode 100644 index 0000000..c02de9c --- /dev/null +++ b/mongo-init.js @@ -0,0 +1,24 @@ +db.createUser({ + user: 'root', + pwd: 'password', + roles: [ + { + role: 'readWrite', + db: 'admin', + }, + { + role: 'readWrite', + db: 'bot', + }, + ], +}); + +db = new Mongo().getDB("bot"); + +db.images.createIndex({ "status": 1 }); +db.images.createIndex({ "image": 1 }, { "unique": true }); +db.images.insert({ + url: "https://example.com", + status: "consumed", + tags: ["2girls", "sleeping"] +}); \ No newline at end of file diff --git a/package.json b/package.json index eaac0ed..2d7a2ae 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,9 @@ }, "peerDependencies": { "typescript": "^5.0.0" + },"scripts": { + "start": "bun run src/index.ts", + "dev": "bun --hot run src/index.ts" }, "dependencies": { "@types/express": "^4.17.21", diff --git a/src/ImageModel.ts b/src/ImageModel.ts new file mode 100644 index 0000000..0a74f50 --- /dev/null +++ b/src/ImageModel.ts @@ -0,0 +1,20 @@ +import mongoose from "mongoose"; + +const ImageSchema = new mongoose.Schema({ + url: { + type: String, + required: true + }, + status: { + type: String, + enum: { + values: ["consumed", "unavailable", "available"], + }, + required: true + }, + tags: { + type: [String] + } +}); + +export default mongoose.model('images', ImageSchema); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..10401fc --- /dev/null +++ b/src/index.ts @@ -0,0 +1,45 @@ +import express from "express"; +import mongoose from "mongoose"; +import ImageModel from "./ImageModel"; + +const app = express(); + +app.use(express.json()); + +// Hello World GET endpoint +app.get("/", (_, res) => { + res.json({ message: "Blazing fast 🚀" }); +}); + +app.get("/images", async (req, res) => { + try { + const allImages = await ImageModel.find(); + res.json(allImages); + } catch (error) { + res.status(500).json({ message: error }); + } +}) + +// Set the default port to 8080, or use the PORT environment variable + +const start = async () => { + const port = process.env.PORT || 8080; + const mongo_uri: string = process.env.MONGODB_URI || ""; + const mongo_user = process.env.MONGODB_USER; + const mongo_pass = process.env.MONGODB_PASS; + + try { + await mongoose.connect(mongo_uri, { + authSource: "admin", + user: mongo_user, + pass: mongo_pass + }); + app.listen(port, () => console.log(`Express server listening on port ${port}`)); + } catch (error) { + console.error(error); + process.exit(1); + } +} + +start(); +