From 0452c0680fdf660417787133bc022e125d6b985f Mon Sep 17 00:00:00 2001 From: Rory& Date: Fri, 7 Aug 2026 23:58:01 +0200 Subject: [PATCH] Fix categories type --- extra/admin-api/outputs.nix | 1 + src/database/entities/Categories.ts | 25 +++++++++++++++---- src/database/entities/Guild.ts | 4 +-- .../postgres/1786139482251-Int2CategoryId.ts | 15 +++++++++++ 4 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 src/database/migration/postgres/1786139482251-Int2CategoryId.ts diff --git a/extra/admin-api/outputs.nix b/extra/admin-api/outputs.nix index 94d7c3118..4c7ad3f54 100644 --- a/extra/admin-api/outputs.nix +++ b/extra/admin-api/outputs.nix @@ -86,6 +86,7 @@ nixpkgs.lib.recursiveUpdate ( name = "Spacebar.Models.Api"; projectFile = "Spacebar.Models.Api.csproj"; srcRoot = Models/Spacebar.Models.Api; + projectReferences = [ proj.Spacebar-Models-Generic ]; }; Spacebar-Models-AdminApi = buildSpacebarDotnetModule { name = "Spacebar.Models.AdminApi"; diff --git a/src/database/entities/Categories.ts b/src/database/entities/Categories.ts index 3a7e133ff..b305b2fff 100644 --- a/src/database/entities/Categories.ts +++ b/src/database/entities/Categories.ts @@ -16,10 +16,11 @@ along with this program. If not, see . */ -import { Column, Entity, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; import { BaseClassWithoutId } from "./BaseClass"; +import { DiscoveryCategory } from "@spacebar/schemas"; -// TODO: categories: +// was this an old response format? Keeping for completeness sake // [{ // "id": 16, // "default": "Anime & Manga", @@ -31,7 +32,6 @@ import { BaseClassWithoutId } from "./BaseClass"; // }, // "is_primary": false/true // }] -// Also populate discord default categories @Entity({ name: "categories", @@ -39,19 +39,34 @@ import { BaseClassWithoutId } from "./BaseClass"; export class Categories extends BaseClassWithoutId { // Not using snowflake - @PrimaryColumn({ type: "int4" }) + @PrimaryGeneratedColumn({ type: "int2" }) id: number; @Column({ nullable: true }) name: string; @Column({ type: "jsonb" }) - localizations: string; + localizations: CategoryLocalization; // Whether to show the category prominently (e.g. in a sidebar) instead of only secondary (e.g. in search results) @Column({ nullable: true }) is_primary: boolean; + // TODO: was this removed? @Column({ nullable: true }) icon?: string; + + public toDiscoveryCategory(locale?: string): DiscoveryCategory { + locale ??= "en-US"; + let name = this.name; + if (locale in this.localizations) name = this.localizations[locale] ?? this.name; + + return { + id: this.id, + name: name, + is_primary: this.is_primary, + } satisfies DiscoveryCategory; + } } + +export type CategoryLocalization = { [locale: string]: string }; diff --git a/src/database/entities/Guild.ts b/src/database/entities/Guild.ts index d111f5e0f..d7a82667c 100644 --- a/src/database/entities/Guild.ts +++ b/src/database/entities/Guild.ts @@ -106,8 +106,8 @@ export class Guild extends BaseClass { features: string[] = []; //TODO use enum //TODO: https://discord.com/developers/docs/resources/guild#guild-object-guild-features - @Column({ type: "int8", nullable: true }) - primary_category_id?: string; // TODO: this was number? + @Column({ type: "int2", nullable: true }) + primary_category_id?: number; @Column({ nullable: true }) icon?: string; diff --git a/src/database/migration/postgres/1786139482251-Int2CategoryId.ts b/src/database/migration/postgres/1786139482251-Int2CategoryId.ts new file mode 100644 index 000000000..fa94fd442 --- /dev/null +++ b/src/database/migration/postgres/1786139482251-Int2CategoryId.ts @@ -0,0 +1,15 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Int2CategoryId1786139482251 implements MigrationInterface { + name = "Int2CategoryId1786139482251"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE guilds ALTER COLUMN primary_category_id TYPE int2 USING primary_category_id::int2`); + await queryRunner.query(`ALTER TABLE categories ALTER COLUMN id TYPE smallserial USING id::smallserial`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE guilds ALTER COLUMN primary_category_id TYPE bigint USING primary_category_id::bigint`); + await queryRunner.query(`ALTER TABLE categories ALTER COLUMN id TYPE bigint USING id::bigint`); + } +}