From 14e0842dfbc7bc67fb50be0b8dbf6443e5413687 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Mon, 18 Jul 2022 19:22:48 +0200 Subject: [PATCH] fix ts errors --- api/package-lock.json | Bin 552367 -> 556570 bytes api/package.json | 2 +- .../#channel_id/messages/bulk-delete.ts | 8 +- api/src/routes/channels/#channel_id/purge.ts | 115 ++++++++---------- api/src/routes/discoverable-guilds.ts | 19 +-- bundle/package-lock.json | Bin 596113 -> 596113 bytes util/package-lock.json | Bin 501775 -> 504932 bytes util/package.json | 4 +- util/src/entities/BaseClass.ts | 12 +- util/src/entities/User.ts | 27 ++-- 10 files changed, 94 insertions(+), 93 deletions(-) diff --git a/api/package-lock.json b/api/package-lock.json index de8891880a292180749519b284ec5bc0e9de96cb..4e65e88601c151f3e77576fcf5d8fcc1ecb843e2 100644 GIT binary patch delta 6264 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 { const { channel_id } = req.params; - const channel = await Channel.findOneOrFail({ id: channel_id }); + const channel = await Channel.findOneByOrFail({ id: channel_id }); 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"); - + let superuser = rights.has("MANAGE_MESSAGES"); 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[] }; @@ -35,7 +35,7 @@ router.post("/", route({ body: "BulkDeleteSchema" }), async (req: Request, res: if (messages.length > maxBulkDelete) throw new HTTPError(`You cannot delete more than ${maxBulkDelete} messages`); } - await Message.delete(messages.map((x) => ({ id: x }))); + await Message.delete({ id: In(messages) }); await emitEvent({ event: "MESSAGE_DELETE_BULK", diff --git a/api/src/routes/channels/#channel_id/purge.ts b/api/src/routes/channels/#channel_id/purge.ts index 622e06e5a..3a6997b24 100644 --- a/api/src/routes/channels/#channel_id/purge.ts +++ b/api/src/routes/channels/#channel_id/purge.ts @@ -2,24 +2,9 @@ import { HTTPError } from "lambert-server"; import { route } from "@fosscord/api"; import { isTextChannel } from "./messages"; import { FindManyOptions, Between, Not } from "typeorm"; -import { - Attachment, - Channel, - Config, - Embed, - DiscordApiErrors, - emitEvent, - FosscordApiErrors, - getPermission, - getRights, - Message, - MessageDeleteBulkEvent, - Snowflake, - uploadFile -} from "@fosscord/util"; +import { Channel, Config, emitEvent, getPermission, getRights, Message, MessageDeleteBulkEvent } from "@fosscord/util"; import { Router, Response, Request } from "express"; -import multer from "multer"; -import { handleMessage, postHandleMessage } from "@fosscord/api"; +import { In } from "typeorm"; const router: Router = Router(); @@ -27,58 +12,58 @@ export default router; export interface PurgeSchema { before: string; - after: string + after: string; } /** TODO: apply the delete bit by bit to prevent client and database stress **/ -router.post("/", route({ /*body: "PurgeSchema",*/ }), async (req: Request, res: Response) => { - const { channel_id } = req.params; - const channel = await Channel.findOneOrFail({ id: channel_id }); - - if (!channel.guild_id) throw new HTTPError("Can't purge dm channels", 400); - isTextChannel(channel.type); +router.post("/",route({ /*body: "PurgeSchema",*/ }), async (req: Request, res: Response) => { + const { channel_id } = req.params; + const channel = await Channel.findOneOrFail({ where: { id: channel_id } }); - const rights = await getRights(req.user_id); - if (!rights.has("MANAGE_MESSAGES")) { - const permissions = await getPermission(req.user_id, channel.guild_id, channel_id); - permissions.hasThrow("MANAGE_MESSAGES"); - permissions.hasThrow("MANAGE_CHANNELS"); + if (!channel.guild_id) throw new HTTPError("Can't purge dm channels", 400); + isTextChannel(channel.type); + + const rights = await getRights(req.user_id); + if (!rights.has("MANAGE_MESSAGES")) { + const permissions = await getPermission(req.user_id, channel.guild_id, channel_id); + permissions.hasThrow("MANAGE_MESSAGES"); + permissions.hasThrow("MANAGE_CHANNELS"); + } + + const { before, after } = req.body as PurgeSchema; + + // TODO: send the deletion event bite-by-bite to prevent client stress + + let query: FindManyOptions & { where: { id?: any } } = { + order: { id: "ASC" }, + // take: limit, + where: { + channel_id, + id: Between(after, before), // the right way around + author_id: rights.has("SELF_DELETE_MESSAGES") ? undefined : Not(req.user_id) + // if you lack the right of self-deletion, you can't delete your own messages, even in purges + }, + relations: ["author", "webhook", "application", "mentions", "mention_roles", "mention_channels", "sticker_items", "attachments"] + }; + + const messages = await Message.find(query); + const endpoint = Config.get().cdn.endpointPublic; + + if (messages.length == 0) { + res.sendStatus(304); + return; + } + + await Message.delete({ id: In(messages) }); + + await emitEvent({ + event: "MESSAGE_DELETE_BULK", + channel_id, + data: { ids: messages.map((x) => x.id), channel_id, guild_id: channel.guild_id } + } as MessageDeleteBulkEvent); + + res.sendStatus(204); } - - const { before, after } = req.body as PurgeSchema; - - // TODO: send the deletion event bite-by-bite to prevent client stress - - let query: FindManyOptions & { where: { id?: any; }; } = { - order: { id: "ASC" }, - // take: limit, - where: { - channel_id, - id: Between(after, before), // the right way around - author_id: rights.has("SELF_DELETE_MESSAGES") ? undefined : Not(req.user_id) - // if you lack the right of self-deletion, you can't delete your own messages, even in purges - }, - relations: ["author", "webhook", "application", "mentions", "mention_roles", "mention_channels", "sticker_items", "attachments"] - }; - - - const messages = await Message.find(query); - const endpoint = Config.get().cdn.endpointPublic; - - if (messages.length == 0) { - res.sendStatus(304); - return; - } - - await Message.delete(messages.map((x) => ({ id: x }))); - - await emitEvent({ - event: "MESSAGE_DELETE_BULK", - channel_id, - data: { ids: messages.map(x => x.id), channel_id, guild_id: channel.guild_id } - } as MessageDeleteBulkEvent); - - res.sendStatus(204); -}); +); diff --git a/api/src/routes/discoverable-guilds.ts b/api/src/routes/discoverable-guilds.ts index 984916f41..fb7b844f4 100644 --- a/api/src/routes/discoverable-guilds.ts +++ b/api/src/routes/discoverable-guilds.ts @@ -16,19 +16,24 @@ router.get("/", route({}), async (req: Request, res: Response) => { if (categories == undefined) { guilds = showAllGuilds ? await Guild.find({ take: Math.abs(Number(limit || configLimit)) }) - : await Guild.find({ where: `"features" LIKE '%DISCOVERABLE%'`, take: Math.abs(Number(limit || configLimit)) }); + : await Guild.find({ where: { features: Like("%DISCOVERABLE%") }, take: Math.abs(Number(limit || configLimit)) }); } else { guilds = showAllGuilds - ? await Guild.find({ where: `"primary_category_id" = ${categories}`, take: Math.abs(Number(limit || configLimit)) }) - : await Guild.find({ - where: `"primary_category_id" = ${categories} AND "features" LIKE '%DISCOVERABLE%'`, - take: Math.abs(Number(limit || configLimit)) - }); + ? await Guild.find({ where: { primary_category_id: Number(categories) }, take: Math.abs(Number(limit || configLimit)) }) + : await Guild.find({ + where: { primary_category_id: Number(categories), features: Like("%DISCOVERABLE%") }, + take: Math.abs(Number(limit || configLimit)) + }); } const total = guilds ? guilds.length : undefined; - res.send({ total: total, guilds: guilds, offset: Number(offset || Config.get().guild.discovery.offset), limit: Number(limit || configLimit) }); + res.send({ + total: total, + guilds: guilds, + offset: Number(offset || Config.get().guild.discovery.offset), + limit: Number(limit || configLimit) + }); }); export default router; diff --git a/bundle/package-lock.json b/bundle/package-lock.json index 3f2d85ba94eae8263f9b314cbe23d946a755671f..b9277e0b86c145d81a0ccc1e175136f8a11015a3 100644 GIT binary patch delta 116 zcmbQZQDx#rl?}E0OeUtA>-o=e0_o|2&dkD-HQ3ds8|+|Yo6Ik!FnxhGTWzzpRJ*nm zBM>tIF*6Xe05R)!Z7DWx9u^Z*C7tOFHyA~>`>C-xu_O4C=Si`*uh(S*V)pIpbvYir F0sxgxA=3Z= delta 113 zcmbQZQDx#rl?}E0OvdJ$>-o=e0_o|2&dkD-HQ3ds8|+|Yo6Ik!FnxhGTWzzpRJ*nm zBM>tIF*6Xe05R)!Z7DWxp2-W@q$kf8vfAFQ#>UDH<{5BvPmgqF=59Zz%Lc^k+Yjn; HTzCZlRaYTv diff --git a/util/package-lock.json b/util/package-lock.json index a566836e46504a49e42d7b479d226a8c8356539d..2405456ee1f520c44bd7b665e52bd9f6369afeec 100644 GIT binary patch delta 6920 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 diff --git a/util/package.json b/util/package.json index 246ec6b68..e6dc8e2df 100644 --- a/util/package.json +++ b/util/package.json @@ -32,7 +32,7 @@ "@types/amqplib": "^0.8.1", "@types/jsonwebtoken": "^8.5.0", "@types/multer": "^1.4.7", - "@types/node": "^14.17.9", + "@types/node": "^14.18.22", "@types/node-fetch": "^2.5.12", "jest": "^27.0.6", "ts-node": "^10.2.1" @@ -50,7 +50,7 @@ "picocolors": "^1.0.0", "proxy-agent": "^5.0.0", "reflect-metadata": "^0.1.13", - "typeorm": "^0.2.45", + "typeorm": "^0.3.7", "typescript": "^4.4.2", "typescript-json-schema": "^0.50.1" }, diff --git a/util/src/entities/BaseClass.ts b/util/src/entities/BaseClass.ts index 9f23de7cb..7ee27e304 100644 --- a/util/src/entities/BaseClass.ts +++ b/util/src/entities/BaseClass.ts @@ -50,12 +50,20 @@ export class BaseClassWithoutId extends BaseEntity { ); } - static increment(conditions: FindOptionsWhere, propertyPath: string, value: number | string) { + static increment( + conditions: FindOptionsWhere, + propertyPath: string, + value: number | string + ) { const repository = this.getRepository(); return repository.increment(conditions, propertyPath, value); } - static decrement(conditions: FindOptionsWhere, propertyPath: string, value: number | string) { + static decrement( + conditions: FindOptionsWhere, + propertyPath: string, + value: number | string + ) { const repository = this.getRepository(); return repository.decrement(conditions, propertyPath, value); } diff --git a/util/src/entities/User.ts b/util/src/entities/User.ts index bd70780dd..7d5dc5a6e 100644 --- a/util/src/entities/User.ts +++ b/util/src/entities/User.ts @@ -1,4 +1,4 @@ -import { Column, Entity, FindOneOptions, JoinColumn, OneToMany } from "typeorm"; +import { Column, Entity, FindOneOptions, FindOptionsSelectByString, JoinColumn, ManyToMany, OneToMany, RelationId } from "typeorm"; import { BaseClass } from "./BaseClass"; import { BitField } from "../util/BitField"; import { Relationship } from "./Relationship"; @@ -90,7 +90,7 @@ export class User extends BaseClass { @Column() premium: boolean; // if user bought individual premium - + @Column() premium_type: number; // individual premium level @@ -105,7 +105,7 @@ export class User extends BaseClass { @Column({ select: false }) nsfw_allowed: boolean; // if the user can do age-restricted actions (NSFW channels/guilds/commands) - + @Column({ select: false }) mfa_enabled: boolean; // if multi factor authentication is enabled @@ -170,11 +170,14 @@ export class User extends BaseClass { @Column({ type: "simple-json", select: false }) settings: UserSettings; - + // workaround to prevent fossord-unaware clients from deleting settings not used by them @Column({ type: "simple-json", select: false }) extended_settings: string; + @Column({ type: "simple-json" }) + notes: { [key: string]: string }; //key is ID of user + toPublicUser() { const user: any = {}; PublicUserProjection.forEach((x) => { @@ -184,19 +187,17 @@ export class User extends BaseClass { } static async getPublicUser(user_id: string, opts?: FindOneOptions) { - return await User.findOneOrFail( - { id: user_id }, - { - ...opts, - select: [...PublicUserProjection, ...(opts?.select || [])], - } - ); + return await User.findOneOrFail({ + where: { id: user_id }, + select: [...PublicUserProjection, ...((opts?.select as FindOptionsSelectByString) || [])], + ...opts, + }); } private static async generateDiscriminator(username: string): Promise { if (Config.get().register.incrementingDiscriminators) { // discriminator will be incrementally generated - + // First we need to figure out the currently highest discrimnator for the given username and then increment it const users = await User.find({ where: { username }, select: ["discriminator"] }); const highestDiscriminator = Math.max(0, ...users.map((u) => Number(u.discriminator))); @@ -268,6 +269,8 @@ export class User extends BaseClass { premium_type: 2, bio: "", mfa_enabled: false, + totp_secret: "", + totp_backup_codes: [], verified: true, disabled: false, deleted: false,