From c3a7a44d02002f518c6d6d4b1e4d8c4dbe08bfdd Mon Sep 17 00:00:00 2001
From: gunshiz
Date: Sun, 6 Sep 2026 14:47:11 +0700
Subject: [PATCH] feat : update
---
app/globals.css | 8 +
components/admin/guide-overview-form.tsx | 139 +-
components/admin/media-uploader.tsx | 7 +-
components/public/guide-image-export.tsx | 9 +-
components/public/material-poster.tsx | 179 ++
components/public/structured-guide.tsx | 73 +-
db/schema.ts | 15 +
drizzle/0032_grey_excalibur.sql | 7 +
drizzle/meta/0032_snapshot.json | 3698 ++++++++++++++++++++++
drizzle/meta/_journal.json | 7 +
lib/catalog/lunaris.test.ts | 17 +
lib/catalog/lunaris.ts | 18 +
lib/catalog/sync.ts | 7 +
lib/content/queries.ts | 11 +-
lib/guides/mutations.ts | 27 +
lib/guides/queries.ts | 29 +-
lib/guides/schemas.ts | 5 +
public/Kanit-ExtraBoldItalic.ttf | Bin 0 -> 191664 bytes
public/img/mat/fade.png | Bin 0 -> 208233 bytes
19 files changed, 4218 insertions(+), 38 deletions(-)
create mode 100644 components/public/material-poster.tsx
create mode 100644 drizzle/0032_grey_excalibur.sql
create mode 100644 drizzle/meta/0032_snapshot.json
create mode 100644 public/Kanit-ExtraBoldItalic.ttf
create mode 100644 public/img/mat/fade.png
diff --git a/app/globals.css b/app/globals.css
index 0fa8350..8fe1671 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -17,6 +17,14 @@
font-display: swap;
}
+@font-face {
+ font-family: "Kanit Poster";
+ src: url("/Kanit-ExtraBoldItalic.ttf") format("truetype");
+ font-style: italic;
+ font-weight: 800;
+ font-display: swap;
+}
+
@custom-variant dark (&:is(.dark *));
@theme inline {
diff --git a/components/admin/guide-overview-form.tsx b/components/admin/guide-overview-form.tsx
index 24bd4b0..714277f 100644
--- a/components/admin/guide-overview-form.tsx
+++ b/components/admin/guide-overview-form.tsx
@@ -6,6 +6,8 @@ import { useState } from "react";
import { saveGuideOverview } from "@/app/admin/actions";
import { AutosaveStatus } from "@/components/admin/autosave-status";
import { MediaUploader } from "@/components/admin/media-uploader";
+import { MaterialPoster } from "@/components/public/material-poster";
+import { GuideImageExport } from "@/components/public/guide-image-export";
import {
Card,
CardContent,
@@ -26,6 +28,8 @@ import { Textarea } from "@/components/ui/textarea";
import { useAutosave } from "@/hooks/use-autosave";
import { adminDraftKey } from "@/lib/editor/local-draft";
import { parseYouTubeUrl } from "@/lib/guides/youtube";
+import { detectThemeColorsFromPixels } from "@/lib/overview-image";
+import type { PublicGuide } from "@/lib/guides/queries";
import { cn } from "@/lib/utils";
export function GuideOverviewForm({
@@ -39,6 +43,13 @@ export function GuideOverviewForm({
coverMediaId: string;
coverUrl: string;
name: string;
+ posterArtMediaId: string | null;
+ posterArtUrl: string | null;
+ posterArtOffsetX: number;
+ posterArtOffsetY: number;
+ posterTopColors: [string, string];
+ posterBottomColors: [string, string];
+ character: Omit;
};
}) {
const [overview, setOverview] = useState(guide.overview);
@@ -47,9 +58,28 @@ export function GuideOverviewForm({
id: guide.coverMediaId,
url: guide.coverUrl,
});
+ const [posterArt, setPosterArt] = useState({
+ id: guide.posterArtMediaId,
+ url: guide.posterArtUrl,
+ });
+ const [posterArtOffset, setPosterArtOffset] = useState({
+ x: guide.posterArtOffsetX,
+ y: guide.posterArtOffsetY,
+ });
+ const [posterTopColors, setPosterTopColors] = useState(guide.posterTopColors);
+ const [posterBottomColors, setPosterBottomColors] = useState(guide.posterBottomColors);
const youtubeVideo = parseYouTubeUrl(youtubeUrl.trim());
const invalidYoutubeUrl = Boolean(youtubeUrl.trim() && !youtubeVideo);
- const value = { coverMediaId: cover.id, overview, youtubeUrl };
+ const value = {
+ coverMediaId: cover.id,
+ overview,
+ youtubeUrl,
+ posterArtMediaId: posterArt.id,
+ posterArtOffsetX: posterArtOffset.x,
+ posterArtOffsetY: posterArtOffset.y,
+ posterTopColors,
+ posterBottomColors,
+ };
const incompleteIssues = [
!cover.id ? "กรุณาอัปโหลด Guide Image" : null,
!overview.trim() ? "กรุณากรอก Overview" : null,
@@ -57,7 +87,7 @@ export function GuideOverviewForm({
].filter((issue): issue is string => Boolean(issue));
const invalidCover = !cover.id;
const invalidOverview = !overview.trim();
- const localDraft = { overview, youtubeUrl, cover };
+ const localDraft = { overview, youtubeUrl, cover, posterArt, posterArtOffset, posterTopColors, posterBottomColors };
const autosave = useAutosave({
value,
valid: Boolean(cover.id && overview.trim() && !invalidYoutubeUrl),
@@ -91,14 +121,78 @@ export function GuideOverviewForm({
youtubeUrl:
typeof draft.youtubeUrl === "string" ? draft.youtubeUrl : "",
cover: { id: draftCover.id, url: draftCover.url },
+ posterArt: draft.posterArt && typeof draft.posterArt === "object"
+ ? {
+ id: typeof (draft.posterArt as Record).id === "string"
+ ? (draft.posterArt as Record).id as string
+ : null,
+ url: typeof (draft.posterArt as Record).url === "string"
+ ? (draft.posterArt as Record).url as string
+ : null,
+ }
+ : { id: guide.posterArtMediaId, url: guide.posterArtUrl },
+ posterArtOffset: draft.posterArtOffset && typeof draft.posterArtOffset === "object"
+ ? {
+ x: typeof (draft.posterArtOffset as Record).x === "number" ? (draft.posterArtOffset as Record).x as number : 0,
+ y: typeof (draft.posterArtOffset as Record).y === "number" ? (draft.posterArtOffset as Record).y as number : 0,
+ }
+ : { x: guide.posterArtOffsetX, y: guide.posterArtOffsetY },
+ posterTopColors: Array.isArray(draft.posterTopColors) && draft.posterTopColors.length === 2
+ ? draft.posterTopColors as [string, string]
+ : guide.posterTopColors,
+ posterBottomColors: Array.isArray(draft.posterBottomColors) && draft.posterBottomColors.length === 2
+ ? draft.posterBottomColors as [string, string]
+ : guide.posterBottomColors,
};
},
restoreLocalDraft: (draft) => {
setOverview(draft.overview);
setYoutubeUrl(draft.youtubeUrl);
setCover(draft.cover);
+ setPosterArt(draft.posterArt);
+ setPosterArtOffset(draft.posterArtOffset);
+ setPosterTopColors(draft.posterTopColors);
+ setPosterBottomColors(draft.posterBottomColors);
},
});
+
+ async function detectPosterColors(url: string) {
+ try {
+ const image = await new Promise((resolve, reject) => {
+ const candidate = new window.Image();
+ candidate.crossOrigin = "anonymous";
+ candidate.onload = () => resolve(candidate);
+ candidate.onerror = reject;
+ candidate.src = url;
+ });
+ const scale = Math.min(1, 512 / Math.max(image.naturalWidth, image.naturalHeight));
+ const canvas = document.createElement("canvas");
+ canvas.width = Math.max(1, Math.round(image.naturalWidth * scale));
+ canvas.height = Math.max(1, Math.round(image.naturalHeight * scale));
+ const context = canvas.getContext("2d");
+ if (!context) return;
+ context.drawImage(image, 0, 0, canvas.width, canvas.height);
+ const colors = detectThemeColorsFromPixels(
+ context.getImageData(0, 0, canvas.width, canvas.height).data,
+ canvas.width,
+ canvas.height,
+ );
+ setPosterTopColors(colors.top);
+ setPosterBottomColors(colors.bottom);
+ } catch {
+ // Keep the current colors when the uploaded media host disallows pixel reads.
+ }
+ }
+
+ function setUploadedPoster(asset: { id: string; url: string }) {
+ setPosterArt(asset);
+ setPosterArtOffset({ x: 0, y: 0 });
+ }
+
+ function detectPosterColorsFromFile(file: File) {
+ const url = URL.createObjectURL(file);
+ void detectPosterColors(url).finally(() => URL.revokeObjectURL(url));
+ }
return (
@@ -169,6 +263,47 @@ export function GuideOverviewForm({
) : null}
+
+ Materials Overview
+
+
+
+
+
+
+
+
+
+
+ อัปโหลดภาพตัวละคร แล้วลากบนตัวอย่างเพื่อจัดตำแหน่ง สีด้านบนและล่างจะตรวจให้อัตโนมัติ
+
+
diff --git a/components/admin/media-uploader.tsx b/components/admin/media-uploader.tsx
index 5c9f13f..f7fa41e 100644
--- a/components/admin/media-uploader.tsx
+++ b/components/admin/media-uploader.tsx
@@ -19,8 +19,10 @@ export interface UploadedMedia {
export function MediaUploader({
onReady,
+ onFileSelected,
}: {
onReady: (media: UploadedMedia) => void;
+ onFileSelected?: (file: File) => void;
}) {
const inputId = useId();
const [state, setState] = useState<"idle" | "uploading">("idle");
@@ -67,7 +69,10 @@ export function MediaUploader({
onChange={(event) => {
const file = event.target.files?.[0];
event.target.value = "";
- if (file) void upload(file);
+ if (file) {
+ onFileSelected?.(file);
+ void upload(file);
+ }
}}
/>
)}
- {youtubeVideo ? (
-
-
-
-
-
-
+
+ ) : null}
+ {youtubeVideo ? (
+
+
+
+
+
+ }
+ nativeButton={false}
+ >
+ ดูวิดีโอต้นฉบับบน YouTube
+
+
+
+ ) : null}
+
) : null}
);
@@ -520,7 +537,7 @@ function WeaponSectionContent({
: "text-sm sm:text-base",
)}
>
- ดาเมททั้งทีม
+ ดาเมจทั้งทีม
) : null}
diff --git a/db/schema.ts b/db/schema.ts
index 9c15181..fd37947 100644
--- a/db/schema.ts
+++ b/db/schema.ts
@@ -18,6 +18,7 @@ import {
import type {
CatalogAscensionGroup,
+ CatalogBaseStat,
CatalogConstellation,
CatalogTalent,
} from "@/lib/catalog/lunaris";
@@ -456,6 +457,7 @@ export const catalogCharacters = catalogSchema.table(
constellations: jsonb("constellations").$type().default([]).notNull(),
talents: jsonb("talents").$type().default([]).notNull(),
ascension: jsonb("ascension").$type().default([]).notNull(),
+ baseStats: jsonb("base_stats").$type().default([]).notNull(),
},
(table) => [
primaryKey({ columns: [table.key] }),
@@ -537,6 +539,19 @@ export const guides = guidesSchema.table(
coverMediaId: uuid("cover_media_id")
.notNull()
.references(() => media.id, { onDelete: "restrict" }),
+ posterArtMediaId: uuid("poster_art_media_id").references(() => media.id, {
+ onDelete: "set null",
+ }),
+ posterArtOffsetX: integer("poster_art_offset_x").default(0).notNull(),
+ posterArtOffsetY: integer("poster_art_offset_y").default(0).notNull(),
+ posterTopColors: jsonb("poster_top_colors")
+ .$type<[string, string]>()
+ .default(["#000000", "#000000"])
+ .notNull(),
+ posterBottomColors: jsonb("poster_bottom_colors")
+ .$type<[string, string]>()
+ .default(["#000000", "#000000"])
+ .notNull(),
version: integer("version").default(1).notNull(),
isPublic: boolean("is_public").default(false).notNull(),
sortOrder: integer("sort_order").default(0).notNull(),
diff --git a/drizzle/0032_grey_excalibur.sql b/drizzle/0032_grey_excalibur.sql
new file mode 100644
index 0000000..580260b
--- /dev/null
+++ b/drizzle/0032_grey_excalibur.sql
@@ -0,0 +1,7 @@
+ALTER TABLE "catalog"."character" ADD COLUMN "base_stats" jsonb DEFAULT '[]'::jsonb NOT NULL;--> statement-breakpoint
+ALTER TABLE "guides"."guide" ADD COLUMN "poster_art_media_id" uuid;--> statement-breakpoint
+ALTER TABLE "guides"."guide" ADD COLUMN "poster_art_offset_x" integer DEFAULT 0 NOT NULL;--> statement-breakpoint
+ALTER TABLE "guides"."guide" ADD COLUMN "poster_art_offset_y" integer DEFAULT 0 NOT NULL;--> statement-breakpoint
+ALTER TABLE "guides"."guide" ADD COLUMN "poster_top_colors" jsonb DEFAULT '["#000000","#000000"]'::jsonb NOT NULL;--> statement-breakpoint
+ALTER TABLE "guides"."guide" ADD COLUMN "poster_bottom_colors" jsonb DEFAULT '["#000000","#000000"]'::jsonb NOT NULL;--> statement-breakpoint
+ALTER TABLE "guides"."guide" ADD CONSTRAINT "guide_poster_art_media_id_media_id_fk" FOREIGN KEY ("poster_art_media_id") REFERENCES "media"."media"("id") ON DELETE set null ON UPDATE no action;
\ No newline at end of file
diff --git a/drizzle/meta/0032_snapshot.json b/drizzle/meta/0032_snapshot.json
new file mode 100644
index 0000000..6817c29
--- /dev/null
+++ b/drizzle/meta/0032_snapshot.json
@@ -0,0 +1,3698 @@
+{
+ "id": "fd6d16b2-b751-442d-83dd-74c9d39ef669",
+ "prevId": "988c292e-03b4-410e-891d-df1bb34702ca",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "auth.account": {
+ "name": "account",
+ "schema": "auth",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "issuer": {
+ "name": "issuer",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "account_id": {
+ "name": "account_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider_id": {
+ "name": "provider_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "access_token": {
+ "name": "access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token": {
+ "name": "refresh_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "id_token": {
+ "name": "id_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "access_token_expires_at": {
+ "name": "access_token_expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token_expires_at": {
+ "name": "refresh_token_expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scope": {
+ "name": "scope",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "account_issuer_unique": {
+ "name": "account_issuer_unique",
+ "columns": [
+ {
+ "expression": "issuer",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "account_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "account_user_id_idx": {
+ "name": "account_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "account_user_id_user_id_fk": {
+ "name": "account_user_id_user_id_fk",
+ "tableFrom": "account",
+ "tableTo": "user",
+ "schemaTo": "auth",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.artifact_group": {
+ "name": "artifact_group",
+ "schema": "guides",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "guide_id": {
+ "name": "guide_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ }
+ },
+ "indexes": {
+ "artifact_group_order_idx": {
+ "name": "artifact_group_order_idx",
+ "columns": [
+ {
+ "expression": "guide_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "artifact_group_guide_id_guide_id_fk": {
+ "name": "artifact_group_guide_id_guide_id_fk",
+ "tableFrom": "artifact_group",
+ "tableTo": "guide",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "guide_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.artifact_profile": {
+ "name": "artifact_profile",
+ "schema": "guides",
+ "columns": {
+ "guide_id": {
+ "name": "guide_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "sands": {
+ "name": "sands",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "goblet": {
+ "name": "goblet",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "circlet": {
+ "name": "circlet",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "substats": {
+ "name": "substats",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "targets": {
+ "name": "targets",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "talents": {
+ "name": "talents",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "note": {
+ "name": "note",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "artifact_profile_guide_id_guide_id_fk": {
+ "name": "artifact_profile_guide_id_guide_id_fk",
+ "tableFrom": "artifact_profile",
+ "tableTo": "guide",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "guide_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.artifact_recommendation": {
+ "name": "artifact_recommendation",
+ "schema": "guides",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "group_id": {
+ "name": "group_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "first_artifact_key": {
+ "name": "first_artifact_key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "second_artifact_key": {
+ "name": "second_artifact_key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "percent": {
+ "name": "percent",
+ "type": "numeric(8, 2)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "note": {
+ "name": "note",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ }
+ },
+ "indexes": {
+ "artifact_recommendation_order_idx": {
+ "name": "artifact_recommendation_order_idx",
+ "columns": [
+ {
+ "expression": "group_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "artifact_recommendation_group_id_artifact_group_id_fk": {
+ "name": "artifact_recommendation_group_id_artifact_group_id_fk",
+ "tableFrom": "artifact_recommendation",
+ "tableTo": "artifact_group",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "group_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "editor.block": {
+ "name": "block",
+ "schema": "editor",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "page_id": {
+ "name": "page_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "schema_version": {
+ "name": "schema_version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "config": {
+ "name": "config",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "responsive_layout": {
+ "name": "responsive_layout",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "block_page_order_idx": {
+ "name": "block_page_order_idx",
+ "columns": [
+ {
+ "expression": "page_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "block_page_id_page_id_fk": {
+ "name": "block_page_id_page_id_fk",
+ "tableFrom": "block",
+ "tableTo": "page",
+ "schemaTo": "editor",
+ "columnsFrom": [
+ "page_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "catalog.artifact": {
+ "name": "artifact",
+ "schema": "catalog",
+ "columns": {
+ "key": {
+ "name": "key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rarity": {
+ "name": "rarity",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image_key": {
+ "name": "image_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "catalog_artifact_name_idx": {
+ "name": "catalog_artifact_name_idx",
+ "columns": [
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {
+ "artifact_key_pk": {
+ "name": "artifact_key_pk",
+ "columns": [
+ "key"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "catalog.character": {
+ "name": "character",
+ "schema": "catalog",
+ "columns": {
+ "key": {
+ "name": "key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "element": {
+ "name": "element",
+ "type": "varchar(48)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rarity": {
+ "name": "rarity",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "weapon_type": {
+ "name": "weapon_type",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image_key": {
+ "name": "image_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "element_icon_key": {
+ "name": "element_icon_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "coop_image_key": {
+ "name": "coop_image_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_card_image_key": {
+ "name": "name_card_image_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "constellations": {
+ "name": "constellations",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "talents": {
+ "name": "talents",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "ascension": {
+ "name": "ascension",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "base_stats": {
+ "name": "base_stats",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ }
+ },
+ "indexes": {
+ "catalog_character_name_idx": {
+ "name": "catalog_character_name_idx",
+ "columns": [
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {
+ "character_key_pk": {
+ "name": "character_key_pk",
+ "columns": [
+ "key"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "catalog.material": {
+ "name": "material",
+ "schema": "catalog",
+ "columns": {
+ "key": {
+ "name": "key",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rarity": {
+ "name": "rarity",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image_key": {
+ "name": "image_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "catalog_material_name_idx": {
+ "name": "catalog_material_name_idx",
+ "columns": [
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "catalog.weapon": {
+ "name": "weapon",
+ "schema": "catalog",
+ "columns": {
+ "key": {
+ "name": "key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rarity": {
+ "name": "rarity",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "weapon_type": {
+ "name": "weapon_type",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image_key": {
+ "name": "image_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "catalog_weapon_name_idx": {
+ "name": "catalog_weapon_name_idx",
+ "columns": [
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {
+ "weapon_key_pk": {
+ "name": "weapon_key_pk",
+ "columns": [
+ "key"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "editor.character": {
+ "name": "character",
+ "schema": "editor",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "slug": {
+ "name": "slug",
+ "type": "varchar(120)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name_th": {
+ "name": "name_th",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name_en": {
+ "name": "name_en",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "portrait_media_id": {
+ "name": "portrait_media_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "element": {
+ "name": "element",
+ "type": "varchar(48)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "role": {
+ "name": "role",
+ "type": "varchar(80)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rarity": {
+ "name": "rarity",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "visible": {
+ "name": "visible",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "character_slug_unique": {
+ "name": "character_slug_unique",
+ "columns": [
+ {
+ "expression": "slug",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "character_directory_idx": {
+ "name": "character_directory_idx",
+ "columns": [
+ {
+ "expression": "visible",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "character_portrait_media_id_media_id_fk": {
+ "name": "character_portrait_media_id_media_id_fk",
+ "tableFrom": "character",
+ "tableTo": "media",
+ "schemaTo": "media",
+ "columnsFrom": [
+ "portrait_media_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.constellation_condition": {
+ "name": "constellation_condition",
+ "schema": "guides",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "guide_id": {
+ "name": "guide_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "note": {
+ "name": "note",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ }
+ },
+ "indexes": {
+ "constellation_condition_order_idx": {
+ "name": "constellation_condition_order_idx",
+ "columns": [
+ {
+ "expression": "guide_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "constellation_condition_guide_id_guide_id_fk": {
+ "name": "constellation_condition_guide_id_guide_id_fk",
+ "tableFrom": "constellation_condition",
+ "tableTo": "guide",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "guide_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.constellation_recommendation": {
+ "name": "constellation_recommendation",
+ "schema": "guides",
+ "columns": {
+ "condition_id": {
+ "name": "condition_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "level": {
+ "name": "level",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "detail": {
+ "name": "detail",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cumulative_percent": {
+ "name": "cumulative_percent",
+ "type": "numeric(8, 2)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_great": {
+ "name": "is_great",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "constellation_recommendation_condition_id_constellation_condition_id_fk": {
+ "name": "constellation_recommendation_condition_id_constellation_condition_id_fk",
+ "tableFrom": "constellation_recommendation",
+ "tableTo": "constellation_condition",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "condition_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "constellation_recommendation_condition_id_level_pk": {
+ "name": "constellation_recommendation_condition_id_level_pk",
+ "columns": [
+ "condition_id",
+ "level"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "editor.data_source_version": {
+ "name": "data_source_version",
+ "schema": "editor",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "data_source_id": {
+ "name": "data_source_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "version": {
+ "name": "version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rows": {
+ "name": "rows",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "evaluation": {
+ "name": "evaluation",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by_id": {
+ "name": "created_by_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "data_source_version_unique": {
+ "name": "data_source_version_unique",
+ "columns": [
+ {
+ "expression": "data_source_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "version",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "data_source_version_data_source_id_data_source_id_fk": {
+ "name": "data_source_version_data_source_id_data_source_id_fk",
+ "tableFrom": "data_source_version",
+ "tableTo": "data_source",
+ "schemaTo": "editor",
+ "columnsFrom": [
+ "data_source_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "data_source_version_created_by_id_user_id_fk": {
+ "name": "data_source_version_created_by_id_user_id_fk",
+ "tableFrom": "data_source_version",
+ "tableTo": "user",
+ "schemaTo": "auth",
+ "columnsFrom": [
+ "created_by_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "editor.data_source": {
+ "name": "data_source",
+ "schema": "editor",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "fields": {
+ "name": "fields",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "current_version": {
+ "name": "current_version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "data_source_name_idx": {
+ "name": "data_source_name_idx",
+ "columns": [
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.extra_section_row": {
+ "name": "extra_section_row",
+ "schema": "guides",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "section_id": {
+ "name": "section_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "media_id": {
+ "name": "media_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "heading": {
+ "name": "heading",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "body": {
+ "name": "body",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "percent": {
+ "name": "percent",
+ "type": "numeric(8, 2)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "background_color": {
+ "name": "background_color",
+ "type": "varchar(7)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "text_color": {
+ "name": "text_color",
+ "type": "varchar(7)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "highlights": {
+ "name": "highlights",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "catalog_items": {
+ "name": "catalog_items",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "sheet": {
+ "name": "sheet",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ }
+ },
+ "indexes": {
+ "extra_section_row_order_idx": {
+ "name": "extra_section_row_order_idx",
+ "columns": [
+ {
+ "expression": "section_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "extra_section_row_section_id_extra_section_section_id_fk": {
+ "name": "extra_section_row_section_id_extra_section_section_id_fk",
+ "tableFrom": "extra_section_row",
+ "tableTo": "extra_section",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "section_id"
+ ],
+ "columnsTo": [
+ "section_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "extra_section_row_media_id_media_id_fk": {
+ "name": "extra_section_row_media_id_media_id_fk",
+ "tableFrom": "extra_section_row",
+ "tableTo": "media",
+ "schemaTo": "media",
+ "columnsFrom": [
+ "media_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.extra_section": {
+ "name": "extra_section",
+ "schema": "guides",
+ "columns": {
+ "section_id": {
+ "name": "section_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "extra_section_section_id_guide_section_id_fk": {
+ "name": "extra_section_section_id_guide_section_id_fk",
+ "tableFrom": "extra_section",
+ "tableTo": "guide_section",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "section_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.glossary_alias": {
+ "name": "glossary_alias",
+ "schema": "guides",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "kind": {
+ "name": "kind",
+ "type": "varchar(16)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "catalog_key": {
+ "name": "catalog_key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "alias": {
+ "name": "alias",
+ "type": "varchar(120)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "normalized_alias": {
+ "name": "normalized_alias",
+ "type": "varchar(120)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "glossary_alias_kind_normalized_unique": {
+ "name": "glossary_alias_kind_normalized_unique",
+ "columns": [
+ {
+ "expression": "kind",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "normalized_alias",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "glossary_alias_item_idx": {
+ "name": "glossary_alias_item_idx",
+ "columns": [
+ {
+ "expression": "kind",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "catalog_key",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.guide_section": {
+ "name": "guide_section",
+ "schema": "guides",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "guide_id": {
+ "name": "guide_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "kind": {
+ "name": "kind",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slug": {
+ "name": "slug",
+ "type": "varchar(120)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "note": {
+ "name": "note",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "enabled": {
+ "name": "enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ }
+ },
+ "indexes": {
+ "guide_section_slug_unique": {
+ "name": "guide_section_slug_unique",
+ "columns": [
+ {
+ "expression": "guide_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "slug",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "guide_section_order_idx": {
+ "name": "guide_section_order_idx",
+ "columns": [
+ {
+ "expression": "guide_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "guide_section_guide_id_guide_id_fk": {
+ "name": "guide_section_guide_id_guide_id_fk",
+ "tableFrom": "guide_section",
+ "tableTo": "guide",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "guide_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.guide": {
+ "name": "guide",
+ "schema": "guides",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "character_key": {
+ "name": "character_key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slug": {
+ "name": "slug",
+ "type": "varchar(120)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "overview": {
+ "name": "overview",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "youtube_url": {
+ "name": "youtube_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cover_media_id": {
+ "name": "cover_media_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "poster_art_media_id": {
+ "name": "poster_art_media_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "poster_art_offset_x": {
+ "name": "poster_art_offset_x",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "poster_art_offset_y": {
+ "name": "poster_art_offset_y",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "poster_top_colors": {
+ "name": "poster_top_colors",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[\"#000000\",\"#000000\"]'::jsonb"
+ },
+ "poster_bottom_colors": {
+ "name": "poster_bottom_colors",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[\"#000000\",\"#000000\"]'::jsonb"
+ },
+ "version": {
+ "name": "version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "is_public": {
+ "name": "is_public",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "trashed_at": {
+ "name": "trashed_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "guide_character_key_unique": {
+ "name": "guide_character_key_unique",
+ "columns": [
+ {
+ "expression": "character_key",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "guide_slug_unique": {
+ "name": "guide_slug_unique",
+ "columns": [
+ {
+ "expression": "slug",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "guide_directory_idx": {
+ "name": "guide_directory_idx",
+ "columns": [
+ {
+ "expression": "trashed_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "guide_cover_media_id_media_id_fk": {
+ "name": "guide_cover_media_id_media_id_fk",
+ "tableFrom": "guide",
+ "tableTo": "media",
+ "schemaTo": "media",
+ "columnsFrom": [
+ "cover_media_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "no action"
+ },
+ "guide_poster_art_media_id_media_id_fk": {
+ "name": "guide_poster_art_media_id_media_id_fk",
+ "tableFrom": "guide",
+ "tableTo": "media",
+ "schemaTo": "media",
+ "columnsFrom": [
+ "poster_art_media_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "media.media": {
+ "name": "media",
+ "schema": "media",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "object_key": {
+ "name": "object_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "file_name": {
+ "name": "file_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mime_type": {
+ "name": "mime_type",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "byte_size": {
+ "name": "byte_size",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "checksum": {
+ "name": "checksum",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "width": {
+ "name": "width",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "height": {
+ "name": "height",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "varchar(24)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "current_reference_count": {
+ "name": "current_reference_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "revision_reference_count": {
+ "name": "revision_reference_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "created_by_id": {
+ "name": "created_by_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "media_object_key_unique": {
+ "name": "media_object_key_unique",
+ "columns": [
+ {
+ "expression": "object_key",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "media_visibility_idx": {
+ "name": "media_visibility_idx",
+ "columns": [
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "current_reference_count",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "media_created_by_id_user_id_fk": {
+ "name": "media_created_by_id_user_id_fk",
+ "tableFrom": "media",
+ "tableTo": "user",
+ "schemaTo": "auth",
+ "columnsFrom": [
+ "created_by_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "media.media_reference": {
+ "name": "media_reference",
+ "schema": "media",
+ "columns": {
+ "media_id": {
+ "name": "media_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "owner_type": {
+ "name": "owner_type",
+ "type": "varchar(24)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "owner_id": {
+ "name": "owner_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "reference_kind": {
+ "name": "reference_kind",
+ "type": "varchar(24)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "media_reference_owner_idx": {
+ "name": "media_reference_owner_idx",
+ "columns": [
+ {
+ "expression": "owner_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "owner_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "media_reference_media_id_media_id_fk": {
+ "name": "media_reference_media_id_media_id_fk",
+ "tableFrom": "media_reference",
+ "tableTo": "media",
+ "schemaTo": "media",
+ "columnsFrom": [
+ "media_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "media_reference_media_id_owner_type_owner_id_reference_kind_pk": {
+ "name": "media_reference_media_id_owner_type_owner_id_reference_kind_pk",
+ "columns": [
+ "media_id",
+ "owner_type",
+ "owner_id",
+ "reference_kind"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.outbox_event": {
+ "name": "outbox_event",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "bigint",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "always",
+ "name": "outbox_event_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "9223372036854775807",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "topic": {
+ "name": "topic",
+ "type": "varchar(160)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "aggregate_id": {
+ "name": "aggregate_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "event_type": {
+ "name": "event_type",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "payload": {
+ "name": "payload",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "varchar(24)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "attempts": {
+ "name": "attempts",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "available_at": {
+ "name": "available_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "processed_at": {
+ "name": "processed_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_error": {
+ "name": "last_error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "outbox_pending_idx": {
+ "name": "outbox_pending_idx",
+ "columns": [
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "available_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "editor.page_data_source": {
+ "name": "page_data_source",
+ "schema": "editor",
+ "columns": {
+ "page_id": {
+ "name": "page_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "data_source_id": {
+ "name": "data_source_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pinned_version": {
+ "name": "pinned_version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "page_data_source_dependency_idx": {
+ "name": "page_data_source_dependency_idx",
+ "columns": [
+ {
+ "expression": "data_source_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "page_data_source_page_id_page_id_fk": {
+ "name": "page_data_source_page_id_page_id_fk",
+ "tableFrom": "page_data_source",
+ "tableTo": "page",
+ "schemaTo": "editor",
+ "columnsFrom": [
+ "page_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "page_data_source_data_source_id_data_source_id_fk": {
+ "name": "page_data_source_data_source_id_data_source_id_fk",
+ "tableFrom": "page_data_source",
+ "tableTo": "data_source",
+ "schemaTo": "editor",
+ "columnsFrom": [
+ "data_source_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "page_data_source_page_id_data_source_id_pk": {
+ "name": "page_data_source_page_id_data_source_id_pk",
+ "columns": [
+ "page_id",
+ "data_source_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "editor.page": {
+ "name": "page",
+ "schema": "editor",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "character_id": {
+ "name": "character_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slug": {
+ "name": "slug",
+ "type": "varchar(120)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "nav_order": {
+ "name": "nav_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "visible": {
+ "name": "visible",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "public_note": {
+ "name": "public_note",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "version": {
+ "name": "version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "page_character_slug_unique": {
+ "name": "page_character_slug_unique",
+ "columns": [
+ {
+ "expression": "character_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "slug",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "page_navigation_idx": {
+ "name": "page_navigation_idx",
+ "columns": [
+ {
+ "expression": "character_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "visible",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "nav_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "page_character_id_character_id_fk": {
+ "name": "page_character_id_character_id_fk",
+ "tableFrom": "page",
+ "tableTo": "character",
+ "schemaTo": "editor",
+ "columnsFrom": [
+ "character_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "editor.public_snapshot": {
+ "name": "public_snapshot",
+ "schema": "editor",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "page_id": {
+ "name": "page_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "page_version": {
+ "name": "page_version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "version_vector": {
+ "name": "version_vector",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "vector_hash": {
+ "name": "vector_hash",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "dto": {
+ "name": "dto",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "visible": {
+ "name": "visible",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "public_snapshot_version_unique": {
+ "name": "public_snapshot_version_unique",
+ "columns": [
+ {
+ "expression": "page_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "page_version",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "vector_hash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "public_snapshot_lookup_idx": {
+ "name": "public_snapshot_lookup_idx",
+ "columns": [
+ {
+ "expression": "page_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "visible",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "public_snapshot_page_id_page_id_fk": {
+ "name": "public_snapshot_page_id_page_id_fk",
+ "tableFrom": "public_snapshot",
+ "tableTo": "page",
+ "schemaTo": "editor",
+ "columnsFrom": [
+ "page_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "editor.revision": {
+ "name": "revision",
+ "schema": "editor",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "page_id": {
+ "name": "page_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "page_version": {
+ "name": "page_version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "kind": {
+ "name": "kind",
+ "type": "varchar(24)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "label": {
+ "name": "label",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "author_id": {
+ "name": "author_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "source_revision_id": {
+ "name": "source_revision_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "checkpoint_hour": {
+ "name": "checkpoint_hour",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot": {
+ "name": "snapshot",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "data_source_versions": {
+ "name": "data_source_versions",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "media_ids": {
+ "name": "media_ids",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "revision_page_created_idx": {
+ "name": "revision_page_created_idx",
+ "columns": [
+ {
+ "expression": "page_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "revision_checkpoint_hour_unique": {
+ "name": "revision_checkpoint_hour_unique",
+ "columns": [
+ {
+ "expression": "page_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "checkpoint_hour",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "where": "\"editor\".\"revision\".\"kind\" = 'checkpoint'",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "revision_page_id_page_id_fk": {
+ "name": "revision_page_id_page_id_fk",
+ "tableFrom": "revision",
+ "tableTo": "page",
+ "schemaTo": "editor",
+ "columnsFrom": [
+ "page_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "revision_author_id_user_id_fk": {
+ "name": "revision_author_id_user_id_fk",
+ "tableFrom": "revision",
+ "tableTo": "user",
+ "schemaTo": "auth",
+ "columnsFrom": [
+ "author_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "auth.session": {
+ "name": "session",
+ "schema": "auth",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "ip_address": {
+ "name": "ip_address",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_agent": {
+ "name": "user_agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "impersonated_by": {
+ "name": "impersonated_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "session_token_unique": {
+ "name": "session_token_unique",
+ "columns": [
+ {
+ "expression": "token",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "session_user_id_idx": {
+ "name": "session_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "session_user_id_user_id_fk": {
+ "name": "session_user_id_user_id_fk",
+ "tableFrom": "session",
+ "tableTo": "user",
+ "schemaTo": "auth",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "editor.slug_alias": {
+ "name": "slug_alias",
+ "schema": "editor",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "kind": {
+ "name": "kind",
+ "type": "varchar(24)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "old_character_slug": {
+ "name": "old_character_slug",
+ "type": "varchar(120)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "old_page_slug": {
+ "name": "old_page_slug",
+ "type": "varchar(120)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "target_character_id": {
+ "name": "target_character_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "target_page_id": {
+ "name": "target_page_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "slug_alias_path_unique": {
+ "name": "slug_alias_path_unique",
+ "columns": [
+ {
+ "expression": "old_character_slug",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "old_page_slug",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "slug_alias_target_character_id_character_id_fk": {
+ "name": "slug_alias_target_character_id_character_id_fk",
+ "tableFrom": "slug_alias",
+ "tableTo": "character",
+ "schemaTo": "editor",
+ "columnsFrom": [
+ "target_character_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "slug_alias_target_page_id_page_id_fk": {
+ "name": "slug_alias_target_page_id_page_id_fk",
+ "tableFrom": "slug_alias",
+ "tableTo": "page",
+ "schemaTo": "editor",
+ "columnsFrom": [
+ "target_page_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.team_composition": {
+ "name": "team_composition",
+ "schema": "guides",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "guide_id": {
+ "name": "guide_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rotation_seconds": {
+ "name": "rotation_seconds",
+ "type": "numeric(8, 2)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "combo": {
+ "name": "combo",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ }
+ },
+ "indexes": {
+ "team_composition_order_idx": {
+ "name": "team_composition_order_idx",
+ "columns": [
+ {
+ "expression": "guide_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "team_composition_guide_id_guide_id_fk": {
+ "name": "team_composition_guide_id_guide_id_fk",
+ "tableFrom": "team_composition",
+ "tableTo": "guide",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "guide_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.team_member": {
+ "name": "team_member",
+ "schema": "guides",
+ "columns": {
+ "team_id": {
+ "name": "team_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "position": {
+ "name": "position",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "character_key": {
+ "name": "character_key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "weapon_key": {
+ "name": "weapon_key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "artifact_key": {
+ "name": "artifact_key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "second_artifact_key": {
+ "name": "second_artifact_key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "constellation": {
+ "name": "constellation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "refinement": {
+ "name": "refinement",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "damage": {
+ "name": "damage",
+ "type": "numeric(18, 2)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "team_member_team_id_team_composition_id_fk": {
+ "name": "team_member_team_id_team_composition_id_fk",
+ "tableFrom": "team_member",
+ "tableTo": "team_composition",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "team_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "team_member_team_id_position_pk": {
+ "name": "team_member_team_id_position_pk",
+ "columns": [
+ "team_id",
+ "position"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "editor.template": {
+ "name": "template",
+ "schema": "editor",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "slug": {
+ "name": "slug",
+ "type": "varchar(120)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "category": {
+ "name": "category",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "structure": {
+ "name": "structure",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "built_in": {
+ "name": "built_in",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "template_slug_unique": {
+ "name": "template_slug_unique",
+ "columns": [
+ {
+ "expression": "slug",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "auth.user": {
+ "name": "user",
+ "schema": "auth",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email_verified": {
+ "name": "email_verified",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'admin'"
+ },
+ "banned": {
+ "name": "banned",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "ban_reason": {
+ "name": "ban_reason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ban_expires": {
+ "name": "ban_expires",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "user_email_unique": {
+ "name": "user_email_unique",
+ "columns": [
+ {
+ "expression": "email",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "auth.verification": {
+ "name": "verification",
+ "schema": "auth",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "identifier": {
+ "name": "identifier",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "verification_identifier_idx": {
+ "name": "verification_identifier_idx",
+ "columns": [
+ {
+ "expression": "identifier",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.weapon_condition": {
+ "name": "weapon_condition",
+ "schema": "guides",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "guide_id": {
+ "name": "guide_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "note": {
+ "name": "note",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ }
+ },
+ "indexes": {
+ "weapon_condition_order_idx": {
+ "name": "weapon_condition_order_idx",
+ "columns": [
+ {
+ "expression": "guide_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "weapon_condition_guide_id_guide_id_fk": {
+ "name": "weapon_condition_guide_id_guide_id_fk",
+ "tableFrom": "weapon_condition",
+ "tableTo": "guide",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "guide_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "guides.weapon_recommendation": {
+ "name": "weapon_recommendation",
+ "schema": "guides",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "condition_id": {
+ "name": "condition_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "weapon_key": {
+ "name": "weapon_key",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "refinement": {
+ "name": "refinement",
+ "type": "varchar(8)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "overall_percent": {
+ "name": "overall_percent",
+ "type": "numeric(8, 2)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "personal_percent": {
+ "name": "personal_percent",
+ "type": "numeric(8, 2)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "note": {
+ "name": "note",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ }
+ },
+ "indexes": {
+ "weapon_recommendation_order_idx": {
+ "name": "weapon_recommendation_order_idx",
+ "columns": [
+ {
+ "expression": "condition_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "weapon_recommendation_condition_id_weapon_condition_id_fk": {
+ "name": "weapon_recommendation_condition_id_weapon_condition_id_fk",
+ "tableFrom": "weapon_recommendation",
+ "tableTo": "weapon_condition",
+ "schemaTo": "guides",
+ "columnsFrom": [
+ "condition_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {},
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json
index 1a3e9d4..839e8fb 100644
--- a/drizzle/meta/_journal.json
+++ b/drizzle/meta/_journal.json
@@ -225,6 +225,13 @@
"when": 1788673251760,
"tag": "0031_watery_sumo",
"breakpoints": true
+ },
+ {
+ "idx": 32,
+ "version": "7",
+ "when": 1788680680873,
+ "tag": "0032_grey_excalibur",
+ "breakpoints": true
}
]
}
\ No newline at end of file
diff --git a/lib/catalog/lunaris.test.ts b/lib/catalog/lunaris.test.ts
index b9c5468..3145592 100644
--- a/lib/catalog/lunaris.test.ts
+++ b/lib/catalog/lunaris.test.ts
@@ -3,6 +3,7 @@ import { describe, expect, it } from "vitest";
import {
avatarIconName,
ascensionSnapshot,
+ baseStatsSnapshot,
characterDetailSchema,
cleanLunarisText,
constellationSnapshot,
@@ -79,6 +80,22 @@ describe("Lunaris character data", () => {
]);
});
+ it("selects dynamic level 90 base stats", () => {
+ const detail = characterDetailSchema.parse({
+ attributes: [
+ { level: 1, ascension: 0, hp: 1, atk: 2, def: 3 },
+ { level: 90, ascension: 6, hp: 12981, atk: 335, def: 787, "CRIT DMG%": "38.4" },
+ ],
+ });
+
+ expect(baseStatsSnapshot(detail)).toEqual([
+ { key: "hp", value: 12981 },
+ { key: "atk", value: 335 },
+ { key: "def", value: 787 },
+ { key: "CRIT DMG%", value: "38.4" },
+ ]);
+ });
+
it("reads the supported weapon type from character details", () => {
const detail = characterDetailSchema.parse({
info: { element: "Cryo", weapon: "WEAPON_SWORD_ONE_HAND" },
diff --git a/lib/catalog/lunaris.ts b/lib/catalog/lunaris.ts
index a98889b..2f93857 100644
--- a/lib/catalog/lunaris.ts
+++ b/lib/catalog/lunaris.ts
@@ -33,6 +33,11 @@ export interface CatalogMaterial {
imageKey: string;
}
+export interface CatalogBaseStat {
+ key: string;
+ value: number | string;
+}
+
const constellationSchema = z.object({
name: z.string(),
description: z.string(),
@@ -60,6 +65,9 @@ export const characterDetailSchema = z.object({
z.string(),
z.union([z.number().int(), z.record(z.string(), z.number().int())]),
).nullish(),
+ attributes: z.array(
+ z.record(z.string(), z.union([z.number(), z.string()])),
+ ).nullish(),
});
export function cleanLunarisText(value: string): string {
@@ -141,3 +149,13 @@ export function ascensionSnapshot(
: Object.entries(entries).map(([key, amount]) => ({ key, amount })),
}));
}
+
+export function baseStatsSnapshot(
+ value: z.infer,
+): CatalogBaseStat[] {
+ const level90 = value.attributes?.find((entry) => entry.level === 90);
+ if (!level90) return [];
+ return Object.entries(level90)
+ .filter(([key]) => key !== "level" && key !== "ascension")
+ .map(([key, stat]) => ({ key, value: stat }));
+}
diff --git a/lib/catalog/sync.ts b/lib/catalog/sync.ts
index 25753bf..1e8deeb 100644
--- a/lib/catalog/sync.ts
+++ b/lib/catalog/sync.ts
@@ -12,6 +12,7 @@ import {
import {
ascensionSnapshot,
avatarIconName,
+ baseStatsSnapshot,
characterDetailSchema,
constellationSnapshot,
nameCardImageName,
@@ -20,6 +21,7 @@ import {
} from "@/lib/catalog/lunaris";
import type {
CatalogAscensionGroup,
+ CatalogBaseStat,
CatalogConstellation,
CatalogMaterial,
CatalogTalent,
@@ -95,6 +97,7 @@ interface SyncedCharacter {
constellations: CatalogConstellation[];
talents: CatalogTalent[];
ascension: CatalogAscensionGroup[];
+ baseStats: CatalogBaseStat[];
}
async function getJson(url: string): Promise {
@@ -274,6 +277,7 @@ async function syncCatalogVersion(version: string): Promise {
)
: [],
ascension: detail ? ascensionSnapshot(detail) : [],
+ baseStats: detail ? baseStatsSnapshot(detail) : [],
};
},
);
@@ -308,6 +312,7 @@ async function syncCatalogVersion(version: string): Promise {
(icon) => `catalog/characters/talents/${webpName(icon)}`,
),
ascension: ascensionSnapshot(detail),
+ baseStats: baseStatsSnapshot(detail),
};
},
);
@@ -456,6 +461,7 @@ async function syncCatalogVersion(version: string): Promise {
constellations: item.constellations,
talents: item.talents,
ascension: item.ascension,
+ baseStats: item.baseStats,
})),
),
{ type: "application/json", acl: "public-read" },
@@ -514,6 +520,7 @@ async function syncCatalogVersion(version: string): Promise {
constellations: item.constellations,
talents: item.talents,
ascension: item.ascension,
+ baseStats: item.baseStats,
})),
);
if (materials.length)
diff --git a/lib/content/queries.ts b/lib/content/queries.ts
index 3e5bbea..37a04e2 100644
--- a/lib/content/queries.ts
+++ b/lib/content/queries.ts
@@ -8,6 +8,7 @@ import {
characters,
dataSources,
dataSourceVersions,
+ guides,
media,
pageDataSources,
pages,
@@ -308,7 +309,7 @@ export async function getMediaVisibility(mediaId: string): Promise<{
retained: boolean;
}> {
const db = getDb();
- const [referencedBlocks, portraitCharacters, [mediaRecord]] = await Promise.all([
+ const [referencedBlocks, portraitCharacters, posterGuides, [mediaRecord]] = await Promise.all([
db
.select({ block: blocks, page: pages, character: characters })
.from(blocks)
@@ -318,6 +319,10 @@ export async function getMediaVisibility(mediaId: string): Promise<{
.select({ character: characters })
.from(characters)
.where(eq(characters.portraitMediaId, mediaId)),
+ db
+ .select({ guide: guides })
+ .from(guides)
+ .where(eq(guides.posterArtMediaId, mediaId)),
db.select().from(media).where(eq(media.id, mediaId)).limit(1),
]);
@@ -336,10 +341,12 @@ export async function getMediaVisibility(mediaId: string): Promise<{
public:
references.some(
({ page, character }) => page.visible && character.visible,
- ) || portraitCharacters.some(({ character }) => character.visible),
+ ) || portraitCharacters.some(({ character }) => character.visible) ||
+ posterGuides.some(({ guide }) => guide.isPublic && !guide.trashedAt),
retained:
references.length > 0 ||
portraitCharacters.length > 0 ||
+ posterGuides.length > 0 ||
Boolean(
mediaRecord &&
(mediaRecord.currentReferenceCount > 0 ||
diff --git a/lib/guides/mutations.ts b/lib/guides/mutations.ts
index 716c2ac..952b59b 100644
--- a/lib/guides/mutations.ts
+++ b/lib/guides/mutations.ts
@@ -126,16 +126,40 @@ export async function updateGuideBasics(guideId: string, input: unknown) {
const [cover] = await getDb().select().from(media).where(and(eq(media.id, data.coverMediaId), eq(media.status, "ready"))).limit(1);
if (!cover) throw new Error("ไม่พบภาพ Guide ที่อัปโหลดแล้ว");
return getDb().transaction(async (tx) => {
+ const posterArtMediaId = data.posterArtMediaId === undefined
+ ? current.posterArtMediaId
+ : data.posterArtMediaId;
+ if (posterArtMediaId) {
+ const [poster] = await tx
+ .select({ id: media.id })
+ .from(media)
+ .where(and(eq(media.id, posterArtMediaId), eq(media.status, "ready")))
+ .limit(1);
+ if (!poster) throw new Error("ไม่พบภาพตัวละครที่อัปโหลดแล้ว");
+ }
const updated = await advanceGuideVersion(tx, guideId, data.expectedVersion);
await tx.update(guides).set({
overview: data.overview,
coverMediaId: data.coverMediaId,
...(data.youtubeUrl !== undefined ? { youtubeUrl: data.youtubeUrl } : {}),
+ ...(data.posterArtMediaId !== undefined ? { posterArtMediaId } : {}),
+ ...(data.posterArtOffsetX !== undefined ? { posterArtOffsetX: Math.round(data.posterArtOffsetX) } : {}),
+ ...(data.posterArtOffsetY !== undefined ? { posterArtOffsetY: Math.round(data.posterArtOffsetY) } : {}),
+ ...(data.posterTopColors !== undefined ? { posterTopColors: data.posterTopColors } : {}),
+ ...(data.posterBottomColors !== undefined ? { posterBottomColors: data.posterBottomColors } : {}),
}).where(eq(guides.id, guideId));
if (current.coverMediaId !== data.coverMediaId) {
await tx.update(media).set({ currentReferenceCount: sql`greatest(${media.currentReferenceCount} - 1, 0)` }).where(eq(media.id, current.coverMediaId));
await tx.update(media).set({ currentReferenceCount: sql`${media.currentReferenceCount} + 1` }).where(eq(media.id, data.coverMediaId));
}
+ if (current.posterArtMediaId !== posterArtMediaId) {
+ if (current.posterArtMediaId) {
+ await tx.update(media).set({ currentReferenceCount: sql`greatest(${media.currentReferenceCount} - 1, 0)` }).where(eq(media.id, current.posterArtMediaId));
+ }
+ if (posterArtMediaId) {
+ await tx.update(media).set({ currentReferenceCount: sql`${media.currentReferenceCount} + 1` }).where(eq(media.id, posterArtMediaId));
+ }
+ }
return updated;
});
}
@@ -390,6 +414,9 @@ export async function permanentlyDeleteGuide(guideId: string) {
if (!guide?.trashedAt) throw new Error("Guide ต้องอยู่ในถังขยะก่อนลบถาวร");
await tx.delete(guides).where(eq(guides.id, guideId));
await tx.update(media).set({ currentReferenceCount: sql`greatest(${media.currentReferenceCount} - 1, 0)` }).where(eq(media.id, guide.coverMediaId));
+ if (guide.posterArtMediaId) {
+ await tx.update(media).set({ currentReferenceCount: sql`greatest(${media.currentReferenceCount} - 1, 0)` }).where(eq(media.id, guide.posterArtMediaId));
+ }
await emitGuideEvents(tx, guide.id, guide.version + 1);
return { version: guide.version + 1 };
});
diff --git a/lib/guides/queries.ts b/lib/guides/queries.ts
index bd6590b..33060bd 100644
--- a/lib/guides/queries.ts
+++ b/lib/guides/queries.ts
@@ -114,14 +114,33 @@ export async function listPublicGuideCards() {
export async function getGuideByCharacterKey(characterKey: string) {
const [row] = await getDb()
- .select({ guide: guides, cover: media })
+ .select({ guide: guides, cover: media, character: catalogCharacters })
.from(guides)
.innerJoin(media, eq(media.id, guides.coverMediaId))
+ .innerJoin(catalogCharacters, eq(catalogCharacters.key, guides.characterKey))
.where(and(eq(guides.characterKey, characterKey), isNull(guides.trashedAt)))
.limit(1);
if (!row) return null;
+ const materialKeys = [...new Set(
+ row.character.ascension.flatMap((group) => group.items.map((item) => item.key)),
+ )];
+ const [materials, poster] = await Promise.all([
+ materialKeys.length
+ ? getDb().select().from(catalogMaterials).where(inArray(catalogMaterials.key, materialKeys))
+ : [],
+ row.guide.posterArtMediaId
+ ? getDb().select().from(media).where(eq(media.id, row.guide.posterArtMediaId)).limit(1)
+ : Promise.resolve([]),
+ ]);
+ const materialByKey = new Map(materials.map((item) => [item.key, item]));
const sections = await getDb().select().from(guideSections).where(eq(guideSections.guideId, row.guide.id)).orderBy(asc(guideSections.sortOrder));
- return { ...row.guide, coverUrl: publicMediaUrl(row.cover.objectKey), sections };
+ return {
+ ...row.guide,
+ coverUrl: publicMediaUrl(row.cover.objectKey),
+ posterArtUrl: poster[0] ? publicMediaUrl(poster[0].objectKey) : null,
+ character: catalogCharacterWithUrls(row.character, materialByKey),
+ sections,
+ };
}
async function getGuideContent(slug: string, publicOnly: boolean) {
@@ -140,7 +159,7 @@ async function getGuideContent(slug: string, publicOnly: boolean) {
const materialKeys = [...new Set(
row.character.ascension.flatMap((group) => group.items.map((item) => item.key)),
)];
- const [sections, weaponConditionsRows, groups, profile, constellationGroups, teams, aliases, materials] = await Promise.all([
+ const [sections, weaponConditionsRows, groups, profile, constellationGroups, teams, aliases, materials, poster] = await Promise.all([
getDb().select().from(guideSections).where(and(eq(guideSections.guideId, row.guide.id), eq(guideSections.enabled, true))).orderBy(asc(guideSections.sortOrder)),
getDb().select().from(weaponConditions).where(eq(weaponConditions.guideId, row.guide.id)).orderBy(asc(weaponConditions.sortOrder)),
getDb().select().from(artifactGroups).where(eq(artifactGroups.guideId, row.guide.id)).orderBy(asc(artifactGroups.sortOrder)),
@@ -151,6 +170,9 @@ async function getGuideContent(slug: string, publicOnly: boolean) {
materialKeys.length
? getDb().select().from(catalogMaterials).where(inArray(catalogMaterials.key, materialKeys))
: [],
+ row.guide.posterArtMediaId
+ ? getDb().select().from(media).where(eq(media.id, row.guide.posterArtMediaId)).limit(1)
+ : Promise.resolve([]),
]);
const groupedAliases = aliasesByItem(aliases);
const materialByKey = new Map(materials.map((item) => [item.key, item]));
@@ -198,6 +220,7 @@ async function getGuideContent(slug: string, publicOnly: boolean) {
return {
...row.guide,
coverUrl: publicMediaUrl(row.cover.objectKey),
+ posterArtUrl: poster[0] ? publicMediaUrl(poster[0].objectKey) : null,
character: { ...catalogCharacterWithUrls(row.character, materialByKey), aliases: groupedAliases.character.get(row.character.key) ?? [] },
elementIconUrls,
sections,
diff --git a/lib/guides/schemas.ts b/lib/guides/schemas.ts
index fa1652f..3f229a9 100644
--- a/lib/guides/schemas.ts
+++ b/lib/guides/schemas.ts
@@ -36,6 +36,11 @@ export const updateGuideSchema = z.strictObject({
coverMediaId: z.string().uuid(),
overview: z.string().trim().min(1).max(500),
youtubeUrl: youtubeUrlSchema,
+ posterArtMediaId: z.string().uuid().nullable().optional(),
+ posterArtOffsetX: z.number().finite().min(-50).max(50).optional(),
+ posterArtOffsetY: z.number().finite().min(-50).max(50).optional(),
+ posterTopColors: z.tuple([z.string().regex(/^#[0-9a-fA-F]{6}$/u), z.string().regex(/^#[0-9a-fA-F]{6}$/u)]).optional(),
+ posterBottomColors: z.tuple([z.string().regex(/^#[0-9a-fA-F]{6}$/u), z.string().regex(/^#[0-9a-fA-F]{6}$/u)]).optional(),
});
export const weaponSectionSchema = z.strictObject({
diff --git a/public/Kanit-ExtraBoldItalic.ttf b/public/Kanit-ExtraBoldItalic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..5f6c382476383cee025d5c3d3b9c9d235b52c11f
GIT binary patch
literal 191664
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