From ede8ed4b715a0167a63edcc15cdc5d4c644356c5 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Sat, 7 Aug 2021 13:15:35 +0200 Subject: [PATCH] :sparkles: icons + banners route --- package-lock.json | Bin 52718 -> 119374 bytes package.json | 2 ++ src/Server.ts | 15 +++++---------- src/routes/attachments.ts | 2 +- src/routes/avatars.ts | 6 +++--- src/start.ts | 22 ++++++++++++++-------- src/util/multer.ts | 10 ++++++++++ 7 files changed, 35 insertions(+), 22 deletions(-) create mode 100644 src/util/multer.ts diff --git a/package-lock.json b/package-lock.json index a12b2477a582446453efe6ced4da4dcf71278ec4..78f760abc606de8b1d888c98348506e4c328aabe 100644 GIT binary patch delta 16086 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

!ZS78Pt_z^Y=3;yg; z3p~7UI(&+1LR;r)VZj|caDDavAHwB%2!krJ9r8G){1Bq>S5UDW>_$nwwa-|v6Y}VY z0e*4kw)`j#Nc8<2;i60q)MkL~>$LDKI^d8S>I57!8?Oi0Bi;`I0es z5!sT-tb<_9);}yh;=q4D_z!i~D7&8@KO_rJf^Qzo6Wa}v z4#`_{^A4T63|MD8{E|$7-+uVQRP*9tC*hL21uIw|)kpK$iWdFUBeOKp00))B`U57E zg8%mcJ%409Y)JLaucX;bDvB{J? zoSvohM9w|_aZFhlMZA4PpUHu$XyyC0aPbMT(s<@c=Vg#Ov3KoH`1REs{y-{$!Q3PB zMWNsHqXs2!HS``u9#2p@Qx!sy50jN>a*t#sM|g>XS_(Jhz5k;`ppPzvgKG>LJM@qX zV9V2@yZGH}=0deK4ZeIj8NNK64%tT&%hY2im2%9gqq3Iep#7Leb6FJR${&BC8o=7} zl^t-YbJR5Q8)*(hnD&i3Pc_fHBNYb73VwyfWbw1})zzz_I78#J?}vJQ9KgrTGDmWg<(5v*mAgH8NpachF4p<)*yiz?} zdt3`&KEEwh?v=vb*^A)z7v9E1a{tt&&UkfP;Deujl_m*{INHVIa{h(mCuK9}mrU>< zgbu7-)ApaXz;|A3m2t5B#a|=j^sxG+h0@e2`aK5k=Y)aAMT`YdT_o}=7(7=Gc9yqu^*zOH0h_JeZ>y@dZW!3o)mO|g>)JhQ z+uNF}+S>!wHEY_*&7CbJHQj3p8!BDwW?O3m(cjAUdIMVunVv$<+1S%#ZLex9Z4bDu z1*}jTQN52rXgGn&1GCd20~kN!rM+WywC7&i5EI{&pTn$EV%+!5sazTV46n;w>EwAJ6D?!NI z!q8sri1+JRasP6^lgop$j5xS4Wqy!J{&fSq(>q(UD_FMeuQMW0jiupa^A%}0f#Krp z%87-(OKvuSjg4~>#^GFQhsc&I)FBd_?<`Nc3iZmUm0mYrkCb0Rt*baHiNEDDox4;8cN{{9WO9u5K0 oO}7JF0qO>~HDv)d47a6n0oNe6kCOo$0k^)C0T(y7%FF?T1?v1ByZ`_I diff --git a/package.json b/package.json index e63787b94..97033983e 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "express": "^4.17.1", "express-async-errors": "^3.1.1", "file-type": "^16.5.0", + "fs-extra": "^10.0.0", "image-size": "^1.0.0", "lambert-db": "^1.2.3", "lambert-server": "^1.2.8", @@ -42,6 +43,7 @@ "@types/btoa": "^1.2.3", "@types/dotenv": "^8.2.0", "@types/express": "^4.17.12", + "@types/fs-extra": "^9.0.12", "@types/multer": "^1.4.7", "@types/node": "^14.17.0", "@types/node-fetch": "^2.5.7", diff --git a/src/Server.ts b/src/Server.ts index 57dfa5364..9996f07af 100644 --- a/src/Server.ts +++ b/src/Server.ts @@ -1,7 +1,7 @@ import { Server, ServerOptions } from "lambert-server"; import { Config, db } from "@fosscord/server-util"; import path from "path"; -import multerConfig from "multer"; +import avatarsRoute from "./routes/avatars"; export interface CDNServerOptions extends ServerOptions {} @@ -20,6 +20,10 @@ export class CDNServer extends Server { console.log("[Database] connected"); await this.registerRoutes(path.join(__dirname, "routes/")); + this.app.use("/icons/", avatarsRoute); + this.log("info", "[Server] Route /icons registered"); + this.app.use("/banners/", avatarsRoute); + this.log("info", "[Server] Route /banners registered"); return super.start(); } @@ -27,12 +31,3 @@ export class CDNServer extends Server { return super.stop(); } } - -export const multer = multerConfig({ - storage: multerConfig.memoryStorage(), - limits: { - fields: 10, - files: 10, - fileSize: 1024 * 1024 * 100, // 100 mb - }, -}); diff --git a/src/routes/attachments.ts b/src/routes/attachments.ts index 9d43a9217..9d208485a 100644 --- a/src/routes/attachments.ts +++ b/src/routes/attachments.ts @@ -3,7 +3,7 @@ import { Config, Snowflake } from "@fosscord/server-util"; import { storage } from "../util/Storage"; import FileType from "file-type"; import { HTTPError } from "lambert-server"; -import { multer } from "../Server"; +import { multer } from "../util/multer"; import imageSize from "image-size"; const router = Router(); diff --git a/src/routes/avatars.ts b/src/routes/avatars.ts index fea7c5f48..476daacd0 100644 --- a/src/routes/avatars.ts +++ b/src/routes/avatars.ts @@ -3,7 +3,7 @@ import { Config, Snowflake } from "@fosscord/server-util"; import { storage } from "../util/Storage"; import FileType from "file-type"; import { HTTPError } from "lambert-server"; -import { multer } from "../Server"; +import { multer } from "../util/multer"; import crypto from "crypto"; // TODO: check premium and animated pfp are allowed in the config @@ -13,7 +13,7 @@ import crypto from "crypto"; // TODO: check request signature for modify methods const ANIMATED_MIME_TYPES = ["image/apng", "image/gif", "image/gifv"]; -const STATIC_MIME_TYPES = ["image/png", "image/jpeg", "image/webp"]; +const STATIC_MIME_TYPES = ["image/png", "image/jpeg", "image/webp", "image/svg+xml", "image/svg"]; const ALLOWED_MIME_TYPES = [...ANIMATED_MIME_TYPES, ...STATIC_MIME_TYPES]; const router = Router(); @@ -38,7 +38,7 @@ router.post("/:user_id", multer.single("file"), async (req: Request, res: Respon id, content_type: type.mime, size, - url: `${endpoint}/path`, + url: `${endpoint}${req.baseUrl}/${user_id}/${id}`, }); }); diff --git a/src/start.ts b/src/start.ts index 822a749fb..57c9f7048 100644 --- a/src/start.ts +++ b/src/start.ts @@ -1,17 +1,23 @@ +import path from "path"; import dotenv from "dotenv"; +import fse from "fs-extra"; dotenv.config(); -import { CDNServer } from "./Server"; - -if (process.env.STORAGE_LOCATION) { - if (!process.env.STORAGE_LOCATION.startsWith("/")) { - process.env.STORAGE_LOCATION = __dirname + "/../" + process.env.STORAGE_LOCATION; +if (!process.env.STORAGE_PROVIDER) process.env.STORAGE_PROVIDER = "file"; +// TODO:nodejs path.join trailing slash windows compatible +if (process.env.STORAGE_PROVIDER === "file") { + if (process.env.STORAGE_LOCATION) { + if (!process.env.STORAGE_LOCATION.startsWith("/")) { + process.env.STORAGE_LOCATION = path.join(__dirname, "..", process.env.STORAGE_LOCATION, "/"); + } + } else { + process.env.STORAGE_LOCATION = path.join(__dirname, "..", "files", "/"); } -} else { - process.env.STORAGE_LOCATION = __dirname + "/../files/"; - process.env.STORAGE_PROVIDER = "file"; + fse.ensureDirSync(process.env.STORAGE_LOCATION); } +import { CDNServer } from "./Server"; + const server = new CDNServer({ port: Number(process.env.PORT) || 3003 }); server .start() diff --git a/src/util/multer.ts b/src/util/multer.ts new file mode 100644 index 000000000..bfdf6affb --- /dev/null +++ b/src/util/multer.ts @@ -0,0 +1,10 @@ +import multerConfig from "multer"; + +export const multer = multerConfig({ + storage: multerConfig.memoryStorage(), + limits: { + fields: 10, + files: 10, + fileSize: 1024 * 1024 * 100, // 100 mb + }, +});