From 8510d7889dd18ac541785ebf75c25468f6c3efbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Wed, 11 Oct 2023 21:34:53 +0200 Subject: [PATCH] add docker --- .dockerignore | 2 ++ apps/backend/Dockerfile | 32 ++++++++++++++++++++++++ apps/backend/src/app.ts | 26 +++----------------- apps/backend/src/middlewares/auth.ts | 1 - apps/backend/src/responses/errors.ts | 35 ++++++++++++++++++++++++--- apps/backend/src/routes/events.ts | 9 +++++-- bun.lockb | Bin 77312 -> 89776 bytes package.json | 3 --- 8 files changed, 75 insertions(+), 33 deletions(-) create mode 100644 .dockerignore create mode 100644 apps/backend/Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..1c7f79b7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +**/.env +**/node_modules diff --git a/apps/backend/Dockerfile b/apps/backend/Dockerfile new file mode 100644 index 00000000..ea621040 --- /dev/null +++ b/apps/backend/Dockerfile @@ -0,0 +1,32 @@ +FROM --platform=linux/amd64 oven/bun:1.0.5-slim + +ARG DATABASE_URL +ENV DATABASE_URL=$DATABASE_URL + +ENV PORT=3000 + +ENV NODE_ENV=production + +# For prisma +ARG NODE_VERSION=18 +RUN apt update \ + && apt install -y curl \ + && curl -L https://raw.githubusercontent.com/tj/n/master/bin/n -o n \ + && bash n $NODE_VERSION \ + && rm n \ + && npm install -g n + +WORKDIR /app +COPY package.json package.json +COPY apps/backend/package.json apps/backend/package.json +COPY packages/types/package.json packages/types/package.json +COPY bun.lockb bun.lockb +RUN bun install +COPY . . + +WORKDIR /app/apps/backend +RUN bunx prisma generate + +EXPOSE ${PORT} +CMD ["bun", "start"] + diff --git a/apps/backend/src/app.ts b/apps/backend/src/app.ts index 3777d175..2cc04a7f 100644 --- a/apps/backend/src/app.ts +++ b/apps/backend/src/app.ts @@ -3,39 +3,19 @@ import events from './routes/events' import profiles from './routes/profiles' import { authMiddleware } from "./middlewares/auth"; import morgan from 'morgan' -import { db } from "./db"; -import { hashPassword } from "./services/password"; -import { v4 as uuid } from 'uuid'; const app = express(); -const port = 8080; +const port = process.env.PORT || 8080; app.use(morgan('tiny')) app.use(express.json()); app.use(express.json()); app.use(authMiddleware) - - app.use(events) app.use(profiles) app.get("/ping", (req, res) => res.json("pong")); + app.listen(port, () => { console.log(`Listening on port ${port}...`); -}); - -// async function main() { -// const secret = uuid() -// await db.client.create({ -// data: { -// project_id: 'eed345ae-2772-42e5-b989-e36e09c5febc', -// name: 'test', -// secret: await hashPassword(secret), -// } -// }) -// console.log('Your secret is', secret); - - -// } - -// main() \ No newline at end of file +}); \ No newline at end of file diff --git a/apps/backend/src/middlewares/auth.ts b/apps/backend/src/middlewares/auth.ts index d7517105..d4d239af 100644 --- a/apps/backend/src/middlewares/auth.ts +++ b/apps/backend/src/middlewares/auth.ts @@ -1,6 +1,5 @@ import { NextFunction, Request, Response } from "express" import { db } from "../db" -import { verifyPassword } from "../services/password" export async function authMiddleware(req: Request, res: Response, next: NextFunction) { const secret = req.headers['mixan-client-secret'] as string | undefined diff --git a/apps/backend/src/responses/errors.ts b/apps/backend/src/responses/errors.ts index 3889abec..1da9b6f7 100644 --- a/apps/backend/src/responses/errors.ts +++ b/apps/backend/src/responses/errors.ts @@ -1,4 +1,8 @@ -import { MixanIssue, MixanIssuesResponse } from "@mixan/types"; +import { + MixanIssue, + MixanErrorResponse, + MixanIssuesResponse, +} from '@mixan/types' export function issues(arr: Array): MixanIssuesResponse { return { @@ -7,7 +11,30 @@ export function issues(arr: Array): MixanIssuesResponse { field: item.field, message: item.message, value: item.value, - }; - }) + } + }), } -} \ No newline at end of file +} + +export function makeError(error: unknown): MixanErrorResponse { + if (error instanceof Error) { + return { + code: 'Error', + message: error.message, + } + } + + // @ts-ignore + if ('message' in error) { + return { + code: 'UnknownError', + // @ts-ignore + message: error.message, + } + } + + return { + code: 'UnknownError', + message: 'Unknown error', + } +} diff --git a/apps/backend/src/routes/events.ts b/apps/backend/src/routes/events.ts index 4d22a977..3e010740 100644 --- a/apps/backend/src/routes/events.ts +++ b/apps/backend/src/routes/events.ts @@ -4,14 +4,19 @@ import { MixanRequest } from '../types/express'; import { EventPayload } from '@mixan/types'; import { getEvents, getProfileIdFromEvents } from '../services/event'; import { success } from '../responses/success'; +import { makeError } from '../responses/errors'; const router = Router(); type PostRequest = MixanRequest> router.get('/events', async (req, res) => { - const events = await getEvents(req.client.project_id) - res.json(success(events)) + try { + const events = await getEvents(req.client.project_id) + res.json(success(events)) + } catch (error) { + res.json(makeError(error)) + } }) router.post('/events', async (req: PostRequest, res) => { diff --git a/bun.lockb b/bun.lockb index 9accf3754fcf341066c636cdbf71c1e95bba1de7..8d6721b757e1d63e3edfbc1971e00b1e53543e82 100755 GIT binary patch delta 22269 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 y`|S_KibLb*?nuw9Ry1PvE9w9Nc5C8H4Su delta 14845 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 diff --git a/package.json b/package.json index e5872eca..518e0929 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,6 @@ "name": "@mixan/root", "version": "1.0.0", "workspaces": ["apps/*", "packages/*"], - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, "keywords": [], "author": "", "license": "ISC",