From 4224096b625c1ec675fa9e41cbe7d7376ddfbf46 Mon Sep 17 00:00:00 2001 From: Z8MB1E Date: Wed, 30 Sep 2026 14:50:40 -0400 Subject: [PATCH] chore(db): register migrations and regenerate schema/types --- src/migrations/index.ts | 26 +- src/payload-generated-schema.ts | 1131 +++++++++++++++++++++++++++---- src/payload-types.ts | 104 ++- 3 files changed, 1129 insertions(+), 132 deletions(-) diff --git a/src/migrations/index.ts b/src/migrations/index.ts index d943612..318c313 100644 --- a/src/migrations/index.ts +++ b/src/migrations/index.ts @@ -90,6 +90,10 @@ import * as migration_20260923_200000_add_missing_role_permission_enum_values fr import * as migration_20260923_202700_add_form_builder_collections from './20260923_202700_add_form_builder_collections'; import * as migration_20260924_205400_add_story_beat_voiceover from './20260924_205400_add_story_beat_voiceover'; import * as migration_20260924_212353_add_story_voiceover_ai_generated from './20260924_212353_add_story_voiceover_ai_generated'; +import * as migration_20260925_235150_add_mission_role_signups from './20260925_235150_add_mission_role_signups'; +import * as migration_20260926_030859_add_mission_role_description from './20260926_030859_add_mission_role_description'; +import * as migration_20260926_044319_add_mission_role_description_richtext from './20260926_044319_add_mission_role_description_richtext'; +import * as migration_20260928_021138_change_ai_model from './20260928_021138_change_ai_model'; export const migrations = [ { @@ -550,6 +554,26 @@ export const migrations = [ { up: migration_20260924_212353_add_story_voiceover_ai_generated.up, down: migration_20260924_212353_add_story_voiceover_ai_generated.down, - name: '20260924_212353_add_story_voiceover_ai_generated' + name: '20260924_212353_add_story_voiceover_ai_generated', + }, + { + up: migration_20260925_235150_add_mission_role_signups.up, + down: migration_20260925_235150_add_mission_role_signups.down, + name: '20260925_235150_add_mission_role_signups', + }, + { + up: migration_20260926_030859_add_mission_role_description.up, + down: migration_20260926_030859_add_mission_role_description.down, + name: '20260926_030859_add_mission_role_description', + }, + { + up: migration_20260926_044319_add_mission_role_description_richtext.up, + down: migration_20260926_044319_add_mission_role_description_richtext.down, + name: '20260926_044319_add_mission_role_description_richtext', + }, + { + up: migration_20260928_021138_change_ai_model.up, + down: migration_20260928_021138_change_ai_model.down, + name: '20260928_021138_change_ai_model' }, ]; diff --git a/src/payload-generated-schema.ts b/src/payload-generated-schema.ts index ef6111b..d97abcd 100644 --- a/src/payload-generated-schema.ts +++ b/src/payload-generated-schema.ts @@ -16,14 +16,41 @@ import { varchar, timestamp, numeric, - jsonb, integer, + jsonb, boolean, type AnyPgColumn, + text, pgEnum, } from "@payloadcms/db-postgres/drizzle/pg-core"; import { sql, relations } from "@payloadcms/db-postgres/drizzle"; import { geometryColumn } from "@payloadcms/db-postgres"; +export const enum_announcements_buttons_style = pgEnum("enum_announcements_buttons_style", [ + "default", + "outline", + "destructive", +]); +export const enum_announcements_variant = pgEnum("enum_announcements_variant", [ + "info", + "success", + "warning", + "error", +]); +export const enum_announcements_display_type = pgEnum("enum_announcements_display_type", [ + "banner", + "modal", + "dialog", + "toast", +]); +export const enum_announcements_targeting_audience = pgEnum( + "enum_announcements_targeting_audience", + ["all", "users", "roles"], +); +export const enum_announcements_paths_match_type = pgEnum("enum_announcements_paths_match_type", [ + "all", + "include", + "exclude", +]); export const enum_game_structures_staff_positions_position_type = pgEnum( "enum_game_structures_staff_positions_position_type", ["administrative", "technical", "other"], @@ -125,6 +152,7 @@ export const enum_users_preferences_notifications_muted_types = pgEnum( "poker:everyone-left", "blackjack:force-ended", "blackjack:everyone-left", + "mission:role-promoted", ], ); export const enum_users_preferences_discord_muted_types = pgEnum( @@ -152,6 +180,7 @@ export const enum_users_preferences_discord_muted_types = pgEnum( "poker:everyone-left", "blackjack:force-ended", "blackjack:everyone-left", + "mission:role-promoted", ], ); export const enum_users_preferences_display_lead_or_actual = pgEnum( @@ -233,6 +262,11 @@ export const enum_roles_permissions = pgEnum("enum_roles_permissions", [ "mission-attendances:update", "mission-attendances:delete", "admin:mission-attendances:manage", + "mission-role-signups:create", + "mission-role-signups:read", + "mission-role-signups:update", + "mission-role-signups:delete", + "admin:mission-role-signups:manage", "campaigns:create", "campaigns:read", "campaigns:update", @@ -373,12 +407,16 @@ export const enum_roles_permissions = pgEnum("enum_roles_permissions", [ "maps:read", "maps:update", "maps:delete", + "maps:place", "admin:maps:manage", "map-roads:read", + "map-roads:author", "admin:map-roads:manage", "map-zones:read", + "map-zones:author", "admin:map-zones:manage", "resource-nodes:read", + "resource-nodes:author", "admin:resource-nodes:manage", "narrative-events:create", "narrative-events:read", @@ -445,6 +483,14 @@ export const enum_roles_permissions = pgEnum("enum_roles_permissions", [ "announcements:update", "announcements:delete", "admin:announcements:manage", + "forms:create", + "forms:read", + "forms:update", + "forms:delete", + "form-submissions:read", + "form-submissions:delete", + "admin:forms:manage", + "admin:form-submissions:manage", "game-rules:read", "game-rules:update", "shims:read", @@ -964,38 +1010,22 @@ export const enum_custom_radio_test_scores_mode = pgEnum("enum_custom_radio_test "sprint", "watch", ]); -export const enum_announcements_buttons_style = pgEnum("enum_announcements_buttons_style", [ - "default", - "outline", - "destructive", +export const enum_forms_confirmation_type = pgEnum("enum_forms_confirmation_type", [ + "message", + "redirect", ]); -export const enum_announcements_variant = pgEnum("enum_announcements_variant", [ - "info", - "success", - "warning", - "error", -]); -export const enum_announcements_display_type = pgEnum("enum_announcements_display_type", [ - "banner", - "modal", - "dialog", - "toast", -]); -export const enum_announcements_targeting_audience = pgEnum( - "enum_announcements_targeting_audience", - ["all", "users", "roles"], -); -export const enum_announcements_paths_match_type = pgEnum("enum_announcements_paths_match_type", [ +export const enum_forms_targeting_audience = pgEnum("enum_forms_targeting_audience", [ "all", - "include", - "exclude", + "users", + "roles", + "qualifications", ]); export const enum_plugin_ai_instructions_field_type = pgEnum( "enum_plugin_ai_instructions_field_type", ["text", "textarea", "upload", "richText"], ); export const enum_plugin_ai_instructions_model_id = pgEnum("enum_plugin_ai_instructions_model_id", [ - "unsloth-text", + "unsloth/gemma-4-26B-A4B-it-qat-GGUF", ]); export const enum_shims_shims_targeting_roles = pgEnum("enum_shims_shims_targeting_roles", [ "guest", @@ -1045,6 +1075,112 @@ export const media = pgTable( ], ); +export const announcements_buttons = pgTable( + "announcements_buttons", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + id: varchar("id").primaryKey(), + label: varchar("label").notNull(), + href: varchar("href"), + style: enum_announcements_buttons_style("style").default("default"), + }, + (columns) => [ + index("announcements_buttons_order_idx").on(columns._order), + index("announcements_buttons_parent_id_idx").on(columns._parentID), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [announcements.id], + name: "announcements_buttons_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const announcements = pgTable( + "announcements", + { + id: serial("id").primaryKey(), + title: varchar("title").notNull(), + subtitle: varchar("subtitle"), + description: jsonb("description"), + variant: enum_announcements_variant("variant").notNull().default("info"), + displayType: enum_announcements_display_type("display_type").notNull().default("banner"), + enabled: boolean("enabled").default(true), + dismissible: boolean("dismissible").default(true), + activeFrom: timestamp("active_from", { mode: "string", withTimezone: true, precision: 3 }), + activeUntil: timestamp("active_until", { mode: "string", withTimezone: true, precision: 3 }), + targeting_audience: enum_announcements_targeting_audience("targeting_audience") + .notNull() + .default("all"), + paths_matchType: enum_announcements_paths_match_type("paths_match_type") + .notNull() + .default("all"), + updatedAt: timestamp("updated_at", { mode: "string", withTimezone: true, precision: 3 }) + .defaultNow() + .notNull(), + createdAt: timestamp("created_at", { mode: "string", withTimezone: true, precision: 3 }) + .defaultNow() + .notNull(), + }, + (columns) => [ + index("announcements_updated_at_idx").on(columns.updatedAt), + index("announcements_created_at_idx").on(columns.createdAt), + ], +); + +export const announcements_texts = pgTable( + "announcements_texts", + { + id: serial("id").primaryKey(), + order: integer("order").notNull(), + parent: integer("parent_id").notNull(), + path: varchar("path").notNull(), + text: varchar("text"), + }, + (columns) => [ + index("announcements_texts_order_parent").on(columns.order, columns.parent), + foreignKey({ + columns: [columns["parent"]], + foreignColumns: [announcements.id], + name: "announcements_texts_parent_fk", + }).onDelete("cascade"), + ], +); + +export const announcements_rels = pgTable( + "announcements_rels", + { + id: serial("id").primaryKey(), + order: integer("order"), + parent: integer("parent_id").notNull(), + path: varchar("path").notNull(), + usersID: integer("users_id"), + rolesID: integer("roles_id"), + }, + (columns) => [ + index("announcements_rels_order_idx").on(columns.order), + index("announcements_rels_parent_idx").on(columns.parent), + index("announcements_rels_path_idx").on(columns.path), + index("announcements_rels_users_id_idx").on(columns.usersID), + index("announcements_rels_roles_id_idx").on(columns.rolesID), + foreignKey({ + columns: [columns["parent"]], + foreignColumns: [announcements.id], + name: "announcements_rels_parent_fk", + }).onDelete("cascade"), + foreignKey({ + columns: [columns["usersID"]], + foreignColumns: [users.id], + name: "announcements_rels_users_fk", + }).onDelete("cascade"), + foreignKey({ + columns: [columns["rolesID"]], + foreignColumns: [roles.id], + name: "announcements_rels_roles_fk", + }).onDelete("cascade"), + ], +); + export const game_hard_resources = pgTable( "game_hard_resources", { @@ -2606,10 +2742,12 @@ export const missions_mission_roles_provided_roles = pgTable( _parentID: integer("_parent_id").notNull(), id: varchar("id").primaryKey(), roleName: varchar("role_name").notNull(), + description: jsonb("description"), missionCritical: boolean("mission_critical").default(true), minimumRank: integer("minimum_rank_id").references(() => ranks.id, { onDelete: "set null", }), + slots: numeric("slots", { mode: "number" }).default(1), }, (columns) => [ index("missions_mission_roles_provided_roles_order_idx").on(columns._order), @@ -2983,6 +3121,37 @@ export const mission_attendances = pgTable( ], ); +export const mission_role_signups = pgTable( + "mission_role_signups", + { + id: serial("id").primaryKey(), + mission: integer("mission_id") + .notNull() + .references(() => missions.id, { + onDelete: "set null", + }), + user: integer("user_id") + .notNull() + .references(() => users.id, { + onDelete: "set null", + }), + roleIndex: numeric("role_index", { mode: "number" }).notNull(), + roleNameSnapshot: varchar("role_name_snapshot"), + updatedAt: timestamp("updated_at", { mode: "string", withTimezone: true, precision: 3 }) + .defaultNow() + .notNull(), + createdAt: timestamp("created_at", { mode: "string", withTimezone: true, precision: 3 }) + .defaultNow() + .notNull(), + }, + (columns) => [ + index("mission_role_signups_mission_idx").on(columns.mission), + index("mission_role_signups_user_idx").on(columns.user), + index("mission_role_signups_updated_at_idx").on(columns.updatedAt), + index("mission_role_signups_created_at_idx").on(columns.createdAt), + ], +); + export const campaigns = pgTable( "campaigns", { @@ -5323,6 +5492,9 @@ export const story_beats = pgTable( mission: integer("mission_id").references(() => missions.id, { onDelete: "set null", }), + voiceover: integer("voiceover_id").references(() => story_voiceovers.id, { + onDelete: "set null", + }), updatedAt: timestamp("updated_at", { mode: "string", withTimezone: true, precision: 3 }) .defaultNow() .notNull(), @@ -5333,6 +5505,7 @@ export const story_beats = pgTable( (columns) => [ index("story_beats_status_idx").on(columns.status), index("story_beats_mission_idx").on(columns.mission), + index("story_beats_voiceover_idx").on(columns.voiceover), index("story_beats_updated_at_idx").on(columns.updatedAt), index("story_beats_created_at_idx").on(columns.createdAt), ], @@ -5369,6 +5542,34 @@ export const story_beat_states = pgTable( ], ); +export const story_voiceovers = pgTable( + "story_voiceovers", + { + id: serial("id").primaryKey(), + aiGenerated: boolean("ai_generated").default(false), + updatedAt: timestamp("updated_at", { mode: "string", withTimezone: true, precision: 3 }) + .defaultNow() + .notNull(), + createdAt: timestamp("created_at", { mode: "string", withTimezone: true, precision: 3 }) + .defaultNow() + .notNull(), + url: varchar("url"), + thumbnailURL: varchar("thumbnail_u_r_l"), + filename: varchar("filename"), + mimeType: varchar("mime_type"), + filesize: numeric("filesize", { mode: "number" }), + width: numeric("width", { mode: "number" }), + height: numeric("height", { mode: "number" }), + focalX: numeric("focal_x", { mode: "number" }), + focalY: numeric("focal_y", { mode: "number" }), + }, + (columns) => [ + index("story_voiceovers_updated_at_idx").on(columns.updatedAt), + index("story_voiceovers_created_at_idx").on(columns.createdAt), + uniqueIndex("story_voiceovers_filename_idx").on(columns.filename), + ], +); + export const mission_files = pgTable( "mission_files", { @@ -6020,44 +6221,363 @@ export const custom_radio_test_scores = pgTable( ], ); -export const announcements_buttons = pgTable( - "announcements_buttons", +export const forms_blocks_checkbox = pgTable( + "forms_blocks_checkbox", { _order: integer("_order").notNull(), _parentID: integer("_parent_id").notNull(), + _path: text("_path").notNull(), id: varchar("id").primaryKey(), - label: varchar("label").notNull(), - href: varchar("href"), - style: enum_announcements_buttons_style("style").default("default"), + name: varchar("name").notNull(), + label: varchar("label"), + width: numeric("width", { mode: "number" }), + required: boolean("required"), + defaultValue: boolean("default_value"), + blockName: varchar("block_name"), }, (columns) => [ - index("announcements_buttons_order_idx").on(columns._order), - index("announcements_buttons_parent_id_idx").on(columns._parentID), + index("forms_blocks_checkbox_order_idx").on(columns._order), + index("forms_blocks_checkbox_parent_id_idx").on(columns._parentID), + index("forms_blocks_checkbox_path_idx").on(columns._path), foreignKey({ columns: [columns["_parentID"]], - foreignColumns: [announcements.id], - name: "announcements_buttons_parent_id_fk", + foreignColumns: [forms.id], + name: "forms_blocks_checkbox_parent_id_fk", }).onDelete("cascade"), ], ); -export const announcements = pgTable( - "announcements", +export const forms_blocks_country = pgTable( + "forms_blocks_country", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + _path: text("_path").notNull(), + id: varchar("id").primaryKey(), + name: varchar("name").notNull(), + label: varchar("label"), + width: numeric("width", { mode: "number" }), + required: boolean("required"), + blockName: varchar("block_name"), + }, + (columns) => [ + index("forms_blocks_country_order_idx").on(columns._order), + index("forms_blocks_country_parent_id_idx").on(columns._parentID), + index("forms_blocks_country_path_idx").on(columns._path), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms.id], + name: "forms_blocks_country_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_blocks_email = pgTable( + "forms_blocks_email", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + _path: text("_path").notNull(), + id: varchar("id").primaryKey(), + name: varchar("name").notNull(), + label: varchar("label"), + width: numeric("width", { mode: "number" }), + required: boolean("required"), + blockName: varchar("block_name"), + }, + (columns) => [ + index("forms_blocks_email_order_idx").on(columns._order), + index("forms_blocks_email_parent_id_idx").on(columns._parentID), + index("forms_blocks_email_path_idx").on(columns._path), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms.id], + name: "forms_blocks_email_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_blocks_message = pgTable( + "forms_blocks_message", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + _path: text("_path").notNull(), + id: varchar("id").primaryKey(), + message: jsonb("message"), + blockName: varchar("block_name"), + }, + (columns) => [ + index("forms_blocks_message_order_idx").on(columns._order), + index("forms_blocks_message_parent_id_idx").on(columns._parentID), + index("forms_blocks_message_path_idx").on(columns._path), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms.id], + name: "forms_blocks_message_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_blocks_number = pgTable( + "forms_blocks_number", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + _path: text("_path").notNull(), + id: varchar("id").primaryKey(), + name: varchar("name").notNull(), + label: varchar("label"), + width: numeric("width", { mode: "number" }), + defaultValue: numeric("default_value", { mode: "number" }), + required: boolean("required"), + blockName: varchar("block_name"), + }, + (columns) => [ + index("forms_blocks_number_order_idx").on(columns._order), + index("forms_blocks_number_parent_id_idx").on(columns._parentID), + index("forms_blocks_number_path_idx").on(columns._path), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms.id], + name: "forms_blocks_number_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_blocks_select_options = pgTable( + "forms_blocks_select_options", + { + _order: integer("_order").notNull(), + _parentID: varchar("_parent_id").notNull(), + id: varchar("id").primaryKey(), + label: varchar("label").notNull(), + value: varchar("value").notNull(), + }, + (columns) => [ + index("forms_blocks_select_options_order_idx").on(columns._order), + index("forms_blocks_select_options_parent_id_idx").on(columns._parentID), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms_blocks_select.id], + name: "forms_blocks_select_options_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_blocks_select = pgTable( + "forms_blocks_select", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + _path: text("_path").notNull(), + id: varchar("id").primaryKey(), + name: varchar("name").notNull(), + label: varchar("label"), + width: numeric("width", { mode: "number" }), + defaultValue: varchar("default_value"), + placeholder: varchar("placeholder"), + required: boolean("required"), + blockName: varchar("block_name"), + }, + (columns) => [ + index("forms_blocks_select_order_idx").on(columns._order), + index("forms_blocks_select_parent_id_idx").on(columns._parentID), + index("forms_blocks_select_path_idx").on(columns._path), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms.id], + name: "forms_blocks_select_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_blocks_state = pgTable( + "forms_blocks_state", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + _path: text("_path").notNull(), + id: varchar("id").primaryKey(), + name: varchar("name").notNull(), + label: varchar("label"), + width: numeric("width", { mode: "number" }), + required: boolean("required"), + blockName: varchar("block_name"), + }, + (columns) => [ + index("forms_blocks_state_order_idx").on(columns._order), + index("forms_blocks_state_parent_id_idx").on(columns._parentID), + index("forms_blocks_state_path_idx").on(columns._path), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms.id], + name: "forms_blocks_state_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_blocks_text = pgTable( + "forms_blocks_text", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + _path: text("_path").notNull(), + id: varchar("id").primaryKey(), + name: varchar("name").notNull(), + label: varchar("label"), + width: numeric("width", { mode: "number" }), + defaultValue: varchar("default_value"), + required: boolean("required"), + blockName: varchar("block_name"), + }, + (columns) => [ + index("forms_blocks_text_order_idx").on(columns._order), + index("forms_blocks_text_parent_id_idx").on(columns._parentID), + index("forms_blocks_text_path_idx").on(columns._path), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms.id], + name: "forms_blocks_text_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_blocks_textarea = pgTable( + "forms_blocks_textarea", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + _path: text("_path").notNull(), + id: varchar("id").primaryKey(), + name: varchar("name").notNull(), + label: varchar("label"), + width: numeric("width", { mode: "number" }), + defaultValue: varchar("default_value"), + required: boolean("required"), + blockName: varchar("block_name"), + }, + (columns) => [ + index("forms_blocks_textarea_order_idx").on(columns._order), + index("forms_blocks_textarea_parent_id_idx").on(columns._parentID), + index("forms_blocks_textarea_path_idx").on(columns._path), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms.id], + name: "forms_blocks_textarea_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_blocks_radio_options = pgTable( + "forms_blocks_radio_options", + { + _order: integer("_order").notNull(), + _parentID: varchar("_parent_id").notNull(), + id: varchar("id").primaryKey(), + label: varchar("label").notNull(), + value: varchar("value").notNull(), + }, + (columns) => [ + index("forms_blocks_radio_options_order_idx").on(columns._order), + index("forms_blocks_radio_options_parent_id_idx").on(columns._parentID), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms_blocks_radio.id], + name: "forms_blocks_radio_options_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_blocks_radio = pgTable( + "forms_blocks_radio", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + _path: text("_path").notNull(), + id: varchar("id").primaryKey(), + name: varchar("name").notNull(), + label: varchar("label"), + width: numeric("width", { mode: "number" }), + defaultValue: varchar("default_value"), + required: boolean("required"), + blockName: varchar("block_name"), + }, + (columns) => [ + index("forms_blocks_radio_order_idx").on(columns._order), + index("forms_blocks_radio_parent_id_idx").on(columns._parentID), + index("forms_blocks_radio_path_idx").on(columns._path), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms.id], + name: "forms_blocks_radio_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_blocks_date = pgTable( + "forms_blocks_date", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + _path: text("_path").notNull(), + id: varchar("id").primaryKey(), + name: varchar("name").notNull(), + label: varchar("label"), + width: numeric("width", { mode: "number" }), + required: boolean("required"), + defaultValue: timestamp("default_value", { mode: "string", withTimezone: true, precision: 3 }), + blockName: varchar("block_name"), + }, + (columns) => [ + index("forms_blocks_date_order_idx").on(columns._order), + index("forms_blocks_date_parent_id_idx").on(columns._parentID), + index("forms_blocks_date_path_idx").on(columns._path), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms.id], + name: "forms_blocks_date_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms_emails = pgTable( + "forms_emails", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + id: varchar("id").primaryKey(), + emailTo: varchar("email_to"), + cc: varchar("cc"), + bcc: varchar("bcc"), + replyTo: varchar("reply_to"), + emailFrom: varchar("email_from"), + subject: varchar("subject").notNull().default("You've received a new message."), + message: jsonb("message"), + }, + (columns) => [ + index("forms_emails_order_idx").on(columns._order), + index("forms_emails_parent_id_idx").on(columns._parentID), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [forms.id], + name: "forms_emails_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const forms = pgTable( + "forms", { id: serial("id").primaryKey(), title: varchar("title").notNull(), - subtitle: varchar("subtitle"), - description: jsonb("description"), - variant: enum_announcements_variant("variant").notNull().default("info"), - displayType: enum_announcements_display_type("display_type").notNull().default("banner"), - enabled: boolean("enabled").default(true), - dismissible: boolean("dismissible").default(true), + submitButtonLabel: varchar("submit_button_label"), + confirmationType: enum_forms_confirmation_type("confirmation_type").default("message"), + confirmationMessage: jsonb("confirmation_message"), + redirect_url: varchar("redirect_url"), activeFrom: timestamp("active_from", { mode: "string", withTimezone: true, precision: 3 }), activeUntil: timestamp("active_until", { mode: "string", withTimezone: true, precision: 3 }), - targeting_audience: enum_announcements_targeting_audience("targeting_audience") - .notNull() - .default("all"), - paths_matchType: enum_announcements_paths_match_type("paths_match_type") + targeting_audience: enum_forms_targeting_audience("targeting_audience") .notNull() .default("all"), updatedAt: timestamp("updated_at", { mode: "string", withTimezone: true, precision: 3 }) @@ -6068,32 +6588,13 @@ export const announcements = pgTable( .notNull(), }, (columns) => [ - index("announcements_updated_at_idx").on(columns.updatedAt), - index("announcements_created_at_idx").on(columns.createdAt), + index("forms_updated_at_idx").on(columns.updatedAt), + index("forms_created_at_idx").on(columns.createdAt), ], ); -export const announcements_texts = pgTable( - "announcements_texts", - { - id: serial("id").primaryKey(), - order: integer("order").notNull(), - parent: integer("parent_id").notNull(), - path: varchar("path").notNull(), - text: varchar("text"), - }, - (columns) => [ - index("announcements_texts_order_parent").on(columns.order, columns.parent), - foreignKey({ - columns: [columns["parent"]], - foreignColumns: [announcements.id], - name: "announcements_texts_parent_fk", - }).onDelete("cascade"), - ], -); - -export const announcements_rels = pgTable( - "announcements_rels", +export const forms_rels = pgTable( + "forms_rels", { id: serial("id").primaryKey(), order: integer("order"), @@ -6101,28 +6602,82 @@ export const announcements_rels = pgTable( path: varchar("path").notNull(), usersID: integer("users_id"), rolesID: integer("roles_id"), + qualificationsID: integer("qualifications_id"), }, (columns) => [ - index("announcements_rels_order_idx").on(columns.order), - index("announcements_rels_parent_idx").on(columns.parent), - index("announcements_rels_path_idx").on(columns.path), - index("announcements_rels_users_id_idx").on(columns.usersID), - index("announcements_rels_roles_id_idx").on(columns.rolesID), + index("forms_rels_order_idx").on(columns.order), + index("forms_rels_parent_idx").on(columns.parent), + index("forms_rels_path_idx").on(columns.path), + index("forms_rels_users_id_idx").on(columns.usersID), + index("forms_rels_roles_id_idx").on(columns.rolesID), + index("forms_rels_qualifications_id_idx").on(columns.qualificationsID), foreignKey({ columns: [columns["parent"]], - foreignColumns: [announcements.id], - name: "announcements_rels_parent_fk", + foreignColumns: [forms.id], + name: "forms_rels_parent_fk", }).onDelete("cascade"), foreignKey({ columns: [columns["usersID"]], foreignColumns: [users.id], - name: "announcements_rels_users_fk", + name: "forms_rels_users_fk", }).onDelete("cascade"), foreignKey({ columns: [columns["rolesID"]], foreignColumns: [roles.id], - name: "announcements_rels_roles_fk", + name: "forms_rels_roles_fk", }).onDelete("cascade"), + foreignKey({ + columns: [columns["qualificationsID"]], + foreignColumns: [qualifications.id], + name: "forms_rels_qualifications_fk", + }).onDelete("cascade"), + ], +); + +export const form_submissions_submission_data = pgTable( + "form_submissions_submission_data", + { + _order: integer("_order").notNull(), + _parentID: integer("_parent_id").notNull(), + id: varchar("id").primaryKey(), + field: varchar("field").notNull(), + value: varchar("value").notNull(), + }, + (columns) => [ + index("form_submissions_submission_data_order_idx").on(columns._order), + index("form_submissions_submission_data_parent_id_idx").on(columns._parentID), + foreignKey({ + columns: [columns["_parentID"]], + foreignColumns: [form_submissions.id], + name: "form_submissions_submission_data_parent_id_fk", + }).onDelete("cascade"), + ], +); + +export const form_submissions = pgTable( + "form_submissions", + { + id: serial("id").primaryKey(), + form: integer("form_id") + .notNull() + .references(() => forms.id, { + onDelete: "set null", + }), + user: integer("user_id").references(() => users.id, { + onDelete: "set null", + }), + updatedAt: timestamp("updated_at", { mode: "string", withTimezone: true, precision: 3 }) + .defaultNow() + .notNull(), + createdAt: timestamp("created_at", { mode: "string", withTimezone: true, precision: 3 }) + .defaultNow() + .notNull(), + }, + (columns) => [ + index("form_submissions_form_idx").on(columns.form), + index("form_submissions_user_idx").on(columns.user), + index("form_submissions_updated_at_idx").on(columns.updatedAt), + index("form_submissions_created_at_idx").on(columns.createdAt), ], ); @@ -6164,8 +6719,8 @@ export const plugin_ai_instructions = pgTable( layout: varchar("layout").default( '[paragraph] - Write a concise introduction (2-3 sentences) that outlines the main topic.\n[horizontalrule] - Insert a horizontal rule to separate the introduction from the main content.\n[list] - Create a list with 3-5 items. Each list item should contain:\n a. [heading] - A brief, descriptive heading (up to 5 words)\n b. [paragraph] - A short explanation or elaboration (1-2 sentences)\n[horizontalrule] - Insert another horizontal rule to separate the main content from the conclusion.\n[paragraph] - Compose a brief conclusion (2-3 sentences) summarizing the key points.\n[quote] - Include a relevant quote from a famous person, directly related to the topic. Format: "Quote text." - Author Name', ), - "unsloth-text-settings_model": varchar("unsloth_text_settings_model").default( - "unsloth/gemma-4-E4B-it-qat-GGUF", + "gemma-4-settings_model": varchar("gemma_4_settings_model").default( + "unsloth/gemma-4-26B-A4B-it-qat-GGUF", ), updatedAt: timestamp("updated_at", { mode: "string", withTimezone: true, precision: 3 }) .defaultNow() @@ -6196,6 +6751,10 @@ export const payload_mcp_api_keys = pgTable( media_create: boolean("media_create").default(false), media_update: boolean("media_update").default(false), media_delete: boolean("media_delete").default(false), + announcements_find: boolean("announcements_find").default(false), + announcements_create: boolean("announcements_create").default(false), + announcements_update: boolean("announcements_update").default(false), + announcements_delete: boolean("announcements_delete").default(false), gameHardResources_find: boolean("game_hard_resources_find").default(false), gameHardResources_create: boolean("game_hard_resources_create").default(false), gameHardResources_update: boolean("game_hard_resources_update").default(false), @@ -6280,6 +6839,10 @@ export const payload_mcp_api_keys = pgTable( missionAttendances_create: boolean("mission_attendances_create").default(false), missionAttendances_update: boolean("mission_attendances_update").default(false), missionAttendances_delete: boolean("mission_attendances_delete").default(false), + missionRoleSignups_find: boolean("mission_role_signups_find").default(false), + missionRoleSignups_create: boolean("mission_role_signups_create").default(false), + missionRoleSignups_update: boolean("mission_role_signups_update").default(false), + missionRoleSignups_delete: boolean("mission_role_signups_delete").default(false), campaigns_find: boolean("campaigns_find").default(false), campaigns_create: boolean("campaigns_create").default(false), campaigns_update: boolean("campaigns_update").default(false), @@ -6416,6 +6979,10 @@ export const payload_mcp_api_keys = pgTable( storyBeatStates_create: boolean("story_beat_states_create").default(false), storyBeatStates_update: boolean("story_beat_states_update").default(false), storyBeatStates_delete: boolean("story_beat_states_delete").default(false), + storyVoiceovers_find: boolean("story_voiceovers_find").default(false), + storyVoiceovers_create: boolean("story_voiceovers_create").default(false), + storyVoiceovers_update: boolean("story_voiceovers_update").default(false), + storyVoiceovers_delete: boolean("story_voiceovers_delete").default(false), missionFiles_find: boolean("mission_files_find").default(false), missionFiles_create: boolean("mission_files_create").default(false), missionFiles_update: boolean("mission_files_update").default(false), @@ -6480,10 +7047,6 @@ export const payload_mcp_api_keys = pgTable( customRadioTestScores_create: boolean("custom_radio_test_scores_create").default(false), customRadioTestScores_update: boolean("custom_radio_test_scores_update").default(false), customRadioTestScores_delete: boolean("custom_radio_test_scores_delete").default(false), - announcements_find: boolean("announcements_find").default(false), - announcements_create: boolean("announcements_create").default(false), - announcements_update: boolean("announcements_update").default(false), - announcements_delete: boolean("announcements_delete").default(false), updatedAt: timestamp("updated_at", { mode: "string", withTimezone: true, precision: 3 }) .defaultNow() .notNull(), @@ -6538,6 +7101,7 @@ export const payload_locked_documents_rels = pgTable( parent: integer("parent_id").notNull(), path: varchar("path").notNull(), mediaID: integer("media_id"), + announcementsID: integer("announcements_id"), "game-hard-resourcesID": integer("game_hard_resources_id"), "game-structuresID": integer("game_structures_id"), "game-vehiclesID": integer("game_vehicles_id"), @@ -6559,6 +7123,7 @@ export const payload_locked_documents_rels = pgTable( "ribbon-submissionsID": integer("ribbon_submissions_id"), missionsID: integer("missions_id"), "mission-attendancesID": integer("mission_attendances_id"), + "mission-role-signupsID": integer("mission_role_signups_id"), campaignsID: integer("campaigns_id"), factionsID: integer("factions_id"), technologiesID: integer("technologies_id"), @@ -6593,6 +7158,7 @@ export const payload_locked_documents_rels = pgTable( "narrative-eventsID": integer("narrative_events_id"), "story-beatsID": integer("story_beats_id"), "story-beat-statesID": integer("story_beat_states_id"), + "story-voiceoversID": integer("story_voiceovers_id"), "mission-filesID": integer("mission_files_id"), "mod-listsID": integer("mod_lists_id"), "game-serversID": integer("game_servers_id"), @@ -6609,7 +7175,8 @@ export const payload_locked_documents_rels = pgTable( "custom-minefield-scoresID": integer("custom_minefield_scores_id"), "custom-radio-testsID": integer("custom_radio_tests_id"), "custom-radio-test-scoresID": integer("custom_radio_test_scores_id"), - announcementsID: integer("announcements_id"), + formsID: integer("forms_id"), + "form-submissionsID": integer("form_submissions_id"), "plugin-ai-instructionsID": integer("plugin_ai_instructions_id"), "payload-mcp-api-keysID": integer("payload_mcp_api_keys_id"), }, @@ -6618,6 +7185,7 @@ export const payload_locked_documents_rels = pgTable( index("payload_locked_documents_rels_parent_idx").on(columns.parent), index("payload_locked_documents_rels_path_idx").on(columns.path), index("payload_locked_documents_rels_media_id_idx").on(columns.mediaID), + index("payload_locked_documents_rels_announcements_id_idx").on(columns.announcementsID), index("payload_locked_documents_rels_game_hard_resources_id_idx").on( columns["game-hard-resourcesID"], ), @@ -6651,6 +7219,9 @@ export const payload_locked_documents_rels = pgTable( index("payload_locked_documents_rels_mission_attendances_id_idx").on( columns["mission-attendancesID"], ), + index("payload_locked_documents_rels_mission_role_signups_id_idx").on( + columns["mission-role-signupsID"], + ), index("payload_locked_documents_rels_campaigns_id_idx").on(columns.campaignsID), index("payload_locked_documents_rels_factions_id_idx").on(columns.factionsID), index("payload_locked_documents_rels_technologies_id_idx").on(columns.technologiesID), @@ -6695,6 +7266,9 @@ export const payload_locked_documents_rels = pgTable( index("payload_locked_documents_rels_story_beat_states_id_idx").on( columns["story-beat-statesID"], ), + index("payload_locked_documents_rels_story_voiceovers_id_idx").on( + columns["story-voiceoversID"], + ), index("payload_locked_documents_rels_mission_files_id_idx").on(columns["mission-filesID"]), index("payload_locked_documents_rels_mod_lists_id_idx").on(columns["mod-listsID"]), index("payload_locked_documents_rels_game_servers_id_idx").on(columns["game-serversID"]), @@ -6729,7 +7303,10 @@ export const payload_locked_documents_rels = pgTable( index("payload_locked_documents_rels_custom_radio_test_scores_i_idx").on( columns["custom-radio-test-scoresID"], ), - index("payload_locked_documents_rels_announcements_id_idx").on(columns.announcementsID), + index("payload_locked_documents_rels_forms_id_idx").on(columns.formsID), + index("payload_locked_documents_rels_form_submissions_id_idx").on( + columns["form-submissionsID"], + ), index("payload_locked_documents_rels_plugin_ai_instructions_id_idx").on( columns["plugin-ai-instructionsID"], ), @@ -6746,6 +7323,11 @@ export const payload_locked_documents_rels = pgTable( foreignColumns: [media.id], name: "payload_locked_documents_rels_media_fk", }).onDelete("cascade"), + foreignKey({ + columns: [columns["announcementsID"]], + foreignColumns: [announcements.id], + name: "payload_locked_documents_rels_announcements_fk", + }).onDelete("cascade"), foreignKey({ columns: [columns["game-hard-resourcesID"]], foreignColumns: [game_hard_resources.id], @@ -6851,6 +7433,11 @@ export const payload_locked_documents_rels = pgTable( foreignColumns: [mission_attendances.id], name: "payload_locked_documents_rels_mission_attendances_fk", }).onDelete("cascade"), + foreignKey({ + columns: [columns["mission-role-signupsID"]], + foreignColumns: [mission_role_signups.id], + name: "payload_locked_documents_rels_mission_role_signups_fk", + }).onDelete("cascade"), foreignKey({ columns: [columns["campaignsID"]], foreignColumns: [campaigns.id], @@ -7021,6 +7608,11 @@ export const payload_locked_documents_rels = pgTable( foreignColumns: [story_beat_states.id], name: "payload_locked_documents_rels_story_beat_states_fk", }).onDelete("cascade"), + foreignKey({ + columns: [columns["story-voiceoversID"]], + foreignColumns: [story_voiceovers.id], + name: "payload_locked_documents_rels_story_voiceovers_fk", + }).onDelete("cascade"), foreignKey({ columns: [columns["mission-filesID"]], foreignColumns: [mission_files.id], @@ -7102,9 +7694,14 @@ export const payload_locked_documents_rels = pgTable( name: "payload_locked_documents_rels_custom_radio_test_scores_fk", }).onDelete("cascade"), foreignKey({ - columns: [columns["announcementsID"]], - foreignColumns: [announcements.id], - name: "payload_locked_documents_rels_announcements_fk", + columns: [columns["formsID"]], + foreignColumns: [forms.id], + name: "payload_locked_documents_rels_forms_fk", + }).onDelete("cascade"), + foreignKey({ + columns: [columns["form-submissionsID"]], + foreignColumns: [form_submissions.id], + name: "payload_locked_documents_rels_form_submissions_fk", }).onDelete("cascade"), foreignKey({ columns: [columns["plugin-ai-instructionsID"]], @@ -7373,6 +7970,48 @@ export const shims_rels = pgTable( ); export const relations_media = relations(media, () => ({})); +export const relations_announcements_buttons = relations(announcements_buttons, ({ one }) => ({ + _parentID: one(announcements, { + fields: [announcements_buttons._parentID], + references: [announcements.id], + relationName: "buttons", + }), +})); +export const relations_announcements_texts = relations(announcements_texts, ({ one }) => ({ + parent: one(announcements, { + fields: [announcements_texts.parent], + references: [announcements.id], + relationName: "_texts", + }), +})); +export const relations_announcements_rels = relations(announcements_rels, ({ one }) => ({ + parent: one(announcements, { + fields: [announcements_rels.parent], + references: [announcements.id], + relationName: "_rels", + }), + usersID: one(users, { + fields: [announcements_rels.usersID], + references: [users.id], + relationName: "users", + }), + rolesID: one(roles, { + fields: [announcements_rels.rolesID], + references: [roles.id], + relationName: "roles", + }), +})); +export const relations_announcements = relations(announcements, ({ many }) => ({ + buttons: many(announcements_buttons, { + relationName: "buttons", + }), + _texts: many(announcements_texts, { + relationName: "_texts", + }), + _rels: many(announcements_rels, { + relationName: "_rels", + }), +})); export const relations_game_hard_resources = relations(game_hard_resources, () => ({})); export const relations_game_structures_labor_requirements = relations( game_structures_labor_requirements, @@ -8132,6 +8771,18 @@ export const relations_mission_attendances = relations(mission_attendances, ({ o relationName: "user", }), })); +export const relations_mission_role_signups = relations(mission_role_signups, ({ one }) => ({ + mission: one(missions, { + fields: [mission_role_signups.mission], + references: [missions.id], + relationName: "mission", + }), + user: one(users, { + fields: [mission_role_signups.user], + references: [users.id], + relationName: "user", + }), +})); export const relations_campaigns = relations(campaigns, ({ one }) => ({ coverImage: one(media, { fields: [campaigns.coverImage], @@ -9231,6 +9882,11 @@ export const relations_story_beats = relations(story_beats, ({ one }) => ({ references: [missions.id], relationName: "mission", }), + voiceover: one(story_voiceovers, { + fields: [story_beats.voiceover], + references: [story_voiceovers.id], + relationName: "voiceover", + }), })); export const relations_story_beat_states = relations(story_beat_states, ({ one }) => ({ user: one(users, { @@ -9244,6 +9900,7 @@ export const relations_story_beat_states = relations(story_beat_states, ({ one } relationName: "beat", }), })); +export const relations_story_voiceovers = relations(story_voiceovers, () => ({})); export const relations_mission_files = relations(mission_files, ({ one }) => ({ author: one(users, { fields: [mission_files.author], @@ -9489,48 +10146,204 @@ export const relations_custom_radio_test_scores = relations( }), }), ); -export const relations_announcements_buttons = relations(announcements_buttons, ({ one }) => ({ - _parentID: one(announcements, { - fields: [announcements_buttons._parentID], - references: [announcements.id], - relationName: "buttons", +export const relations_forms_blocks_checkbox = relations(forms_blocks_checkbox, ({ one }) => ({ + _parentID: one(forms, { + fields: [forms_blocks_checkbox._parentID], + references: [forms.id], + relationName: "_blocks_checkbox", }), })); -export const relations_announcements_texts = relations(announcements_texts, ({ one }) => ({ - parent: one(announcements, { - fields: [announcements_texts.parent], - references: [announcements.id], - relationName: "_texts", +export const relations_forms_blocks_country = relations(forms_blocks_country, ({ one }) => ({ + _parentID: one(forms, { + fields: [forms_blocks_country._parentID], + references: [forms.id], + relationName: "_blocks_country", }), })); -export const relations_announcements_rels = relations(announcements_rels, ({ one }) => ({ - parent: one(announcements, { - fields: [announcements_rels.parent], - references: [announcements.id], +export const relations_forms_blocks_email = relations(forms_blocks_email, ({ one }) => ({ + _parentID: one(forms, { + fields: [forms_blocks_email._parentID], + references: [forms.id], + relationName: "_blocks_email", + }), +})); +export const relations_forms_blocks_message = relations(forms_blocks_message, ({ one }) => ({ + _parentID: one(forms, { + fields: [forms_blocks_message._parentID], + references: [forms.id], + relationName: "_blocks_message", + }), +})); +export const relations_forms_blocks_number = relations(forms_blocks_number, ({ one }) => ({ + _parentID: one(forms, { + fields: [forms_blocks_number._parentID], + references: [forms.id], + relationName: "_blocks_number", + }), +})); +export const relations_forms_blocks_select_options = relations( + forms_blocks_select_options, + ({ one }) => ({ + _parentID: one(forms_blocks_select, { + fields: [forms_blocks_select_options._parentID], + references: [forms_blocks_select.id], + relationName: "options", + }), + }), +); +export const relations_forms_blocks_select = relations(forms_blocks_select, ({ one, many }) => ({ + _parentID: one(forms, { + fields: [forms_blocks_select._parentID], + references: [forms.id], + relationName: "_blocks_select", + }), + options: many(forms_blocks_select_options, { + relationName: "options", + }), +})); +export const relations_forms_blocks_state = relations(forms_blocks_state, ({ one }) => ({ + _parentID: one(forms, { + fields: [forms_blocks_state._parentID], + references: [forms.id], + relationName: "_blocks_state", + }), +})); +export const relations_forms_blocks_text = relations(forms_blocks_text, ({ one }) => ({ + _parentID: one(forms, { + fields: [forms_blocks_text._parentID], + references: [forms.id], + relationName: "_blocks_text", + }), +})); +export const relations_forms_blocks_textarea = relations(forms_blocks_textarea, ({ one }) => ({ + _parentID: one(forms, { + fields: [forms_blocks_textarea._parentID], + references: [forms.id], + relationName: "_blocks_textarea", + }), +})); +export const relations_forms_blocks_radio_options = relations( + forms_blocks_radio_options, + ({ one }) => ({ + _parentID: one(forms_blocks_radio, { + fields: [forms_blocks_radio_options._parentID], + references: [forms_blocks_radio.id], + relationName: "options", + }), + }), +); +export const relations_forms_blocks_radio = relations(forms_blocks_radio, ({ one, many }) => ({ + _parentID: one(forms, { + fields: [forms_blocks_radio._parentID], + references: [forms.id], + relationName: "_blocks_radio", + }), + options: many(forms_blocks_radio_options, { + relationName: "options", + }), +})); +export const relations_forms_blocks_date = relations(forms_blocks_date, ({ one }) => ({ + _parentID: one(forms, { + fields: [forms_blocks_date._parentID], + references: [forms.id], + relationName: "_blocks_date", + }), +})); +export const relations_forms_emails = relations(forms_emails, ({ one }) => ({ + _parentID: one(forms, { + fields: [forms_emails._parentID], + references: [forms.id], + relationName: "emails", + }), +})); +export const relations_forms_rels = relations(forms_rels, ({ one }) => ({ + parent: one(forms, { + fields: [forms_rels.parent], + references: [forms.id], relationName: "_rels", }), usersID: one(users, { - fields: [announcements_rels.usersID], + fields: [forms_rels.usersID], references: [users.id], relationName: "users", }), rolesID: one(roles, { - fields: [announcements_rels.rolesID], + fields: [forms_rels.rolesID], references: [roles.id], relationName: "roles", }), + qualificationsID: one(qualifications, { + fields: [forms_rels.qualificationsID], + references: [qualifications.id], + relationName: "qualifications", + }), })); -export const relations_announcements = relations(announcements, ({ many }) => ({ - buttons: many(announcements_buttons, { - relationName: "buttons", +export const relations_forms = relations(forms, ({ many }) => ({ + _blocks_checkbox: many(forms_blocks_checkbox, { + relationName: "_blocks_checkbox", }), - _texts: many(announcements_texts, { - relationName: "_texts", + _blocks_country: many(forms_blocks_country, { + relationName: "_blocks_country", }), - _rels: many(announcements_rels, { + _blocks_email: many(forms_blocks_email, { + relationName: "_blocks_email", + }), + _blocks_message: many(forms_blocks_message, { + relationName: "_blocks_message", + }), + _blocks_number: many(forms_blocks_number, { + relationName: "_blocks_number", + }), + _blocks_select: many(forms_blocks_select, { + relationName: "_blocks_select", + }), + _blocks_state: many(forms_blocks_state, { + relationName: "_blocks_state", + }), + _blocks_text: many(forms_blocks_text, { + relationName: "_blocks_text", + }), + _blocks_textarea: many(forms_blocks_textarea, { + relationName: "_blocks_textarea", + }), + _blocks_radio: many(forms_blocks_radio, { + relationName: "_blocks_radio", + }), + _blocks_date: many(forms_blocks_date, { + relationName: "_blocks_date", + }), + emails: many(forms_emails, { + relationName: "emails", + }), + _rels: many(forms_rels, { relationName: "_rels", }), })); +export const relations_form_submissions_submission_data = relations( + form_submissions_submission_data, + ({ one }) => ({ + _parentID: one(form_submissions, { + fields: [form_submissions_submission_data._parentID], + references: [form_submissions.id], + relationName: "submissionData", + }), + }), +); +export const relations_form_submissions = relations(form_submissions, ({ one, many }) => ({ + form: one(forms, { + fields: [form_submissions.form], + references: [forms.id], + relationName: "form", + }), + submissionData: many(form_submissions_submission_data, { + relationName: "submissionData", + }), + user: one(users, { + fields: [form_submissions.user], + references: [users.id], + relationName: "user", + }), +})); export const relations_plugin_ai_instructions_images = relations( plugin_ai_instructions_images, ({ one }) => ({ @@ -9572,6 +10385,11 @@ export const relations_payload_locked_documents_rels = relations( references: [media.id], relationName: "media", }), + announcementsID: one(announcements, { + fields: [payload_locked_documents_rels.announcementsID], + references: [announcements.id], + relationName: "announcements", + }), "game-hard-resourcesID": one(game_hard_resources, { fields: [payload_locked_documents_rels["game-hard-resourcesID"]], references: [game_hard_resources.id], @@ -9677,6 +10495,11 @@ export const relations_payload_locked_documents_rels = relations( references: [mission_attendances.id], relationName: "mission-attendances", }), + "mission-role-signupsID": one(mission_role_signups, { + fields: [payload_locked_documents_rels["mission-role-signupsID"]], + references: [mission_role_signups.id], + relationName: "mission-role-signups", + }), campaignsID: one(campaigns, { fields: [payload_locked_documents_rels.campaignsID], references: [campaigns.id], @@ -9847,6 +10670,11 @@ export const relations_payload_locked_documents_rels = relations( references: [story_beat_states.id], relationName: "story-beat-states", }), + "story-voiceoversID": one(story_voiceovers, { + fields: [payload_locked_documents_rels["story-voiceoversID"]], + references: [story_voiceovers.id], + relationName: "story-voiceovers", + }), "mission-filesID": one(mission_files, { fields: [payload_locked_documents_rels["mission-filesID"]], references: [mission_files.id], @@ -9927,10 +10755,15 @@ export const relations_payload_locked_documents_rels = relations( references: [custom_radio_test_scores.id], relationName: "custom-radio-test-scores", }), - announcementsID: one(announcements, { - fields: [payload_locked_documents_rels.announcementsID], - references: [announcements.id], - relationName: "announcements", + formsID: one(forms, { + fields: [payload_locked_documents_rels.formsID], + references: [forms.id], + relationName: "forms", + }), + "form-submissionsID": one(form_submissions, { + fields: [payload_locked_documents_rels["form-submissionsID"]], + references: [form_submissions.id], + relationName: "form-submissions", }), "plugin-ai-instructionsID": one(plugin_ai_instructions, { fields: [payload_locked_documents_rels["plugin-ai-instructionsID"]], @@ -10057,6 +10890,11 @@ export const relations_shims = relations(shims, ({ many }) => ({ })); type DatabaseSchema = { + enum_announcements_buttons_style: typeof enum_announcements_buttons_style; + enum_announcements_variant: typeof enum_announcements_variant; + enum_announcements_display_type: typeof enum_announcements_display_type; + enum_announcements_targeting_audience: typeof enum_announcements_targeting_audience; + enum_announcements_paths_match_type: typeof enum_announcements_paths_match_type; enum_game_structures_staff_positions_position_type: typeof enum_game_structures_staff_positions_position_type; enum_game_structures_construction_status: typeof enum_game_structures_construction_status; enum_game_vehicles_status: typeof enum_game_vehicles_status; @@ -10161,11 +10999,8 @@ type DatabaseSchema = { enum_operation_readiness_nature: typeof enum_operation_readiness_nature; enum_custom_radio_tests_order: typeof enum_custom_radio_tests_order; enum_custom_radio_test_scores_mode: typeof enum_custom_radio_test_scores_mode; - enum_announcements_buttons_style: typeof enum_announcements_buttons_style; - enum_announcements_variant: typeof enum_announcements_variant; - enum_announcements_display_type: typeof enum_announcements_display_type; - enum_announcements_targeting_audience: typeof enum_announcements_targeting_audience; - enum_announcements_paths_match_type: typeof enum_announcements_paths_match_type; + enum_forms_confirmation_type: typeof enum_forms_confirmation_type; + enum_forms_targeting_audience: typeof enum_forms_targeting_audience; enum_plugin_ai_instructions_field_type: typeof enum_plugin_ai_instructions_field_type; enum_plugin_ai_instructions_model_id: typeof enum_plugin_ai_instructions_model_id; enum_shims_shims_targeting_roles: typeof enum_shims_shims_targeting_roles; @@ -10173,6 +11008,10 @@ type DatabaseSchema = { enum_shims_shims_targeting_audience: typeof enum_shims_shims_targeting_audience; enum_shims_shims_paths_match_type: typeof enum_shims_shims_paths_match_type; media: typeof media; + announcements_buttons: typeof announcements_buttons; + announcements: typeof announcements; + announcements_texts: typeof announcements_texts; + announcements_rels: typeof announcements_rels; game_hard_resources: typeof game_hard_resources; game_structures_labor_requirements: typeof game_structures_labor_requirements; game_structures_staff_positions: typeof game_structures_staff_positions; @@ -10226,6 +11065,7 @@ type DatabaseSchema = { missions: typeof missions; missions_rels: typeof missions_rels; mission_attendances: typeof mission_attendances; + mission_role_signups: typeof mission_role_signups; campaigns: typeof campaigns; factions_relationships: typeof factions_relationships; factions: typeof factions; @@ -10302,6 +11142,7 @@ type DatabaseSchema = { narrative_events: typeof narrative_events; story_beats: typeof story_beats; story_beat_states: typeof story_beat_states; + story_voiceovers: typeof story_voiceovers; mission_files: typeof mission_files; mod_lists: typeof mod_lists; game_servers: typeof game_servers; @@ -10321,10 +11162,24 @@ type DatabaseSchema = { custom_minefield_scores: typeof custom_minefield_scores; custom_radio_tests: typeof custom_radio_tests; custom_radio_test_scores: typeof custom_radio_test_scores; - announcements_buttons: typeof announcements_buttons; - announcements: typeof announcements; - announcements_texts: typeof announcements_texts; - announcements_rels: typeof announcements_rels; + forms_blocks_checkbox: typeof forms_blocks_checkbox; + forms_blocks_country: typeof forms_blocks_country; + forms_blocks_email: typeof forms_blocks_email; + forms_blocks_message: typeof forms_blocks_message; + forms_blocks_number: typeof forms_blocks_number; + forms_blocks_select_options: typeof forms_blocks_select_options; + forms_blocks_select: typeof forms_blocks_select; + forms_blocks_state: typeof forms_blocks_state; + forms_blocks_text: typeof forms_blocks_text; + forms_blocks_textarea: typeof forms_blocks_textarea; + forms_blocks_radio_options: typeof forms_blocks_radio_options; + forms_blocks_radio: typeof forms_blocks_radio; + forms_blocks_date: typeof forms_blocks_date; + forms_emails: typeof forms_emails; + forms: typeof forms; + forms_rels: typeof forms_rels; + form_submissions_submission_data: typeof form_submissions_submission_data; + form_submissions: typeof form_submissions; plugin_ai_instructions_images: typeof plugin_ai_instructions_images; plugin_ai_instructions: typeof plugin_ai_instructions; payload_mcp_api_keys: typeof payload_mcp_api_keys; @@ -10342,6 +11197,10 @@ type DatabaseSchema = { shims_texts: typeof shims_texts; shims_rels: typeof shims_rels; relations_media: typeof relations_media; + relations_announcements_buttons: typeof relations_announcements_buttons; + relations_announcements_texts: typeof relations_announcements_texts; + relations_announcements_rels: typeof relations_announcements_rels; + relations_announcements: typeof relations_announcements; relations_game_hard_resources: typeof relations_game_hard_resources; relations_game_structures_labor_requirements: typeof relations_game_structures_labor_requirements; relations_game_structures_staff_positions: typeof relations_game_structures_staff_positions; @@ -10395,6 +11254,7 @@ type DatabaseSchema = { relations_missions_rels: typeof relations_missions_rels; relations_missions: typeof relations_missions; relations_mission_attendances: typeof relations_mission_attendances; + relations_mission_role_signups: typeof relations_mission_role_signups; relations_campaigns: typeof relations_campaigns; relations_factions_relationships: typeof relations_factions_relationships; relations_factions_rels: typeof relations_factions_rels; @@ -10471,6 +11331,7 @@ type DatabaseSchema = { relations_narrative_events: typeof relations_narrative_events; relations_story_beats: typeof relations_story_beats; relations_story_beat_states: typeof relations_story_beat_states; + relations_story_voiceovers: typeof relations_story_voiceovers; relations_mission_files: typeof relations_mission_files; relations_mod_lists: typeof relations_mod_lists; relations_game_servers: typeof relations_game_servers; @@ -10490,10 +11351,24 @@ type DatabaseSchema = { relations_custom_minefield_scores: typeof relations_custom_minefield_scores; relations_custom_radio_tests: typeof relations_custom_radio_tests; relations_custom_radio_test_scores: typeof relations_custom_radio_test_scores; - relations_announcements_buttons: typeof relations_announcements_buttons; - relations_announcements_texts: typeof relations_announcements_texts; - relations_announcements_rels: typeof relations_announcements_rels; - relations_announcements: typeof relations_announcements; + relations_forms_blocks_checkbox: typeof relations_forms_blocks_checkbox; + relations_forms_blocks_country: typeof relations_forms_blocks_country; + relations_forms_blocks_email: typeof relations_forms_blocks_email; + relations_forms_blocks_message: typeof relations_forms_blocks_message; + relations_forms_blocks_number: typeof relations_forms_blocks_number; + relations_forms_blocks_select_options: typeof relations_forms_blocks_select_options; + relations_forms_blocks_select: typeof relations_forms_blocks_select; + relations_forms_blocks_state: typeof relations_forms_blocks_state; + relations_forms_blocks_text: typeof relations_forms_blocks_text; + relations_forms_blocks_textarea: typeof relations_forms_blocks_textarea; + relations_forms_blocks_radio_options: typeof relations_forms_blocks_radio_options; + relations_forms_blocks_radio: typeof relations_forms_blocks_radio; + relations_forms_blocks_date: typeof relations_forms_blocks_date; + relations_forms_emails: typeof relations_forms_emails; + relations_forms_rels: typeof relations_forms_rels; + relations_forms: typeof relations_forms; + relations_form_submissions_submission_data: typeof relations_form_submissions_submission_data; + relations_form_submissions: typeof relations_form_submissions; relations_plugin_ai_instructions_images: typeof relations_plugin_ai_instructions_images; relations_plugin_ai_instructions: typeof relations_plugin_ai_instructions; relations_payload_mcp_api_keys: typeof relations_payload_mcp_api_keys; diff --git a/src/payload-types.ts b/src/payload-types.ts index 0a0595c..a918362 100644 --- a/src/payload-types.ts +++ b/src/payload-types.ts @@ -91,6 +91,7 @@ export interface Config { 'ribbon-submissions': RibbonSubmission; missions: Mission; 'mission-attendances': MissionAttendance; + 'mission-role-signups': MissionRoleSignup; campaigns: Campaign; factions: Faction; technologies: Technology; @@ -183,6 +184,7 @@ export interface Config { 'ribbon-submissions': RibbonSubmissionsSelect | RibbonSubmissionsSelect; missions: MissionsSelect | MissionsSelect; 'mission-attendances': MissionAttendancesSelect | MissionAttendancesSelect; + 'mission-role-signups': MissionRoleSignupsSelect | MissionRoleSignupsSelect; campaigns: CampaignsSelect | CampaignsSelect; factions: FactionsSelect | FactionsSelect; technologies: TechnologiesSelect | TechnologiesSelect; @@ -461,6 +463,7 @@ export interface User { | 'poker:everyone-left' | 'blackjack:force-ended' | 'blackjack:everyone-left' + | 'mission:role-promoted' )[] | null; }; @@ -497,6 +500,7 @@ export interface User { | 'poker:everyone-left' | 'blackjack:force-ended' | 'blackjack:everyone-left' + | 'mission:role-promoted' )[] | null; }; @@ -631,6 +635,11 @@ export interface Role { | 'mission-attendances:update' | 'mission-attendances:delete' | 'admin:mission-attendances:manage' + | 'mission-role-signups:create' + | 'mission-role-signups:read' + | 'mission-role-signups:update' + | 'mission-role-signups:delete' + | 'admin:mission-role-signups:manage' | 'campaigns:create' | 'campaigns:read' | 'campaigns:update' @@ -771,12 +780,16 @@ export interface Role { | 'maps:read' | 'maps:update' | 'maps:delete' + | 'maps:place' | 'admin:maps:manage' | 'map-roads:read' + | 'map-roads:author' | 'admin:map-roads:manage' | 'map-zones:read' + | 'map-zones:author' | 'admin:map-zones:manage' | 'resource-nodes:read' + | 'resource-nodes:author' | 'admin:resource-nodes:manage' | 'narrative-events:create' | 'narrative-events:read' @@ -2948,6 +2961,24 @@ export interface Mission { providedRoles?: | { roleName: string; + /** + * Shown to players under the role name: what the role does and what is expected of whoever fills it. + */ + description?: { + root: { + type: string; + children: { + type: any; + version: number; + [k: string]: unknown; + }[]; + direction: ('ltr' | 'rtl') | null; + format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; + indent: number; + version: number; + }; + [k: string]: unknown; + } | null; /** * If true, this mission cannot be executed without someone fulfilling this role. */ @@ -2960,6 +2991,10 @@ export interface Mission { * This role can only be fulfilled by someone of this rank or higher. */ minimumRank?: (number | null) | Rank; + /** + * How many members can hold this role. Extra sign-ups form a first-come, first-served waitlist that auto-promotes when a holder stops attending. + */ + slots?: number | null; id?: string | null; }[] | null; @@ -3208,6 +3243,25 @@ export interface MissionAttendance { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "mission-role-signups". + */ +export interface MissionRoleSignup { + id: number; + mission: number | Mission; + user: number | User; + /** + * Index into the mission's missionRoles.providedRoles array. A roleName snapshot is kept alongside in case the mission's role list is later edited. + */ + roleIndex: number; + /** + * Copy of the role name at sign-up time, for display if the role list changes. + */ + roleNameSnapshot?: string | null; + updatedAt: string; + createdAt: string; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "shipments". @@ -5146,7 +5200,7 @@ export interface PluginAiInstruction { */ 'field-type'?: ('text' | 'textarea' | 'upload' | 'richText') | null; 'relation-to'?: string | null; - 'model-id'?: 'unsloth-text' | null; + 'model-id'?: 'unsloth/gemma-4-26B-A4B-it-qat-GGUF' | null; /** * Please reload your collection after applying the changes */ @@ -5166,7 +5220,7 @@ export interface PluginAiInstruction { | null; system?: string | null; layout?: string | null; - 'unsloth-text-settings'?: { + 'gemma-4-settings'?: { model?: string | null; }; updatedAt: string; @@ -5606,6 +5660,24 @@ export interface PayloadMcpApiKey { */ delete?: boolean | null; }; + missionRoleSignups?: { + /** + * Allow clients to find mission-role-signups. + */ + find?: boolean | null; + /** + * Allow clients to create mission-role-signups. + */ + create?: boolean | null; + /** + * Allow clients to update mission-role-signups. + */ + update?: boolean | null; + /** + * Allow clients to delete mission-role-signups. + */ + delete?: boolean | null; + }; campaigns?: { /** * Allow clients to find campaigns. @@ -6647,6 +6719,10 @@ export interface PayloadLockedDocument { relationTo: 'mission-attendances'; value: number | MissionAttendance; } | null) + | ({ + relationTo: 'mission-role-signups'; + value: number | MissionRoleSignup; + } | null) | ({ relationTo: 'campaigns'; value: number | Campaign; @@ -7607,9 +7683,11 @@ export interface MissionsSelect { | T | { roleName?: T; + description?: T; missionCritical?: T; requiredMos?: T; minimumRank?: T; + slots?: T; id?: T; }; notes?: T; @@ -7699,6 +7777,18 @@ export interface MissionAttendancesSelect { updatedAt?: T; createdAt?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "mission-role-signups_select". + */ +export interface MissionRoleSignupsSelect { + mission?: T; + user?: T; + roleIndex?: T; + roleNameSnapshot?: T; + updatedAt?: T; + createdAt?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "campaigns_select". @@ -9191,7 +9281,7 @@ export interface PluginAiInstructionsSelect { }; system?: T; layout?: T; - 'unsloth-text-settings'?: + 'gemma-4-settings'?: | T | { model?: T; @@ -9391,6 +9481,14 @@ export interface PayloadMcpApiKeysSelect { update?: T; delete?: T; }; + missionRoleSignups?: + | T + | { + find?: T; + create?: T; + update?: T; + delete?: T; + }; campaigns?: | T | {