diff --git a/assets/openapi.json b/assets/openapi.json index d361c5d1d..f7bc123af 100644 Binary files a/assets/openapi.json and b/assets/openapi.json differ diff --git a/assets/schemas.json b/assets/schemas.json index b905dc180..3d4b7447d 100644 Binary files a/assets/schemas.json and b/assets/schemas.json differ diff --git a/src/api/routes/discoverable-guilds.ts b/src/api/routes/discoverable-guilds.ts index 8f059f570..87de37a3b 100644 --- a/src/api/routes/discoverable-guilds.ts +++ b/src/api/routes/discoverable-guilds.ts @@ -44,31 +44,21 @@ router.get( select: { guild_id: true }, }).then((members) => members.map((member) => member.guild_id)) : []; - let guilds; - 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)), - }); - } else { - guilds = showAllGuilds - ? await Guild.find({ - where: { primary_category_id: categories.toString(), id: Not(In(hiddenGuildIds)) }, - take: Math.abs(Number(limit || configLimit)), - }) - : await Guild.find({ - where: { - primary_category_id: categories.toString(), - features: Like("%DISCOVERABLE%"), - id: Not(In(hiddenGuildIds)), - }, - take: Math.abs(Number(limit || configLimit)), - }); - } + + const guilds = await Guild.find({ + where: { + id: Not(In(hiddenGuildIds)), + discovery_excluded: false, + ...(categories == undefined ? {} : { primary_category_id: categories.toString() }), // TODO: isnt this an array? + ...(showAllGuilds ? {} : { features: Like("%DISCOVERABLE%") }), + }, + order: { + discovery_weight: "DESC", + member_count: "DESC", + }, + skip: Math.abs(Number(offset || Config.get().guild.discovery.offset)), + take: Math.abs(Number(limit || configLimit)), + }); const total = guilds ? guilds.length : undefined; diff --git a/src/util/entities/Guild.ts b/src/util/entities/Guild.ts index 56740ab56..aac3daf0e 100644 --- a/src/util/entities/Guild.ts +++ b/src/util/entities/Guild.ts @@ -298,6 +298,12 @@ export class Guild extends BaseClass { @Column({ select: false, type: "simple-array" }) channel_ordering: string[]; + @Column() + discovery_weight: number = 0; + + @Column() + discovery_excluded: boolean = false; + static async createGuild(body: { name?: string; icon?: string | null; diff --git a/src/util/migration/postgres/1770748070808-GuildDiscoveryHoisting.ts b/src/util/migration/postgres/1770748070808-GuildDiscoveryHoisting.ts new file mode 100644 index 000000000..de8783883 --- /dev/null +++ b/src/util/migration/postgres/1770748070808-GuildDiscoveryHoisting.ts @@ -0,0 +1,15 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class GuildDiscoveryHoisting1770748070808 implements MigrationInterface { + name = "GuildDiscoveryHoisting1770748070808"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "guilds" ADD "discovery_weight" integer NOT NULL`); + await queryRunner.query(`ALTER TABLE "guilds" ADD "discovery_excluded" boolean NOT NULL`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "guilds" DROP COLUMN "discovery_excluded"`); + await queryRunner.query(`ALTER TABLE "guilds" DROP COLUMN "discovery_weight"`); + } +}