diff --git a/api/.env.example b/api/.env.example index 0573c605..5974f628 100644 --- a/api/.env.example +++ b/api/.env.example @@ -1,4 +1,8 @@ MONGO_URL=mongodb://localhost/fosscord PORT=3001 PRODUCTION=TRUE -THREADS=# automatically use all available cores, only available if production = true \ No newline at end of file +THREADS=# automatically use all available cores, only available if production = true +#LOG_REQUESTS= +# only log 200 and 204: LOG_REQUESTS=200 204 +# log everything except 200 and 204: LOG_REQUESTS=-200 204 +# log all requests: LOG_REQUESTS=- \ No newline at end of file diff --git a/api/package-lock.json b/api/package-lock.json index a4ad6b2b..aa0c07c5 100644 Binary files a/api/package-lock.json and b/api/package-lock.json differ diff --git a/api/package.json b/api/package.json index 3be75f68..9701e12d 100644 --- a/api/package.json +++ b/api/package.json @@ -84,6 +84,7 @@ "missing-native-js-functions": "^1.2.18", "morgan": "^1.10.0", "multer": "^1.4.2", + "nanocolors": "^0.2.13", "node-fetch": "^2.6.1", "patch-package": "^6.4.7", "proxy-agent": "^5.0.0", diff --git a/api/scripts/droptables.sql b/api/scripts/droptables.sql index cabb9f31..57d1b271 100644 --- a/api/scripts/droptables.sql +++ b/api/scripts/droptables.sql @@ -26,5 +26,6 @@ DROP TABLE webhooks; DROP TABLE channels; DROP TABLE members; DROP TABLE guilds; +DROP TABLE client_relase; -- DROP TABLE users; -- DROP TABLE config; \ No newline at end of file diff --git a/api/src/Server.ts b/api/src/Server.ts index c16bac5c..259c2a6b 100644 --- a/api/src/Server.ts +++ b/api/src/Server.ts @@ -12,6 +12,7 @@ import { initTranslation } from "./middlewares/Translation"; import morgan from "morgan"; import { initInstance } from "./util/Instance"; import { registerRoutes } from "@fosscord/util"; +import { red } from "nanocolors" export interface FosscordServerOptions extends ServerOptions {} @@ -38,17 +39,6 @@ export class FosscordServer extends Server { await initEvent(); await initInstance(); - /* - DOCUMENTATION: uses LOG_REQUESTS environment variable - - # only log 200 and 204 - LOG_REQUESTS=200 204 - # log everything except 200 and 204 - LOG_REQUESTS=-200 204 - # log all requests - LOG_REQUESTS=- - */ - let logRequests = process.env["LOG_REQUESTS"] != undefined; if (logRequests) { this.app.use( @@ -60,7 +50,7 @@ export class FosscordServer extends Server { } }) ); - } + }; this.app.use(CORS); this.app.use(BodyParser({ inflate: true, limit: "10mb" })); @@ -85,19 +75,20 @@ export class FosscordServer extends Server { }); this.app = app; + + //app.use("/__development", ) + //app.use("/__internals", ) app.use("/api/v6", api); app.use("/api/v7", api); app.use("/api/v8", api); app.use("/api/v9", api); app.use("/api", api); // allow unversioned requests + this.app.use(ErrorHandler); TestClient(this.app); - if (logRequests) { - console.log( - "Warning: Request logging is enabled! This will spam your console!\nTo disable this, unset the 'LOG_REQUESTS' environment variable!" - ); - } + if (logRequests) console.log(red(`Warning: Request logging is enabled! This will spam your console!\nTo disable this, unset the 'LOG_REQUESTS' environment variable!`)); + return super.start(); } -} +}; \ No newline at end of file diff --git a/api/src/middlewares/Authentication.ts b/api/src/middlewares/Authentication.ts index 20ba42d8..429cf11e 100644 --- a/api/src/middlewares/Authentication.ts +++ b/api/src/middlewares/Authentication.ts @@ -3,25 +3,27 @@ import { HTTPError } from "lambert-server"; import { checkToken, Config, Rights } from "@fosscord/util"; export const NO_AUTHORIZATION_ROUTES = [ - //Authentication routes + // Authentication routes "/auth/login", "/auth/register", "/auth/location-metadata", - //Routes with a seperate auth system + // Routes with a seperate auth system "/webhooks/", - //Public information endpoints + // Public information endpoints "/ping", "/gateway", "/experiments", - //Public kubernetes integration + "/updates", + "/downloads/", + // Public kubernetes integration "/-/readyz", "/-/healthz", - //Client nalytics + // Client analytics "/science", "/track", - //Public policy pages + // Public policy pages "/policies/instance", - //Asset delivery + // Asset delivery /\/guilds\/\d+\/widget\.(json|png)/ ]; diff --git a/api/src/routes/downloads.ts b/api/src/routes/downloads.ts new file mode 100644 index 00000000..de261702 --- /dev/null +++ b/api/src/routes/downloads.ts @@ -0,0 +1,19 @@ +import { Router, Response, Request } from "express"; +import { route } from "@fosscord/api"; +import { Relase, Config } from "@fosscord/util"; + +const router = Router(); + +router.get("/:branch", route({}), async (req: Request, res: Response) => { + const { client } = Config.get(); + const { branch } = req.params; + const { platform } = req.query; + + if(!platform || !["linux", "osx", "win"].includes(platform.toString())) return res.status(404) + + const relase = await Relase.findOneOrFail({ name: client.relases.upstreamVersion }); + + res.redirect(relase[`win_url`]); +}); + +export default router; diff --git a/api/src/routes/updates.ts b/api/src/routes/updates.ts new file mode 100644 index 00000000..4682ce7c --- /dev/null +++ b/api/src/routes/updates.ts @@ -0,0 +1,20 @@ +import { Router, Response, Request } from "express"; +import { route } from "@fosscord/api"; +import { Config, Relase } from "@fosscord/util"; + +const router = Router(); + +router.get("/", route({}), async (req: Request, res: Response) => { + const { client } = Config.get(); + + const relase = await Relase.findOneOrFail({ name: client.relases.upstreamVersion}) + + res.json({ + name: relase.name, + pub_date: relase.pub_date, + url: relase.url, + notes: relase.notes + }); +}); + +export default router; diff --git a/util/src/entities/Config.ts b/util/src/entities/Config.ts index 99e3537c..2d003c99 100644 --- a/util/src/entities/Config.ts +++ b/util/src/entities/Config.ts @@ -181,6 +181,10 @@ export interface ConfigValue { }, client: { useTestClient: Boolean; + relases: { + useLocalRelases: Boolean; //TODO + upstreamVersion: string; + } }, metrics: { timeout: number; @@ -365,7 +369,11 @@ export const DefaultConfigOptions: ConfigValue = { allowRaws: false }, client: { - useTestClient: true + useTestClient: true, + relases: { + useLocalRelases: true, + upstreamVersion: "0.0.264" + } }, metrics: { timeout: 30000 diff --git a/util/src/entities/clientRelase.ts b/util/src/entities/clientRelase.ts new file mode 100644 index 00000000..e021b82b --- /dev/null +++ b/util/src/entities/clientRelase.ts @@ -0,0 +1,26 @@ +import { Column, Entity} from "typeorm"; +import { BaseClass } from "./BaseClass"; + +@Entity("client_relase") +export class Relase extends BaseClass { + @Column() + name: string; + + @Column() + pub_date: string; + + @Column() + url: string; + + @Column() + deb_url: string; + + @Column() + osx_url: string; + + @Column() + win_url: string; + + @Column({ nullable: true }) + notes?: string; +} diff --git a/util/src/entities/index.ts b/util/src/entities/index.ts index b52841c9..fdf18f23 100644 --- a/util/src/entities/index.ts +++ b/util/src/entities/index.ts @@ -26,3 +26,4 @@ export * from "./Template"; export * from "./User"; export * from "./VoiceState"; export * from "./Webhook"; +export * from "./clientRelase"; \ No newline at end of file