From 98c0de78e8a73e3e5bf0928226cfb8a024b566a1 Mon Sep 17 00:00:00 2001 From: Elias Schneider Date: Fri, 5 May 2023 11:37:02 +0200 Subject: [PATCH] feat: add env variables for port, database url and data dir --- .gitignore | 1 + backend/prisma/.env | 2 ++ backend/prisma/schema.prisma | 2 +- backend/prisma/seed/config.seed.ts | 11 +++++++++-- backend/src/clamscan/clamscan.service.ts | 5 +++-- backend/src/constants.ts | 3 +++ backend/src/file/file.service.ts | 19 +++++++++---------- backend/src/jobs/jobs.service.ts | 9 +++++---- backend/src/main.ts | 7 +++++-- backend/src/prisma/prisma.service.ts | 5 ++--- backend/src/share/share.service.ts | 5 +++-- 11 files changed, 43 insertions(+), 26 deletions(-) create mode 100644 backend/prisma/.env create mode 100644 backend/src/constants.ts diff --git a/.gitignore b/.gitignore index 73672119..80e7fe1c 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ yarn-error.log* # env file .env +!/backend/prisma/.env # vercel .vercel diff --git a/backend/prisma/.env b/backend/prisma/.env new file mode 100644 index 00000000..cecaf528 --- /dev/null +++ b/backend/prisma/.env @@ -0,0 +1,2 @@ +#This file is only used to set a default value for the database url +DATABASE_URL="file:../data/pingvin-share.db" \ No newline at end of file diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index b0baa98c..c25b385e 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -4,7 +4,7 @@ generator client { datasource db { provider = "sqlite" - url = "file:../data/pingvin-share.db" + url = env("DATABASE_URL") } model User { diff --git a/backend/prisma/seed/config.seed.ts b/backend/prisma/seed/config.seed.ts index 5abc3de2..23d78ead 100644 --- a/backend/prisma/seed/config.seed.ts +++ b/backend/prisma/seed/config.seed.ts @@ -1,6 +1,5 @@ import { Prisma, PrismaClient } from "@prisma/client"; import * as crypto from "crypto"; - const configVariables: ConfigVariables = { internal: { jwtSecret: { @@ -162,7 +161,15 @@ type ConfigVariables = { }; }; -const prisma = new PrismaClient(); +const prisma = new PrismaClient({ + datasources: { + db: { + url: + process.env.DATABASE_URL || + "file:../data/pingvin-share.db?connection_limit=1", + }, + }, +}); async function seedConfigVariables() { for (const [category, configVariablesOfCategory] of Object.entries( diff --git a/backend/src/clamscan/clamscan.service.ts b/backend/src/clamscan/clamscan.service.ts index b1a53bf1..cbed5bce 100644 --- a/backend/src/clamscan/clamscan.service.ts +++ b/backend/src/clamscan/clamscan.service.ts @@ -3,6 +3,7 @@ import * as NodeClam from "clamscan"; import * as fs from "fs"; import { FileService } from "src/file/file.service"; import { PrismaService } from "src/prisma/prisma.service"; +import { SHARE_DIRECTORY } from "../constants"; const clamscanConfig = { clamdscan: { @@ -39,12 +40,12 @@ export class ClamScanService { const infectedFiles = []; const files = fs - .readdirSync(`./data/uploads/shares/${shareId}`) + .readdirSync(`${SHARE_DIRECTORY}/${shareId}`) .filter((file) => file != "archive.zip"); for (const fileId of files) { const { isInfected } = await clamScan - .isInfected(`./data/uploads/shares/${shareId}/${fileId}`) + .isInfected(`${SHARE_DIRECTORY}/${shareId}/${fileId}`) .catch(() => { console.log("ClamAV is not active"); return { isInfected: false }; diff --git a/backend/src/constants.ts b/backend/src/constants.ts new file mode 100644 index 00000000..d282f729 --- /dev/null +++ b/backend/src/constants.ts @@ -0,0 +1,3 @@ +export const DATA_DIRECTORY = process.env.DATA_DIRECTORY || "./data"; +export const SHARE_DIRECTORY = `${DATA_DIRECTORY}/uploads/shares` +export const DATABASE_URL = process.env.DATABASE_URL || "file:../data/pingvin-share.db?connection_limit=1"; \ No newline at end of file diff --git a/backend/src/file/file.service.ts b/backend/src/file/file.service.ts index be0cddc4..51d02398 100644 --- a/backend/src/file/file.service.ts +++ b/backend/src/file/file.service.ts @@ -11,6 +11,7 @@ import * as fs from "fs"; import * as mime from "mime-types"; import { ConfigService } from "src/config/config.service"; import { PrismaService } from "src/prisma/prisma.service"; +import { SHARE_DIRECTORY } from "../constants"; @Injectable() export class FileService { @@ -39,7 +40,7 @@ export class FileService { let diskFileSize: number; try { diskFileSize = fs.statSync( - `./data/uploads/shares/${shareId}/${file.id}.tmp-chunk` + `${SHARE_DIRECTORY}/${shareId}/${file.id}.tmp-chunk` ).size; } catch { diskFileSize = 0; @@ -78,18 +79,18 @@ export class FileService { } fs.appendFileSync( - `./data/uploads/shares/${shareId}/${file.id}.tmp-chunk`, + `${SHARE_DIRECTORY}/${shareId}/${file.id}.tmp-chunk`, buffer ); const isLastChunk = chunk.index == chunk.total - 1; if (isLastChunk) { fs.renameSync( - `./data/uploads/shares/${shareId}/${file.id}.tmp-chunk`, - `./data/uploads/shares/${shareId}/${file.id}` + `${SHARE_DIRECTORY}/${shareId}/${file.id}.tmp-chunk`, + `${SHARE_DIRECTORY}/${shareId}/${file.id}` ); const fileSize = fs.statSync( - `./data/uploads/shares/${shareId}/${file.id}` + `${SHARE_DIRECTORY}/${shareId}/${file.id}` ).size; await this.prisma.file.create({ data: { @@ -111,9 +112,7 @@ export class FileService { if (!fileMetaData) throw new NotFoundException("File not found"); - const file = fs.createReadStream( - `./data/uploads/shares/${shareId}/${fileId}` - ); + const file = fs.createReadStream(`${SHARE_DIRECTORY}/${shareId}/${fileId}`); return { metaData: { @@ -126,13 +125,13 @@ export class FileService { } async deleteAllFiles(shareId: string) { - await fs.promises.rm(`./data/uploads/shares/${shareId}`, { + await fs.promises.rm(`${SHARE_DIRECTORY}/${shareId}`, { recursive: true, force: true, }); } getZip(shareId: string) { - return fs.createReadStream(`./data/uploads/shares/${shareId}/archive.zip`); + return fs.createReadStream(`${SHARE_DIRECTORY}/${shareId}/archive.zip`); } } diff --git a/backend/src/jobs/jobs.service.ts b/backend/src/jobs/jobs.service.ts index 17beba40..3764a4a9 100644 --- a/backend/src/jobs/jobs.service.ts +++ b/backend/src/jobs/jobs.service.ts @@ -5,6 +5,7 @@ import * as moment from "moment"; import { FileService } from "src/file/file.service"; import { PrismaService } from "src/prisma/prisma.service"; import { ReverseShareService } from "src/reverseShare/reverseShare.service"; +import { SHARE_DIRECTORY } from "../constants"; @Injectable() export class JobsService { @@ -61,25 +62,25 @@ export class JobsService { let filesDeleted = 0; const shareDirectories = fs - .readdirSync("./data/uploads/shares", { withFileTypes: true }) + .readdirSync(SHARE_DIRECTORY, { withFileTypes: true }) .filter((dirent) => dirent.isDirectory()) .map((dirent) => dirent.name); for (const shareDirectory of shareDirectories) { const temporaryFiles = fs - .readdirSync(`./data/uploads/shares/${shareDirectory}`) + .readdirSync(`${SHARE_DIRECTORY}/${shareDirectory}`) .filter((file) => file.endsWith(".tmp-chunk")); for (const file of temporaryFiles) { const stats = fs.statSync( - `./data/uploads/shares/${shareDirectory}/${file}` + `${SHARE_DIRECTORY}/${shareDirectory}/${file}` ); const isOlderThanOneDay = moment(stats.mtime) .add(1, "day") .isBefore(moment()); if (isOlderThanOneDay) { - fs.rmSync(`./data/uploads/shares/${shareDirectory}/${file}`); + fs.rmSync(`${SHARE_DIRECTORY}/${shareDirectory}/${file}`); filesDeleted++; } } diff --git a/backend/src/main.ts b/backend/src/main.ts index c9bf1734..d019c076 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -6,6 +6,7 @@ import * as bodyParser from "body-parser"; import * as cookieParser from "cookie-parser"; import * as fs from "fs"; import { AppModule } from "./app.module"; +import { DATA_DIRECTORY } from "./constants"; async function bootstrap() { const app = await NestFactory.create(AppModule); @@ -16,7 +17,9 @@ async function bootstrap() { app.use(cookieParser()); app.set("trust proxy", true); - await fs.promises.mkdir("./data/uploads/_temp", { recursive: true }); + await fs.promises.mkdir(`${DATA_DIRECTORY}/uploads/_temp`, { + recursive: true, + }); app.setGlobalPrefix("api"); @@ -30,6 +33,6 @@ async function bootstrap() { SwaggerModule.setup("api/swagger", app, document); } - await app.listen(process.env.PORT || 8080); + await app.listen(parseInt(process.env.PORT) || 8080); } bootstrap(); diff --git a/backend/src/prisma/prisma.service.ts b/backend/src/prisma/prisma.service.ts index 5a1aa8c2..7295e1ec 100644 --- a/backend/src/prisma/prisma.service.ts +++ b/backend/src/prisma/prisma.service.ts @@ -1,5 +1,6 @@ import { Injectable } from "@nestjs/common"; import { PrismaClient } from "@prisma/client"; +import { DATABASE_URL } from "../constants"; @Injectable() export class PrismaService extends PrismaClient { @@ -7,9 +8,7 @@ export class PrismaService extends PrismaClient { super({ datasources: { db: { - url: - process.env.DATABASE_URL || - "file:../data/pingvin-share.db?connection_limit=1", + url: DATABASE_URL, }, }, }); diff --git a/backend/src/share/share.service.ts b/backend/src/share/share.service.ts index f9f3d900..43927cc7 100644 --- a/backend/src/share/share.service.ts +++ b/backend/src/share/share.service.ts @@ -16,6 +16,7 @@ import { EmailService } from "src/email/email.service"; import { FileService } from "src/file/file.service"; import { PrismaService } from "src/prisma/prisma.service"; import { ReverseShareService } from "src/reverseShare/reverseShare.service"; +import { SHARE_DIRECTORY } from "../constants"; import { CreateShareDTO } from "./dto/createShare.dto"; @Injectable() @@ -65,7 +66,7 @@ export class ShareService { } } - fs.mkdirSync(`./data/uploads/shares/${share.id}`, { + fs.mkdirSync(`${SHARE_DIRECTORY}/${share.id}`, { recursive: true, }); @@ -99,7 +100,7 @@ export class ShareService { } async createZip(shareId: string) { - const path = `./data/uploads/shares/${shareId}`; + const path = `${SHARE_DIRECTORY}/${shareId}`; const files = await this.prisma.file.findMany({ where: { shareId } }); const archive = archiver("zip", {