diff --git a/src/api/middlewares/BodyParser.ts b/src/api/middlewares/BodyParser.ts index 34433aeb2..60aac11e6 100644 --- a/src/api/middlewares/BodyParser.ts +++ b/src/api/middlewares/BodyParser.ts @@ -37,8 +37,7 @@ export function BodyParser(opts?: OptionsJson) { const jsonParser = bodyParser.json(opts); return (req: Request, res: Response, next: NextFunction) => { - if (!req.headers["content-type"]) - req.headers["content-type"] = "application/json"; + if (!req.headers["content-type"]) req.headers["content-type"] = "application/json"; jsonParser(req, res, (err) => { if (err) { diff --git a/src/api/middlewares/ErrorHandler.ts b/src/api/middlewares/ErrorHandler.ts index 3255ff3e7..cd306c9c3 100644 --- a/src/api/middlewares/ErrorHandler.ts +++ b/src/api/middlewares/ErrorHandler.ts @@ -21,12 +21,7 @@ import { HTTPError } from "lambert-server"; import { ApiError, FieldError } from "@spacebar/util"; const EntityNotFoundErrorRegex = /"(\w+)"/; -export function ErrorHandler( - error: Error & { type?: string }, - req: Request, - res: Response, - next: NextFunction, -) { +export function ErrorHandler(error: Error & { type?: string }, req: Request, res: Response, next: NextFunction) { if (!error) return next(); try { @@ -36,16 +31,13 @@ export function ErrorHandler( let errors = undefined; let _ajvErrors = undefined; - if (error instanceof HTTPError && error.code) - code = httpcode = error.code; + if (error instanceof HTTPError && error.code) code = httpcode = error.code; else if (error instanceof ApiError) { code = error.code; message = error.message; httpcode = error.httpStatus; } else if (error.name === "EntityNotFoundError") { - message = `${ - error.message.match(EntityNotFoundErrorRegex)?.[1] || "Item" - } could not be found`; + message = `${error.message.match(EntityNotFoundErrorRegex)?.[1] || "Item"} could not be found`; code = httpcode = 404; } else if (error instanceof FieldError) { code = Number(error.code); @@ -58,12 +50,7 @@ export function ErrorHandler( code = 50109; message = "The request body contains invalid JSON."; } else { - console.error( - `[Error] ${code} ${req.url}\n`, - errors || error, - "\nbody:", - req.body, - ); + console.error(`[Error] ${code} ${req.url}\n`, errors || error, "\nbody:", req.body); if (req.server?.options?.production) { // don't expose internal errors to the user, instead human errors should be thrown as HTTPError @@ -77,8 +64,6 @@ export function ErrorHandler( res.status(httpcode).json({ code: code, message, errors, _ajvErrors }); } catch (error) { console.error(`[Internal Server Error] 500`, error); - return res - .status(500) - .json({ code: 500, message: "Internal Server Error" }); + return res.status(500).json({ code: 500, message: "Internal Server Error" }); } } diff --git a/src/api/middlewares/ImageProxy.ts b/src/api/middlewares/ImageProxy.ts index d87a8de91..b1cb568d0 100644 --- a/src/api/middlewares/ImageProxy.ts +++ b/src/api/middlewares/ImageProxy.ts @@ -32,23 +32,8 @@ try { let sentImageProxyWarning = false; -const sharpSupported = new Set([ - "image/jpeg", - "image/png", - "image/bmp", - "image/tiff", - "image/gif", - "image/webp", - "image/avif", - "image/svg+xml", -]); -const jimpSupported = new Set([ - "image/jpeg", - "image/png", - "image/bmp", - "image/tiff", - "image/gif", -]); +const sharpSupported = new Set(["image/jpeg", "image/png", "image/bmp", "image/tiff", "image/gif", "image/webp", "image/avif", "image/svg+xml"]); +const jimpSupported = new Set(["image/jpeg", "image/png", "image/bmp", "image/tiff", "image/gif"]); const resizeSupported = new Set([...sharpSupported, ...jimpSupported]); export async function ImageProxy(req: Request, res: Response) { @@ -63,15 +48,9 @@ export async function ImageProxy(req: Request, res: Response) { .replace(/\//g, "_"); try { - if (!crypto.timingSafeEqual(Buffer.from(hash), Buffer.from(path[0]))) - throw new Error("Invalid signature"); + if (!crypto.timingSafeEqual(Buffer.from(hash), Buffer.from(path[0]))) throw new Error("Invalid signature"); } catch { - console.log( - "[ImageProxy] Invalid signature, expected " + - hash + - " but got " + - path[0], - ); + console.log("[ImageProxy] Invalid signature, expected " + hash + " but got " + path[0]); res.status(403).send("Invalid signature"); return; } @@ -91,30 +70,18 @@ export async function ImageProxy(req: Request, res: Response) { if (!request) return; if (request.status !== 200) { - res.status(request.status).send( - "Origin failed to respond: " + - request.status + - " " + - request.statusText, - ); + res.status(request.status).send("Origin failed to respond: " + request.status + " " + request.statusText); return; } - if ( - !request.headers.get("Content-Type") || - !request.headers.get("Content-Length") - ) { - res.status(500).send( - "Origin did not provide a Content-Type or Content-Length header", - ); + if (!request.headers.get("Content-Type") || !request.headers.get("Content-Length")) { + res.status(500).send("Origin did not provide a Content-Type or Content-Length header"); return; } // @ts-expect-error TS doesn't believe that the header cannot be null (it's checked for falsiness above) if (parseInt(request.headers.get("Content-Length")) > 1024 * 1024 * 10) { - res.status(500).send( - "Origin provided a Content-Length header that is too large", - ); + res.status(500).send("Origin provided a Content-Length header that is too large"); return; } @@ -124,11 +91,7 @@ export async function ImageProxy(req: Request, res: Response) { const arrayBuffer = await request.arrayBuffer(); let resultBuffer = Buffer.from(arrayBuffer); - if ( - !sentImageProxyWarning && - resizeSupported.has(contentType) && - /^\d+x\d+$/.test(path[1]) - ) { + if (!sentImageProxyWarning && resizeSupported.has(contentType) && /^\d+x\d+$/.test(path[1])) { if (sharp !== false) { try { sharp = await import("sharp"); @@ -144,11 +107,7 @@ export async function ImageProxy(req: Request, res: Response) { Jimp = await import("jimp"); } catch { sentImageProxyWarning = true; - console.log( - `[ImageProxy] ${yellow( - 'Neither "sharp" or "jimp" NPM packages are installed, image resizing will be disabled', - )}`, - ); + console.log(`[ImageProxy] ${yellow('Neither "sharp" or "jimp" NPM packages are installed, image resizing will be disabled')}`); } } @@ -177,10 +136,7 @@ export async function ImageProxy(req: Request, res: Response) { } res.header("Content-Type", contentType); - res.setHeader( - "Cache-Control", - "public, max-age=" + Config.get().cdn.proxyCacheHeaderSeconds, - ); + res.setHeader("Cache-Control", "public, max-age=" + Config.get().cdn.proxyCacheHeaderSeconds); res.send(resultBuffer); } diff --git a/src/api/middlewares/Translation.ts b/src/api/middlewares/Translation.ts index f3a4c8dfe..e089407e2 100644 --- a/src/api/middlewares/Translation.ts +++ b/src/api/middlewares/Translation.ts @@ -27,12 +27,8 @@ const ASSET_FOLDER_PATH = path.join(__dirname, "..", "..", "..", "assets"); export async function initTranslation(router: Router) { const languages = fs.readdirSync(path.join(ASSET_FOLDER_PATH, "locales")); - const namespaces = fs.readdirSync( - path.join(ASSET_FOLDER_PATH, "locales", "en"), - ); - const ns = namespaces - .filter((x) => x.endsWith(".json")) - .map((x) => x.slice(0, x.length - 5)); + const namespaces = fs.readdirSync(path.join(ASSET_FOLDER_PATH, "locales", "en")); + const ns = namespaces.filter((x) => x.endsWith(".json")).map((x) => x.slice(0, x.length - 5)); await i18next .use(i18nextBackend) @@ -43,9 +39,7 @@ export async function initTranslation(router: Router) { fallbackLng: "en", ns, backend: { - loadPath: - path.join(ASSET_FOLDER_PATH, "locales") + - "/{{lng}}/{{ns}}.json", + loadPath: path.join(ASSET_FOLDER_PATH, "locales") + "/{{lng}}/{{ns}}.json", }, load: "all", }); diff --git a/src/api/routes/applications/#application_id/bot/index.ts b/src/api/routes/applications/#application_id/bot/index.ts index db1d02538..e6f1522cc 100644 --- a/src/api/routes/applications/#application_id/bot/index.ts +++ b/src/api/routes/applications/#application_id/bot/index.ts @@ -17,18 +17,11 @@ */ import { route } from "@spacebar/api"; -import { - Application, - DiscordApiErrors, - User, - createAppBotUser, - generateToken, - handleFile, -} from "@spacebar/util"; +import { Application, DiscordApiErrors, User, createAppBotUser, generateToken, handleFile } from "@spacebar/util"; import { Request, Response, Router } from "express"; import { HTTPError } from "lambert-server"; import { verifyToken } from "node-2fa"; -import { BotModifySchema } from "@spacebar/schemas" +import { BotModifySchema } from "@spacebar/schemas"; const router: Router = Router({ mergeParams: true }); @@ -50,8 +43,7 @@ router.post( relations: ["owner"], }); - if (app.owner.id != req.user_id) - throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION; + if (app.owner.id != req.user_id) throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION; const user = await createAppBotUser(app, req); @@ -77,8 +69,7 @@ router.post( const bot = await User.findOneOrFail({ where: { id: req.params.application_id } }); const owner = await User.findOneOrFail({ where: { id: req.user_id } }); - if (owner.id != req.user_id) - throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION; + if (owner.id != req.user_id) throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION; if ( owner.totp_secret && @@ -120,14 +111,9 @@ router.patch( if (!app.bot) throw DiscordApiErrors.BOT_ONLY_ENDPOINT; - if (app.owner.id != req.user_id) - throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION; + if (app.owner.id != req.user_id) throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION; - if (body.avatar) - body.avatar = await handleFile( - `/avatars/${app.id}`, - body.avatar as string, - ); + if (body.avatar) body.avatar = await handleFile(`/avatars/${app.id}`, body.avatar as string); app.bot.assign(body); diff --git a/src/api/routes/applications/@me.ts b/src/api/routes/applications/@me.ts index 773a48278..f4a909762 100644 --- a/src/api/routes/applications/@me.ts +++ b/src/api/routes/applications/@me.ts @@ -17,16 +17,11 @@ */ import { route } from "@spacebar/api"; -import { - Application, - DiscordApiErrors, - Guild, - handleFile, -} from "@spacebar/util"; +import { Application, DiscordApiErrors, Guild, handleFile } from "@spacebar/util"; import { Request, Response, Router } from "express"; import { HTTPError } from "lambert-server"; import { verifyToken } from "node-2fa"; -import { ApplicationModifySchema } from "@spacebar/schemas" +import { ApplicationModifySchema } from "@spacebar/schemas"; const router: Router = Router({ mergeParams: true }); @@ -75,16 +70,10 @@ router.patch( }); if (body.icon) { - body.icon = await handleFile( - `/app-icons/${app.id}`, - body.icon as string, - ); + body.icon = await handleFile(`/app-icons/${app.id}`, body.icon as string); } if (body.cover_image) { - body.cover_image = await handleFile( - `/app-icons/${app.id}`, - body.cover_image as string, - ); + body.cover_image = await handleFile(`/app-icons/${app.id}`, body.cover_image as string); } if (body.guild_id) { @@ -92,11 +81,7 @@ router.patch( where: { id: body.guild_id }, select: ["owner_id"], }); - if (guild.owner_id != req.user_id) - throw new HTTPError( - "You must be the owner of the guild to link it to an application", - 400, - ); + if (guild.owner_id != req.user_id) throw new HTTPError("You must be the owner of the guild to link it to an application", 400); } if (app.bot) { diff --git a/src/api/routes/applications/detectable.ts b/src/api/routes/applications/detectable.ts index d36d17b7d..4de8a78d2 100644 --- a/src/api/routes/applications/detectable.ts +++ b/src/api/routes/applications/detectable.ts @@ -23,8 +23,8 @@ import { ApplicationDetectableResponse } from "@spacebar/schemas"; const router: Router = Router({ mergeParams: true }); const cache = { data: {}, - expires: 0 -} + expires: 0, +}; router.get( "/", diff --git a/src/api/routes/applications/index.ts b/src/api/routes/applications/index.ts index 77f02fc1b..e3b270c32 100644 --- a/src/api/routes/applications/index.ts +++ b/src/api/routes/applications/index.ts @@ -17,15 +17,9 @@ */ import { route } from "@spacebar/api"; -import { - Application, - Config, - User, - createAppBotUser, - trimSpecial, -} from "@spacebar/util"; +import { Application, Config, User, createAppBotUser, trimSpecial } from "@spacebar/util"; import { Request, Response, Router } from "express"; -import { ApplicationCreateSchema } from "@spacebar/schemas" +import { ApplicationCreateSchema } from "@spacebar/schemas"; const router: Router = Router({ mergeParams: true }); diff --git a/src/api/routes/attachments/refresh-urls.ts b/src/api/routes/attachments/refresh-urls.ts index 76954c779..92a7dd165 100644 --- a/src/api/routes/attachments/refresh-urls.ts +++ b/src/api/routes/attachments/refresh-urls.ts @@ -17,12 +17,9 @@ */ import { route } from "@spacebar/api"; -import { - getUrlSignature, - NewUrlSignatureData, -} from "@spacebar/util"; +import { getUrlSignature, NewUrlSignatureData } from "@spacebar/util"; import { Request, Response, Router } from "express"; -import { RefreshUrlsRequestSchema } from "@spacebar/schemas" +import { RefreshUrlsRequestSchema } from "@spacebar/schemas"; const router = Router({ mergeParams: true }); router.post( diff --git a/src/api/routes/auth/generate-registration-tokens.ts b/src/api/routes/auth/generate-registration-tokens.ts index 387375ae1..be9329530 100644 --- a/src/api/routes/auth/generate-registration-tokens.ts +++ b/src/api/routes/auth/generate-registration-tokens.ts @@ -29,13 +29,11 @@ router.get( query: { count: { type: "number", - description: - "The number of registration tokens to generate. Defaults to 1.", + description: "The number of registration tokens to generate. Defaults to 1.", }, length: { type: "number", - description: - "The length of each registration token. Defaults to 255.", + description: "The length of each registration token. Defaults to 255.", }, }, right: "CREATE_REGISTRATION_TOKENS", @@ -43,20 +41,14 @@ router.get( }), async (req: Request, res: Response) => { const count = req.query.count ? parseInt(req.query.count as string) : 1; - const length = req.query.length - ? parseInt(req.query.length as string) - : 255; + const length = req.query.length ? parseInt(req.query.length as string) : 255; const tokens: ValidRegistrationToken[] = []; for (let i = 0; i < count; i++) { const token = ValidRegistrationToken.create({ token: randomString(length), - expires_at: new Date( - Date.now() + - Config.get().security - .defaultRegistrationTokenExpiration, - ), + expires_at: new Date(Date.now() + Config.get().security.defaultRegistrationTokenExpiration), }); tokens.push(token); } @@ -68,14 +60,7 @@ router.get( transaction: false, }); - const ret = req.query.include_url - ? tokens.map( - (x) => - `${Config.get().general.frontPage}/register?token=${ - x.token - }`, - ) - : tokens.map((x) => x.token); + const ret = req.query.include_url ? tokens.map((x) => `${Config.get().general.frontPage}/register?token=${x.token}`) : tokens.map((x) => x.token); if (req.query.plain) return res.send(ret.join("\n")); diff --git a/src/api/routes/auth/mfa/totp.ts b/src/api/routes/auth/mfa/totp.ts index cc6e8a253..edf307cc2 100644 --- a/src/api/routes/auth/mfa/totp.ts +++ b/src/api/routes/auth/mfa/totp.ts @@ -21,7 +21,7 @@ import { BackupCode, User, generateToken } from "@spacebar/util"; import { Request, Response, Router } from "express"; import { HTTPError } from "lambert-server"; import { verifyToken } from "node-2fa"; -import { TotpSchema } from "@spacebar/schemas" +import { TotpSchema } from "@spacebar/schemas"; const router = Router({ mergeParams: true }); router.post( @@ -60,11 +60,7 @@ router.post( if (!backup) { const ret = verifyToken(user.totp_secret || "", code); - if (!ret || ret.delta != 0) - throw new HTTPError( - req.t("auth:login.INVALID_TOTP_CODE"), - 60008, - ); + if (!ret || ret.delta != 0) throw new HTTPError(req.t("auth:login.INVALID_TOTP_CODE"), 60008); } else { backup.consumed = true; await backup.save(); diff --git a/src/api/routes/auth/mfa/webauthn.ts b/src/api/routes/auth/mfa/webauthn.ts index 80ff57f0f..63b1335d9 100644 --- a/src/api/routes/auth/mfa/webauthn.ts +++ b/src/api/routes/auth/mfa/webauthn.ts @@ -17,17 +17,11 @@ */ import { route } from "@spacebar/api"; -import { - generateToken, - SecurityKey, - User, - verifyWebAuthnToken, - WebAuthn, -} from "@spacebar/util"; +import { generateToken, SecurityKey, User, verifyWebAuthnToken, WebAuthn } from "@spacebar/util"; import { Request, Response, Router } from "express"; import { ExpectedAssertionResult } from "fido2-lib"; import { HTTPError } from "lambert-server"; -import { WebAuthnTotpSchema } from "@spacebar/schemas" +import { WebAuthnTotpSchema } from "@spacebar/schemas"; const router = Router({ mergeParams: true }); function toArrayBuffer(buf: Buffer) { @@ -65,46 +59,31 @@ router.post( }); const ret = await verifyWebAuthnToken(ticket); - if (!ret) - throw new HTTPError(req.t("auth:login.INVALID_TOTP_CODE"), 60008); + if (!ret) throw new HTTPError(req.t("auth:login.INVALID_TOTP_CODE"), 60008); await User.update({ id: user.id }, { totp_last_ticket: "" }); const clientAttestationResponse = JSON.parse(code); - if (!clientAttestationResponse.rawId) - throw new HTTPError("Missing rawId", 400); + if (!clientAttestationResponse.rawId) throw new HTTPError("Missing rawId", 400); - clientAttestationResponse.rawId = toArrayBuffer( - Buffer.from(clientAttestationResponse.rawId, "base64url"), - ); + clientAttestationResponse.rawId = toArrayBuffer(Buffer.from(clientAttestationResponse.rawId, "base64url")); const securityKey = await SecurityKey.findOneOrFail({ where: { - key_id: Buffer.from( - clientAttestationResponse.rawId, - "base64url", - ).toString("base64"), + key_id: Buffer.from(clientAttestationResponse.rawId, "base64url").toString("base64"), }, }); - const assertionExpectations: ExpectedAssertionResult = JSON.parse( - Buffer.from( - clientAttestationResponse.response.clientDataJSON, - "base64", - ).toString(), - ); + const assertionExpectations: ExpectedAssertionResult = JSON.parse(Buffer.from(clientAttestationResponse.response.clientDataJSON, "base64").toString()); - const authnResult = await WebAuthn.fido2.assertionResult( - clientAttestationResponse, - { - ...assertionExpectations, - factor: "second", - publicKey: securityKey.public_key, - prevCounter: securityKey.counter, - userHandle: securityKey.key_id, - }, - ); + const authnResult = await WebAuthn.fido2.assertionResult(clientAttestationResponse, { + ...assertionExpectations, + factor: "second", + publicKey: securityKey.public_key, + prevCounter: securityKey.counter, + userHandle: securityKey.key_id, + }); const counter = authnResult.authnrData.get("counter"); diff --git a/src/api/routes/auth/reset.ts b/src/api/routes/auth/reset.ts index 5cb5690d3..69f97d28a 100644 --- a/src/api/routes/auth/reset.ts +++ b/src/api/routes/auth/reset.ts @@ -17,16 +17,10 @@ */ import { route } from "@spacebar/api"; -import { - checkToken, - Email, - FieldErrors, - generateToken, - User, -} from "@spacebar/util"; +import { checkToken, Email, FieldErrors, generateToken, User } from "@spacebar/util"; import bcrypt from "bcrypt"; import { Request, Response, Router } from "express"; -import { PasswordResetSchema } from "@spacebar/schemas" +import { PasswordResetSchema } from "@spacebar/schemas"; const router = Router({ mergeParams: true }); @@ -52,7 +46,7 @@ router.post( const userTokenData = await checkToken(token, { select: ["email"], fingerprint: req.fingerprint, - ipAddress: req.ip + ipAddress: req.ip, }); user = userTokenData.user; } catch { diff --git a/src/api/routes/auth/verify/index.ts b/src/api/routes/auth/verify/index.ts index 8c636196e..43fb23a02 100644 --- a/src/api/routes/auth/verify/index.ts +++ b/src/api/routes/auth/verify/index.ts @@ -77,7 +77,7 @@ router.post( try { const userTokenData = await checkToken(token, { fingerprint: req.fingerprint, - ipAddress: req.ip + ipAddress: req.ip, }); user = userTokenData.user; } catch { diff --git a/src/api/routes/auth/verify/resend.ts b/src/api/routes/auth/verify/resend.ts index c9696ebdc..4ef1d5183 100644 --- a/src/api/routes/auth/verify/resend.ts +++ b/src/api/routes/auth/verify/resend.ts @@ -56,9 +56,7 @@ router.post( return res.sendStatus(204); }) .catch((e) => { - console.error( - `Failed to send verification email to ${user.username}#${user.discriminator}: ${e}`, - ); + console.error(`Failed to send verification email to ${user.username}#${user.discriminator}: ${e}`); throw new HTTPError("Failed to send verification email", 500); }); }, diff --git a/src/api/routes/auth/verify/view-backup-codes-challenge.ts b/src/api/routes/auth/verify/view-backup-codes-challenge.ts index 811de5084..7c15795c8 100644 --- a/src/api/routes/auth/verify/view-backup-codes-challenge.ts +++ b/src/api/routes/auth/verify/view-backup-codes-challenge.ts @@ -20,7 +20,7 @@ import { route } from "@spacebar/api"; import { FieldErrors, User } from "@spacebar/util"; import bcrypt from "bcrypt"; import { Request, Response, Router } from "express"; -import { BackupCodesChallengeSchema } from "@spacebar/schemas" +import { BackupCodesChallengeSchema } from "@spacebar/schemas"; const router = Router({ mergeParams: true }); router.post( diff --git a/src/api/routes/channels/#channel_id/attachments.ts b/src/api/routes/channels/#channel_id/attachments.ts index 4699fe408..9f865c6a7 100644 --- a/src/api/routes/channels/#channel_id/attachments.ts +++ b/src/api/routes/channels/#channel_id/attachments.ts @@ -17,15 +17,10 @@ */ import { randomString, route } from "@spacebar/api"; -import { - Channel, - Config, - Permissions, - User, -} from "@spacebar/util"; +import { Channel, Config, Permissions, User } from "@spacebar/util"; import { Request, Response, Router } from "express"; import { CloudAttachment } from "@spacebar/util"; -import { UploadAttachmentRequestSchema, UploadAttachmentResponseSchema } from "@spacebar/schemas" +import { UploadAttachmentRequestSchema, UploadAttachmentResponseSchema } from "@spacebar/schemas"; const router: Router = Router({ mergeParams: true }); @@ -91,14 +86,16 @@ router.post( }), ); - res.send({attachments: attachments.map(a => { - return { - id: a.userAttachmentId, - upload_filename: a.uploadFilename, - upload_url: `${cdnUrl}/attachments/${a.uploadFilename}`, - original_content_type: a.userOriginalContentType - } - })} as UploadAttachmentResponseSchema); + res.send({ + attachments: attachments.map((a) => { + return { + id: a.userAttachmentId, + upload_filename: a.uploadFilename, + upload_url: `${cdnUrl}/attachments/${a.uploadFilename}`, + original_content_type: a.userOriginalContentType, + }; + }), + } as UploadAttachmentResponseSchema); }, ); @@ -122,18 +119,15 @@ router.delete("/:cloud_attachment_url", async (req: Request, res: Response) => { }); } - const response = await fetch( - `${Config.get().cdn.endpointPrivate || "http://localhost:3001"}/attachments/${att.uploadFilename}`, - { - headers: { - signature: Config.get().security.requestSignature - }, - method: "DELETE", + const response = await fetch(`${Config.get().cdn.endpointPrivate}/attachments/${att.uploadFilename}`, { + headers: { + signature: Config.get().security.requestSignature, }, - ); + method: "DELETE", + }); await att.remove(); return res.status(response.status).send(response.body); }); -export default router; +export default router; \ No newline at end of file diff --git a/src/api/routes/channels/#channel_id/index.ts b/src/api/routes/channels/#channel_id/index.ts index 1535b0051..97857da6a 100644 --- a/src/api/routes/channels/#channel_id/index.ts +++ b/src/api/routes/channels/#channel_id/index.ts @@ -17,16 +17,9 @@ */ import { route } from "@spacebar/api"; -import { - Channel, - ChannelDeleteEvent, - ChannelUpdateEvent, - Recipient, - emitEvent, - handleFile, -} from "@spacebar/util"; +import { Channel, ChannelDeleteEvent, ChannelUpdateEvent, Recipient, emitEvent, handleFile } from "@spacebar/util"; import { Request, Response, Router } from "express"; -import { ChannelModifySchema, ChannelType } from "@spacebar/schemas" +import { ChannelModifySchema, ChannelType } from "@spacebar/schemas"; const router: Router = Router({ mergeParams: true }); // TODO: delete channel @@ -51,11 +44,7 @@ router.get( }); if (!channel.guild_id) return res.send(channel); - channel.position = await Channel.calculatePosition( - channel_id, - channel.guild_id, - channel.guild, - ); + channel.position = await Channel.calculatePosition(channel_id, channel.guild_id, channel.guild); return res.send(channel); }, ); @@ -145,11 +134,7 @@ router.patch( async (req: Request, res: Response) => { const payload = req.body as ChannelModifySchema; const { channel_id } = req.params; - if (payload.icon) - payload.icon = await handleFile( - `/channel-icons/${channel_id}`, - payload.icon, - ); + if (payload.icon) payload.icon = await handleFile(`/channel-icons/${channel_id}`, payload.icon); const channel = await Channel.findOneOrFail({ where: { id: channel_id }, diff --git a/src/api/routes/channels/#channel_id/invites.ts b/src/api/routes/channels/#channel_id/invites.ts index fcf6f97cd..298f42ed7 100644 --- a/src/api/routes/channels/#channel_id/invites.ts +++ b/src/api/routes/channels/#channel_id/invites.ts @@ -20,7 +20,7 @@ import { randomString, route } from "@spacebar/api"; import { Channel, Guild, Invite, InviteCreateEvent, PublicInviteRelation, User, emitEvent } from "@spacebar/util"; import { Request, Response, Router } from "express"; import { HTTPError } from "lambert-server"; -import { InviteCreateSchema, isTextChannel } from "@spacebar/schemas" +import { InviteCreateSchema, isTextChannel } from "@spacebar/schemas"; const router: Router = Router({ mergeParams: true }); diff --git a/src/api/routes/channels/#channel_id/messages/#message_id/index.ts b/src/api/routes/channels/#channel_id/messages/#message_id/index.ts index bf35dc3d2..cdba9b168 100644 --- a/src/api/routes/channels/#channel_id/messages/#message_id/index.ts +++ b/src/api/routes/channels/#channel_id/messages/#message_id/index.ts @@ -35,7 +35,7 @@ import { Request, Response, Router } from "express"; import { HTTPError } from "lambert-server"; import multer from "multer"; import { handleMessage, postHandleMessage, route } from "../../../../../util"; -import { MessageCreateAttachment, MessageCreateCloudAttachment, MessageCreateSchema, MessageEditSchema } from "@spacebar/schemas" +import { MessageCreateAttachment, MessageCreateCloudAttachment, MessageCreateSchema, MessageEditSchema } from "@spacebar/schemas"; const router = Router({ mergeParams: true }); // TODO: message content/embed string length limit @@ -75,11 +75,7 @@ router.patch( relations: ["attachments"], }); - const permissions = await getPermission( - req.user_id, - undefined, - channel_id, - ); + const permissions = await getPermission(req.user_id, undefined, channel_id); const rights = await getRights(req.user_id); @@ -196,13 +192,8 @@ router.put( if (req.file) { try { - const file = await uploadFile( - `/attachments/${req.params.channel_id}`, - req.file, - ); - attachments.push( - Attachment.create({ ...file, proxy_url: file.url }), - ); + const file = await uploadFile(`/attachments/${req.params.channel_id}`, req.file); + attachments.push(Attachment.create({ ...file, proxy_url: file.url })); } catch (error) { return res.status(400).json(error); } @@ -241,9 +232,7 @@ router.put( ]); // no await as it shouldnt block the message send function and silently catch error - postHandleMessage(message).catch((e) => - console.error("[Message] post-message handler failed", e), - ); + postHandleMessage(message).catch((e) => console.error("[Message] post-message handler failed", e)); return res.json( message.withSignedAttachments( @@ -279,14 +268,9 @@ router.get( relations: ["attachments"], }); - const permissions = await getPermission( - req.user_id, - undefined, - channel_id, - ); + const permissions = await getPermission(req.user_id, undefined, channel_id); - if (message.author_id !== req.user_id) - permissions.hasThrow("READ_MESSAGE_HISTORY"); + if (message.author_id !== req.user_id) permissions.hasThrow("READ_MESSAGE_HISTORY"); return res.json(message); }, @@ -317,11 +301,7 @@ router.delete( if (message.author_id !== req.user_id) { if (!rights.has("MANAGE_MESSAGES")) { - const permission = await getPermission( - req.user_id, - channel.guild_id, - channel_id, - ); + const permission = await getPermission(req.user_id, channel.guild_id, channel_id); permission.hasThrow("MANAGE_MESSAGES"); } } else rights.hasThrow("SELF_DELETE_MESSAGES"); diff --git a/src/api/routes/channels/#channel_id/messages/bulk-delete.ts b/src/api/routes/channels/#channel_id/messages/bulk-delete.ts index 77fd26d65..54801a48b 100644 --- a/src/api/routes/channels/#channel_id/messages/bulk-delete.ts +++ b/src/api/routes/channels/#channel_id/messages/bulk-delete.ts @@ -17,15 +17,7 @@ */ import { route } from "@spacebar/api"; -import { - Channel, - Config, - emitEvent, - getPermission, - getRights, - Message, - MessageDeleteBulkEvent, -} from "@spacebar/util"; +import { Channel, Config, emitEvent, getPermission, getRights, Message, MessageDeleteBulkEvent } from "@spacebar/util"; import { Request, Response, Router } from "express"; import { HTTPError } from "lambert-server"; @@ -54,30 +46,21 @@ router.post( const channel = await Channel.findOneOrFail({ where: { id: channel_id }, }); - if (!channel.guild_id) - throw new HTTPError("Can't bulk delete dm channel messages", 400); + if (!channel.guild_id) throw new HTTPError("Can't bulk delete dm channel messages", 400); const rights = await getRights(req.user_id); rights.hasThrow("SELF_DELETE_MESSAGES"); const superuser = rights.has("MANAGE_MESSAGES"); - const permission = await getPermission( - req.user_id, - channel?.guild_id, - channel_id, - ); + const permission = await getPermission(req.user_id, channel?.guild_id, channel_id); const { maxBulkDelete } = Config.get().limits.message; const { messages } = req.body as { messages: string[] }; - if (messages.length === 0) - throw new HTTPError("You must specify messages to bulk delete"); + if (messages.length === 0) throw new HTTPError("You must specify messages to bulk delete"); if (!superuser) { permission.hasThrow("MANAGE_MESSAGES"); - if (messages.length > maxBulkDelete) - throw new HTTPError( - `You cannot delete more than ${maxBulkDelete} messages`, - ); + if (messages.length > maxBulkDelete) throw new HTTPError(`You cannot delete more than ${maxBulkDelete} messages`); } await Message.delete(messages); diff --git a/src/api/routes/channels/#channel_id/messages/pins/index.ts b/src/api/routes/channels/#channel_id/messages/pins/index.ts index b12d59577..1d770bd29 100644 --- a/src/api/routes/channels/#channel_id/messages/pins/index.ts +++ b/src/api/routes/channels/#channel_id/messages/pins/index.ts @@ -17,16 +17,7 @@ */ import { route } from "@spacebar/api"; -import { - ChannelPinsUpdateEvent, - Config, - DiscordApiErrors, - emitEvent, - Message, - MessageCreateEvent, - MessageUpdateEvent, - User, -} from "@spacebar/util"; +import { ChannelPinsUpdateEvent, Config, DiscordApiErrors, emitEvent, Message, MessageCreateEvent, MessageUpdateEvent, User } from "@spacebar/util"; import { Request, Response, Router } from "express"; import { IsNull, Not } from "typeorm"; @@ -61,8 +52,7 @@ router.put( }); const { maxPins } = Config.get().limits.channel; - if (pinned_count >= maxPins) - throw DiscordApiErrors.MAXIMUM_PINS.withParams(maxPins); + if (pinned_count >= maxPins) throw DiscordApiErrors.MAXIMUM_PINS.withParams(maxPins); message.pinned_at = new Date();