From 67c993ca1091bd70cabd3a51bce2923211117673 Mon Sep 17 00:00:00 2001 From: Z8MB1E Date: Sun, 20 Sep 2026 02:43:47 -0400 Subject: [PATCH] feat(operations): mission reservations and deterministic settlement Reserve personnel, vehicles, cargo, and budget with idempotent keys and exactly-once settlement; extraction effects preflight before any write so validated HQ deposits and locker credits are final and survive mission failure. Failure sweeps touch only unextracted reservations. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- .../operations/OperationReservations.ts | 146 + src/lib/operations/allocation.ts | 211 + src/lib/operations/allocationSweep.ts | 92 + src/lib/operations/allocationTypes.ts | 85 + src/lib/operations/allocationValidate.ts | 232 + src/lib/operations/settlement.ts | 95 + src/lib/operations/settlementExtraction.ts | 258 + src/lib/operations/settlementFacts.ts | 163 + src/lib/operations/settlementFit.ts | 173 + src/lib/operations/settlementMath.ts | 130 + src/lib/operations/settlementParse.ts | 212 + src/lib/operations/settlementResolve.ts | 31 + src/lib/operations/settlementTypes.ts | 135 + ...60918_194842_add_operation_allocation.json | 30621 ++++++++++++++++ ...0260918_194842_add_operation_allocation.ts | 116 + tests/int/operation-allocation.int.spec.ts | 1071 + tests/int/operation-settlement.int.spec.ts | 850 + 17 files changed, 34621 insertions(+) create mode 100644 src/collections/operations/OperationReservations.ts create mode 100644 src/lib/operations/allocation.ts create mode 100644 src/lib/operations/allocationSweep.ts create mode 100644 src/lib/operations/allocationTypes.ts create mode 100644 src/lib/operations/allocationValidate.ts create mode 100644 src/lib/operations/settlement.ts create mode 100644 src/lib/operations/settlementExtraction.ts create mode 100644 src/lib/operations/settlementFacts.ts create mode 100644 src/lib/operations/settlementFit.ts create mode 100644 src/lib/operations/settlementMath.ts create mode 100644 src/lib/operations/settlementParse.ts create mode 100644 src/lib/operations/settlementResolve.ts create mode 100644 src/lib/operations/settlementTypes.ts create mode 100644 src/migrations/20260918_194842_add_operation_allocation.json create mode 100644 src/migrations/20260918_194842_add_operation_allocation.ts create mode 100644 tests/int/operation-allocation.int.spec.ts create mode 100644 tests/int/operation-settlement.int.spec.ts diff --git a/src/collections/operations/OperationReservations.ts b/src/collections/operations/OperationReservations.ts new file mode 100644 index 0000000..32d1b48 --- /dev/null +++ b/src/collections/operations/OperationReservations.ts @@ -0,0 +1,146 @@ +import type { CollectionConfig } from "payload"; + +/** + * Mission allocation reservations. + * + * One row per allocation request against an operation: personnel, vehicles, + * cargo/resources, and a treasury budget earmarked for a mission, plus the + * origin/destination structures and an optional expiry. Reservations are + * earmarks only — no locker, shipment, bank, or storage rows are mutated at + * reserve or settle time; the deterministic settlement record on the row + * captures what was consumed versus returned, exactly once. + * + * Settlement state machine: `reserved` -> `settled` | `cancelled` | `expired` + * | `no-show` (all terminal). `reservationKey` is the idempotency key: a + * retry with the same key returns the existing row instead of creating a + * second reservation. + * + * Writes are internal only (create/update/delete denied; the allocation + * service in `src/lib/operations/allocation.ts` writes via `overrideAccess`). + * Read is open to any logged-in user. + */ +export const OperationReservations: CollectionConfig = { + slug: "operation-reservations", + admin: { + group: "Operations", + useAsTitle: "reservationKey", + defaultColumns: ["reservationKey", "operationId", "status", "expiresAt", "settledAt"], + }, + access: { + read: ({ req }) => !!req.user, + create: () => false, + update: () => false, + delete: () => false, + }, + fields: [ + { + name: "reservationKey", + type: "text", + required: true, + unique: true, + index: true, + admin: { + description: "Idempotency key for the allocation request. Retries with the same key are no-ops.", + }, + }, + { + name: "operationId", + type: "text", + required: true, + index: true, + admin: { description: "Operation identity this allocation belongs to." }, + }, + { + name: "mission", + type: "relationship", + relationTo: "missions", + admin: { description: "The mission these assets are allocated to, when known." }, + }, + { + name: "status", + type: "select", + required: true, + defaultValue: "reserved", + options: [ + { label: "Reserved", value: "reserved" }, + { label: "Settled", value: "settled" }, + { label: "Cancelled", value: "cancelled" }, + { label: "Expired", value: "expired" }, + { label: "No-Show", value: "no-show" }, + ], + admin: { + description: "reserved is the only non-terminal state; every terminal state is settled exactly once.", + }, + }, + { + name: "personnel", + type: "array", + admin: { description: "Reserved unit members." }, + fields: [ + { name: "user", type: "relationship", relationTo: "users", required: true }, + { name: "slot", type: "text", admin: { description: "Optional role/slot label." } }, + ], + }, + { + name: "vehicles", + type: "array", + admin: { description: "Reserved deployed vehicles." }, + fields: [ + { name: "vehicle", type: "relationship", relationTo: "game-vehicles", required: true }, + ], + }, + { + name: "cargo", + type: "array", + admin: { description: "Reserved resources (drawn from the origin structure). " }, + fields: [ + { name: "resource", type: "relationship", relationTo: "resources", required: true }, + { name: "amount", type: "number", required: true, min: 1 }, + ], + }, + { + name: "budget", + type: "group", + admin: { description: "Treasury budget earmarked for the operation." }, + fields: [ + { name: "account", type: "relationship", relationTo: "bank-accounts" }, + { name: "amount", type: "number", min: 0 }, + ], + }, + { + name: "origin", + type: "relationship", + relationTo: "game-structures", + admin: { description: "Structure the reserved cargo/vehicles are drawn from." }, + }, + { + name: "destination", + type: "relationship", + relationTo: "game-structures", + admin: { description: "Structure the cargo is bound for (storage rules checked at reserve time)." }, + }, + { + name: "expiresAt", + type: "date", + admin: { description: "When the reservation lapses; the expiry sweeper settles it as expired." }, + }, + { name: "createdBy", type: "relationship", relationTo: "users" }, + { name: "settledAt", type: "date" }, + { + name: "settledByEffect", + type: "relationship", + relationTo: "operation-effects", + admin: { + description: "Provenance: the operation effect that drove this settlement, when effect-driven.", + }, + }, + { + name: "settlement", + type: "json", + admin: { + description: + "Deterministic settlement record: outcome, reason, consumed and returned amounts, actor, effect, timestamp.", + }, + }, + ], +}; diff --git a/src/lib/operations/allocation.ts b/src/lib/operations/allocation.ts new file mode 100644 index 0000000..1543c7d --- /dev/null +++ b/src/lib/operations/allocation.ts @@ -0,0 +1,211 @@ +import type { Payload, PayloadRequest } from "payload"; +import type { OperationReservation } from "@/payload-types"; +import { + type ReservationRow, + type ReserveOperationAssetsInput, + type SettlementConsumed, + type SettlementOutcome, + type SettlementRecord, +} from "./allocationTypes"; +import { validateReservation } from "./allocationValidate"; +import { + computeReturned, + defaultReason, + normalizeConsumed, + reservedAmounts, +} from "./settlementMath"; + +/** + * Mission allocation reservations: reserve assets against an operation, then + * settle each reservation exactly once. + * + * Reservations are earmarks with capacity checks. No locker, shipment, bank, + * or storage rows are mutated here: reserving validates that the requested + * personnel, vehicles, cargo, and treasury budget are available (net of other + * active reservations), and settlement records the consumed versus returned + * amounts on the reservation row itself. Actual asset movement from these + * settlement records is extraction/economy scope (later roadmap tasks). + * + * Non-negotiable policy: a later mission failure must not reverse any + * separately validated extraction deposit. `failOperationReservations` only + * settles rows still in `reserved` state and never writes to the + * operation-effects ledger, so recorded extraction effects stay final. + */ + +export type { + ReservationCargoLine, + ReservationRow, + ReserveOperationAssetsInput, + ReservePersonnelLine, + SettlementAmounts, + SettlementConsumed, + SettlementOutcome, + SettlementRecord, +} from "./allocationTypes"; + +export { expireOperationReservations, failOperationReservations } from "./allocationSweep"; + +function pgErrorCode(error: unknown): string | undefined { + const cause = (error as { cause?: { code?: string } })?.cause; + return cause?.code ?? (error as { code?: string })?.code; +} + +async function findByKey( + payload: Payload, + key: string, + req?: PayloadRequest, +): Promise { + const res = await payload.find({ + collection: "operation-reservations", + where: { reservationKey: { equals: key } }, + limit: 1, + depth: 0, + overrideAccess: true, + req, + }); + return (res.docs[0] as OperationReservation | undefined) ?? null; +} + +async function activeReservationRows( + payload: Payload, + req?: PayloadRequest, +): Promise { + const res = await payload.find({ + collection: "operation-reservations", + where: { status: { equals: "reserved" } }, + limit: 1000, + depth: 0, + overrideAccess: true, + req, + }); + return res.docs as unknown as ReservationRow[]; +} + +/** + * Reserve assets for an operation. Idempotent by `reservationKey`: a retry + * with an existing key returns the stored row. Every capacity check runs + * before the create, so an insufficient allocation fails without partial + * writes. + */ +export async function reserveOperationAssets( + payload: Payload, + input: ReserveOperationAssetsInput, + req?: PayloadRequest, +): Promise { + if (input.reservationKey) { + const existing = await findByKey(payload, input.reservationKey, req); + if (existing) return existing; + } + + const active = await activeReservationRows(payload, req); + await validateReservation(payload, input, active, req); + + try { + return (await payload.create({ + collection: "operation-reservations", + data: { + reservationKey: input.reservationKey, + operationId: input.operationId, + mission: input.missionId ?? null, + status: "reserved", + personnel: (input.personnel ?? []).map((p) => ({ user: p.userId, slot: p.slot ?? null })), + vehicles: (input.vehicleIds ?? []).map((v) => ({ vehicle: v })), + cargo: (input.cargo ?? []).map((c) => ({ resource: c.resourceId, amount: c.amount })), + ...(input.budget + ? { budget: { account: input.budget.accountId, amount: input.budget.amount } } + : {}), + origin: input.originId ?? null, + destination: input.destinationId ?? null, + expiresAt: input.expiresAt ?? null, + createdBy: input.actorId, + }, + overrideAccess: true, + depth: 0, + req, + })) as unknown as OperationReservation; + } catch (error) { + if (pgErrorCode(error) === "23505") { + // Unique-constraint race on reservationKey: the other request won. + const existing = await findByKey(payload, input.reservationKey, req); + if (existing) return existing; + } + throw error; + } +} + +/** + * Settle a reservation exactly once. A reservation already in a terminal + * state is returned unchanged (idempotent no-op); the stored status is + * re-read immediately before the outcome is computed, mirroring the + * completeShipment guard. + */ +export async function settleOperationReservation( + payload: Payload, + ref: { reservationId?: number; reservationKey?: string }, + opts: { + outcome: SettlementOutcome; + consumed?: SettlementConsumed; + reason?: string; + effectId?: number; + actorId?: number; + }, + req?: PayloadRequest, +): Promise { + let located: OperationReservation | null = null; + if (ref.reservationId != null) { + located = (await payload + .findByID({ + collection: "operation-reservations", + id: ref.reservationId, + depth: 0, + overrideAccess: true, + req, + }) + .catch(() => null)) as unknown as OperationReservation | null; + } else if (ref.reservationKey) { + located = await findByKey(payload, ref.reservationKey, req); + } + if (!located) throw new Error("Reservation not found."); + + // Fresh re-read: another caller may have settled since `located` was read. + const fresh = (await payload + .findByID({ + collection: "operation-reservations", + id: located.id, + depth: 0, + overrideAccess: true, + req, + }) + .catch(() => null)) as unknown as OperationReservation | null; + if (!fresh) throw new Error("Reservation not found."); + if (fresh.status !== "reserved") return fresh; + + const row = fresh as unknown as ReservationRow; + const reserved = reservedAmounts(row); + const consumed = normalizeConsumed(reserved, opts.outcome, opts.consumed); + const returned = computeReturned(reserved, consumed); + + const settlement: SettlementRecord = { + outcome: opts.outcome, + reason: opts.reason ?? defaultReason(opts.outcome), + consumed, + returned, + actorId: opts.actorId ?? null, + effectId: opts.effectId ?? null, + settledAt: new Date().toISOString(), + }; + + return (await payload.update({ + collection: "operation-reservations", + id: fresh.id, + data: { + status: opts.outcome, + settledAt: settlement.settledAt, + settledByEffect: opts.effectId ?? null, + settlement, + }, + overrideAccess: true, + depth: 0, + req, + })) as unknown as OperationReservation; +} diff --git a/src/lib/operations/allocationSweep.ts b/src/lib/operations/allocationSweep.ts new file mode 100644 index 0000000..7aacf40 --- /dev/null +++ b/src/lib/operations/allocationSweep.ts @@ -0,0 +1,92 @@ +import type { Payload, PayloadRequest } from "payload"; +import type { ReservationRow, SettlementConsumed } from "./allocationTypes"; +import { settleOperationReservation } from "./allocation"; + +/** + * Operation-wide batch settlement: mission failure and expiry sweeps. Each + * row still settles through `settleOperationReservation`, so the exactly-once + * guard applies per row and re-running a sweep is a no-op. + */ + +/** + * Mission-failure settlement: every still-reserved reservation for the + * operation settles with reason `mission-failed`, consuming only what the + * caller evidences and returning the rest. Rows already settled (including + * extraction-driven settlements) are terminal and therefore untouched, and + * no operation-effects rows are written or reversed here: a recorded + * extraction deposit stays final even when the mission fails. + */ +export async function failOperationReservations( + payload: Payload, + operationId: string, + opts?: { + effectId?: number; + actorId?: number; + consumedByKey?: Record; + }, + req?: PayloadRequest, +): Promise { + const active = await payload.find({ + collection: "operation-reservations", + where: { + and: [{ operationId: { equals: operationId } }, { status: { equals: "reserved" } }], + }, + limit: 1000, + depth: 0, + overrideAccess: true, + req, + }); + + let settled = 0; + for (const doc of active.docs) { + const row = doc as unknown as ReservationRow; + await settleOperationReservation( + payload, + { reservationId: row.id }, + { + outcome: "settled", + reason: "mission-failed", + consumed: opts?.consumedByKey?.[row.reservationKey], + effectId: opts?.effectId, + actorId: opts?.actorId, + }, + req, + ); + settled += 1; + } + return settled; +} + +/** + * Expiry sweeper: reservations past `expiresAt` while still reserved settle + * as `expired` with everything returned. Idempotent via the settle guard. + */ +export async function expireOperationReservations( + payload: Payload, + now: Date = new Date(), + req?: PayloadRequest, +): Promise { + const due = await payload.find({ + collection: "operation-reservations", + where: { + and: [{ status: { equals: "reserved" } }, { expiresAt: { less_than: now.toISOString() } }], + }, + limit: 1000, + depth: 0, + overrideAccess: true, + req, + }); + + let settled = 0; + for (const doc of due.docs) { + const row = doc as unknown as ReservationRow; + await settleOperationReservation( + payload, + { reservationId: row.id }, + { outcome: "expired" }, + req, + ); + settled += 1; + } + return settled; +} diff --git a/src/lib/operations/allocationTypes.ts b/src/lib/operations/allocationTypes.ts new file mode 100644 index 0000000..b7558ef --- /dev/null +++ b/src/lib/operations/allocationTypes.ts @@ -0,0 +1,85 @@ +/** + * Allocation contracts shared by the reservation service, its validator, and + * the settlement math. Pure module: no Payload imports, safe anywhere. + */ + +export interface ReservationCargoLine { + resourceId: number; + amount: number; +} + +export interface ReservePersonnelLine { + userId: number; + slot?: string; +} + +export interface ReserveOperationAssetsInput { + reservationKey: string; + operationId: string; + actorId: number; + missionId?: number; + personnel?: ReservePersonnelLine[]; + vehicleIds?: number[]; + cargo?: ReservationCargoLine[]; + budget?: { accountId: number; amount: number }; + originId?: number; + destinationId?: number; + expiresAt?: string; +} + +export type SettlementOutcome = "settled" | "cancelled" | "expired" | "no-show"; + +export interface SettlementConsumed { + personnel?: number[]; + vehicleIds?: number[]; + cargo?: ReservationCargoLine[]; + budgetAmount?: number; +} + +export interface SettlementAmounts { + personnel: number[]; + vehicles: number[]; + cargo: { resource: number; amount: number }[]; + budget: number; +} + +export type SettlementRecord = { + outcome: SettlementOutcome; + reason: string; + consumed: SettlementAmounts; + returned: SettlementAmounts; + actorId: number | null; + effectId: number | null; + settledAt: string; +}; + +/** Depth-0 reservation row shape (relationship fields are plain ids). */ +export interface ReservationRow { + id: number; + reservationKey: string; + operationId: string; + status: string; + mission?: number | null; + personnel?: { user: number; slot?: string | null }[] | null; + vehicles?: { vehicle: number }[] | null; + cargo?: { resource: number; amount: number }[] | null; + budget?: { account?: number | null; amount?: number | null } | null; + origin?: number | null; + destination?: number | null; +} + +export function relId(value: unknown): number | null { + if (typeof value === "number") return value; + if (value && typeof value === "object" && "id" in value) { + return (value as { id: number }).id; + } + return null; +} + +export function aggregateCargo(lines: readonly ReservationCargoLine[]): Map { + const totals = new Map(); + for (const line of lines) { + totals.set(line.resourceId, (totals.get(line.resourceId) ?? 0) + line.amount); + } + return totals; +} diff --git a/src/lib/operations/allocationValidate.ts b/src/lib/operations/allocationValidate.ts new file mode 100644 index 0000000..25523d9 --- /dev/null +++ b/src/lib/operations/allocationValidate.ts @@ -0,0 +1,232 @@ +import type { Payload, PayloadRequest } from "payload"; +import type { GameStructure } from "@/payload-types"; +import { hasPermission } from "@/utils/access-control/hasPermission"; +import { storedAmount } from "@/lib/base/storage"; +import { + checkStorageDeposit, + storageViolationMessage, + type StorageRulesSource, +} from "@/lib/storageRules"; +import { + aggregateCargo, + relId, + type ReservationRow, + type ReserveOperationAssetsInput, +} from "./allocationTypes"; + +type StorageEntry = NonNullable[number]; + +/** + * Capacity validation for a reservation request. Every check runs before any + * create, so an insufficient allocation fails without partial writes. All + * availability is computed net of the other currently active (`reserved`) + * reservations, which is what prevents double-spending the same stock, + * vehicle, budget, or person. + */ +export async function validateReservation( + payload: Payload, + input: ReserveOperationAssetsInput, + active: ReservationRow[], + req?: PayloadRequest, +): Promise { + const errors: string[] = []; + + if (!input.reservationKey) errors.push("A reservation key is required."); + if (!input.operationId) errors.push("An operation id is required."); + + const actor = await payload + .findByID({ collection: "users", id: input.actorId, depth: 0, overrideAccess: true, req }) + .catch(() => null); + if (!actor) { + errors.push(`Actor #${input.actorId} does not exist.`); + } else if (!(await hasPermission(payload, actor, "operation-reservations:create"))) { + errors.push(`Actor #${input.actorId} is not authorized to allocate operation assets.`); + } + + if (input.missionId != null) { + const mission = await payload + .findByID({ collection: "missions", id: input.missionId, depth: 0, overrideAccess: true, req }) + .catch(() => null); + if (!mission) errors.push(`Mission #${input.missionId} does not exist.`); + } + + const cargoTotals = aggregateCargo(input.cargo ?? []); + for (const [resourceId, amount] of cargoTotals) { + if (!Number.isInteger(amount) || amount <= 0) { + errors.push(`Cargo amount for resource #${resourceId} must be a positive integer.`); + } + } + if (cargoTotals.size > 0 && input.originId == null) { + errors.push("An origin structure is required when cargo is reserved."); + } + if (input.expiresAt != null && Number.isNaN(Date.parse(input.expiresAt))) { + errors.push("expiresAt must be a valid date."); + } + + let origin: GameStructure | null = null; + if (input.originId != null) { + origin = (await payload + .findByID({ + collection: "game-structures", + id: input.originId, + depth: 0, + overrideAccess: true, + req, + }) + .catch(() => null)) as unknown as GameStructure | null; + if (!origin) errors.push(`Origin structure #${input.originId} does not exist.`); + } + + const bookedOnMission = new Set(); + if (input.missionId != null) { + for (const row of active) { + if (relId(row.mission) !== input.missionId) continue; + for (const p of row.personnel ?? []) bookedOnMission.add(relId(p.user) ?? -1); + } + } + for (const line of input.personnel ?? []) { + if (bookedOnMission.has(line.userId)) { + errors.push(`User #${line.userId} is already reserved on this mission.`); + continue; + } + const user = await payload + .findByID({ collection: "users", id: line.userId, depth: 0, overrideAccess: true, req }) + .catch(() => null); + if (!user) errors.push(`User #${line.userId} does not exist.`); + } + + const reservedVehicleIds = new Set(); + for (const row of active) { + for (const v of row.vehicles ?? []) reservedVehicleIds.add(relId(v.vehicle) ?? -1); + } + for (const vehicleId of input.vehicleIds ?? []) { + if (reservedVehicleIds.has(vehicleId)) { + errors.push(`Vehicle #${vehicleId} is already reserved.`); + continue; + } + const vehicle = (await payload + .findByID({ collection: "game-vehicles", id: vehicleId, depth: 0, overrideAccess: true, req }) + .catch(() => null)) as unknown as { + status?: string; + deployedAt?: number | null; + } | null; + if (!vehicle) { + errors.push(`Vehicle #${vehicleId} does not exist.`); + continue; + } + if (vehicle.status !== "idle") { + errors.push(`Vehicle #${vehicleId} is not available (status: ${vehicle.status}).`); + } + if (input.originId != null && relId(vehicle.deployedAt) !== input.originId) { + errors.push(`Vehicle #${vehicleId} is not stationed at the origin structure.`); + } + } + + if (origin && cargoTotals.size > 0) { + const originStock: StorageEntry[] = [ + ...(origin.storedResources ?? []), + ...(origin.voidStorage ?? []), + ]; + const reservedAtOrigin = new Map(); + for (const row of active) { + if (relId(row.origin) !== input.originId) continue; + for (const c of row.cargo ?? []) { + const rid = relId(c.resource); + if (rid == null) continue; + reservedAtOrigin.set(rid, (reservedAtOrigin.get(rid) ?? 0) + c.amount); + } + } + for (const [resourceId, amount] of cargoTotals) { + const available = + storedAmount(originStock, resourceId) - (reservedAtOrigin.get(resourceId) ?? 0); + if (available < amount) { + errors.push( + `Insufficient cargo: resource #${resourceId} has ${available} available at the origin, ${amount} requested.`, + ); + } + } + } + + if (input.destinationId != null) { + const destination = (await payload + .findByID({ + collection: "game-structures", + id: input.destinationId, + depth: 1, + overrideAccess: true, + req, + }) + .catch(() => null)) as unknown as (GameStructure & { + type?: StorageRulesSource | number | null; + }) | null; + if (!destination) { + errors.push(`Destination structure #${input.destinationId} does not exist.`); + } else if (cargoTotals.size > 0 && destination.type && typeof destination.type === "object") { + const rules = destination.type; + const destStock: StorageEntry[] = [ + ...(destination.storedResources ?? []), + ...(destination.voidStorage ?? []), + ]; + const inbound = new Map(); + for (const row of active) { + if (relId(row.destination) !== input.destinationId) continue; + for (const c of row.cargo ?? []) { + const rid = relId(c.resource); + if (rid == null) continue; + inbound.set(rid, (inbound.get(rid) ?? 0) + c.amount); + } + } + for (const [resourceId, amount] of cargoTotals) { + const currentStored = storedAmount(destStock, resourceId) + (inbound.get(resourceId) ?? 0); + const check = checkStorageDeposit(rules, resourceId, amount, currentStored); + if (!check.allowed) { + errors.push(storageViolationMessage(`Resource #${resourceId}`, check)); + } + } + } + } + + if (input.budget) { + if (!Number.isInteger(input.budget.amount) || input.budget.amount <= 0) { + errors.push("Budget amount must be a positive integer."); + } else { + const account = (await payload + .findByID({ + collection: "bank-accounts", + id: input.budget.accountId, + depth: 0, + overrideAccess: true, + req, + }) + .catch(() => null)) as unknown as { + id: number; + name?: string; + status?: string; + balance?: number | null; + } | null; + if (!account) { + errors.push(`Budget account #${input.budget.accountId} does not exist.`); + } else { + if (account.status !== "open") { + errors.push(`Budget account "${account.name}" is ${account.status}.`); + } + let earmarked = 0; + for (const row of active) { + if (relId(row.budget?.account) === account.id) { + earmarked += row.budget?.amount ?? 0; + } + } + const available = (account.balance ?? 0) - earmarked; + if (available < input.budget.amount) { + errors.push( + `Insufficient budget in "${account.name}": ${available} available, ${input.budget.amount} requested.`, + ); + } + } + } + } + + if (errors.length > 0) { + throw new Error(`Reservation rejected: ${errors.join(" ")}`); + } +} diff --git a/src/lib/operations/settlement.ts b/src/lib/operations/settlement.ts new file mode 100644 index 0000000..d8d3542 --- /dev/null +++ b/src/lib/operations/settlement.ts @@ -0,0 +1,95 @@ +import type { Payload, PayloadRequest } from "payload"; +import type { OperationEffect } from "@/payload-types"; +import { handleExtraction } from "./settlementExtraction"; +import { + handleInventoryLoss, + handleObjective, + handleOperationEnd, +} from "./settlementFacts"; +import { findByIdOrNull } from "./settlementResolve"; +import { SettlementFailure } from "./settlementTypes"; + +/** + * Operation settlement: applies validated operation effects to real state. + * + * Extraction finality: a validated logistics extraction deposits its + * manifest at the designated HQ structure and a validated player extraction + * credits its manifest to the extractor's personal locker, immediately and + * finally. A later mission failure settles only still-reserved reservations + * (via `failOperationReservations`) and never reverses an applied effect. + * + * Exactly-once: the dispatcher re-reads the effect fresh and no-ops on + * terminal (`applied`/`reversed`) rows, so a replay applies nothing twice. + * Recoverable failures (full HQ, full locker, unresolved references) are + * recorded as `failed` effects with a structured note; the full manifest + * stays on the effect payload, so reconciliation can replay them later. + */ + +/** + * Apply one operation effect. Never throws: recoverable failures are + * recorded on the effect row, and unexpected errors are marked + * `internal-error` so the ledger write path stays unbreakable. + */ +export async function applyOperationEffect( + payload: Payload, + effectId: number, + req?: PayloadRequest, +): Promise { + const effect = (await findByIdOrNull( + payload, + "operation-effects", + effectId, + req, + )) as unknown as OperationEffect | null; + if (!effect) return null; + if (effect.status === "applied" || effect.status === "reversed") return effect; + + try { + const note = await dispatchEffect(payload, effect, req); + return (await payload.update({ + collection: "operation-effects", + id: effect.id, + data: { + status: "applied", + appliedAt: new Date().toISOString(), + reconciliationNotes: note ?? null, + }, + overrideAccess: true, + depth: 0, + req, + })) as unknown as OperationEffect; + } catch (error) { + const code = error instanceof SettlementFailure ? error.code : "internal-error"; + const message = error instanceof Error ? error.message : "unknown error"; + payload.logger.error(`[Operations] Effect ${effect.effectKey} failed (${code}): ${message}`); + return (await payload.update({ + collection: "operation-effects", + id: effect.id, + data: { status: "failed", reconciliationNotes: `${code}: ${message}` }, + overrideAccess: true, + depth: 0, + req, + })) as unknown as OperationEffect; + } +} + +async function dispatchEffect( + payload: Payload, + effect: OperationEffect, + req?: PayloadRequest, +): Promise { + switch (effect.effectType) { + case "operation.started": + return null; + case "operation.objective-updated": + return handleObjective(payload, effect); + case "operation.extraction-recorded": + return handleExtraction(payload, effect, req); + case "operation.inventory-recorded": + return handleInventoryLoss(payload, effect, req); + case "operation.ended": + return handleOperationEnd(payload, effect, req); + default: + throw new SettlementFailure("internal-error", `Unknown effect type "${effect.effectType}".`); + } +} diff --git a/src/lib/operations/settlementExtraction.ts b/src/lib/operations/settlementExtraction.ts new file mode 100644 index 0000000..7408117 --- /dev/null +++ b/src/lib/operations/settlementExtraction.ts @@ -0,0 +1,258 @@ +import type { Payload, PayloadRequest } from "payload"; +import type { + Asset, + GameStructure, + LockerStorage, + OperationEffect, + Resource, + Structure, + User, +} from "@/payload-types"; +import { addResourceInternal } from "@/app/(frontend)/logistics/structures/actions"; +import { creditLockerQuantity } from "@/lib/market"; +import { ensureLockerStorage, getLockerGridDimensions } from "@/lib/locker"; +import { notifyUser } from "@/lib/notifications"; +import { emitGameEvent } from "@/utils/event-log/emit"; +import { EventTypes } from "@/utils/event-log/eventTypes"; +import { settleOperationReservation } from "./allocation"; +import { findByIdOrNull } from "./settlementResolve"; +import { preflightHqDeposit, preflightLockerCredit } from "./settlementFit"; +import type { LockerFitLine } from "./settlementFit"; +import { + parseExtractionPayload, + parseLogisticsLine, + parsePlayerLine, +} from "./settlementParse"; +import { SettlementFailure } from "./settlementTypes"; +import type { ExtractionPayloadV1, LogisticsExtractionLine } from "./settlementTypes"; + +/** + * Extraction settlement: converts a validated extraction effect into one + * provenance-linked HQ deposit (logistics) or personal-locker credit + * (player). Both paths preflight the whole manifest before any write, so a + * rejected effect never leaves a partial deposit or credit behind. + */ + +type AuditUser = Parameters[1]; + +async function resolveAuditUser( + payload: Payload, + actorId: number | undefined, + req?: PayloadRequest, +): Promise { + if (actorId !== undefined) { + const user = await findByIdOrNull(payload, "users", actorId, req); + if (user) return user as unknown as AuditUser; + } + // Evidence stays authoritative without an actor: the deposit still + // applies; only the game-event audit trail loses actor attribution. + return { id: null } as unknown as AuditUser; +} + +export async function handleExtraction( + payload: Payload, + effect: OperationEffect, + req?: PayloadRequest, +): Promise { + const parsed = parseExtractionPayload(effect.payload); + if (!parsed.ok) throw new SettlementFailure(parsed.code, parsed.message); + const ext = parsed.value; + + if (ext.recoveryPolicy && ext.recoveryPolicy.type !== "none") { + throw new SettlementFailure( + "unsupported-recovery-policy", + `Recovery policy "${ext.recoveryPolicy.type}" is not implemented in contract v1.`, + ); + } + // Record-only extraction (legacy `{ player }` shape): AAR evidence, no + // inventory movement. + if (!ext.kind) return null; + + const rawLines = ext.items ?? []; + if (ext.kind === "logistics") { + await settleLogisticsExtraction(payload, ext, rawLines, req); + } else { + await settlePlayerExtraction(payload, effect, ext, rawLines, req); + } + + if (ext.reservationKey) { + return await settleLinkedReservation(payload, ext, effect.id, req); + } + return null; +} + +async function settleLogisticsExtraction( + payload: Payload, + ext: ExtractionPayloadV1, + rawLines: unknown[], + req?: PayloadRequest, +): Promise { + const hqId = ext.hqStructureId as number; + const hqResult = await payload.find({ + collection: "game-structures", + where: { id: { equals: hqId } }, + limit: 1, + depth: 2, + overrideAccess: true, + req, + }); + const hq = + (hqResult.docs[0] as unknown as (GameStructure & { type: Structure }) | undefined) ?? null; + if (!hq || typeof hq.type !== "object") { + throw new SettlementFailure("hq-not-found", `HQ structure #${hqId} does not exist.`); + } + + const lines: LogisticsExtractionLine[] = []; + const massPerUnit = new Map(); + for (const raw of rawLines) { + const line = parseLogisticsLine(raw); + if (!line.ok) throw new SettlementFailure(line.code, line.message); + const resource = (await findByIdOrNull( + payload, + "resources", + line.value.resourceId, + req, + )) as unknown as Resource | null; + if (!resource) { + throw new SettlementFailure( + "unresolved-asset", + `Resource #${line.value.resourceId} does not exist.`, + ); + } + massPerUnit.set(resource.id, resource.massPerUnit ?? 0); + lines.push(line.value); + } + + preflightHqDeposit( + { + blueprint: hq.type, + installedModules: hq.installedModules ?? null, + storedEntries: hq.storedResources ?? [], + voidEntries: hq.voidStorage ?? [], + massPerUnit, + }, + lines, + ); + + const auditUser = await resolveAuditUser(payload, ext.actorId, req); + for (const line of lines) { + const result = await addResourceInternal(payload, auditUser, hqId, line.resourceId, line.amount); + if (!result.success) { + throw new SettlementFailure("hq-rule-violation", result.error ?? "HQ deposit rejected."); + } + } + + if (ext.actorId) { + const total = lines.reduce((sum, line) => sum + line.amount, 0); + await notifyUser(payload, { + userId: ext.actorId, + type: "operation:extraction", + title: "Logistics extraction complete", + message: `${total.toLocaleString()} resource unit(s) deposited at HQ "${hq.name}".`, + link: `/logistics/structures/${hqId}`, + }); + } +} + +async function settlePlayerExtraction( + payload: Payload, + effect: OperationEffect, + ext: ExtractionPayloadV1, + rawLines: unknown[], + req?: PayloadRequest, +): Promise { + const userId = ext.actorId as number; + const user = (await findByIdOrNull(payload, "users", userId, req)) as unknown as User | null; + if (!user) throw new SettlementFailure("unresolved-user", `User #${userId} does not exist.`); + + const lines: LockerFitLine[] = []; + for (const raw of rawLines) { + const line = parsePlayerLine(raw); + if (!line.ok) throw new SettlementFailure(line.code, line.message); + const asset = (await findByIdOrNull( + payload, + "assets", + line.value.assetId, + req, + )) as unknown as Asset | null; + if (!asset) { + throw new SettlementFailure("unresolved-asset", `Asset #${line.value.assetId} does not exist.`); + } + lines.push({ ...line.value, asset }); + } + + const locker = await ensureLockerStorage(payload, userId); + const lockerFull = (await payload.findByID({ + collection: "locker-storages", + id: locker.id, + depth: 1, + overrideAccess: true, + req, + })) as unknown as LockerStorage; + const grid = await getLockerGridDimensions(payload); + preflightLockerCredit(lockerFull, grid, lines); + + for (const line of lines) { + try { + await creditLockerQuantity(payload, userId, line.assetId, line.quantity); + } catch (error) { + throw new SettlementFailure( + "locker-full", + error instanceof Error ? error.message : "Locker credit failed.", + ); + } + await emitGameEvent(payload, { + type: EventTypes.LockerAddItem, + message: `Extraction secured ${line.quantity}x ${line.asset.name} in ${user.displayName || user.username}'s locker`, + actor: userId, + targetCollection: "locker-storages", + targetId: locker.id, + data: { + assetId: line.assetId, + quantity: line.quantity, + operationId: ext.operationId, + effectKey: effect.effectKey, + }, + }); + } + + const total = lines.reduce((sum, line) => sum + line.quantity, 0); + await notifyUser(payload, { + userId, + type: "operation:extraction", + title: "Extraction complete", + message: `${total.toLocaleString()} item unit(s) secured in your locker.`, + link: "/locker", + }); +} + +async function settleLinkedReservation( + payload: Payload, + ext: ExtractionPayloadV1, + effectId: number, + req?: PayloadRequest, +): Promise { + try { + await settleOperationReservation( + payload, + { reservationKey: ext.reservationKey }, + { + outcome: "settled", + reason: "extracted", + consumed: ext.consumed, + effectId, + actorId: ext.actorId, + }, + req, + ); + return null; + } catch (error) { + // Downstream accounting must not roll back a final deposit: the + // reservation stays reserved for a later sweep or replay. + const message = error instanceof Error ? error.message : "unknown error"; + payload.logger.warn( + `[Operations] Reservation ${ext.reservationKey} settlement deferred: ${message}`, + ); + return `reservation ${ext.reservationKey} settlement deferred: ${message}`; + } +} diff --git a/src/lib/operations/settlementFacts.ts b/src/lib/operations/settlementFacts.ts new file mode 100644 index 0000000..0870fea --- /dev/null +++ b/src/lib/operations/settlementFacts.ts @@ -0,0 +1,163 @@ +import type { Payload, PayloadRequest } from "payload"; +import type { Asset, OperationEffect } from "@/payload-types"; +import { notifyUser } from "@/lib/notifications"; +import { emitGameEvent } from "@/utils/event-log/emit"; +import { EventTypes } from "@/utils/event-log/eventTypes"; +import { failOperationReservations } from "./allocation"; +import { findByIdOrNull } from "./settlementResolve"; +import { applyZonePressure, PRESSURE_OUTCOME_DELTAS } from "./territory"; +import { + parseInventoryLossPayload, + parseObjectivePayload, + parseOperationEndPayload, + parsePlayerLine, +} from "./settlementParse"; +import { + MISSION_FAILURE_OUTCOMES, + SettlementFailure, +} from "./settlementTypes"; +import type { LockerFitLine } from "./settlementFit"; + +/** + * AAR-fact handlers: inventory loss evidence, objective completion, and + * operation-end sweeps. These record statistics-only facts (effect row, + * event log, notification) and never award rewards or mutate inventory. + */ + +export async function handleInventoryLoss( + payload: Payload, + effect: OperationEffect, + req?: PayloadRequest, +): Promise { + const parsed = parseInventoryLossPayload(effect.payload); + if (!parsed.ok) throw new SettlementFailure(parsed.code, parsed.message); + const loss = parsed.value; + // Record-only inventory delta: no loss reason, no evidence to record. + if (!loss.reason) return null; + + const lines: LockerFitLine[] = []; + for (const raw of loss.items ?? []) { + const line = parsePlayerLine(raw); + if (!line.ok) throw new SettlementFailure(line.code, line.message); + const asset = (await findByIdOrNull( + payload, + "assets", + line.value.assetId, + req, + )) as unknown as Asset | null; + if (!asset) { + throw new SettlementFailure("unresolved-asset", `Asset #${line.value.assetId} does not exist.`); + } + lines.push({ ...line.value, asset }); + } + + // Death-loss rule: evidence only. No locker/HQ mutation and no scoreboard + // write (the profile XP hook awards XP for ANY scoreboard key, so a + // scoreboard write would be a reward, which is prohibited). + if (loss.reason === "death" && loss.actorId) { + await emitGameEvent(payload, { + type: EventTypes.PlayerDeath, + message: `${lines.length} item line(s) recorded as unextracted losses`, + actor: loss.actorId, + targetCollection: "users", + targetId: loss.actorId, + data: { + operationId: loss.operationId, + effectKey: effect.effectKey, + items: lines.map((line) => ({ assetId: line.assetId, quantity: line.quantity })), + }, + }); + } + if (loss.actorId) { + const total = lines.reduce((sum, line) => sum + line.quantity, 0); + await notifyUser(payload, { + userId: loss.actorId, + type: "operation:death", + title: loss.reason === "death" ? "KIA: unextracted inventory lost" : "Inventory lost", + message: `${total.toLocaleString()} item unit(s) recorded as lost (unextracted). No recovery policy applies.`, + link: "/locker", + }); + } + return null; +} + +function objectiveName(objective: unknown): string | null { + if (typeof objective === "string" && objective) return objective; + if (typeof objective === "object" && objective !== null) { + const record = objective as Record; + if (typeof record.name === "string" && record.name) return record.name; + if (typeof record.id === "string" && record.id) return record.id; + } + return null; +} + +export async function handleObjective( + payload: Payload, + effect: OperationEffect, +): Promise { + const parsed = parseObjectivePayload(effect.payload); + if (!parsed.ok) throw new SettlementFailure(parsed.code, parsed.message); + const objective = parsed.value; + // AAR only: objective completion never touches inventory. + if (objective.actorId) { + const name = objectiveName(objective.objective); + await notifyUser(payload, { + userId: objective.actorId, + type: "operation:objective", + title: "Objective updated", + message: name ? `Objective updated: ${name}.` : "An operation objective was updated.", + }); + } + return null; +} + +export async function handleOperationEnd( + payload: Payload, + effect: OperationEffect, + req?: PayloadRequest, +): Promise { + const parsed = parseOperationEndPayload(effect.payload); + if (!parsed.ok) throw new SettlementFailure(parsed.code, parsed.message); + const end = parsed.value; + const failed = MISSION_FAILURE_OUTCOMES.includes( + end.outcome as (typeof MISSION_FAILURE_OUTCOMES)[number], + ); + const notes: string[] = []; + if (failed) { + // Mission failure settles only still-reserved rows; it never writes or + // reverses effects, so recorded extraction deposits stay final. + const settled = await failOperationReservations( + payload, + end.operationId, + { effectId: effect.id, actorId: end.actorId }, + req, + ); + notes.push(`mission-failed: settled ${settled} reservation(s)`); + } + + // Mission-scoped strategic pressure (task 7): an explicit zone on the end + // payload receives one attributed delta; replays are no-ops by sourceEffect. + if (end.zoneId != null) { + const delta = failed ? PRESSURE_OUTCOME_DELTAS.failure : PRESSURE_OUTCOME_DELTAS.success; + const applied = await applyZonePressure( + payload, + { + zoneId: end.zoneId, + factionId: end.factionId, + operationId: end.operationId, + missionId: end.missionId, + sourceEffectId: effect.id, + delta, + note: `operation ${end.operationId} ended (${end.outcome ?? "unknown outcome"}): pressure ${delta > 0 ? "+" : ""}${delta}`, + }, + req, + ); + notes.push( + applied.created + ? `zone-pressure ${delta > 0 ? "+" : ""}${delta} on zone #${end.zoneId}` + : `zone-pressure replay skipped (zone #${end.zoneId})`, + ); + } + + return notes.length > 0 ? notes.join("; ") : null; +} diff --git a/src/lib/operations/settlementFit.ts b/src/lib/operations/settlementFit.ts new file mode 100644 index 0000000..9b31571 --- /dev/null +++ b/src/lib/operations/settlementFit.ts @@ -0,0 +1,173 @@ +import type { Asset, GameStructure, LockerStorage, Resource } from "@/payload-types"; +import { effectiveMaxMass } from "@/lib/base/modules"; +import { checkStorageDeposit, storageViolationMessage } from "@/lib/storageRules"; +import type { StorageRulesSource } from "@/lib/storageRules"; +import { + findLockerEmptySpot, + getLockerItemFootprint, + lockerIsStackable, + lockerMaxStack, + toLockerGridItems, +} from "@/lib/locker"; +import { SettlementFailure } from "./settlementTypes"; +import type { LogisticsExtractionLine, PlayerExtractionLine } from "./settlementTypes"; + +/** + * Pure preflight checks for extraction settlement. Every recoverable failure + * mode (storage rules, HQ capacity, locker space) is detected here, BEFORE + * any write, so a rejected effect never leaves a partial deposit or credit + * behind. The canonical writers (`addResourceInternal`, + * `creditLockerQuantity`) still re-run their own checks; these simulations + * exist to keep the whole effect atomic. + */ + +type StorageEntry = NonNullable[number]; + +export interface HqDepositContext { + blueprint: StorageRulesSource & { + maxCapacityMass?: number | null; + moduleSlots?: number | null; + moduleOptions?: + | { + name: string; + effects?: { type: string; value?: number | null }[] | null; + }[] + | null; + }; + installedModules?: { name: string }[] | null; + storedEntries: StorageEntry[]; + voidEntries: StorageEntry[]; + massPerUnit: Map; +} + +function entryResourceId(entry: StorageEntry): number | null { + const r = entry.resource; + if (typeof r === "number") return r; + if (r && typeof r === "object" && "id" in r) return r.id; + return null; +} + +/** + * Verify every logistics line against the HQ's storage rules and mass + * capacity, accumulating inbound amounts so multi-line payloads are checked + * as a whole. Throws SettlementFailure on the first violation. + */ +export function preflightHqDeposit( + ctx: HqDepositContext, + lines: LogisticsExtractionLine[], +): void { + const maxMass = effectiveMaxMass(ctx.blueprint, ctx.installedModules); + const allEntries = [...ctx.storedEntries, ...ctx.voidEntries]; + + let currentMass = 0; + for (const entry of ctx.storedEntries) { + const rid = entryResourceId(entry); + if (rid === null) continue; + currentMass += (ctx.massPerUnit.get(rid) ?? 0) * entry.amount; + } + + const inbound = new Map(); + let addedMass = 0; + for (const line of lines) { + const alreadyInbound = inbound.get(line.resourceId) ?? 0; + const currentStored = + allEntries + .filter((e) => entryResourceId(e) === line.resourceId) + .reduce((sum, e) => sum + e.amount, 0) + alreadyInbound; + + const check = checkStorageDeposit(ctx.blueprint, line.resourceId, line.amount, currentStored); + if (!check.allowed) { + throw new SettlementFailure( + "hq-rule-violation", + storageViolationMessage(`Resource #${line.resourceId}`, check), + ); + } + + inbound.set(line.resourceId, alreadyInbound + line.amount); + addedMass += (ctx.massPerUnit.get(line.resourceId) ?? 0) * line.amount; + } + + if (maxMass && currentMass + addedMass > maxMass) { + throw new SettlementFailure( + "hq-capacity", + `HQ capacity exceeded. Available: ${Math.max(0, maxMass - currentMass).toLocaleString()} kg, needed: ${addedMass.toLocaleString()} kg.`, + ); + } +} + +export interface LockerFitLine extends PlayerExtractionLine { + asset: Asset; +} + +/** + * Simulate `creditLockerQuantity` for every player line against a cloned + * locker, mirroring its merge-then-place order exactly. Throws + * SettlementFailure("locker-full") when any unit cannot fit; returns void + * when the whole manifest fits, so the real credit cannot partially apply. + */ +export function preflightLockerCredit( + locker: LockerStorage, + grid: { width: number; height: number }, + lines: LockerFitLine[], +): void { + const items = [...(locker.items ?? [])]; + const gridItems = toLockerGridItems(items); + + for (const line of lines) { + const { asset } = line; + const stackable = lockerIsStackable(asset); + const maxStack = lockerMaxStack(asset); + const footprint = getLockerItemFootprint(asset, false); + let remaining = line.quantity; + + if (stackable) { + for (const entry of gridItems) { + if (remaining <= 0) break; + if (entry.assetId !== line.assetId) continue; + const space = + maxStack === Infinity + ? remaining + : Math.max(0, Math.min(maxStack - entry.quantity, remaining)); + if (space <= 0) continue; + const idx = items.findIndex((e) => e.id === entry.id); + if (idx >= 0) { + items[idx] = { ...items[idx], quantity: (items[idx].quantity ?? 0) + space }; + entry.quantity += space; + remaining -= space; + } + } + } + + while (remaining > 0) { + const stackAmount = Math.min(remaining, maxStack === Infinity ? remaining : maxStack); + const spot = findLockerEmptySpot( + gridItems, + footprint.width, + footprint.height, + grid.width, + grid.height, + ); + if (!spot) { + throw new SettlementFailure( + "locker-full", + `No space in the locker for ${asset.name}. Needs ${footprint.width}x${footprint.height} free cells.`, + ); + } + gridItems.push({ + id: `sim-${gridItems.length}`, + assetId: line.assetId, + quantity: stackAmount, + gridX: spot.x, + gridY: spot.y, + rotated: false, + asset, + }); + remaining -= stackAmount; + } + } +} + +/** Mass per unit lookup helper for resolved resource docs. */ +export function massPerUnitOf(resources: Map, resourceId: number): number { + return resources.get(resourceId)?.massPerUnit ?? 0; +} diff --git a/src/lib/operations/settlementMath.ts b/src/lib/operations/settlementMath.ts new file mode 100644 index 0000000..8cddac0 --- /dev/null +++ b/src/lib/operations/settlementMath.ts @@ -0,0 +1,130 @@ +import { + aggregateCargo, + relId, + type ReservationRow, + type SettlementAmounts, + type SettlementConsumed, + type SettlementOutcome, +} from "./allocationTypes"; + +/** + * Deterministic settlement math for operation reservations. Pure module: no + * Payload imports. Consumed amounts are validated against what was reserved + * (throwing before any write when they exceed it); returned amounts are + * always `reserved - consumed`, so a settlement can never return more than + * was earmarked. + */ + +export function reservedAmounts(row: ReservationRow): SettlementAmounts { + const cargoTotals = new Map(); + const cargoOrder: number[] = []; + for (const c of row.cargo ?? []) { + const rid = relId(c.resource); + if (rid == null) continue; + if (!cargoTotals.has(rid)) cargoOrder.push(rid); + cargoTotals.set(rid, (cargoTotals.get(rid) ?? 0) + c.amount); + } + return { + personnel: (row.personnel ?? []) + .map((p) => relId(p.user)) + .filter((id): id is number => id != null), + vehicles: (row.vehicles ?? []) + .map((v) => relId(v.vehicle)) + .filter((id): id is number => id != null), + cargo: cargoOrder.map((rid) => ({ resource: rid, amount: cargoTotals.get(rid) ?? 0 })), + budget: row.budget?.amount ?? 0, + }; +} + +/** + * Validate and normalize the consumed amounts for a `settled` outcome. + * Cancellation, no-show, and expiry consume nothing by definition. + */ +export function normalizeConsumed( + reserved: SettlementAmounts, + outcome: SettlementOutcome, + consumed?: SettlementConsumed, +): SettlementAmounts { + if (outcome !== "settled") { + return { personnel: [], vehicles: [], cargo: [], budget: 0 }; + } + + const errors: string[] = []; + const personnel = consumed?.personnel ?? []; + for (const id of personnel) { + if (!reserved.personnel.includes(id)) { + errors.push(`Consumed personnel #${id} was not reserved.`); + } + } + const vehicles = consumed?.vehicleIds ?? []; + for (const id of vehicles) { + if (!reserved.vehicles.includes(id)) { + errors.push(`Consumed vehicle #${id} was not reserved.`); + } + } + const reservedCargo = aggregateCargo( + reserved.cargo.map((c) => ({ resourceId: c.resource, amount: c.amount })), + ); + const consumedCargo = aggregateCargo(consumed?.cargo ?? []); + for (const [resourceId, amount] of consumedCargo) { + if (!Number.isInteger(amount) || amount < 0) { + errors.push( + `Consumed cargo amount for resource #${resourceId} must be a non-negative integer.`, + ); + continue; + } + const reservedAmount = reservedCargo.get(resourceId) ?? 0; + if (amount > reservedAmount) { + errors.push( + `Consumed cargo for resource #${resourceId} (${amount}) exceeds the reserved amount (${reservedAmount}).`, + ); + } + } + const budgetAmount = consumed?.budgetAmount ?? 0; + if (!Number.isInteger(budgetAmount) || budgetAmount < 0) { + errors.push("Consumed budget must be a non-negative integer."); + } else if (budgetAmount > reserved.budget) { + errors.push( + `Consumed budget (${budgetAmount}) exceeds the reserved amount (${reserved.budget}).`, + ); + } + + if (errors.length > 0) { + throw new Error(`Settlement rejected: ${errors.join(" ")}`); + } + + const cargoOrder: number[] = []; + for (const line of consumed?.cargo ?? []) { + if (!cargoOrder.includes(line.resourceId)) cargoOrder.push(line.resourceId); + } + return { + personnel, + vehicles, + cargo: cargoOrder + .map((rid) => ({ resource: rid, amount: consumedCargo.get(rid) ?? 0 })) + .filter((line) => line.amount > 0), + budget: budgetAmount, + }; +} + +export function computeReturned( + reserved: SettlementAmounts, + consumed: SettlementAmounts, +): SettlementAmounts { + const consumedCargo = new Map(consumed.cargo.map((c) => [c.resource, c.amount])); + return { + personnel: reserved.personnel.filter((id) => !consumed.personnel.includes(id)), + vehicles: reserved.vehicles.filter((id) => !consumed.vehicles.includes(id)), + cargo: reserved.cargo + .map((line) => ({ + resource: line.resource, + amount: line.amount - (consumedCargo.get(line.resource) ?? 0), + })) + .filter((line) => line.amount > 0), + budget: reserved.budget - consumed.budget, + }; +} + +export function defaultReason(outcome: SettlementOutcome): string { + return outcome === "settled" ? "completed" : outcome; +} diff --git a/src/lib/operations/settlementParse.ts b/src/lib/operations/settlementParse.ts new file mode 100644 index 0000000..75813b8 --- /dev/null +++ b/src/lib/operations/settlementParse.ts @@ -0,0 +1,212 @@ +import type { SettlementConsumed } from "./allocationTypes"; +import { + DEFAULT_RECOVERY_POLICY, + EXTRACTION_KINDS, + INVENTORY_SNAPSHOT_ITEM_LIMIT, + LOSS_REASONS, + OPERATION_SETTLEMENT_VERSION, +} from "./settlementTypes"; +import type { + ExtractionKind, + ExtractionPayloadV1, + InventoryLossPayloadV1, + LogisticsExtractionLine, + LossReason, + ObjectivePayloadV1, + OperationEndPayloadV1, + ParseFailure, + ParseResult, + PlayerExtractionLine, + RecoveryPolicy, + SettlementFailureCode, +} from "./settlementTypes"; + +/** + * Boundary parsers for the settlement contract: untrusted effect payloads + * are parsed into typed contract values exactly once, here. Anything the + * parsers reject becomes a failed effect; the handlers never re-validate. + */ + +function asRecord(raw: unknown): Record | null { + return typeof raw === "object" && raw !== null && !Array.isArray(raw) + ? (raw as Record) + : null; +} + +function positiveInt(value: unknown): number | null { + return typeof value === "number" && Number.isInteger(value) && value > 0 ? value : null; +} + +function fail(code: SettlementFailureCode, message: string): ParseFailure { + return { ok: false, code, message }; +} + +function parseItems(raw: unknown): ParseResult { + if (raw === undefined || raw === null) return { ok: true, value: [] }; + if (!Array.isArray(raw)) return fail("malformed-payload", "items must be an array."); + if (raw.length > INVENTORY_SNAPSHOT_ITEM_LIMIT) { + return fail( + "malformed-payload", + `items exceeds the snapshot limit of ${INVENTORY_SNAPSHOT_ITEM_LIMIT} lines.`, + ); + } + return { ok: true, value: raw }; +} + +function parseOptionalId(p: Record, key: string): number | undefined { + const value = p[key]; + return typeof value === "number" && Number.isInteger(value) && value > 0 ? value : undefined; +} + +/** Parse a logistics line: `{ resourceId, amount }`, both positive integers. */ +export function parseLogisticsLine(raw: unknown): ParseResult { + const line = asRecord(raw); + const resourceId = positiveInt(line?.resourceId); + const amount = positiveInt(line?.amount); + if (!line || resourceId === null || amount === null) { + return fail( + "malformed-asset", + "A logistics line must carry a positive integer resourceId and amount.", + ); + } + return { ok: true, value: { resourceId, amount } }; +} + +/** Parse a player line: `{ assetId, quantity }`, both positive integers. */ +export function parsePlayerLine(raw: unknown): ParseResult { + const line = asRecord(raw); + const assetId = positiveInt(line?.assetId); + const quantity = positiveInt(line?.quantity); + if (!line || assetId === null || quantity === null) { + return fail( + "malformed-asset", + "A player extraction line must carry a positive integer assetId and quantity.", + ); + } + return { ok: true, value: { assetId, quantity } }; +} + +export function parseExtractionPayload(raw: unknown): ParseResult { + const p = asRecord(raw); + if (!p) return fail("malformed-payload", "Extraction effect payload must be an object."); + const operationId = typeof p.operationId === "string" ? p.operationId : "unknown"; + const version = typeof p.version === "number" ? p.version : OPERATION_SETTLEMENT_VERSION; + + const items = parseItems(p.items); + if (!items.ok) return items; + + let kind: ExtractionKind | undefined; + if (p.kind !== undefined && p.kind !== null) { + if (!EXTRACTION_KINDS.includes(p.kind as ExtractionKind)) { + return fail("malformed-payload", `Unknown extraction kind "${String(p.kind)}".`); + } + kind = p.kind as ExtractionKind; + } + if (kind === undefined && items.value.length > 0) { + return fail("malformed-payload", "Extraction kind is required when items are present."); + } + + const actorId = parseOptionalId(p, "actorId"); + const hqStructureId = parseOptionalId(p, "hqStructureId"); + if (kind === "player" && actorId === undefined) { + return fail("malformed-payload", "A player extraction requires a positive integer actorId."); + } + if (kind === "logistics" && hqStructureId === undefined) { + return fail( + "malformed-payload", + "A logistics extraction requires a positive integer hqStructureId.", + ); + } + + let consumed: SettlementConsumed | undefined; + if (p.consumed !== undefined && p.consumed !== null) { + const c = asRecord(p.consumed); + if (!c) return fail("malformed-payload", "consumed must be an object."); + consumed = c as SettlementConsumed; + } + + let recoveryPolicy: RecoveryPolicy = DEFAULT_RECOVERY_POLICY; + if (p.recoveryPolicy !== undefined && p.recoveryPolicy !== null) { + const rp = asRecord(p.recoveryPolicy); + if (!rp || typeof rp.type !== "string") { + return fail("malformed-payload", "recoveryPolicy must be an object with a type."); + } + recoveryPolicy = rp as unknown as RecoveryPolicy; + } + + const reservationKey = + typeof p.reservationKey === "string" && p.reservationKey ? p.reservationKey : undefined; + + return { + ok: true, + value: { + operationId, + version, + kind, + actorId, + hqStructureId, + reservationKey, + items: items.value, + consumed, + recoveryPolicy, + }, + }; +} + +export function parseInventoryLossPayload(raw: unknown): ParseResult { + const p = asRecord(raw); + if (!p) return fail("malformed-payload", "Inventory effect payload must be an object."); + const operationId = typeof p.operationId === "string" ? p.operationId : "unknown"; + const version = typeof p.version === "number" ? p.version : OPERATION_SETTLEMENT_VERSION; + + const items = parseItems(p.items); + if (!items.ok) return items; + + let reason: LossReason | undefined; + if (p.reason !== undefined && p.reason !== null) { + if (!LOSS_REASONS.includes(p.reason as LossReason)) { + return fail("malformed-payload", `Unknown inventory reason "${String(p.reason)}".`); + } + reason = p.reason as LossReason; + } + + return { + ok: true, + value: { + operationId, + version, + actorId: parseOptionalId(p, "actorId"), + reason, + items: items.value, + }, + }; +} + +export function parseObjectivePayload(raw: unknown): ParseResult { + const p = asRecord(raw); + if (!p) return fail("malformed-payload", "Objective effect payload must be an object."); + return { + ok: true, + value: { + operationId: typeof p.operationId === "string" ? p.operationId : "unknown", + actorId: parseOptionalId(p, "actorId"), + objective: p.objective ?? null, + }, + }; +} + +export function parseOperationEndPayload(raw: unknown): ParseResult { + const p = asRecord(raw); + if (!p) return fail("malformed-payload", "Operation end payload must be an object."); + return { + ok: true, + value: { + operationId: typeof p.operationId === "string" ? p.operationId : "unknown", + actorId: parseOptionalId(p, "actorId"), + outcome: typeof p.outcome === "string" ? p.outcome : undefined, + zoneId: parseOptionalId(p, "zoneId"), + factionId: parseOptionalId(p, "factionId"), + missionId: parseOptionalId(p, "missionId"), + }, + }; +} diff --git a/src/lib/operations/settlementResolve.ts b/src/lib/operations/settlementResolve.ts new file mode 100644 index 0000000..2f892ec --- /dev/null +++ b/src/lib/operations/settlementResolve.ts @@ -0,0 +1,31 @@ +import type { Payload, PayloadRequest } from "payload"; + +type CollectionSlug = + | "users" + | "assets" + | "resources" + | "game-structures" + | "operation-effects" + | "operation-events" + | "arma-sync-events"; + +/** + * Non-throwing id lookup: findByID's NotFound throw inside the hook's open + * transaction poisons the later effect update; find returns empty instead. + */ +export async function findByIdOrNull( + payload: Payload, + collection: CollectionSlug, + id: number, + req?: PayloadRequest, +): Promise<{ id: number } | null> { + const result = await payload.find({ + collection, + where: { id: { equals: id } }, + limit: 1, + depth: 0, + overrideAccess: true, + req, + }); + return (result.docs[0] as { id: number } | undefined) ?? null; +} diff --git a/src/lib/operations/settlementTypes.ts b/src/lib/operations/settlementTypes.ts new file mode 100644 index 0000000..c0d9df6 --- /dev/null +++ b/src/lib/operations/settlementTypes.ts @@ -0,0 +1,135 @@ +import type { SettlementConsumed } from "./allocationTypes"; + +/** + * Operation settlement contracts (version 1). Pure module: no Payload + * imports, safe to import anywhere. + * + * Extraction contract: a validated `operation.extraction` event carries a + * `kind` ("player" | "logistics") and an item manifest. A logistics + * extraction deposits resources at the operation's designated HQ structure; + * a player extraction credits assets to the extracting user's personal + * locker. An extraction event with no `kind` and no `items` is record-only: + * AAR evidence with no inventory movement (the legacy `{ player }` shape). + * + * Asset resolution rule: resource/asset ids come only from the payload. A + * line with a missing, non-integer, or non-positive id is `malformed-asset`; + * an id that does not resolve to an existing catalog doc is + * `unresolved-asset`. Either rejects the whole effect; the settlement never + * guesses an id. + * + * Stack behavior: locker credits go through `creditLockerQuantity`, which + * merges stackables into existing stacks before filling empty grid spots. + * HQ deposits go through `addResourceInternal`, which tops up existing + * stacks of the same resource before placing new grid entries (or + * flat-lists on gridless blueprints). + * + * Death-loss rule: a validated `operation.inventory` event with + * `reason: "death" | "loss"` records loss evidence for the unextracted + * inventory the server reports, verbatim. It never mutates lockers, HQ + * storage, or the profile scoreboard: the profile XP hook awards XP for ANY + * scoreboard key, so a scoreboard write would be a reward, which the plan + * prohibits. Losses are AAR facts (effect row + event log + notification). + */ + +/** Current version of the settlement contract. */ +export const OPERATION_SETTLEMENT_VERSION = 1; + +/** Maximum item lines accepted in one extraction/loss payload. */ +export const INVENTORY_SNAPSHOT_ITEM_LIMIT = 100; + +export const EXTRACTION_KINDS = ["player", "logistics"] as const; +export type ExtractionKind = (typeof EXTRACTION_KINDS)[number]; + +export const LOSS_REASONS = ["death", "loss"] as const; +export type LossReason = (typeof LOSS_REASONS)[number]; + +/** operation.end outcomes that trigger the mission-failure sweep. */ +export const MISSION_FAILURE_OUTCOMES = ["failed", "failure"] as const; + +/** + * Recovery/insurance extension point. Typed but unimplemented: only "none" + * is supported in this contract version; any other policy rejects the + * effect instead of silently ignoring it. + */ +export type RecoveryPolicy = + | { type: "none" } + | { type: "insurance"; provider: string } + | { type: "recovery-team"; teamId: string }; + +export const DEFAULT_RECOVERY_POLICY: RecoveryPolicy = { type: "none" }; + +export const SETTLEMENT_FAILURE_CODES = [ + "malformed-payload", + "malformed-asset", + "unresolved-asset", + "unresolved-user", + "unsupported-recovery-policy", + "hq-not-found", + "hq-capacity", + "hq-rule-violation", + "locker-full", + "internal-error", +] as const; +export type SettlementFailureCode = (typeof SETTLEMENT_FAILURE_CODES)[number]; + +/** Typed settlement failure: caught by the dispatcher into a failed effect. */ +export class SettlementFailure extends Error { + constructor( + readonly code: SettlementFailureCode, + message: string, + ) { + super(message); + this.name = "SettlementFailure"; + } +} + +export type ParseFailure = { ok: false; code: SettlementFailureCode; message: string }; +export type ParseResult = { ok: true; value: T } | ParseFailure; + +export interface LogisticsExtractionLine { + resourceId: number; + amount: number; +} + +export interface PlayerExtractionLine { + assetId: number; + quantity: number; +} + +export interface ExtractionPayloadV1 { + operationId: string; + version: number; + kind?: ExtractionKind; + actorId?: number; + hqStructureId?: number; + reservationKey?: string; + items?: unknown[]; + consumed?: SettlementConsumed; + recoveryPolicy?: RecoveryPolicy; +} + +export interface InventoryLossPayloadV1 { + operationId: string; + version: number; + actorId?: number; + reason?: LossReason; + items?: unknown[]; +} + +export interface ObjectivePayloadV1 { + operationId: string; + actorId?: number; + objective?: unknown; +} + +export interface OperationEndPayloadV1 { + operationId: string; + actorId?: number; + outcome?: string; + /** Optional zone the operation's strategic pressure applies to (task 7). */ + zoneId?: number; + /** Optional faction driving or receiving the pressure. */ + factionId?: number; + /** Optional mission the operation was scoped to. */ + missionId?: number; +} diff --git a/src/migrations/20260918_194842_add_operation_allocation.json b/src/migrations/20260918_194842_add_operation_allocation.json new file mode 100644 index 0000000..6c48a17 --- /dev/null +++ b/src/migrations/20260918_194842_add_operation_allocation.json @@ -0,0 +1,30621 @@ +{ + "version": "7", + "dialect": "postgresql", + "tables": { + "public.media": { + "name": "media", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "alt": { + "name": "alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "url": { + "name": "url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "thumbnail_u_r_l": { + "name": "thumbnail_u_r_l", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "filename": { + "name": "filename", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "mime_type": { + "name": "mime_type", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "filesize": { + "name": "filesize", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "width": { + "name": "width", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "height": { + "name": "height", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "focal_x": { + "name": "focal_x", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "focal_y": { + "name": "focal_y", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "media_updated_at_idx": { + "name": "media_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "media_created_at_idx": { + "name": "media_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "media_filename_idx": { + "name": "media_filename_idx", + "columns": [ + { + "expression": "filename", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_hard_resources": { + "name": "game_hard_resources", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "game_hard_resources_name_idx": { + "name": "game_hard_resources_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_hard_resources_updated_at_idx": { + "name": "game_hard_resources_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_hard_resources_created_at_idx": { + "name": "game_hard_resources_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_structures_labor_requirements": { + "name": "game_structures_labor_requirements", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "classification_id": { + "name": "classification_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "required_headcount": { + "name": "required_headcount", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "max_headcount": { + "name": "max_headcount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "enforced_salary": { + "name": "enforced_salary", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "game_structures_labor_requirements_order_idx": { + "name": "game_structures_labor_requirements_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_labor_requirements_parent_id_idx": { + "name": "game_structures_labor_requirements_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_labor_requirements_classification_idx": { + "name": "game_structures_labor_requirements_classification_idx", + "columns": [ + { + "expression": "classification_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_structures_labor_requirements_classification_id_labor_classifications_id_fk": { + "name": "game_structures_labor_requirements_classification_id_labor_classifications_id_fk", + "tableFrom": "game_structures_labor_requirements", + "tableTo": "labor_classifications", + "columnsFrom": [ + "classification_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_structures_labor_requirements_parent_id_fk": { + "name": "game_structures_labor_requirements_parent_id_fk", + "tableFrom": "game_structures_labor_requirements", + "tableTo": "game_structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_structures_staff_positions": { + "name": "game_structures_staff_positions", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "position_type": { + "name": "position_type", + "type": "enum_game_structures_staff_positions_position_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "max": { + "name": "max", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "enforced_salary": { + "name": "enforced_salary", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "game_structures_staff_positions_order_idx": { + "name": "game_structures_staff_positions_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_staff_positions_parent_id_idx": { + "name": "game_structures_staff_positions_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_structures_staff_positions_parent_id_fk": { + "name": "game_structures_staff_positions_parent_id_fk", + "tableFrom": "game_structures_staff_positions", + "tableTo": "game_structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_structures_production_inputs": { + "name": "game_structures_production_inputs", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount_per_hour": { + "name": "amount_per_hour", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + } + }, + "indexes": { + "game_structures_production_inputs_order_idx": { + "name": "game_structures_production_inputs_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_production_inputs_parent_id_idx": { + "name": "game_structures_production_inputs_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_production_inputs_resource_idx": { + "name": "game_structures_production_inputs_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_structures_production_inputs_resource_id_resources_id_fk": { + "name": "game_structures_production_inputs_resource_id_resources_id_fk", + "tableFrom": "game_structures_production_inputs", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_structures_production_inputs_parent_id_fk": { + "name": "game_structures_production_inputs_parent_id_fk", + "tableFrom": "game_structures_production_inputs", + "tableTo": "game_structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_structures_production_outputs": { + "name": "game_structures_production_outputs", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount_per_hour": { + "name": "amount_per_hour", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + } + }, + "indexes": { + "game_structures_production_outputs_order_idx": { + "name": "game_structures_production_outputs_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_production_outputs_parent_id_idx": { + "name": "game_structures_production_outputs_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_production_outputs_resource_idx": { + "name": "game_structures_production_outputs_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_structures_production_outputs_resource_id_resources_id_fk": { + "name": "game_structures_production_outputs_resource_id_resources_id_fk", + "tableFrom": "game_structures_production_outputs", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_structures_production_outputs_parent_id_fk": { + "name": "game_structures_production_outputs_parent_id_fk", + "tableFrom": "game_structures_production_outputs", + "tableTo": "game_structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_structures_installed_modules": { + "name": "game_structures_installed_modules", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "installed_at": { + "name": "installed_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "game_structures_installed_modules_order_idx": { + "name": "game_structures_installed_modules_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_installed_modules_parent_id_idx": { + "name": "game_structures_installed_modules_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_structures_installed_modules_parent_id_fk": { + "name": "game_structures_installed_modules_parent_id_fk", + "tableFrom": "game_structures_installed_modules", + "tableTo": "game_structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_structures_stored_resources": { + "name": "game_structures_stored_resources", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "grid_x": { + "name": "grid_x", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "grid_y": { + "name": "grid_y", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "rotated": { + "name": "rotated", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "game_structures_stored_resources_order_idx": { + "name": "game_structures_stored_resources_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_stored_resources_parent_id_idx": { + "name": "game_structures_stored_resources_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_stored_resources_resource_idx": { + "name": "game_structures_stored_resources_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_structures_stored_resources_resource_id_resources_id_fk": { + "name": "game_structures_stored_resources_resource_id_resources_id_fk", + "tableFrom": "game_structures_stored_resources", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_structures_stored_resources_parent_id_fk": { + "name": "game_structures_stored_resources_parent_id_fk", + "tableFrom": "game_structures_stored_resources", + "tableTo": "game_structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_structures_void_storage": { + "name": "game_structures_void_storage", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "grid_x": { + "name": "grid_x", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "grid_y": { + "name": "grid_y", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "rotated": { + "name": "rotated", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "game_structures_void_storage_order_idx": { + "name": "game_structures_void_storage_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_void_storage_parent_id_idx": { + "name": "game_structures_void_storage_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_void_storage_resource_idx": { + "name": "game_structures_void_storage_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_structures_void_storage_resource_id_resources_id_fk": { + "name": "game_structures_void_storage_resource_id_resources_id_fk", + "tableFrom": "game_structures_void_storage", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_structures_void_storage_parent_id_fk": { + "name": "game_structures_void_storage_parent_id_fk", + "tableFrom": "game_structures_void_storage", + "tableTo": "game_structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_structures": { + "name": "game_structures", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "type_id": { + "name": "type_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "faction_id": { + "name": "faction_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "map_id": { + "name": "map_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "construction_status": { + "name": "construction_status", + "type": "enum_game_structures_construction_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'complete'" + }, + "construction_started_at": { + "name": "construction_started_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "construction_completes_at": { + "name": "construction_completes_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "maintenance_cost": { + "name": "maintenance_cost", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "production_paused": { + "name": "production_paused", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "last_production_at": { + "name": "last_production_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "production_stall_reason": { + "name": "production_stall_reason", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "coordinates": { + "name": "coordinates", + "type": "geometry(Point)", + "primaryKey": false, + "notNull": false + }, + "label_visible": { + "name": "label_visible", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "label_priority": { + "name": "label_priority", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "parent_structure_id": { + "name": "parent_structure_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "game_structures_type_idx": { + "name": "game_structures_type_idx", + "columns": [ + { + "expression": "type_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_faction_idx": { + "name": "game_structures_faction_idx", + "columns": [ + { + "expression": "faction_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_map_idx": { + "name": "game_structures_map_idx", + "columns": [ + { + "expression": "map_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_parent_structure_idx": { + "name": "game_structures_parent_structure_idx", + "columns": [ + { + "expression": "parent_structure_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_updated_at_idx": { + "name": "game_structures_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_structures_created_at_idx": { + "name": "game_structures_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_structures_type_id_structures_id_fk": { + "name": "game_structures_type_id_structures_id_fk", + "tableFrom": "game_structures", + "tableTo": "structures", + "columnsFrom": [ + "type_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_structures_faction_id_factions_id_fk": { + "name": "game_structures_faction_id_factions_id_fk", + "tableFrom": "game_structures", + "tableTo": "factions", + "columnsFrom": [ + "faction_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_structures_map_id_maps_id_fk": { + "name": "game_structures_map_id_maps_id_fk", + "tableFrom": "game_structures", + "tableTo": "maps", + "columnsFrom": [ + "map_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_structures_parent_structure_id_game_structures_id_fk": { + "name": "game_structures_parent_structure_id_game_structures_id_fk", + "tableFrom": "game_structures", + "tableTo": "game_structures", + "columnsFrom": [ + "parent_structure_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_vehicles_stored_resources": { + "name": "game_vehicles_stored_resources", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "grid_x": { + "name": "grid_x", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "grid_y": { + "name": "grid_y", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "rotated": { + "name": "rotated", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "game_vehicles_stored_resources_order_idx": { + "name": "game_vehicles_stored_resources_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_vehicles_stored_resources_parent_id_idx": { + "name": "game_vehicles_stored_resources_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_vehicles_stored_resources_resource_idx": { + "name": "game_vehicles_stored_resources_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_vehicles_stored_resources_resource_id_resources_id_fk": { + "name": "game_vehicles_stored_resources_resource_id_resources_id_fk", + "tableFrom": "game_vehicles_stored_resources", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_vehicles_stored_resources_parent_id_fk": { + "name": "game_vehicles_stored_resources_parent_id_fk", + "tableFrom": "game_vehicles_stored_resources", + "tableTo": "game_vehicles", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_vehicles_void_storage": { + "name": "game_vehicles_void_storage", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "grid_x": { + "name": "grid_x", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "grid_y": { + "name": "grid_y", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "rotated": { + "name": "rotated", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "game_vehicles_void_storage_order_idx": { + "name": "game_vehicles_void_storage_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_vehicles_void_storage_parent_id_idx": { + "name": "game_vehicles_void_storage_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_vehicles_void_storage_resource_idx": { + "name": "game_vehicles_void_storage_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_vehicles_void_storage_resource_id_resources_id_fk": { + "name": "game_vehicles_void_storage_resource_id_resources_id_fk", + "tableFrom": "game_vehicles_void_storage", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_vehicles_void_storage_parent_id_fk": { + "name": "game_vehicles_void_storage_parent_id_fk", + "tableFrom": "game_vehicles_void_storage", + "tableTo": "game_vehicles", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_vehicles": { + "name": "game_vehicles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "type_id": { + "name": "type_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "deployed_at_id": { + "name": "deployed_at_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "faction_id": { + "name": "faction_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "enum_game_vehicles_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "current_fuel": { + "name": "current_fuel", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "current_health": { + "name": "current_health", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "game_vehicles_type_idx": { + "name": "game_vehicles_type_idx", + "columns": [ + { + "expression": "type_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_vehicles_deployed_at_idx": { + "name": "game_vehicles_deployed_at_idx", + "columns": [ + { + "expression": "deployed_at_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_vehicles_faction_idx": { + "name": "game_vehicles_faction_idx", + "columns": [ + { + "expression": "faction_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_vehicles_updated_at_idx": { + "name": "game_vehicles_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_vehicles_created_at_idx": { + "name": "game_vehicles_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_vehicles_type_id_vehicles_id_fk": { + "name": "game_vehicles_type_id_vehicles_id_fk", + "tableFrom": "game_vehicles", + "tableTo": "vehicles", + "columnsFrom": [ + "type_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_vehicles_deployed_at_id_game_structures_id_fk": { + "name": "game_vehicles_deployed_at_id_game_structures_id_fk", + "tableFrom": "game_vehicles", + "tableTo": "game_structures", + "columnsFrom": [ + "deployed_at_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_vehicles_faction_id_factions_id_fk": { + "name": "game_vehicles_faction_id_factions_id_fk", + "tableFrom": "game_vehicles", + "tableTo": "factions", + "columnsFrom": [ + "faction_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_npcs": { + "name": "game_npcs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "occupation": { + "name": "occupation", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "location_id": { + "name": "location_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "faction_id": { + "name": "faction_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "bio": { + "name": "bio", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "is_generated": { + "name": "is_generated", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "is_in_game": { + "name": "is_in_game", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "vendor_enabled": { + "name": "vendor_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "vendor_price_modifier": { + "name": "vendor_price_modifier", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "game_npcs_location_idx": { + "name": "game_npcs_location_idx", + "columns": [ + { + "expression": "location_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_npcs_faction_idx": { + "name": "game_npcs_faction_idx", + "columns": [ + { + "expression": "faction_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_npcs_updated_at_idx": { + "name": "game_npcs_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_npcs_created_at_idx": { + "name": "game_npcs_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_npcs_location_id_game_structures_id_fk": { + "name": "game_npcs_location_id_game_structures_id_fk", + "tableFrom": "game_npcs", + "tableTo": "game_structures", + "columnsFrom": [ + "location_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_npcs_faction_id_factions_id_fk": { + "name": "game_npcs_faction_id_factions_id_fk", + "tableFrom": "game_npcs", + "tableTo": "factions", + "columnsFrom": [ + "faction_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_npcs_rels": { + "name": "game_npcs_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "assets_id": { + "name": "assets_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "game_npcs_rels_order_idx": { + "name": "game_npcs_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_npcs_rels_parent_idx": { + "name": "game_npcs_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_npcs_rels_path_idx": { + "name": "game_npcs_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_npcs_rels_assets_id_idx": { + "name": "game_npcs_rels_assets_id_idx", + "columns": [ + { + "expression": "assets_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_npcs_rels_parent_fk": { + "name": "game_npcs_rels_parent_fk", + "tableFrom": "game_npcs_rels", + "tableTo": "game_npcs", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "game_npcs_rels_assets_fk": { + "name": "game_npcs_rels_assets_fk", + "tableFrom": "game_npcs_rels", + "tableTo": "assets", + "columnsFrom": [ + "assets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.npc_staffing": { + "name": "npc_staffing", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "npc_id": { + "name": "npc_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "structure_id": { + "name": "structure_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "position_type": { + "name": "position_type", + "type": "enum_npc_staffing_position_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'labor'" + }, + "position_title": { + "name": "position_title", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "headcount": { + "name": "headcount", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "labor_classification_id": { + "name": "labor_classification_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "salary": { + "name": "salary", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "status": { + "name": "status", + "type": "enum_npc_staffing_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'active'" + }, + "hired_at": { + "name": "hired_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "terminated_at": { + "name": "terminated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "npc_staffing_npc_idx": { + "name": "npc_staffing_npc_idx", + "columns": [ + { + "expression": "npc_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "npc_staffing_structure_idx": { + "name": "npc_staffing_structure_idx", + "columns": [ + { + "expression": "structure_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "npc_staffing_labor_classification_idx": { + "name": "npc_staffing_labor_classification_idx", + "columns": [ + { + "expression": "labor_classification_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "npc_staffing_updated_at_idx": { + "name": "npc_staffing_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "npc_staffing_created_at_idx": { + "name": "npc_staffing_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "npc_staffing_npc_id_game_npcs_id_fk": { + "name": "npc_staffing_npc_id_game_npcs_id_fk", + "tableFrom": "npc_staffing", + "tableTo": "game_npcs", + "columnsFrom": [ + "npc_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "npc_staffing_structure_id_game_structures_id_fk": { + "name": "npc_staffing_structure_id_game_structures_id_fk", + "tableFrom": "npc_staffing", + "tableTo": "game_structures", + "columnsFrom": [ + "structure_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "npc_staffing_labor_classification_id_labor_classifications_id_fk": { + "name": "npc_staffing_labor_classification_id_labor_classifications_id_fk", + "tableFrom": "npc_staffing", + "tableTo": "labor_classifications", + "columnsFrom": [ + "labor_classification_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.labor_classifications": { + "name": "labor_classifications", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "default_unit_salary": { + "name": "default_unit_salary", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "build_efficiency": { + "name": "build_efficiency", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "available_headcount": { + "name": "available_headcount", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "labor_classifications_name_idx": { + "name": "labor_classifications_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "labor_classifications_key_idx": { + "name": "labor_classifications_key_idx", + "columns": [ + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "labor_classifications_updated_at_idx": { + "name": "labor_classifications_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "labor_classifications_created_at_idx": { + "name": "labor_classifications_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_event_logs": { + "name": "game_event_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "system": { + "name": "system", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "message": { + "name": "message", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "actor_id": { + "name": "actor_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "structure_id": { + "name": "structure_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "target_collection": { + "name": "target_collection", + "type": "enum_game_event_logs_target_collection", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "data": { + "name": "data", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "game_event_logs_type_idx": { + "name": "game_event_logs_type_idx", + "columns": [ + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_event_logs_actor_idx": { + "name": "game_event_logs_actor_idx", + "columns": [ + { + "expression": "actor_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_event_logs_structure_idx": { + "name": "game_event_logs_structure_idx", + "columns": [ + { + "expression": "structure_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_event_logs_updated_at_idx": { + "name": "game_event_logs_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_event_logs_created_at_idx": { + "name": "game_event_logs_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_event_logs_actor_id_users_id_fk": { + "name": "game_event_logs_actor_id_users_id_fk", + "tableFrom": "game_event_logs", + "tableTo": "users", + "columnsFrom": [ + "actor_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "game_event_logs_structure_id_game_structures_id_fk": { + "name": "game_event_logs_structure_id_game_structures_id_fk", + "tableFrom": "game_event_logs", + "tableTo": "game_structures", + "columnsFrom": [ + "structure_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users_roles": { + "name": "users_roles", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_users_roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "users_roles_order_idx": { + "name": "users_roles_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_roles_parent_idx": { + "name": "users_roles_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "users_roles_parent_fk": { + "name": "users_roles_parent_fk", + "tableFrom": "users_roles", + "tableTo": "users", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users_preferences_notifications_muted_types": { + "name": "users_preferences_notifications_muted_types", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_users_preferences_notifications_muted_types", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "users_preferences_notifications_muted_types_order_idx": { + "name": "users_preferences_notifications_muted_types_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_preferences_notifications_muted_types_parent_idx": { + "name": "users_preferences_notifications_muted_types_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "users_preferences_notifications_muted_types_parent_fk": { + "name": "users_preferences_notifications_muted_types_parent_fk", + "tableFrom": "users_preferences_notifications_muted_types", + "tableTo": "users", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users_preferences_discord_muted_types": { + "name": "users_preferences_discord_muted_types", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_users_preferences_discord_muted_types", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "users_preferences_discord_muted_types_order_idx": { + "name": "users_preferences_discord_muted_types_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_preferences_discord_muted_types_parent_idx": { + "name": "users_preferences_discord_muted_types_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "users_preferences_discord_muted_types_parent_fk": { + "name": "users_preferences_discord_muted_types_parent_fk", + "tableFrom": "users_preferences_discord_muted_types", + "tableTo": "users", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users_sessions": { + "name": "users_sessions", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "users_sessions_order_idx": { + "name": "users_sessions_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_sessions_parent_id_idx": { + "name": "users_sessions_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "users_sessions_parent_id_fk": { + "name": "users_sessions_parent_id_fk", + "tableFrom": "users_sessions", + "tableTo": "users", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "discord_username": { + "name": "discord_username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "discord_id": { + "name": "discord_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "display_name": { + "name": "display_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "payload_display_name": { + "name": "payload_display_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "steam_id": { + "name": "steam_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "preferences_notifications_muted_all": { + "name": "preferences_notifications_muted_all", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "preferences_display_show_callsign": { + "name": "preferences_display_show_callsign", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "preferences_display_lead_or_actual": { + "name": "preferences_display_lead_or_actual", + "type": "enum_users_preferences_display_lead_or_actual", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'lead'" + }, + "preferences_display_show_version_overlay": { + "name": "preferences_display_show_version_overlay", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "preferences_display_xp_display_mini": { + "name": "preferences_display_xp_display_mini", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "preferences_display_show_background_texture": { + "name": "preferences_display_show_background_texture", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "preferences_discord_enabled": { + "name": "preferences_discord_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "preferences_dashboard_layout": { + "name": "preferences_dashboard_layout", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "reset_password_token": { + "name": "reset_password_token", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "reset_password_expiration": { + "name": "reset_password_expiration", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "salt": { + "name": "salt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "login_attempts": { + "name": "login_attempts", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "lock_until": { + "name": "lock_until", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "users_discord_username_idx": { + "name": "users_discord_username_idx", + "columns": [ + { + "expression": "discord_username", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_discord_id_idx": { + "name": "users_discord_id_idx", + "columns": [ + { + "expression": "discord_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_updated_at_idx": { + "name": "users_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_created_at_idx": { + "name": "users_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_username_idx": { + "name": "users_username_idx", + "columns": [ + { + "expression": "username", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users_rels": { + "name": "users_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "roles_id": { + "name": "roles_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "users_rels_order_idx": { + "name": "users_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_rels_parent_idx": { + "name": "users_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_rels_path_idx": { + "name": "users_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_rels_roles_id_idx": { + "name": "users_rels_roles_id_idx", + "columns": [ + { + "expression": "roles_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "users_rels_parent_fk": { + "name": "users_rels_parent_fk", + "tableFrom": "users_rels", + "tableTo": "users", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "users_rels_roles_fk": { + "name": "users_rels_roles_fk", + "tableFrom": "users_rels", + "tableTo": "roles", + "columnsFrom": [ + "roles_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.roles_permissions": { + "name": "roles_permissions", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_roles_permissions", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "roles_permissions_order_idx": { + "name": "roles_permissions_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "roles_permissions_parent_idx": { + "name": "roles_permissions_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "roles_permissions_parent_fk": { + "name": "roles_permissions_parent_fk", + "tableFrom": "roles_permissions", + "tableTo": "roles", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "is_system": { + "name": "is_system", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "is_superuser": { + "name": "is_superuser", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "roles_name_idx": { + "name": "roles_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "roles_slug_idx": { + "name": "roles_slug_idx", + "columns": [ + { + "expression": "slug", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "roles_updated_at_idx": { + "name": "roles_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "roles_created_at_idx": { + "name": "roles_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.roles_rels": { + "name": "roles_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "roles_id": { + "name": "roles_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "roles_rels_order_idx": { + "name": "roles_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "roles_rels_parent_idx": { + "name": "roles_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "roles_rels_path_idx": { + "name": "roles_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "roles_rels_roles_id_idx": { + "name": "roles_rels_roles_id_idx", + "columns": [ + { + "expression": "roles_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "roles_rels_parent_fk": { + "name": "roles_rels_parent_fk", + "tableFrom": "roles_rels", + "tableTo": "roles", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "roles_rels_roles_fk": { + "name": "roles_rels_roles_fk", + "tableFrom": "roles_rels", + "tableTo": "roles", + "columnsFrom": [ + "roles_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ranks": { + "name": "ranks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "_order": { + "name": "_order", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "abbreviation": { + "name": "abbreviation", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "insignia_id": { + "name": "insignia_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "promotion_ceiling_id": { + "name": "promotion_ceiling_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "ranks__order_idx": { + "name": "ranks__order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ranks_name_idx": { + "name": "ranks_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ranks_abbreviation_idx": { + "name": "ranks_abbreviation_idx", + "columns": [ + { + "expression": "abbreviation", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ranks_insignia_idx": { + "name": "ranks_insignia_idx", + "columns": [ + { + "expression": "insignia_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ranks_promotion_ceiling_idx": { + "name": "ranks_promotion_ceiling_idx", + "columns": [ + { + "expression": "promotion_ceiling_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ranks_updated_at_idx": { + "name": "ranks_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ranks_created_at_idx": { + "name": "ranks_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "ranks_insignia_id_media_id_fk": { + "name": "ranks_insignia_id_media_id_fk", + "tableFrom": "ranks", + "tableTo": "media", + "columnsFrom": [ + "insignia_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ranks_promotion_ceiling_id_ranks_id_fk": { + "name": "ranks_promotion_ceiling_id_ranks_id_fk", + "tableFrom": "ranks", + "tableTo": "ranks", + "columnsFrom": [ + "promotion_ceiling_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.profiles_progression_awards": { + "name": "profiles_progression_awards", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "award_id": { + "name": "award_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "awarded_by_id": { + "name": "awarded_by_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "awarded_at": { + "name": "awarded_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + }, + "award_reason": { + "name": "award_reason", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "upgraded_from_id": { + "name": "upgraded_from_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "upgraded_at": { + "name": "upgraded_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "profiles_progression_awards_order_idx": { + "name": "profiles_progression_awards_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "profiles_progression_awards_parent_id_idx": { + "name": "profiles_progression_awards_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "profiles_progression_awards_award_idx": { + "name": "profiles_progression_awards_award_idx", + "columns": [ + { + "expression": "award_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "profiles_progression_awards_awarded_by_idx": { + "name": "profiles_progression_awards_awarded_by_idx", + "columns": [ + { + "expression": "awarded_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "profiles_progression_awards_upgraded_from_idx": { + "name": "profiles_progression_awards_upgraded_from_idx", + "columns": [ + { + "expression": "upgraded_from_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "profiles_progression_awards_award_id_awards_id_fk": { + "name": "profiles_progression_awards_award_id_awards_id_fk", + "tableFrom": "profiles_progression_awards", + "tableTo": "awards", + "columnsFrom": [ + "award_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "profiles_progression_awards_awarded_by_id_profiles_id_fk": { + "name": "profiles_progression_awards_awarded_by_id_profiles_id_fk", + "tableFrom": "profiles_progression_awards", + "tableTo": "profiles", + "columnsFrom": [ + "awarded_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "profiles_progression_awards_upgraded_from_id_awards_id_fk": { + "name": "profiles_progression_awards_upgraded_from_id_awards_id_fk", + "tableFrom": "profiles_progression_awards", + "tableTo": "awards", + "columnsFrom": [ + "upgraded_from_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "profiles_progression_awards_parent_id_fk": { + "name": "profiles_progression_awards_parent_id_fk", + "tableFrom": "profiles_progression_awards", + "tableTo": "profiles", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.profiles": { + "name": "profiles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "rank_id": { + "name": "rank_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "dossier_enlistment_date": { + "name": "dossier_enlistment_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + }, + "dossier_personal_excerpt": { + "name": "dossier_personal_excerpt", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "dossier_intel_excerpt": { + "name": "dossier_intel_excerpt", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "progression_scoreboard_infantry_kills": { + "name": "progression_scoreboard_infantry_kills", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_scoreboard_vehicle_kills": { + "name": "progression_scoreboard_vehicle_kills", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_scoreboard_armor_kills": { + "name": "progression_scoreboard_armor_kills", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_scoreboard_air_kills": { + "name": "progression_scoreboard_air_kills", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_scoreboard_deaths": { + "name": "progression_scoreboard_deaths", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_flappy_bird_games_played": { + "name": "progression_minigames_flappy_bird_games_played", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_flappy_bird_total_passes": { + "name": "progression_minigames_flappy_bird_total_passes", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_flappy_bird_best_score": { + "name": "progression_minigames_flappy_bird_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_flappy_bird_xp_earned": { + "name": "progression_minigames_flappy_bird_xp_earned", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_eod_minesweeper_games_played": { + "name": "progression_minigames_eod_minesweeper_games_played", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_eod_minesweeper_wins": { + "name": "progression_minigames_eod_minesweeper_wins", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_eod_minesweeper_losses": { + "name": "progression_minigames_eod_minesweeper_losses", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_eod_minesweeper_best_score": { + "name": "progression_minigames_eod_minesweeper_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_eod_minesweeper_xp_earned": { + "name": "progression_minigames_eod_minesweeper_xp_earned", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_eod_minesweeper_best_training_time": { + "name": "progression_minigames_eod_minesweeper_best_training_time", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_eod_minesweeper_best_perimeter_time": { + "name": "progression_minigames_eod_minesweeper_best_perimeter_time", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_eod_minesweeper_best_supply_road_time": { + "name": "progression_minigames_eod_minesweeper_best_supply_road_time", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_eod_minesweeper_best_training_flags": { + "name": "progression_minigames_eod_minesweeper_best_training_flags", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_eod_minesweeper_best_perimeter_flags": { + "name": "progression_minigames_eod_minesweeper_best_perimeter_flags", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_eod_minesweeper_best_supply_road_flags": { + "name": "progression_minigames_eod_minesweeper_best_supply_road_flags", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_games_played": { + "name": "progression_minigames_radio_traffic_games_played", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_total_messages": { + "name": "progression_minigames_radio_traffic_total_messages", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_incorrect_messages": { + "name": "progression_minigames_radio_traffic_incorrect_messages", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_best_score": { + "name": "progression_minigames_radio_traffic_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_best_accuracy": { + "name": "progression_minigames_radio_traffic_best_accuracy", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_best_sprint_time_ms": { + "name": "progression_minigames_radio_traffic_best_sprint_time_ms", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_sprint_games_played": { + "name": "progression_minigames_radio_traffic_sprint_games_played", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_sprint_total_messages": { + "name": "progression_minigames_radio_traffic_sprint_total_messages", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_sprint_incorrect_messages": { + "name": "progression_minigames_radio_traffic_sprint_incorrect_messages", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_sprint_best_score": { + "name": "progression_minigames_radio_traffic_sprint_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_sprint_best_accuracy": { + "name": "progression_minigames_radio_traffic_sprint_best_accuracy", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_watch_games_played": { + "name": "progression_minigames_radio_traffic_watch_games_played", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_watch_total_messages": { + "name": "progression_minigames_radio_traffic_watch_total_messages", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_watch_incorrect_messages": { + "name": "progression_minigames_radio_traffic_watch_incorrect_messages", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_watch_best_score": { + "name": "progression_minigames_radio_traffic_watch_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_watch_best_accuracy": { + "name": "progression_minigames_radio_traffic_watch_best_accuracy", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_radio_traffic_xp_earned": { + "name": "progression_minigames_radio_traffic_xp_earned", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_aim_trainer_games_played": { + "name": "progression_minigames_aim_trainer_games_played", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_aim_trainer_best_score": { + "name": "progression_minigames_aim_trainer_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_aim_trainer_recruit_best_score": { + "name": "progression_minigames_aim_trainer_recruit_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_aim_trainer_veteran_best_score": { + "name": "progression_minigames_aim_trainer_veteran_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_aim_trainer_elite_best_score": { + "name": "progression_minigames_aim_trainer_elite_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_aim_trainer_recruit_best_accuracy": { + "name": "progression_minigames_aim_trainer_recruit_best_accuracy", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_aim_trainer_veteran_best_accuracy": { + "name": "progression_minigames_aim_trainer_veteran_best_accuracy", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_aim_trainer_elite_best_accuracy": { + "name": "progression_minigames_aim_trainer_elite_best_accuracy", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_aim_trainer_xp_earned": { + "name": "progression_minigames_aim_trainer_xp_earned", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_opord_recall_games_played": { + "name": "progression_minigames_opord_recall_games_played", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_opord_recall_best_score": { + "name": "progression_minigames_opord_recall_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_opord_recall_best_accuracy": { + "name": "progression_minigames_opord_recall_best_accuracy", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_opord_recall_recruit_best_score": { + "name": "progression_minigames_opord_recall_recruit_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_opord_recall_veteran_best_score": { + "name": "progression_minigames_opord_recall_veteran_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_opord_recall_elite_best_score": { + "name": "progression_minigames_opord_recall_elite_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_opord_recall_recruit_best_time_ms": { + "name": "progression_minigames_opord_recall_recruit_best_time_ms", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "progression_minigames_opord_recall_veteran_best_time_ms": { + "name": "progression_minigames_opord_recall_veteran_best_time_ms", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "progression_minigames_opord_recall_elite_best_time_ms": { + "name": "progression_minigames_opord_recall_elite_best_time_ms", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "progression_minigames_opord_recall_xp_earned": { + "name": "progression_minigames_opord_recall_xp_earned", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_poker_games_played": { + "name": "progression_minigames_poker_games_played", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_poker_wins": { + "name": "progression_minigames_poker_wins", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_poker_second_places": { + "name": "progression_minigames_poker_second_places", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_poker_third_places": { + "name": "progression_minigames_poker_third_places", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_poker_fourth_places": { + "name": "progression_minigames_poker_fourth_places", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_poker_hands_won": { + "name": "progression_minigames_poker_hands_won", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_poker_best_score": { + "name": "progression_minigames_poker_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_poker_xp_earned": { + "name": "progression_minigames_poker_xp_earned", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_blackjack_games_played": { + "name": "progression_minigames_blackjack_games_played", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_blackjack_rounds_won": { + "name": "progression_minigames_blackjack_rounds_won", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_blackjack_blackjacks_hit": { + "name": "progression_minigames_blackjack_blackjacks_hit", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_blackjack_best_score": { + "name": "progression_minigames_blackjack_best_score", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_minigames_blackjack_xp_earned": { + "name": "progression_minigames_blackjack_xp_earned", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_chip_bank": { + "name": "progression_chip_bank", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "progression_chip_bank_refilled_at": { + "name": "progression_chip_bank_refilled_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "progression_voiceover_xp_earned": { + "name": "progression_voiceover_xp_earned", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "profiles_user_idx": { + "name": "profiles_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "profiles_rank_idx": { + "name": "profiles_rank_idx", + "columns": [ + { + "expression": "rank_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "profiles_updated_at_idx": { + "name": "profiles_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "profiles_created_at_idx": { + "name": "profiles_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "profiles_user_id_users_id_fk": { + "name": "profiles_user_id_users_id_fk", + "tableFrom": "profiles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "profiles_rank_id_ranks_id_fk": { + "name": "profiles_rank_id_ranks_id_fk", + "tableFrom": "profiles", + "tableTo": "ranks", + "columnsFrom": [ + "rank_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.profiles_rels": { + "name": "profiles_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "qualifications_id": { + "name": "qualifications_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "profiles_rels_order_idx": { + "name": "profiles_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "profiles_rels_parent_idx": { + "name": "profiles_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "profiles_rels_path_idx": { + "name": "profiles_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "profiles_rels_qualifications_id_idx": { + "name": "profiles_rels_qualifications_id_idx", + "columns": [ + { + "expression": "qualifications_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "profiles_rels_parent_fk": { + "name": "profiles_rels_parent_fk", + "tableFrom": "profiles_rels", + "tableTo": "profiles", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "profiles_rels_qualifications_fk": { + "name": "profiles_rels_qualifications_fk", + "tableFrom": "profiles_rels", + "tableTo": "qualifications", + "columnsFrom": [ + "qualifications_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.awards_grant_config_allowed_grantor_assignment_types": { + "name": "awards_grant_config_allowed_grantor_assignment_types", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_awards_grant_config_allowed_grantor_assignment_types", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "awards_grant_config_allowed_grantor_assignment_types_order_idx": { + "name": "awards_grant_config_allowed_grantor_assignment_types_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "awards_grant_config_allowed_grantor_assignment_types_parent_idx": { + "name": "awards_grant_config_allowed_grantor_assignment_types_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "awards_grant_config_allowed_grantor_assignment_types_parent_fk": { + "name": "awards_grant_config_allowed_grantor_assignment_types_parent_fk", + "tableFrom": "awards_grant_config_allowed_grantor_assignment_types", + "tableTo": "awards", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.awards": { + "name": "awards", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "enum_awards_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'commendation'" + }, + "commendation_color": { + "name": "commendation_color", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "'#92400e'" + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "experience_points": { + "name": "experience_points", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "ribbon_design": { + "name": "ribbon_design", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "background_image_id": { + "name": "background_image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "medal_design": { + "name": "medal_design", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "advancement_series_key": { + "name": "advancement_series_key", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "advancement_tier": { + "name": "advancement_tier", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "grant_config_max_grants_per_grantor": { + "name": "grant_config_max_grants_per_grantor", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "grant_config_recipient_scope": { + "name": "grant_config_recipient_scope", + "type": "enum_awards_grant_config_recipient_scope", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'same_command'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "awards_name_idx": { + "name": "awards_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "awards_image_idx": { + "name": "awards_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "awards_background_image_idx": { + "name": "awards_background_image_idx", + "columns": [ + { + "expression": "background_image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "awards_updated_at_idx": { + "name": "awards_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "awards_created_at_idx": { + "name": "awards_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "awards_image_id_media_id_fk": { + "name": "awards_image_id_media_id_fk", + "tableFrom": "awards", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "awards_background_image_id_media_id_fk": { + "name": "awards_background_image_id_media_id_fk", + "tableFrom": "awards", + "tableTo": "media", + "columnsFrom": [ + "background_image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.awards_rels": { + "name": "awards_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "assignments_id": { + "name": "assignments_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "awards_rels_order_idx": { + "name": "awards_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "awards_rels_parent_idx": { + "name": "awards_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "awards_rels_path_idx": { + "name": "awards_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "awards_rels_assignments_id_idx": { + "name": "awards_rels_assignments_id_idx", + "columns": [ + { + "expression": "assignments_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "awards_rels_parent_fk": { + "name": "awards_rels_parent_fk", + "tableFrom": "awards_rels", + "tableTo": "awards", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "awards_rels_assignments_fk": { + "name": "awards_rels_assignments_fk", + "tableFrom": "awards_rels", + "tableTo": "assignments", + "columnsFrom": [ + "assignments_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.qualifications": { + "name": "qualifications", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "qualifications_name_idx": { + "name": "qualifications_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "qualifications_updated_at_idx": { + "name": "qualifications_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "qualifications_created_at_idx": { + "name": "qualifications_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.assignments": { + "name": "assignments", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "enum_assignments_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "callsign": { + "name": "callsign", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "leader_id": { + "name": "leader_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "assignments_leader_idx": { + "name": "assignments_leader_idx", + "columns": [ + { + "expression": "leader_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignments_updated_at_idx": { + "name": "assignments_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignments_created_at_idx": { + "name": "assignments_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "assignments_leader_id_users_id_fk": { + "name": "assignments_leader_id_users_id_fk", + "tableFrom": "assignments", + "tableTo": "users", + "columnsFrom": [ + "leader_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.assignments_rels": { + "name": "assignments_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "assignments_id": { + "name": "assignments_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "users_id": { + "name": "users_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "assignments_rels_order_idx": { + "name": "assignments_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignments_rels_parent_idx": { + "name": "assignments_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignments_rels_path_idx": { + "name": "assignments_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignments_rels_assignments_id_idx": { + "name": "assignments_rels_assignments_id_idx", + "columns": [ + { + "expression": "assignments_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignments_rels_users_id_idx": { + "name": "assignments_rels_users_id_idx", + "columns": [ + { + "expression": "users_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "assignments_rels_parent_fk": { + "name": "assignments_rels_parent_fk", + "tableFrom": "assignments_rels", + "tableTo": "assignments", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "assignments_rels_assignments_fk": { + "name": "assignments_rels_assignments_fk", + "tableFrom": "assignments_rels", + "tableTo": "assignments", + "columnsFrom": [ + "assignments_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "assignments_rels_users_fk": { + "name": "assignments_rels_users_fk", + "tableFrom": "assignments_rels", + "tableTo": "users", + "columnsFrom": [ + "users_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.assignment_transfers": { + "name": "assignment_transfers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "requester_id": { + "name": "requester_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "from_assignment_id": { + "name": "from_assignment_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "to_assignment_id": { + "name": "to_assignment_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "enum_assignment_transfers_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "escalation_reason": { + "name": "escalation_reason", + "type": "enum_assignment_transfers_escalation_reason", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "from_leader_decision": { + "name": "from_leader_decision", + "type": "enum_assignment_transfers_from_leader_decision", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "to_leader_decision": { + "name": "to_leader_decision", + "type": "enum_assignment_transfers_to_leader_decision", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "from_decision_by_id": { + "name": "from_decision_by_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "to_decision_by_id": { + "name": "to_decision_by_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "from_decided_at": { + "name": "from_decided_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "to_decided_at": { + "name": "to_decided_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "from_leader_snapshot_id": { + "name": "from_leader_snapshot_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "to_leader_snapshot_id": { + "name": "to_leader_snapshot_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "rejection_reason": { + "name": "rejection_reason", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "request_note": { + "name": "request_note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "appeal_note": { + "name": "appeal_note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "resolved_by_id": { + "name": "resolved_by_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "resolution_note": { + "name": "resolution_note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "resolved_at": { + "name": "resolved_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "discord_from_leader_message_id": { + "name": "discord_from_leader_message_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "discord_to_leader_message_id": { + "name": "discord_to_leader_message_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "discord_requester_message_id": { + "name": "discord_requester_message_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "source_notified_to_user_id_id": { + "name": "source_notified_to_user_id_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "destination_notified_to_user_id_id": { + "name": "destination_notified_to_user_id_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "discord_delivered_keys": { + "name": "discord_delivered_keys", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'::jsonb" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "assignment_transfers_requester_idx": { + "name": "assignment_transfers_requester_idx", + "columns": [ + { + "expression": "requester_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_from_assignment_idx": { + "name": "assignment_transfers_from_assignment_idx", + "columns": [ + { + "expression": "from_assignment_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_to_assignment_idx": { + "name": "assignment_transfers_to_assignment_idx", + "columns": [ + { + "expression": "to_assignment_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_status_idx": { + "name": "assignment_transfers_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_from_decision_by_idx": { + "name": "assignment_transfers_from_decision_by_idx", + "columns": [ + { + "expression": "from_decision_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_to_decision_by_idx": { + "name": "assignment_transfers_to_decision_by_idx", + "columns": [ + { + "expression": "to_decision_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_from_leader_snapshot_idx": { + "name": "assignment_transfers_from_leader_snapshot_idx", + "columns": [ + { + "expression": "from_leader_snapshot_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_to_leader_snapshot_idx": { + "name": "assignment_transfers_to_leader_snapshot_idx", + "columns": [ + { + "expression": "to_leader_snapshot_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_resolved_by_idx": { + "name": "assignment_transfers_resolved_by_idx", + "columns": [ + { + "expression": "resolved_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_source_notified_to_user_id_idx": { + "name": "assignment_transfers_source_notified_to_user_id_idx", + "columns": [ + { + "expression": "source_notified_to_user_id_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_destination_notified_to_user_id_idx": { + "name": "assignment_transfers_destination_notified_to_user_id_idx", + "columns": [ + { + "expression": "destination_notified_to_user_id_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_updated_at_idx": { + "name": "assignment_transfers_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assignment_transfers_created_at_idx": { + "name": "assignment_transfers_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "assignment_transfers_requester_id_users_id_fk": { + "name": "assignment_transfers_requester_id_users_id_fk", + "tableFrom": "assignment_transfers", + "tableTo": "users", + "columnsFrom": [ + "requester_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "assignment_transfers_from_assignment_id_assignments_id_fk": { + "name": "assignment_transfers_from_assignment_id_assignments_id_fk", + "tableFrom": "assignment_transfers", + "tableTo": "assignments", + "columnsFrom": [ + "from_assignment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "assignment_transfers_to_assignment_id_assignments_id_fk": { + "name": "assignment_transfers_to_assignment_id_assignments_id_fk", + "tableFrom": "assignment_transfers", + "tableTo": "assignments", + "columnsFrom": [ + "to_assignment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "assignment_transfers_from_decision_by_id_users_id_fk": { + "name": "assignment_transfers_from_decision_by_id_users_id_fk", + "tableFrom": "assignment_transfers", + "tableTo": "users", + "columnsFrom": [ + "from_decision_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "assignment_transfers_to_decision_by_id_users_id_fk": { + "name": "assignment_transfers_to_decision_by_id_users_id_fk", + "tableFrom": "assignment_transfers", + "tableTo": "users", + "columnsFrom": [ + "to_decision_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "assignment_transfers_from_leader_snapshot_id_users_id_fk": { + "name": "assignment_transfers_from_leader_snapshot_id_users_id_fk", + "tableFrom": "assignment_transfers", + "tableTo": "users", + "columnsFrom": [ + "from_leader_snapshot_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "assignment_transfers_to_leader_snapshot_id_users_id_fk": { + "name": "assignment_transfers_to_leader_snapshot_id_users_id_fk", + "tableFrom": "assignment_transfers", + "tableTo": "users", + "columnsFrom": [ + "to_leader_snapshot_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "assignment_transfers_resolved_by_id_users_id_fk": { + "name": "assignment_transfers_resolved_by_id_users_id_fk", + "tableFrom": "assignment_transfers", + "tableTo": "users", + "columnsFrom": [ + "resolved_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "assignment_transfers_source_notified_to_user_id_id_users_id_fk": { + "name": "assignment_transfers_source_notified_to_user_id_id_users_id_fk", + "tableFrom": "assignment_transfers", + "tableTo": "users", + "columnsFrom": [ + "source_notified_to_user_id_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "assignment_transfers_destination_notified_to_user_id_id_users_id_fk": { + "name": "assignment_transfers_destination_notified_to_user_id_id_users_id_fk", + "tableFrom": "assignment_transfers", + "tableTo": "users", + "columnsFrom": [ + "destination_notified_to_user_id_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.experience": { + "name": "experience", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "required_points": { + "name": "required_points", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "experience_name_idx": { + "name": "experience_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "experience_updated_at_idx": { + "name": "experience_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "experience_created_at_idx": { + "name": "experience_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_notifications": { + "name": "user_notifications", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "message": { + "name": "message", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "link": { + "name": "link", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "read": { + "name": "read", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "user_notifications_user_idx": { + "name": "user_notifications_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "user_notifications_read_idx": { + "name": "user_notifications_read_idx", + "columns": [ + { + "expression": "read", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "user_notifications_updated_at_idx": { + "name": "user_notifications_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "user_notifications_created_at_idx": { + "name": "user_notifications_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "user_notifications_user_id_users_id_fk": { + "name": "user_notifications_user_id_users_id_fk", + "tableFrom": "user_notifications", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.evaluations": { + "name": "evaluations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rater_id": { + "name": "rater_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "ratee_id": { + "name": "ratee_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "mission_id": { + "name": "mission_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "kind": { + "name": "kind", + "type": "enum_evaluations_kind", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "level": { + "name": "level", + "type": "enum_evaluations_level", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "comment": { + "name": "comment", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "evaluations_rater_idx": { + "name": "evaluations_rater_idx", + "columns": [ + { + "expression": "rater_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "evaluations_ratee_idx": { + "name": "evaluations_ratee_idx", + "columns": [ + { + "expression": "ratee_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "evaluations_mission_idx": { + "name": "evaluations_mission_idx", + "columns": [ + { + "expression": "mission_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "evaluations_updated_at_idx": { + "name": "evaluations_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "evaluations_created_at_idx": { + "name": "evaluations_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "evaluations_rater_id_users_id_fk": { + "name": "evaluations_rater_id_users_id_fk", + "tableFrom": "evaluations", + "tableTo": "users", + "columnsFrom": [ + "rater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "evaluations_ratee_id_users_id_fk": { + "name": "evaluations_ratee_id_users_id_fk", + "tableFrom": "evaluations", + "tableTo": "users", + "columnsFrom": [ + "ratee_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "evaluations_mission_id_missions_id_fk": { + "name": "evaluations_mission_id_missions_id_fk", + "tableFrom": "evaluations", + "tableTo": "missions", + "columnsFrom": [ + "mission_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ribbon_submissions_grantor_types": { + "name": "ribbon_submissions_grantor_types", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_ribbon_submissions_grantor_types", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "ribbon_submissions_grantor_types_order_idx": { + "name": "ribbon_submissions_grantor_types_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ribbon_submissions_grantor_types_parent_idx": { + "name": "ribbon_submissions_grantor_types_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "ribbon_submissions_grantor_types_parent_fk": { + "name": "ribbon_submissions_grantor_types_parent_fk", + "tableFrom": "ribbon_submissions_grantor_types", + "tableTo": "ribbon_submissions", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ribbon_submissions": { + "name": "ribbon_submissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "design": { + "name": "design", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "enum_ribbon_submissions_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "review_note": { + "name": "review_note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "reviewed_by_id": { + "name": "reviewed_by_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "reviewed_at": { + "name": "reviewed_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "award_id": { + "name": "award_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "award_xp": { + "name": "award_xp", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "recipient_scope": { + "name": "recipient_scope", + "type": "enum_ribbon_submissions_recipient_scope", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'same_command'" + }, + "max_grants_per_grantor": { + "name": "max_grants_per_grantor", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "ribbon_submissions_user_idx": { + "name": "ribbon_submissions_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ribbon_submissions_reviewed_by_idx": { + "name": "ribbon_submissions_reviewed_by_idx", + "columns": [ + { + "expression": "reviewed_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ribbon_submissions_award_idx": { + "name": "ribbon_submissions_award_idx", + "columns": [ + { + "expression": "award_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ribbon_submissions_updated_at_idx": { + "name": "ribbon_submissions_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ribbon_submissions_created_at_idx": { + "name": "ribbon_submissions_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "ribbon_submissions_user_id_users_id_fk": { + "name": "ribbon_submissions_user_id_users_id_fk", + "tableFrom": "ribbon_submissions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ribbon_submissions_reviewed_by_id_users_id_fk": { + "name": "ribbon_submissions_reviewed_by_id_users_id_fk", + "tableFrom": "ribbon_submissions", + "tableTo": "users", + "columnsFrom": [ + "reviewed_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ribbon_submissions_award_id_awards_id_fk": { + "name": "ribbon_submissions_award_id_awards_id_fk", + "tableFrom": "ribbon_submissions", + "tableTo": "awards", + "columnsFrom": [ + "award_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.missions_mission_roles_provided_roles": { + "name": "missions_mission_roles_provided_roles", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "role_name": { + "name": "role_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "mission_critical": { + "name": "mission_critical", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "minimum_rank_id": { + "name": "minimum_rank_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "missions_mission_roles_provided_roles_order_idx": { + "name": "missions_mission_roles_provided_roles_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_mission_roles_provided_roles_parent_id_idx": { + "name": "missions_mission_roles_provided_roles_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_mission_roles_provided_roles_minimum_rank_idx": { + "name": "missions_mission_roles_provided_roles_minimum_rank_idx", + "columns": [ + { + "expression": "minimum_rank_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "missions_mission_roles_provided_roles_minimum_rank_id_ranks_id_fk": { + "name": "missions_mission_roles_provided_roles_minimum_rank_id_ranks_id_fk", + "tableFrom": "missions_mission_roles_provided_roles", + "tableTo": "ranks", + "columnsFrom": [ + "minimum_rank_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "missions_mission_roles_provided_roles_parent_id_fk": { + "name": "missions_mission_roles_provided_roles_parent_id_fk", + "tableFrom": "missions_mission_roles_provided_roles", + "tableTo": "missions", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.missions_briefing": { + "name": "missions_briefing", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "section_name": { + "name": "section_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "details": { + "name": "details", + "type": "jsonb", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "missions_briefing_order_idx": { + "name": "missions_briefing_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_briefing_parent_id_idx": { + "name": "missions_briefing_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "missions_briefing_parent_id_fk": { + "name": "missions_briefing_parent_id_fk", + "tableFrom": "missions_briefing", + "tableTo": "missions", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.missions_mission_objectives": { + "name": "missions_mission_objectives", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "mission_critical": { + "name": "mission_critical", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "success_or_fail_conditions": { + "name": "success_or_fail_conditions", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "redacted": { + "name": "redacted", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "missions_mission_objectives_order_idx": { + "name": "missions_mission_objectives_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_mission_objectives_parent_id_idx": { + "name": "missions_mission_objectives_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "missions_mission_objectives_parent_id_fk": { + "name": "missions_mission_objectives_parent_id_fk", + "tableFrom": "missions_mission_objectives", + "tableTo": "missions", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.missions_factions_involved": { + "name": "missions_factions_involved", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "faction_id": { + "name": "faction_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "threat_level": { + "name": "threat_level", + "type": "enum_missions_factions_involved_threat_level", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'hostile'" + } + }, + "indexes": { + "missions_factions_involved_order_idx": { + "name": "missions_factions_involved_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_factions_involved_parent_id_idx": { + "name": "missions_factions_involved_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_factions_involved_faction_idx": { + "name": "missions_factions_involved_faction_idx", + "columns": [ + { + "expression": "faction_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "missions_factions_involved_faction_id_factions_id_fk": { + "name": "missions_factions_involved_faction_id_factions_id_fk", + "tableFrom": "missions_factions_involved", + "tableTo": "factions", + "columnsFrom": [ + "faction_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "missions_factions_involved_parent_id_fk": { + "name": "missions_factions_involved_parent_id_fk", + "tableFrom": "missions_factions_involved", + "tableTo": "missions", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.missions_logistics_and_support_insertion": { + "name": "missions_logistics_and_support_insertion", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_missions_logistics_and_support_insertion", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "missions_logistics_and_support_insertion_order_idx": { + "name": "missions_logistics_and_support_insertion_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_logistics_and_support_insertion_parent_idx": { + "name": "missions_logistics_and_support_insertion_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "missions_logistics_and_support_insertion_parent_fk": { + "name": "missions_logistics_and_support_insertion_parent_fk", + "tableFrom": "missions_logistics_and_support_insertion", + "tableTo": "missions", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.missions_logistics_and_support_extraction": { + "name": "missions_logistics_and_support_extraction", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_missions_logistics_and_support_extraction", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "missions_logistics_and_support_extraction_order_idx": { + "name": "missions_logistics_and_support_extraction_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_logistics_and_support_extraction_parent_idx": { + "name": "missions_logistics_and_support_extraction_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "missions_logistics_and_support_extraction_parent_fk": { + "name": "missions_logistics_and_support_extraction_parent_fk", + "tableFrom": "missions_logistics_and_support_extraction", + "tableTo": "missions", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.missions_logistics_and_support_assets_available": { + "name": "missions_logistics_and_support_assets_available", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "asset_type": { + "name": "asset_type", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "asset_count": { + "name": "asset_count", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "does_respawn": { + "name": "does_respawn", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "asset_callsign": { + "name": "asset_callsign", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "missions_logistics_and_support_assets_available_order_idx": { + "name": "missions_logistics_and_support_assets_available_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_logistics_and_support_assets_available_parent_id_idx": { + "name": "missions_logistics_and_support_assets_available_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "missions_logistics_and_support_assets_available_parent_id_fk": { + "name": "missions_logistics_and_support_assets_available_parent_id_fk", + "tableFrom": "missions_logistics_and_support_assets_available", + "tableTo": "missions", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.missions_comms_and_docs_frequencies": { + "name": "missions_comms_and_docs_frequencies", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "frequency": { + "name": "frequency", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "net_name": { + "name": "net_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "freq_usage": { + "name": "freq_usage", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "missions_comms_and_docs_frequencies_order_idx": { + "name": "missions_comms_and_docs_frequencies_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_comms_and_docs_frequencies_parent_id_idx": { + "name": "missions_comms_and_docs_frequencies_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "missions_comms_and_docs_frequencies_parent_id_fk": { + "name": "missions_comms_and_docs_frequencies_parent_id_fk", + "tableFrom": "missions_comms_and_docs_frequencies", + "tableTo": "missions", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.missions": { + "name": "missions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "code_name": { + "name": "code_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "summary": { + "name": "summary", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "operation_type": { + "name": "operation_type", + "type": "enum_missions_operation_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "discord_message_id": { + "name": "discord_message_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "discord_attendance_hash": { + "name": "discord_attendance_hash", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "discord_attendance_sent_at": { + "name": "discord_attendance_sent_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "discord_modlist_hash": { + "name": "discord_modlist_hash", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "discord_cancelled_at": { + "name": "discord_cancelled_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "evaluation_reminders_sent_at": { + "name": "evaluation_reminders_sent_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "ready_reminder_web_sent_at": { + "name": "ready_reminder_web_sent_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "ready_reminder_dm_sent_at": { + "name": "ready_reminder_dm_sent_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "imminent_reminder_sent_at": { + "name": "imminent_reminder_sent_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "tickets_settled_at": { + "name": "tickets_settled_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cover_image_id": { + "name": "cover_image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "classification_map_id": { + "name": "classification_map_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "classification_mission_type": { + "name": "classification_mission_type", + "type": "enum_missions_classification_mission_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'Zeus'" + }, + "classification_campaign_id": { + "name": "classification_campaign_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "classification_custom_scripts": { + "name": "classification_custom_scripts", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "classification_start_date_time": { + "name": "classification_start_date_time", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + }, + "classification_estimated_duration": { + "name": "classification_estimated_duration", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 240 + }, + "ownership_and_status_status": { + "name": "ownership_and_status_status", + "type": "enum_missions_ownership_and_status_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'Concept'" + }, + "ownership_and_status_visibility": { + "name": "ownership_and_status_visibility", + "type": "enum_missions_ownership_and_status_visibility", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'leadership'" + }, + "ownership_and_status_completed_at": { + "name": "ownership_and_status_completed_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "mission_roles_max_players": { + "name": "mission_roles_max_players", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 32 + }, + "mission_roles_notes": { + "name": "mission_roles_notes", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "civilian_presence": { + "name": "civilian_presence", + "type": "enum_missions_civilian_presence", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'None'" + }, + "game_details_server_details_server_ip": { + "name": "game_details_server_details_server_ip", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "'arma.onyxsimple.com'" + }, + "game_details_server_details_server_port": { + "name": "game_details_server_details_server_port", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 2302 + }, + "game_details_server_details_server_password": { + "name": "game_details_server_details_server_password", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "'ptf313'" + }, + "game_details_game_setup_mission_file_id": { + "name": "game_details_game_setup_mission_file_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "game_details_game_setup_required_mods_id": { + "name": "game_details_game_setup_required_mods_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "comms_and_docs_radio_plan": { + "name": "comms_and_docs_radio_plan", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "missions_code_name_idx": { + "name": "missions_code_name_idx", + "columns": [ + { + "expression": "code_name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_created_by_idx": { + "name": "missions_created_by_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_cover_image_idx": { + "name": "missions_cover_image_idx", + "columns": [ + { + "expression": "cover_image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_classification_classification_map_idx": { + "name": "missions_classification_classification_map_idx", + "columns": [ + { + "expression": "classification_map_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_classification_classification_campaign_idx": { + "name": "missions_classification_classification_campaign_idx", + "columns": [ + { + "expression": "classification_campaign_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_game_details_game_setup_game_details_game_setup_idx": { + "name": "missions_game_details_game_setup_game_details_game_setup_idx", + "columns": [ + { + "expression": "game_details_game_setup_mission_file_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_game_details_game_setup_game_details_game_set_1_idx": { + "name": "missions_game_details_game_setup_game_details_game_set_1_idx", + "columns": [ + { + "expression": "game_details_game_setup_required_mods_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_updated_at_idx": { + "name": "missions_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_created_at_idx": { + "name": "missions_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "missions_created_by_id_users_id_fk": { + "name": "missions_created_by_id_users_id_fk", + "tableFrom": "missions", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "missions_cover_image_id_media_id_fk": { + "name": "missions_cover_image_id_media_id_fk", + "tableFrom": "missions", + "tableTo": "media", + "columnsFrom": [ + "cover_image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "missions_classification_map_id_maps_id_fk": { + "name": "missions_classification_map_id_maps_id_fk", + "tableFrom": "missions", + "tableTo": "maps", + "columnsFrom": [ + "classification_map_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "missions_classification_campaign_id_campaigns_id_fk": { + "name": "missions_classification_campaign_id_campaigns_id_fk", + "tableFrom": "missions", + "tableTo": "campaigns", + "columnsFrom": [ + "classification_campaign_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "missions_game_details_game_setup_mission_file_id_mission_files_id_fk": { + "name": "missions_game_details_game_setup_mission_file_id_mission_files_id_fk", + "tableFrom": "missions", + "tableTo": "mission_files", + "columnsFrom": [ + "game_details_game_setup_mission_file_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "missions_game_details_game_setup_required_mods_id_mod_lists_id_fk": { + "name": "missions_game_details_game_setup_required_mods_id_mod_lists_id_fk", + "tableFrom": "missions", + "tableTo": "mod_lists", + "columnsFrom": [ + "game_details_game_setup_required_mods_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.missions_rels": { + "name": "missions_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "users_id": { + "name": "users_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "qualifications_id": { + "name": "qualifications_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "missions_rels_order_idx": { + "name": "missions_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_rels_parent_idx": { + "name": "missions_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_rels_path_idx": { + "name": "missions_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_rels_users_id_idx": { + "name": "missions_rels_users_id_idx", + "columns": [ + { + "expression": "users_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "missions_rels_qualifications_id_idx": { + "name": "missions_rels_qualifications_id_idx", + "columns": [ + { + "expression": "qualifications_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "missions_rels_parent_fk": { + "name": "missions_rels_parent_fk", + "tableFrom": "missions_rels", + "tableTo": "missions", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "missions_rels_users_fk": { + "name": "missions_rels_users_fk", + "tableFrom": "missions_rels", + "tableTo": "users", + "columnsFrom": [ + "users_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "missions_rels_qualifications_fk": { + "name": "missions_rels_qualifications_fk", + "tableFrom": "missions_rels", + "tableTo": "qualifications", + "columnsFrom": [ + "qualifications_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mission_attendances": { + "name": "mission_attendances", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "mission_id": { + "name": "mission_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "response": { + "name": "response", + "type": "enum_mission_attendances_response", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "mission_attendances_mission_idx": { + "name": "mission_attendances_mission_idx", + "columns": [ + { + "expression": "mission_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "mission_attendances_user_idx": { + "name": "mission_attendances_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "mission_attendances_updated_at_idx": { + "name": "mission_attendances_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "mission_attendances_created_at_idx": { + "name": "mission_attendances_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "mission_attendances_mission_id_missions_id_fk": { + "name": "mission_attendances_mission_id_missions_id_fk", + "tableFrom": "mission_attendances", + "tableTo": "missions", + "columnsFrom": [ + "mission_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "mission_attendances_user_id_users_id_fk": { + "name": "mission_attendances_user_id_users_id_fk", + "tableFrom": "mission_attendances", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.campaigns": { + "name": "campaigns", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "summary": { + "name": "summary", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "'An Arma 3 campaign.'" + }, + "status": { + "name": "status", + "type": "enum_campaigns_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'concept'" + }, + "campaign_mode": { + "name": "campaign_mode", + "type": "enum_campaigns_campaign_mode", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'custom'" + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "start_date": { + "name": "start_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "end_date": { + "name": "end_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "cover_image_id": { + "name": "cover_image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "owner_id": { + "name": "owner_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "campaigns_name_idx": { + "name": "campaigns_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "campaigns_cover_image_idx": { + "name": "campaigns_cover_image_idx", + "columns": [ + { + "expression": "cover_image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "campaigns_owner_idx": { + "name": "campaigns_owner_idx", + "columns": [ + { + "expression": "owner_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "campaigns_updated_at_idx": { + "name": "campaigns_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "campaigns_created_at_idx": { + "name": "campaigns_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "campaigns_cover_image_id_media_id_fk": { + "name": "campaigns_cover_image_id_media_id_fk", + "tableFrom": "campaigns", + "tableTo": "media", + "columnsFrom": [ + "cover_image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "campaigns_owner_id_users_id_fk": { + "name": "campaigns_owner_id_users_id_fk", + "tableFrom": "campaigns", + "tableTo": "users", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.factions_relationships": { + "name": "factions_relationships", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "target_faction_id": { + "name": "target_faction_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "notes": { + "name": "notes", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "factions_relationships_order_idx": { + "name": "factions_relationships_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "factions_relationships_parent_id_idx": { + "name": "factions_relationships_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "factions_relationships_target_faction_idx": { + "name": "factions_relationships_target_faction_idx", + "columns": [ + { + "expression": "target_faction_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "factions_relationships_target_faction_id_factions_id_fk": { + "name": "factions_relationships_target_faction_id_factions_id_fk", + "tableFrom": "factions_relationships", + "tableTo": "factions", + "columnsFrom": [ + "target_faction_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "factions_relationships_parent_id_fk": { + "name": "factions_relationships_parent_id_fk", + "tableFrom": "factions_relationships", + "tableTo": "factions", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.factions": { + "name": "factions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "enum_factions_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'minorFaction'" + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "reputation": { + "name": "reputation", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "playable_faction": { + "name": "playable_faction", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "starting_faction": { + "name": "starting_faction", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "cover_image_id": { + "name": "cover_image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "factions_name_idx": { + "name": "factions_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "factions_cover_image_idx": { + "name": "factions_cover_image_idx", + "columns": [ + { + "expression": "cover_image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "factions_updated_at_idx": { + "name": "factions_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "factions_created_at_idx": { + "name": "factions_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "factions_cover_image_id_media_id_fk": { + "name": "factions_cover_image_id_media_id_fk", + "tableFrom": "factions", + "tableTo": "media", + "columnsFrom": [ + "cover_image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.factions_rels": { + "name": "factions_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "campaigns_id": { + "name": "campaigns_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "factions_rels_order_idx": { + "name": "factions_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "factions_rels_parent_idx": { + "name": "factions_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "factions_rels_path_idx": { + "name": "factions_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "factions_rels_campaigns_id_idx": { + "name": "factions_rels_campaigns_id_idx", + "columns": [ + { + "expression": "campaigns_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "factions_rels_parent_fk": { + "name": "factions_rels_parent_fk", + "tableFrom": "factions_rels", + "tableTo": "factions", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "factions_rels_campaigns_fk": { + "name": "factions_rels_campaigns_fk", + "tableFrom": "factions_rels", + "tableTo": "campaigns", + "columnsFrom": [ + "campaigns_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.technologies_requirements_prerequisite_technologies": { + "name": "technologies_requirements_prerequisite_technologies", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "technologies_requirements_prerequisite_technologies_order_idx": { + "name": "technologies_requirements_prerequisite_technologies_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "technologies_requirements_prerequisite_technologies_parent_id_idx": { + "name": "technologies_requirements_prerequisite_technologies_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "technologies_requirements_prerequisite_technologies_parent_id_fk": { + "name": "technologies_requirements_prerequisite_technologies_parent_id_fk", + "tableFrom": "technologies_requirements_prerequisite_technologies", + "tableTo": "technologies", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.technologies_research_costs_resources": { + "name": "technologies_research_costs_resources", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + } + }, + "indexes": { + "technologies_research_costs_resources_order_idx": { + "name": "technologies_research_costs_resources_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "technologies_research_costs_resources_parent_id_idx": { + "name": "technologies_research_costs_resources_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "technologies_research_costs_resources_resource_idx": { + "name": "technologies_research_costs_resources_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "technologies_research_costs_resources_resource_id_resources_id_fk": { + "name": "technologies_research_costs_resources_resource_id_resources_id_fk", + "tableFrom": "technologies_research_costs_resources", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "technologies_research_costs_resources_parent_id_fk": { + "name": "technologies_research_costs_resources_parent_id_fk", + "tableFrom": "technologies_research_costs_resources", + "tableTo": "technologies", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.technologies": { + "name": "technologies", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "approval_status": { + "name": "approval_status", + "type": "enum_technologies_approval_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'in_progress'" + }, + "type": { + "name": "type", + "type": "enum_technologies_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'upgrade'" + }, + "summary": { + "name": "summary", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "research_costs_minimum_research_duration": { + "name": "research_costs_minimum_research_duration", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "research_costs_maximum_research_duration": { + "name": "research_costs_maximum_research_duration", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "technologies_updated_at_idx": { + "name": "technologies_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "technologies_created_at_idx": { + "name": "technologies_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.technologies_rels": { + "name": "technologies_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "technologies_id": { + "name": "technologies_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "technologies_rels_order_idx": { + "name": "technologies_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "technologies_rels_parent_idx": { + "name": "technologies_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "technologies_rels_path_idx": { + "name": "technologies_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "technologies_rels_technologies_id_idx": { + "name": "technologies_rels_technologies_id_idx", + "columns": [ + { + "expression": "technologies_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "technologies_rels_parent_fk": { + "name": "technologies_rels_parent_fk", + "tableFrom": "technologies_rels", + "tableTo": "technologies", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "technologies_rels_technologies_fk": { + "name": "technologies_rels_technologies_fk", + "tableFrom": "technologies_rels", + "tableTo": "technologies", + "columnsFrom": [ + "technologies_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.assets_skin_configuration_applies_to_asset_types": { + "name": "assets_skin_configuration_applies_to_asset_types", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_assets_skin_configuration_applies_to_asset_types", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "assets_skin_configuration_applies_to_asset_types_order_idx": { + "name": "assets_skin_configuration_applies_to_asset_types_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assets_skin_configuration_applies_to_asset_types_parent_idx": { + "name": "assets_skin_configuration_applies_to_asset_types_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "assets_skin_configuration_applies_to_asset_types_parent_fk": { + "name": "assets_skin_configuration_applies_to_asset_types_parent_fk", + "tableFrom": "assets_skin_configuration_applies_to_asset_types", + "tableTo": "assets", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.assets_crafting_crafting_data_inputs": { + "name": "assets_crafting_crafting_data_inputs", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "quantity": { + "name": "quantity", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "lended": { + "name": "lended", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "assets_crafting_crafting_data_inputs_order_idx": { + "name": "assets_crafting_crafting_data_inputs_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assets_crafting_crafting_data_inputs_parent_id_idx": { + "name": "assets_crafting_crafting_data_inputs_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "assets_crafting_crafting_data_inputs_parent_id_fk": { + "name": "assets_crafting_crafting_data_inputs_parent_id_fk", + "tableFrom": "assets_crafting_crafting_data_inputs", + "tableTo": "assets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.assets_crafting_crafting_data_byproducts": { + "name": "assets_crafting_crafting_data_byproducts", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "quantity": { + "name": "quantity", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "assets_crafting_crafting_data_byproducts_order_idx": { + "name": "assets_crafting_crafting_data_byproducts_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assets_crafting_crafting_data_byproducts_parent_id_idx": { + "name": "assets_crafting_crafting_data_byproducts_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "assets_crafting_crafting_data_byproducts_parent_id_fk": { + "name": "assets_crafting_crafting_data_byproducts_parent_id_fk", + "tableFrom": "assets_crafting_crafting_data_byproducts", + "tableTo": "assets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.assets": { + "name": "assets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "approval_status": { + "name": "approval_status", + "type": "enum_assets_approval_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'in_progress'" + }, + "class_name": { + "name": "class_name", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "asset_type": { + "name": "asset_type", + "type": "enum_assets_asset_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'weapon'" + }, + "weapon_configuration_slot_type": { + "name": "weapon_configuration_slot_type", + "type": "enum_assets_weapon_configuration_slot_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "nightvision_configuration_nvg_generation": { + "name": "nightvision_configuration_nvg_generation", + "type": "enum_assets_nightvision_configuration_nvg_generation", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "nightvision_configuration_nvg_has_thermals": { + "name": "nightvision_configuration_nvg_has_thermals", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "container_configuration_capacity_kg": { + "name": "container_configuration_capacity_kg", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "container_configuration_weight_kg": { + "name": "container_configuration_weight_kg", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "magazine_configuration_round_capacity": { + "name": "magazine_configuration_round_capacity", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "magazine_configuration_ammo_type": { + "name": "magazine_configuration_ammo_type", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "magazine_configuration_greenmag_compatible": { + "name": "magazine_configuration_greenmag_compatible", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "asset_metadata_mod": { + "name": "asset_metadata_mod", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "asset_metadata_thumbnail_id": { + "name": "asset_metadata_thumbnail_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "asset_metadata_game_description": { + "name": "asset_metadata_game_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "tradeable": { + "name": "tradeable", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "market_trading_rarity": { + "name": "market_trading_rarity", + "type": "enum_assets_market_trading_rarity", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "market_trading_perceived_value_base_buy_price": { + "name": "market_trading_perceived_value_base_buy_price", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "market_trading_perceived_value_base_sell_price": { + "name": "market_trading_perceived_value_base_sell_price", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "economy_enabled": { + "name": "economy_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "economy_baseline_supply": { + "name": "economy_baseline_supply", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 100 + }, + "economy_baseline_demand": { + "name": "economy_baseline_demand", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 50 + }, + "economy_max_modifier": { + "name": "economy_max_modifier", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "crafting_craftable": { + "name": "crafting_craftable", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "crafting_blueprint_required": { + "name": "crafting_blueprint_required", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "crafting_technology_required_to_use": { + "name": "crafting_technology_required_to_use", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "crafting_crafting_data_crafting_time_per_unit": { + "name": "crafting_crafting_data_crafting_time_per_unit", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "crafting_crafting_data_batch_size": { + "name": "crafting_crafting_data_batch_size", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "storage_dimensions_grid_width": { + "name": "storage_dimensions_grid_width", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "storage_dimensions_grid_height": { + "name": "storage_dimensions_grid_height", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "storage_dimensions_stackable": { + "name": "storage_dimensions_stackable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "storage_dimensions_max_stack_size": { + "name": "storage_dimensions_max_stack_size", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "storage_dimensions_rotatable": { + "name": "storage_dimensions_rotatable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "is_live": { + "name": "is_live", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "assets_asset_metadata_asset_metadata_thumbnail_idx": { + "name": "assets_asset_metadata_asset_metadata_thumbnail_idx", + "columns": [ + { + "expression": "asset_metadata_thumbnail_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assets_updated_at_idx": { + "name": "assets_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assets_created_at_idx": { + "name": "assets_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "assets_asset_metadata_thumbnail_id_media_id_fk": { + "name": "assets_asset_metadata_thumbnail_id_media_id_fk", + "tableFrom": "assets", + "tableTo": "media", + "columnsFrom": [ + "asset_metadata_thumbnail_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.assets_rels": { + "name": "assets_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "assets_id": { + "name": "assets_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "technologies_id": { + "name": "technologies_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "resources_id": { + "name": "resources_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "structures_id": { + "name": "structures_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "assets_rels_order_idx": { + "name": "assets_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assets_rels_parent_idx": { + "name": "assets_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assets_rels_path_idx": { + "name": "assets_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assets_rels_assets_id_idx": { + "name": "assets_rels_assets_id_idx", + "columns": [ + { + "expression": "assets_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assets_rels_technologies_id_idx": { + "name": "assets_rels_technologies_id_idx", + "columns": [ + { + "expression": "technologies_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assets_rels_resources_id_idx": { + "name": "assets_rels_resources_id_idx", + "columns": [ + { + "expression": "resources_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "assets_rels_structures_id_idx": { + "name": "assets_rels_structures_id_idx", + "columns": [ + { + "expression": "structures_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "assets_rels_parent_fk": { + "name": "assets_rels_parent_fk", + "tableFrom": "assets_rels", + "tableTo": "assets", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "assets_rels_assets_fk": { + "name": "assets_rels_assets_fk", + "tableFrom": "assets_rels", + "tableTo": "assets", + "columnsFrom": [ + "assets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "assets_rels_technologies_fk": { + "name": "assets_rels_technologies_fk", + "tableFrom": "assets_rels", + "tableTo": "technologies", + "columnsFrom": [ + "technologies_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "assets_rels_resources_fk": { + "name": "assets_rels_resources_fk", + "tableFrom": "assets_rels", + "tableTo": "resources", + "columnsFrom": [ + "resources_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "assets_rels_structures_fk": { + "name": "assets_rels_structures_fk", + "tableFrom": "assets_rels", + "tableTo": "structures", + "columnsFrom": [ + "structures_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.resources": { + "name": "resources", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "code_name": { + "name": "code_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "approval_status": { + "name": "approval_status", + "type": "enum_resources_approval_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'in_progress'" + }, + "type": { + "name": "type", + "type": "enum_resources_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'physical'" + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "icon_id": { + "name": "icon_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "color": { + "name": "color", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "base_value": { + "name": "base_value", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "tradeable": { + "name": "tradeable", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "rarity": { + "name": "rarity", + "type": "enum_resources_rarity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'common'" + }, + "economy_enabled": { + "name": "economy_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "economy_baseline_supply": { + "name": "economy_baseline_supply", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 100 + }, + "economy_baseline_demand": { + "name": "economy_baseline_demand", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 50 + }, + "economy_max_modifier": { + "name": "economy_max_modifier", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "unit_of_measure": { + "name": "unit_of_measure", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "mass_per_unit": { + "name": "mass_per_unit", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "stack_size": { + "name": "stack_size", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "grid_width": { + "name": "grid_width", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "grid_height": { + "name": "grid_height", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "stackable": { + "name": "stackable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "max_stack_size": { + "name": "max_stack_size", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "rotatable": { + "name": "rotatable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "resources_icon_idx": { + "name": "resources_icon_idx", + "columns": [ + { + "expression": "icon_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "resources_updated_at_idx": { + "name": "resources_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "resources_created_at_idx": { + "name": "resources_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "resources_icon_id_media_id_fk": { + "name": "resources_icon_id_media_id_fk", + "tableFrom": "resources", + "tableTo": "media", + "columnsFrom": [ + "icon_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.vehicles_category": { + "name": "vehicles_category", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_vehicles_category", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "vehicles_category_order_idx": { + "name": "vehicles_category_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_category_parent_idx": { + "name": "vehicles_category_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "vehicles_category_parent_fk": { + "name": "vehicles_category_parent_fk", + "tableFrom": "vehicles_category", + "tableTo": "vehicles", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.vehicles_materials": { + "name": "vehicles_materials", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "vehicles_materials_order_idx": { + "name": "vehicles_materials_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_materials_parent_id_idx": { + "name": "vehicles_materials_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_materials_resource_idx": { + "name": "vehicles_materials_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "vehicles_materials_resource_id_resources_id_fk": { + "name": "vehicles_materials_resource_id_resources_id_fk", + "tableFrom": "vehicles_materials", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "vehicles_materials_parent_id_fk": { + "name": "vehicles_materials_parent_id_fk", + "tableFrom": "vehicles_materials", + "tableTo": "vehicles", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.vehicles_scrap_returns": { + "name": "vehicles_scrap_returns", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "chance": { + "name": "chance", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 100 + } + }, + "indexes": { + "vehicles_scrap_returns_order_idx": { + "name": "vehicles_scrap_returns_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_scrap_returns_parent_id_idx": { + "name": "vehicles_scrap_returns_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_scrap_returns_resource_idx": { + "name": "vehicles_scrap_returns_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "vehicles_scrap_returns_resource_id_resources_id_fk": { + "name": "vehicles_scrap_returns_resource_id_resources_id_fk", + "tableFrom": "vehicles_scrap_returns", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "vehicles_scrap_returns_parent_id_fk": { + "name": "vehicles_scrap_returns_parent_id_fk", + "tableFrom": "vehicles_scrap_returns", + "tableTo": "vehicles", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.vehicles_upkeep_costs": { + "name": "vehicles_upkeep_costs", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1 + } + }, + "indexes": { + "vehicles_upkeep_costs_order_idx": { + "name": "vehicles_upkeep_costs_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_upkeep_costs_parent_id_idx": { + "name": "vehicles_upkeep_costs_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_upkeep_costs_resource_idx": { + "name": "vehicles_upkeep_costs_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "vehicles_upkeep_costs_resource_id_resources_id_fk": { + "name": "vehicles_upkeep_costs_resource_id_resources_id_fk", + "tableFrom": "vehicles_upkeep_costs", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "vehicles_upkeep_costs_parent_id_fk": { + "name": "vehicles_upkeep_costs_parent_id_fk", + "tableFrom": "vehicles_upkeep_costs", + "tableTo": "vehicles", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.vehicles_allowed_virtual_cargo": { + "name": "vehicles_allowed_virtual_cargo", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1 + } + }, + "indexes": { + "vehicles_allowed_virtual_cargo_order_idx": { + "name": "vehicles_allowed_virtual_cargo_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_allowed_virtual_cargo_parent_id_idx": { + "name": "vehicles_allowed_virtual_cargo_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "vehicles_allowed_virtual_cargo_parent_id_fk": { + "name": "vehicles_allowed_virtual_cargo_parent_id_fk", + "tableFrom": "vehicles_allowed_virtual_cargo", + "tableTo": "vehicles", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.vehicles_pylons": { + "name": "vehicles_pylons", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "pylon_name": { + "name": "pylon_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "pylon_type": { + "name": "pylon_type", + "type": "enum_vehicles_pylons_pylon_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'mountedWeapon'" + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "ammo_type_id": { + "name": "ammo_type_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "vehicles_pylons_order_idx": { + "name": "vehicles_pylons_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_pylons_parent_id_idx": { + "name": "vehicles_pylons_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_pylons_ammo_type_idx": { + "name": "vehicles_pylons_ammo_type_idx", + "columns": [ + { + "expression": "ammo_type_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "vehicles_pylons_ammo_type_id_assets_id_fk": { + "name": "vehicles_pylons_ammo_type_id_assets_id_fk", + "tableFrom": "vehicles_pylons", + "tableTo": "assets", + "columnsFrom": [ + "ammo_type_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "vehicles_pylons_parent_id_fk": { + "name": "vehicles_pylons_parent_id_fk", + "tableFrom": "vehicles_pylons", + "tableTo": "vehicles", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.vehicles": { + "name": "vehicles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "classname": { + "name": "classname", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "approval_status": { + "name": "approval_status", + "type": "enum_vehicles_approval_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'in_progress'" + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "fuel_fuel_type_id": { + "name": "fuel_fuel_type_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "fuel_fuel_capacity": { + "name": "fuel_fuel_capacity", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "fuel_fuel_consumption_rate": { + "name": "fuel_fuel_consumption_rate", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "construction_time": { + "name": "construction_time", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "transport_mode": { + "name": "transport_mode", + "type": "enum_vehicles_transport_mode", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'ground'" + }, + "width": { + "name": "width", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "height": { + "name": "height", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "max_mass": { + "name": "max_mass", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "ace_cargo_slots": { + "name": "ace_cargo_slots", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "max_health": { + "name": "max_health", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "armor_rating": { + "name": "armor_rating", + "type": "enum_vehicles_armor_rating", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "max_speed_on_road": { + "name": "max_speed_on_road", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "max_speed_off_road": { + "name": "max_speed_off_road", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "max_airspeed": { + "name": "max_airspeed", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "max_knots": { + "name": "max_knots", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "vehicles_image_idx": { + "name": "vehicles_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_fuel_fuel_fuel_type_idx": { + "name": "vehicles_fuel_fuel_fuel_type_idx", + "columns": [ + { + "expression": "fuel_fuel_type_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_updated_at_idx": { + "name": "vehicles_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_created_at_idx": { + "name": "vehicles_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "vehicles_image_id_media_id_fk": { + "name": "vehicles_image_id_media_id_fk", + "tableFrom": "vehicles", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "vehicles_fuel_fuel_type_id_resources_id_fk": { + "name": "vehicles_fuel_fuel_type_id_resources_id_fk", + "tableFrom": "vehicles", + "tableTo": "resources", + "columnsFrom": [ + "fuel_fuel_type_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.vehicles_rels": { + "name": "vehicles_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "technologies_id": { + "name": "technologies_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "assets_id": { + "name": "assets_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "vehicles_id": { + "name": "vehicles_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "resources_id": { + "name": "resources_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "vehicles_rels_order_idx": { + "name": "vehicles_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_rels_parent_idx": { + "name": "vehicles_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_rels_path_idx": { + "name": "vehicles_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_rels_technologies_id_idx": { + "name": "vehicles_rels_technologies_id_idx", + "columns": [ + { + "expression": "technologies_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_rels_assets_id_idx": { + "name": "vehicles_rels_assets_id_idx", + "columns": [ + { + "expression": "assets_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_rels_vehicles_id_idx": { + "name": "vehicles_rels_vehicles_id_idx", + "columns": [ + { + "expression": "vehicles_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "vehicles_rels_resources_id_idx": { + "name": "vehicles_rels_resources_id_idx", + "columns": [ + { + "expression": "resources_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "vehicles_rels_parent_fk": { + "name": "vehicles_rels_parent_fk", + "tableFrom": "vehicles_rels", + "tableTo": "vehicles", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "vehicles_rels_technologies_fk": { + "name": "vehicles_rels_technologies_fk", + "tableFrom": "vehicles_rels", + "tableTo": "technologies", + "columnsFrom": [ + "technologies_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "vehicles_rels_assets_fk": { + "name": "vehicles_rels_assets_fk", + "tableFrom": "vehicles_rels", + "tableTo": "assets", + "columnsFrom": [ + "assets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "vehicles_rels_vehicles_fk": { + "name": "vehicles_rels_vehicles_fk", + "tableFrom": "vehicles_rels", + "tableTo": "vehicles", + "columnsFrom": [ + "vehicles_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "vehicles_rels_resources_fk": { + "name": "vehicles_rels_resources_fk", + "tableFrom": "vehicles_rels", + "tableTo": "resources", + "columnsFrom": [ + "resources_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_materials": { + "name": "structures_materials", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "structures_materials_order_idx": { + "name": "structures_materials_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_materials_parent_id_idx": { + "name": "structures_materials_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_materials_resource_idx": { + "name": "structures_materials_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_materials_resource_id_resources_id_fk": { + "name": "structures_materials_resource_id_resources_id_fk", + "tableFrom": "structures_materials", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "structures_materials_parent_id_fk": { + "name": "structures_materials_parent_id_fk", + "tableFrom": "structures_materials", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_resources_in_range": { + "name": "structures_resources_in_range", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "range": { + "name": "range", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "structures_resources_in_range_order_idx": { + "name": "structures_resources_in_range_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_resources_in_range_parent_id_idx": { + "name": "structures_resources_in_range_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_resources_in_range_resource_idx": { + "name": "structures_resources_in_range_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_resources_in_range_resource_id_resources_id_fk": { + "name": "structures_resources_in_range_resource_id_resources_id_fk", + "tableFrom": "structures_resources_in_range", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "structures_resources_in_range_parent_id_fk": { + "name": "structures_resources_in_range_parent_id_fk", + "tableFrom": "structures_resources_in_range", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_structures_in_range": { + "name": "structures_structures_in_range", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "structure_id": { + "name": "structure_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "range": { + "name": "range", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "structures_structures_in_range_order_idx": { + "name": "structures_structures_in_range_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_structures_in_range_parent_id_idx": { + "name": "structures_structures_in_range_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_structures_in_range_structure_idx": { + "name": "structures_structures_in_range_structure_idx", + "columns": [ + { + "expression": "structure_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_structures_in_range_structure_id_structures_id_fk": { + "name": "structures_structures_in_range_structure_id_structures_id_fk", + "tableFrom": "structures_structures_in_range", + "tableTo": "structures", + "columnsFrom": [ + "structure_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "structures_structures_in_range_parent_id_fk": { + "name": "structures_structures_in_range_parent_id_fk", + "tableFrom": "structures_structures_in_range", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_upkeep": { + "name": "structures_upkeep", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "structures_upkeep_order_idx": { + "name": "structures_upkeep_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_upkeep_parent_id_idx": { + "name": "structures_upkeep_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_upkeep_resource_idx": { + "name": "structures_upkeep_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_upkeep_resource_id_resources_id_fk": { + "name": "structures_upkeep_resource_id_resources_id_fk", + "tableFrom": "structures_upkeep", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "structures_upkeep_parent_id_fk": { + "name": "structures_upkeep_parent_id_fk", + "tableFrom": "structures_upkeep", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_labor_requirements": { + "name": "structures_labor_requirements", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "classification_id": { + "name": "classification_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "required_headcount": { + "name": "required_headcount", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "max_headcount": { + "name": "max_headcount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "enforced_salary": { + "name": "enforced_salary", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "structures_labor_requirements_order_idx": { + "name": "structures_labor_requirements_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_labor_requirements_parent_id_idx": { + "name": "structures_labor_requirements_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_labor_requirements_classification_idx": { + "name": "structures_labor_requirements_classification_idx", + "columns": [ + { + "expression": "classification_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_labor_requirements_classification_id_labor_classifications_id_fk": { + "name": "structures_labor_requirements_classification_id_labor_classifications_id_fk", + "tableFrom": "structures_labor_requirements", + "tableTo": "labor_classifications", + "columnsFrom": [ + "classification_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "structures_labor_requirements_parent_id_fk": { + "name": "structures_labor_requirements_parent_id_fk", + "tableFrom": "structures_labor_requirements", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_staff_positions": { + "name": "structures_staff_positions", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "position_type": { + "name": "position_type", + "type": "enum_structures_staff_positions_position_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "max": { + "name": "max", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "enforced_salary": { + "name": "enforced_salary", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "structures_staff_positions_order_idx": { + "name": "structures_staff_positions_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_staff_positions_parent_id_idx": { + "name": "structures_staff_positions_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_staff_positions_parent_id_fk": { + "name": "structures_staff_positions_parent_id_fk", + "tableFrom": "structures_staff_positions", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_production_inputs": { + "name": "structures_production_inputs", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount_per_hour": { + "name": "amount_per_hour", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + } + }, + "indexes": { + "structures_production_inputs_order_idx": { + "name": "structures_production_inputs_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_production_inputs_parent_id_idx": { + "name": "structures_production_inputs_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_production_inputs_resource_idx": { + "name": "structures_production_inputs_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_production_inputs_resource_id_resources_id_fk": { + "name": "structures_production_inputs_resource_id_resources_id_fk", + "tableFrom": "structures_production_inputs", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "structures_production_inputs_parent_id_fk": { + "name": "structures_production_inputs_parent_id_fk", + "tableFrom": "structures_production_inputs", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_production_outputs": { + "name": "structures_production_outputs", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount_per_hour": { + "name": "amount_per_hour", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + } + }, + "indexes": { + "structures_production_outputs_order_idx": { + "name": "structures_production_outputs_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_production_outputs_parent_id_idx": { + "name": "structures_production_outputs_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_production_outputs_resource_idx": { + "name": "structures_production_outputs_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_production_outputs_resource_id_resources_id_fk": { + "name": "structures_production_outputs_resource_id_resources_id_fk", + "tableFrom": "structures_production_outputs", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "structures_production_outputs_parent_id_fk": { + "name": "structures_production_outputs_parent_id_fk", + "tableFrom": "structures_production_outputs", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_module_options_effects": { + "name": "structures_module_options_effects", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "enum_structures_module_options_effects_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "numeric", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "structures_module_options_effects_order_idx": { + "name": "structures_module_options_effects_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_module_options_effects_parent_id_idx": { + "name": "structures_module_options_effects_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_module_options_effects_parent_id_fk": { + "name": "structures_module_options_effects_parent_id_fk", + "tableFrom": "structures_module_options_effects", + "tableTo": "structures_module_options", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_module_options_materials": { + "name": "structures_module_options_materials", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "structures_module_options_materials_order_idx": { + "name": "structures_module_options_materials_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_module_options_materials_parent_id_idx": { + "name": "structures_module_options_materials_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_module_options_materials_resource_idx": { + "name": "structures_module_options_materials_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_module_options_materials_resource_id_resources_id_fk": { + "name": "structures_module_options_materials_resource_id_resources_id_fk", + "tableFrom": "structures_module_options_materials", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "structures_module_options_materials_parent_id_fk": { + "name": "structures_module_options_materials_parent_id_fk", + "tableFrom": "structures_module_options_materials", + "tableTo": "structures_module_options", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_module_options": { + "name": "structures_module_options", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "category": { + "name": "category", + "type": "enum_structures_module_options_category", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'utility'" + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "structures_module_options_order_idx": { + "name": "structures_module_options_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_module_options_parent_id_idx": { + "name": "structures_module_options_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_module_options_parent_id_fk": { + "name": "structures_module_options_parent_id_fk", + "tableFrom": "structures_module_options", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_auto_generated_resources": { + "name": "structures_auto_generated_resources", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "min_amount": { + "name": "min_amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "max_amount": { + "name": "max_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "min_frequency": { + "name": "min_frequency", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "'1'" + }, + "max_frequency": { + "name": "max_frequency", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "produce_chance": { + "name": "produce_chance", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 100 + } + }, + "indexes": { + "structures_auto_generated_resources_order_idx": { + "name": "structures_auto_generated_resources_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_auto_generated_resources_parent_id_idx": { + "name": "structures_auto_generated_resources_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_auto_generated_resources_resource_idx": { + "name": "structures_auto_generated_resources_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_auto_generated_resources_resource_id_resources_id_fk": { + "name": "structures_auto_generated_resources_resource_id_resources_id_fk", + "tableFrom": "structures_auto_generated_resources", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "structures_auto_generated_resources_parent_id_fk": { + "name": "structures_auto_generated_resources_parent_id_fk", + "tableFrom": "structures_auto_generated_resources", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_allowed_storage": { + "name": "structures_allowed_storage", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "structures_allowed_storage_order_idx": { + "name": "structures_allowed_storage_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_allowed_storage_parent_id_idx": { + "name": "structures_allowed_storage_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_allowed_storage_parent_id_fk": { + "name": "structures_allowed_storage_parent_id_fk", + "tableFrom": "structures_allowed_storage", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_prohibited_storage": { + "name": "structures_prohibited_storage", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "structures_prohibited_storage_order_idx": { + "name": "structures_prohibited_storage_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_prohibited_storage_parent_id_idx": { + "name": "structures_prohibited_storage_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_prohibited_storage_parent_id_fk": { + "name": "structures_prohibited_storage_parent_id_fk", + "tableFrom": "structures_prohibited_storage", + "tableTo": "structures", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures": { + "name": "structures", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "code_name": { + "name": "code_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "approval_status": { + "name": "approval_status", + "type": "enum_structures_approval_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'in_progress'" + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "category": { + "name": "category", + "type": "enum_structures_category", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "construction_duration_minutes": { + "name": "construction_duration_minutes", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "construction_crew_required": { + "name": "construction_crew_required", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "requires_upgrade": { + "name": "requires_upgrade", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "upgrades_into_id": { + "name": "upgrades_into_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "upgrade_cost_multiplier": { + "name": "upgrade_cost_multiplier", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "terrain_type": { + "name": "terrain_type", + "type": "enum_structures_terrain_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "sell_price": { + "name": "sell_price", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "maintenance_cost": { + "name": "maintenance_cost", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "module_slots": { + "name": "module_slots", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "aura_effect_type": { + "name": "aura_effect_type", + "type": "enum_structures_aura_effect_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "aura_value": { + "name": "aura_value", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "aura_range_meters": { + "name": "aura_range_meters", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "function_type": { + "name": "function_type", + "type": "enum_structures_function_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "max_capacity_mass": { + "name": "max_capacity_mass", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "restrict_to_allowed": { + "name": "restrict_to_allowed", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "x_size": { + "name": "x_size", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "y_size": { + "name": "y_size", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "max_health": { + "name": "max_health", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "repair_speed": { + "name": "repair_speed", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "structures_image_idx": { + "name": "structures_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_upgrades_into_idx": { + "name": "structures_upgrades_into_idx", + "columns": [ + { + "expression": "upgrades_into_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_updated_at_idx": { + "name": "structures_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_created_at_idx": { + "name": "structures_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_image_id_media_id_fk": { + "name": "structures_image_id_media_id_fk", + "tableFrom": "structures", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "structures_upgrades_into_id_structures_id_fk": { + "name": "structures_upgrades_into_id_structures_id_fk", + "tableFrom": "structures", + "tableTo": "structures", + "columnsFrom": [ + "upgrades_into_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.structures_rels": { + "name": "structures_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "technologies_id": { + "name": "technologies_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "assets_id": { + "name": "assets_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "vehicles_id": { + "name": "vehicles_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "resources_id": { + "name": "resources_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "structures_rels_order_idx": { + "name": "structures_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_rels_parent_idx": { + "name": "structures_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_rels_path_idx": { + "name": "structures_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_rels_technologies_id_idx": { + "name": "structures_rels_technologies_id_idx", + "columns": [ + { + "expression": "technologies_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_rels_assets_id_idx": { + "name": "structures_rels_assets_id_idx", + "columns": [ + { + "expression": "assets_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_rels_vehicles_id_idx": { + "name": "structures_rels_vehicles_id_idx", + "columns": [ + { + "expression": "vehicles_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "structures_rels_resources_id_idx": { + "name": "structures_rels_resources_id_idx", + "columns": [ + { + "expression": "resources_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "structures_rels_parent_fk": { + "name": "structures_rels_parent_fk", + "tableFrom": "structures_rels", + "tableTo": "structures", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "structures_rels_technologies_fk": { + "name": "structures_rels_technologies_fk", + "tableFrom": "structures_rels", + "tableTo": "technologies", + "columnsFrom": [ + "technologies_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "structures_rels_assets_fk": { + "name": "structures_rels_assets_fk", + "tableFrom": "structures_rels", + "tableTo": "assets", + "columnsFrom": [ + "assets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "structures_rels_vehicles_fk": { + "name": "structures_rels_vehicles_fk", + "tableFrom": "structures_rels", + "tableTo": "vehicles", + "columnsFrom": [ + "vehicles_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "structures_rels_resources_fk": { + "name": "structures_rels_resources_fk", + "tableFrom": "structures_rels", + "tableTo": "resources", + "columnsFrom": [ + "resources_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shipments_cargo": { + "name": "shipments_cargo", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "shipments_cargo_order_idx": { + "name": "shipments_cargo_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_cargo_parent_id_idx": { + "name": "shipments_cargo_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "shipments_cargo_parent_id_fk": { + "name": "shipments_cargo_parent_id_fk", + "tableFrom": "shipments_cargo", + "tableTo": "shipments", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shipments": { + "name": "shipments", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "origin_id": { + "name": "origin_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "destination_id": { + "name": "destination_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "map_id": { + "name": "map_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "route_path": { + "name": "route_path", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "transport_vehicle_id": { + "name": "transport_vehicle_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "distance": { + "name": "distance", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "fuel_cost": { + "name": "fuel_cost", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "fuel_consumed": { + "name": "fuel_consumed", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "status": { + "name": "status", + "type": "enum_shipments_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "dispatched_at": { + "name": "dispatched_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "estimated_arrival": { + "name": "estimated_arrival", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "auto_return": { + "name": "auto_return", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "failure_reason": { + "name": "failure_reason", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "shipments_origin_idx": { + "name": "shipments_origin_idx", + "columns": [ + { + "expression": "origin_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_destination_idx": { + "name": "shipments_destination_idx", + "columns": [ + { + "expression": "destination_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_map_idx": { + "name": "shipments_map_idx", + "columns": [ + { + "expression": "map_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_transport_vehicle_idx": { + "name": "shipments_transport_vehicle_idx", + "columns": [ + { + "expression": "transport_vehicle_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_created_by_idx": { + "name": "shipments_created_by_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_updated_at_idx": { + "name": "shipments_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_created_at_idx": { + "name": "shipments_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "shipments_origin_id_game_structures_id_fk": { + "name": "shipments_origin_id_game_structures_id_fk", + "tableFrom": "shipments", + "tableTo": "game_structures", + "columnsFrom": [ + "origin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "shipments_destination_id_game_structures_id_fk": { + "name": "shipments_destination_id_game_structures_id_fk", + "tableFrom": "shipments", + "tableTo": "game_structures", + "columnsFrom": [ + "destination_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "shipments_map_id_maps_id_fk": { + "name": "shipments_map_id_maps_id_fk", + "tableFrom": "shipments", + "tableTo": "maps", + "columnsFrom": [ + "map_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "shipments_transport_vehicle_id_game_vehicles_id_fk": { + "name": "shipments_transport_vehicle_id_game_vehicles_id_fk", + "tableFrom": "shipments", + "tableTo": "game_vehicles", + "columnsFrom": [ + "transport_vehicle_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "shipments_created_by_id_users_id_fk": { + "name": "shipments_created_by_id_users_id_fk", + "tableFrom": "shipments", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shipments_rels": { + "name": "shipments_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "resources_id": { + "name": "resources_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "assets_id": { + "name": "assets_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "vehicles_id": { + "name": "vehicles_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "shipments_rels_order_idx": { + "name": "shipments_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_rels_parent_idx": { + "name": "shipments_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_rels_path_idx": { + "name": "shipments_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_rels_resources_id_idx": { + "name": "shipments_rels_resources_id_idx", + "columns": [ + { + "expression": "resources_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_rels_assets_id_idx": { + "name": "shipments_rels_assets_id_idx", + "columns": [ + { + "expression": "assets_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shipments_rels_vehicles_id_idx": { + "name": "shipments_rels_vehicles_id_idx", + "columns": [ + { + "expression": "vehicles_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "shipments_rels_parent_fk": { + "name": "shipments_rels_parent_fk", + "tableFrom": "shipments_rels", + "tableTo": "shipments", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shipments_rels_resources_fk": { + "name": "shipments_rels_resources_fk", + "tableFrom": "shipments_rels", + "tableTo": "resources", + "columnsFrom": [ + "resources_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shipments_rels_assets_fk": { + "name": "shipments_rels_assets_fk", + "tableFrom": "shipments_rels", + "tableTo": "assets", + "columnsFrom": [ + "assets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shipments_rels_vehicles_fk": { + "name": "shipments_rels_vehicles_fk", + "tableFrom": "shipments_rels", + "tableTo": "vehicles", + "columnsFrom": [ + "vehicles_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.bank_accounts": { + "name": "bank_accounts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "account_type": { + "name": "account_type", + "type": "enum_bank_accounts_account_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'personal'" + }, + "owner_faction_id": { + "name": "owner_faction_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "currency_id": { + "name": "currency_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "balance": { + "name": "balance", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "status": { + "name": "status", + "type": "enum_bank_accounts_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'open'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "bank_accounts_owner_faction_idx": { + "name": "bank_accounts_owner_faction_idx", + "columns": [ + { + "expression": "owner_faction_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "bank_accounts_owner_user_idx": { + "name": "bank_accounts_owner_user_idx", + "columns": [ + { + "expression": "owner_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "bank_accounts_currency_idx": { + "name": "bank_accounts_currency_idx", + "columns": [ + { + "expression": "currency_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "bank_accounts_updated_at_idx": { + "name": "bank_accounts_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "bank_accounts_owner_faction_id_factions_id_fk": { + "name": "bank_accounts_owner_faction_id_factions_id_fk", + "tableFrom": "bank_accounts", + "tableTo": "factions", + "columnsFrom": [ + "owner_faction_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "bank_accounts_owner_user_id_users_id_fk": { + "name": "bank_accounts_owner_user_id_users_id_fk", + "tableFrom": "bank_accounts", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "bank_accounts_currency_id_resources_id_fk": { + "name": "bank_accounts_currency_id_resources_id_fk", + "tableFrom": "bank_accounts", + "tableTo": "resources", + "columnsFrom": [ + "currency_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.bank_transactions": { + "name": "bank_transactions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "transaction_number": { + "name": "transaction_number", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "enum_bank_transactions_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "from_account_id": { + "name": "from_account_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "to_account_id": { + "name": "to_account_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "fee": { + "name": "fee", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "memo": { + "name": "memo", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "actor_id": { + "name": "actor_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "enum_bank_transactions_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'completed'" + }, + "reference_id": { + "name": "reference_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "bank_transactions_transaction_number_idx": { + "name": "bank_transactions_transaction_number_idx", + "columns": [ + { + "expression": "transaction_number", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "bank_transactions_from_account_idx": { + "name": "bank_transactions_from_account_idx", + "columns": [ + { + "expression": "from_account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "bank_transactions_to_account_idx": { + "name": "bank_transactions_to_account_idx", + "columns": [ + { + "expression": "to_account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "bank_transactions_actor_idx": { + "name": "bank_transactions_actor_idx", + "columns": [ + { + "expression": "actor_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "bank_transactions_reference_idx": { + "name": "bank_transactions_reference_idx", + "columns": [ + { + "expression": "reference_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "bank_transactions_updated_at_idx": { + "name": "bank_transactions_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "bank_transactions_created_at_idx": { + "name": "bank_transactions_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "bank_transactions_from_account_id_bank_accounts_id_fk": { + "name": "bank_transactions_from_account_id_bank_accounts_id_fk", + "tableFrom": "bank_transactions", + "tableTo": "bank_accounts", + "columnsFrom": [ + "from_account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "bank_transactions_to_account_id_bank_accounts_id_fk": { + "name": "bank_transactions_to_account_id_bank_accounts_id_fk", + "tableFrom": "bank_transactions", + "tableTo": "bank_accounts", + "columnsFrom": [ + "to_account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "bank_transactions_actor_id_users_id_fk": { + "name": "bank_transactions_actor_id_users_id_fk", + "tableFrom": "bank_transactions", + "tableTo": "users", + "columnsFrom": [ + "actor_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "bank_transactions_reference_id_bank_transactions_id_fk": { + "name": "bank_transactions_reference_id_bank_transactions_id_fk", + "tableFrom": "bank_transactions", + "tableTo": "bank_transactions", + "columnsFrom": [ + "reference_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ledger_entries": { + "name": "ledger_entries", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "transaction_id": { + "name": "transaction_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "enum_ledger_entries_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "balance_after": { + "name": "balance_after", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "memo": { + "name": "memo", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "ledger_entries_account_idx": { + "name": "ledger_entries_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ledger_entries_transaction_idx": { + "name": "ledger_entries_transaction_idx", + "columns": [ + { + "expression": "transaction_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ledger_entries_updated_at_idx": { + "name": "ledger_entries_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ledger_entries_created_at_idx": { + "name": "ledger_entries_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "ledger_entries_account_id_bank_accounts_id_fk": { + "name": "ledger_entries_account_id_bank_accounts_id_fk", + "tableFrom": "ledger_entries", + "tableTo": "bank_accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ledger_entries_transaction_id_bank_transactions_id_fk": { + "name": "ledger_entries_transaction_id_bank_transactions_id_fk", + "tableFrom": "ledger_entries", + "tableTo": "bank_transactions", + "columnsFrom": [ + "transaction_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.locker_storages_items_equipment_attachments": { + "name": "locker_storages_items_equipment_attachments", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "locker_storages_items_equipment_attachments_order_idx": { + "name": "locker_storages_items_equipment_attachments_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "locker_storages_items_equipment_attachments_parent_id_idx": { + "name": "locker_storages_items_equipment_attachments_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "locker_storages_items_equipment_attachments_asset_idx": { + "name": "locker_storages_items_equipment_attachments_asset_idx", + "columns": [ + { + "expression": "asset_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "locker_storages_items_equipment_attachments_asset_id_assets_id_fk": { + "name": "locker_storages_items_equipment_attachments_asset_id_assets_id_fk", + "tableFrom": "locker_storages_items_equipment_attachments", + "tableTo": "assets", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "locker_storages_items_equipment_attachments_parent_id_fk": { + "name": "locker_storages_items_equipment_attachments_parent_id_fk", + "tableFrom": "locker_storages_items_equipment_attachments", + "tableTo": "locker_storages_items", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.locker_storages_items": { + "name": "locker_storages_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "quantity": { + "name": "quantity", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "grid_x": { + "name": "grid_x", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "grid_y": { + "name": "grid_y", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "rotated": { + "name": "rotated", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "equipment_skin_id": { + "name": "equipment_skin_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "equipment_custom_name": { + "name": "equipment_custom_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "locker_storages_items_order_idx": { + "name": "locker_storages_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "locker_storages_items_parent_id_idx": { + "name": "locker_storages_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "locker_storages_items_asset_idx": { + "name": "locker_storages_items_asset_idx", + "columns": [ + { + "expression": "asset_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "locker_storages_items_equipment_equipment_skin_idx": { + "name": "locker_storages_items_equipment_equipment_skin_idx", + "columns": [ + { + "expression": "equipment_skin_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "locker_storages_items_asset_id_assets_id_fk": { + "name": "locker_storages_items_asset_id_assets_id_fk", + "tableFrom": "locker_storages_items", + "tableTo": "assets", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "locker_storages_items_equipment_skin_id_assets_id_fk": { + "name": "locker_storages_items_equipment_skin_id_assets_id_fk", + "tableFrom": "locker_storages_items", + "tableTo": "assets", + "columnsFrom": [ + "equipment_skin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "locker_storages_items_parent_id_fk": { + "name": "locker_storages_items_parent_id_fk", + "tableFrom": "locker_storages_items", + "tableTo": "locker_storages", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.locker_storages": { + "name": "locker_storages", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "'Personal Locker'" + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "item_count": { + "name": "item_count", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "locker_storages_owner_user_idx": { + "name": "locker_storages_owner_user_idx", + "columns": [ + { + "expression": "owner_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "locker_storages_updated_at_idx": { + "name": "locker_storages_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "locker_storages_created_at_idx": { + "name": "locker_storages_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "locker_storages_owner_user_id_users_id_fk": { + "name": "locker_storages_owner_user_id_users_id_fk", + "tableFrom": "locker_storages", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.loadouts": { + "name": "loadouts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "equipped": { + "name": "equipped", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "slots_primary_id": { + "name": "slots_primary_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_secondary_id": { + "name": "slots_secondary_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_launcher_id": { + "name": "slots_launcher_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_uniform_id": { + "name": "slots_uniform_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_vest_id": { + "name": "slots_vest_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_backpack_id": { + "name": "slots_backpack_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_helmet_id": { + "name": "slots_helmet_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_facewear_id": { + "name": "slots_facewear_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_nvg_id": { + "name": "slots_nvg_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_radio_id": { + "name": "slots_radio_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_optic_id": { + "name": "slots_optic_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_muzzle_id": { + "name": "slots_muzzle_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slots_bipod_id": { + "name": "slots_bipod_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "loadouts_owner_user_idx": { + "name": "loadouts_owner_user_idx", + "columns": [ + { + "expression": "owner_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_primary_idx": { + "name": "loadouts_slots_slots_primary_idx", + "columns": [ + { + "expression": "slots_primary_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_secondary_idx": { + "name": "loadouts_slots_slots_secondary_idx", + "columns": [ + { + "expression": "slots_secondary_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_launcher_idx": { + "name": "loadouts_slots_slots_launcher_idx", + "columns": [ + { + "expression": "slots_launcher_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_uniform_idx": { + "name": "loadouts_slots_slots_uniform_idx", + "columns": [ + { + "expression": "slots_uniform_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_vest_idx": { + "name": "loadouts_slots_slots_vest_idx", + "columns": [ + { + "expression": "slots_vest_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_backpack_idx": { + "name": "loadouts_slots_slots_backpack_idx", + "columns": [ + { + "expression": "slots_backpack_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_helmet_idx": { + "name": "loadouts_slots_slots_helmet_idx", + "columns": [ + { + "expression": "slots_helmet_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_facewear_idx": { + "name": "loadouts_slots_slots_facewear_idx", + "columns": [ + { + "expression": "slots_facewear_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_nvg_idx": { + "name": "loadouts_slots_slots_nvg_idx", + "columns": [ + { + "expression": "slots_nvg_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_radio_idx": { + "name": "loadouts_slots_slots_radio_idx", + "columns": [ + { + "expression": "slots_radio_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_optic_idx": { + "name": "loadouts_slots_slots_optic_idx", + "columns": [ + { + "expression": "slots_optic_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_muzzle_idx": { + "name": "loadouts_slots_slots_muzzle_idx", + "columns": [ + { + "expression": "slots_muzzle_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_slots_slots_bipod_idx": { + "name": "loadouts_slots_slots_bipod_idx", + "columns": [ + { + "expression": "slots_bipod_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_updated_at_idx": { + "name": "loadouts_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "loadouts_created_at_idx": { + "name": "loadouts_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "loadouts_owner_user_id_users_id_fk": { + "name": "loadouts_owner_user_id_users_id_fk", + "tableFrom": "loadouts", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_primary_id_assets_id_fk": { + "name": "loadouts_slots_primary_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_primary_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_secondary_id_assets_id_fk": { + "name": "loadouts_slots_secondary_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_secondary_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_launcher_id_assets_id_fk": { + "name": "loadouts_slots_launcher_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_launcher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_uniform_id_assets_id_fk": { + "name": "loadouts_slots_uniform_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_uniform_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_vest_id_assets_id_fk": { + "name": "loadouts_slots_vest_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_vest_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_backpack_id_assets_id_fk": { + "name": "loadouts_slots_backpack_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_backpack_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_helmet_id_assets_id_fk": { + "name": "loadouts_slots_helmet_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_helmet_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_facewear_id_assets_id_fk": { + "name": "loadouts_slots_facewear_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_facewear_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_nvg_id_assets_id_fk": { + "name": "loadouts_slots_nvg_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_nvg_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_radio_id_assets_id_fk": { + "name": "loadouts_slots_radio_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_radio_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_optic_id_assets_id_fk": { + "name": "loadouts_slots_optic_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_optic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_muzzle_id_assets_id_fk": { + "name": "loadouts_slots_muzzle_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_muzzle_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "loadouts_slots_bipod_id_assets_id_fk": { + "name": "loadouts_slots_bipod_id_assets_id_fk", + "tableFrom": "loadouts", + "tableTo": "assets", + "columnsFrom": [ + "slots_bipod_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.market_listings": { + "name": "market_listings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "seller_id": { + "name": "seller_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "npc_id": { + "name": "npc_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "quantity": { + "name": "quantity", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "price": { + "name": "price", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "desired_price": { + "name": "desired_price", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "min_price": { + "name": "min_price", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "currency_id": { + "name": "currency_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "enum_market_listings_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "is_auto_generated": { + "name": "is_auto_generated", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "listed_at": { + "name": "listed_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "sold_at": { + "name": "sold_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "buyer_id": { + "name": "buyer_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "market_listings_asset_idx": { + "name": "market_listings_asset_idx", + "columns": [ + { + "expression": "asset_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_listings_seller_idx": { + "name": "market_listings_seller_idx", + "columns": [ + { + "expression": "seller_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_listings_npc_idx": { + "name": "market_listings_npc_idx", + "columns": [ + { + "expression": "npc_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_listings_currency_idx": { + "name": "market_listings_currency_idx", + "columns": [ + { + "expression": "currency_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_listings_status_idx": { + "name": "market_listings_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_listings_buyer_idx": { + "name": "market_listings_buyer_idx", + "columns": [ + { + "expression": "buyer_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_listings_updated_at_idx": { + "name": "market_listings_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_listings_created_at_idx": { + "name": "market_listings_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "market_listings_asset_id_assets_id_fk": { + "name": "market_listings_asset_id_assets_id_fk", + "tableFrom": "market_listings", + "tableTo": "assets", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "market_listings_seller_id_users_id_fk": { + "name": "market_listings_seller_id_users_id_fk", + "tableFrom": "market_listings", + "tableTo": "users", + "columnsFrom": [ + "seller_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "market_listings_npc_id_game_npcs_id_fk": { + "name": "market_listings_npc_id_game_npcs_id_fk", + "tableFrom": "market_listings", + "tableTo": "game_npcs", + "columnsFrom": [ + "npc_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "market_listings_currency_id_resources_id_fk": { + "name": "market_listings_currency_id_resources_id_fk", + "tableFrom": "market_listings", + "tableTo": "resources", + "columnsFrom": [ + "currency_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "market_listings_buyer_id_users_id_fk": { + "name": "market_listings_buyer_id_users_id_fk", + "tableFrom": "market_listings", + "tableTo": "users", + "columnsFrom": [ + "buyer_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.market_negotiations_history": { + "name": "market_negotiations_history", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "from": { + "name": "from", + "type": "enum_market_negotiations_history_from", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "note": { + "name": "note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "at": { + "name": "at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "market_negotiations_history_order_idx": { + "name": "market_negotiations_history_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_negotiations_history_parent_id_idx": { + "name": "market_negotiations_history_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "market_negotiations_history_parent_id_fk": { + "name": "market_negotiations_history_parent_id_fk", + "tableFrom": "market_negotiations_history", + "tableTo": "market_negotiations", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.market_negotiations": { + "name": "market_negotiations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "listing_id": { + "name": "listing_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "buyer_id": { + "name": "buyer_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "enum_market_negotiations_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'open'" + }, + "patience": { + "name": "patience", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "quantity": { + "name": "quantity", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "proposed_by": { + "name": "proposed_by", + "type": "enum_market_negotiations_proposed_by", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'buyer'" + }, + "accepted_price": { + "name": "accepted_price", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "market_negotiations_listing_idx": { + "name": "market_negotiations_listing_idx", + "columns": [ + { + "expression": "listing_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_negotiations_buyer_idx": { + "name": "market_negotiations_buyer_idx", + "columns": [ + { + "expression": "buyer_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_negotiations_status_idx": { + "name": "market_negotiations_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_negotiations_updated_at_idx": { + "name": "market_negotiations_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_negotiations_created_at_idx": { + "name": "market_negotiations_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "market_negotiations_listing_id_market_listings_id_fk": { + "name": "market_negotiations_listing_id_market_listings_id_fk", + "tableFrom": "market_negotiations", + "tableTo": "market_listings", + "columnsFrom": [ + "listing_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "market_negotiations_buyer_id_users_id_fk": { + "name": "market_negotiations_buyer_id_users_id_fk", + "tableFrom": "market_negotiations", + "tableTo": "users", + "columnsFrom": [ + "buyer_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.market_state": { + "name": "market_state", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "item_type": { + "name": "item_type", + "type": "enum_market_state_item_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "item_id": { + "name": "item_id", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "gm_baseline_supply": { + "name": "gm_baseline_supply", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 100 + }, + "gm_baseline_demand": { + "name": "gm_baseline_demand", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 50 + }, + "current_supply": { + "name": "current_supply", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 100 + }, + "artificial_demand": { + "name": "artificial_demand", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 50 + }, + "real_demand": { + "name": "real_demand", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "price_modifier": { + "name": "price_modifier", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "last_computed_at": { + "name": "last_computed_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "market_state_item_type_idx": { + "name": "market_state_item_type_idx", + "columns": [ + { + "expression": "item_type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_state_item_id_idx": { + "name": "market_state_item_id_idx", + "columns": [ + { + "expression": "item_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_state_updated_at_idx": { + "name": "market_state_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "market_state_created_at_idx": { + "name": "market_state_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "itemType_itemId_idx": { + "name": "itemType_itemId_idx", + "columns": [ + { + "expression": "item_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "item_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.voice_scripts": { + "name": "voice_scripts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "script": { + "name": "script", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "xp_amount": { + "name": "xp_amount", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 250 + }, + "spoiler": { + "name": "spoiler", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "status": { + "name": "status", + "type": "enum_voice_scripts_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "voice_scripts_updated_at_idx": { + "name": "voice_scripts_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "voice_scripts_created_at_idx": { + "name": "voice_scripts_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.voice_submissions": { + "name": "voice_submissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "script_id": { + "name": "script_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "enum_voice_submissions_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "review_note": { + "name": "review_note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "url": { + "name": "url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "thumbnail_u_r_l": { + "name": "thumbnail_u_r_l", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "filename": { + "name": "filename", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "mime_type": { + "name": "mime_type", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "filesize": { + "name": "filesize", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "width": { + "name": "width", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "height": { + "name": "height", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "focal_x": { + "name": "focal_x", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "focal_y": { + "name": "focal_y", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "voice_submissions_script_idx": { + "name": "voice_submissions_script_idx", + "columns": [ + { + "expression": "script_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "voice_submissions_user_idx": { + "name": "voice_submissions_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "voice_submissions_updated_at_idx": { + "name": "voice_submissions_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "voice_submissions_created_at_idx": { + "name": "voice_submissions_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "voice_submissions_filename_idx": { + "name": "voice_submissions_filename_idx", + "columns": [ + { + "expression": "filename", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "voice_submissions_script_id_voice_scripts_id_fk": { + "name": "voice_submissions_script_id_voice_scripts_id_fk", + "tableFrom": "voice_submissions", + "tableTo": "voice_scripts", + "columnsFrom": [ + "script_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "voice_submissions_user_id_users_id_fk": { + "name": "voice_submissions_user_id_users_id_fk", + "tableFrom": "voice_submissions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.tickets_activity": { + "name": "tickets_activity", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "enum_tickets_activity_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'system'" + }, + "content": { + "name": "content", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "author_id": { + "name": "author_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "tickets_activity_order_idx": { + "name": "tickets_activity_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_activity_parent_id_idx": { + "name": "tickets_activity_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_activity_author_idx": { + "name": "tickets_activity_author_idx", + "columns": [ + { + "expression": "author_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "tickets_activity_author_id_users_id_fk": { + "name": "tickets_activity_author_id_users_id_fk", + "tableFrom": "tickets_activity", + "tableTo": "users", + "columnsFrom": [ + "author_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "tickets_activity_parent_id_fk": { + "name": "tickets_activity_parent_id_fk", + "tableFrom": "tickets_activity", + "tableTo": "tickets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.tickets_edit_history": { + "name": "tickets_edit_history", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "before": { + "name": "before", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "after": { + "name": "after", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "edited_by_id": { + "name": "edited_by_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "edited_at": { + "name": "edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "tickets_edit_history_order_idx": { + "name": "tickets_edit_history_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_edit_history_parent_id_idx": { + "name": "tickets_edit_history_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_edit_history_edited_by_idx": { + "name": "tickets_edit_history_edited_by_idx", + "columns": [ + { + "expression": "edited_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "tickets_edit_history_edited_by_id_users_id_fk": { + "name": "tickets_edit_history_edited_by_id_users_id_fk", + "tableFrom": "tickets_edit_history", + "tableTo": "users", + "columnsFrom": [ + "edited_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "tickets_edit_history_parent_id_fk": { + "name": "tickets_edit_history_parent_id_fk", + "tableFrom": "tickets_edit_history", + "tableTo": "tickets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.tickets": { + "name": "tickets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "category": { + "name": "category", + "type": "enum_tickets_category", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'support_request'" + }, + "priority": { + "name": "priority", + "type": "enum_tickets_priority", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'medium'" + }, + "status": { + "name": "status", + "type": "enum_tickets_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'open'" + }, + "reporter_id": { + "name": "reporter_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "assignee_id": { + "name": "assignee_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "closed_at": { + "name": "closed_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "project_id": { + "name": "project_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "sprint_id": { + "name": "sprint_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "release_id": { + "name": "release_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_ticket_id": { + "name": "parent_ticket_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "enum_tickets_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'task'" + }, + "story_points": { + "name": "story_points", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "estimate": { + "name": "estimate", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "start_date": { + "name": "start_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "due_date": { + "name": "due_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "resolution": { + "name": "resolution", + "type": "enum_tickets_resolution", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "tickets_category_idx": { + "name": "tickets_category_idx", + "columns": [ + { + "expression": "category", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_priority_idx": { + "name": "tickets_priority_idx", + "columns": [ + { + "expression": "priority", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_status_idx": { + "name": "tickets_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_reporter_idx": { + "name": "tickets_reporter_idx", + "columns": [ + { + "expression": "reporter_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_assignee_idx": { + "name": "tickets_assignee_idx", + "columns": [ + { + "expression": "assignee_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_project_idx": { + "name": "tickets_project_idx", + "columns": [ + { + "expression": "project_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_sprint_idx": { + "name": "tickets_sprint_idx", + "columns": [ + { + "expression": "sprint_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_release_idx": { + "name": "tickets_release_idx", + "columns": [ + { + "expression": "release_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_parent_ticket_idx": { + "name": "tickets_parent_ticket_idx", + "columns": [ + { + "expression": "parent_ticket_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_updated_at_idx": { + "name": "tickets_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_created_at_idx": { + "name": "tickets_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "tickets_reporter_id_users_id_fk": { + "name": "tickets_reporter_id_users_id_fk", + "tableFrom": "tickets", + "tableTo": "users", + "columnsFrom": [ + "reporter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "tickets_assignee_id_users_id_fk": { + "name": "tickets_assignee_id_users_id_fk", + "tableFrom": "tickets", + "tableTo": "users", + "columnsFrom": [ + "assignee_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "tickets_project_id_projects_id_fk": { + "name": "tickets_project_id_projects_id_fk", + "tableFrom": "tickets", + "tableTo": "projects", + "columnsFrom": [ + "project_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "tickets_sprint_id_sprints_id_fk": { + "name": "tickets_sprint_id_sprints_id_fk", + "tableFrom": "tickets", + "tableTo": "sprints", + "columnsFrom": [ + "sprint_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "tickets_release_id_releases_id_fk": { + "name": "tickets_release_id_releases_id_fk", + "tableFrom": "tickets", + "tableTo": "releases", + "columnsFrom": [ + "release_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "tickets_parent_ticket_id_tickets_id_fk": { + "name": "tickets_parent_ticket_id_tickets_id_fk", + "tableFrom": "tickets", + "tableTo": "tickets", + "columnsFrom": [ + "parent_ticket_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.tickets_rels": { + "name": "tickets_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "labels_id": { + "name": "labels_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "tickets_rels_order_idx": { + "name": "tickets_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_rels_parent_idx": { + "name": "tickets_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_rels_path_idx": { + "name": "tickets_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tickets_rels_labels_id_idx": { + "name": "tickets_rels_labels_id_idx", + "columns": [ + { + "expression": "labels_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "tickets_rels_parent_fk": { + "name": "tickets_rels_parent_fk", + "tableFrom": "tickets_rels", + "tableTo": "tickets", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "tickets_rels_labels_fk": { + "name": "tickets_rels_labels_fk", + "tableFrom": "tickets_rels", + "tableTo": "labels", + "columnsFrom": [ + "labels_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ticket_votes": { + "name": "ticket_votes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "ticket_id": { + "name": "ticket_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "ticket_votes_ticket_idx": { + "name": "ticket_votes_ticket_idx", + "columns": [ + { + "expression": "ticket_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ticket_votes_user_idx": { + "name": "ticket_votes_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ticket_votes_updated_at_idx": { + "name": "ticket_votes_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ticket_votes_created_at_idx": { + "name": "ticket_votes_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ticket_user_idx": { + "name": "ticket_user_idx", + "columns": [ + { + "expression": "ticket_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "ticket_votes_ticket_id_tickets_id_fk": { + "name": "ticket_votes_ticket_id_tickets_id_fk", + "tableFrom": "ticket_votes", + "tableTo": "tickets", + "columnsFrom": [ + "ticket_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "ticket_votes_user_id_users_id_fk": { + "name": "ticket_votes_user_id_users_id_fk", + "tableFrom": "ticket_votes", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.wiki_pages": { + "name": "wiki_pages", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "category": { + "name": "category", + "type": "enum_wiki_pages_category", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "body": { + "name": "body", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "lockdown": { + "name": "lockdown", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "locked_by_id": { + "name": "locked_by_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "locked_at": { + "name": "locked_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_editor_id": { + "name": "last_editor_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "wiki_pages_slug_idx": { + "name": "wiki_pages_slug_idx", + "columns": [ + { + "expression": "slug", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wiki_pages_category_idx": { + "name": "wiki_pages_category_idx", + "columns": [ + { + "expression": "category", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wiki_pages_locked_by_idx": { + "name": "wiki_pages_locked_by_idx", + "columns": [ + { + "expression": "locked_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wiki_pages_last_editor_idx": { + "name": "wiki_pages_last_editor_idx", + "columns": [ + { + "expression": "last_editor_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wiki_pages_updated_at_idx": { + "name": "wiki_pages_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wiki_pages_created_at_idx": { + "name": "wiki_pages_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "wiki_pages_locked_by_id_users_id_fk": { + "name": "wiki_pages_locked_by_id_users_id_fk", + "tableFrom": "wiki_pages", + "tableTo": "users", + "columnsFrom": [ + "locked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "wiki_pages_last_editor_id_users_id_fk": { + "name": "wiki_pages_last_editor_id_users_id_fk", + "tableFrom": "wiki_pages", + "tableTo": "users", + "columnsFrom": [ + "last_editor_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.wiki_pages_texts": { + "name": "wiki_pages_texts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "wiki_pages_texts_order_parent": { + "name": "wiki_pages_texts_order_parent", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "wiki_pages_texts_parent_fk": { + "name": "wiki_pages_texts_parent_fk", + "tableFrom": "wiki_pages_texts", + "tableTo": "wiki_pages", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.wiki_revisions": { + "name": "wiki_revisions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "page_id": { + "name": "page_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "revision_number": { + "name": "revision_number", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "title_snapshot": { + "name": "title_snapshot", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "content_snapshot": { + "name": "content_snapshot", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "editor_id": { + "name": "editor_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "summary": { + "name": "summary", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "enum_wiki_revisions_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "restored_from_revision": { + "name": "restored_from_revision", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "wiki_revisions_page_idx": { + "name": "wiki_revisions_page_idx", + "columns": [ + { + "expression": "page_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wiki_revisions_editor_idx": { + "name": "wiki_revisions_editor_idx", + "columns": [ + { + "expression": "editor_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wiki_revisions_updated_at_idx": { + "name": "wiki_revisions_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wiki_revisions_created_at_idx": { + "name": "wiki_revisions_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "wiki_revisions_page_id_wiki_pages_id_fk": { + "name": "wiki_revisions_page_id_wiki_pages_id_fk", + "tableFrom": "wiki_revisions", + "tableTo": "wiki_pages", + "columnsFrom": [ + "page_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "wiki_revisions_editor_id_users_id_fk": { + "name": "wiki_revisions_editor_id_users_id_fk", + "tableFrom": "wiki_revisions", + "tableTo": "users", + "columnsFrom": [ + "editor_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.wiki_templates": { + "name": "wiki_templates", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "body": { + "name": "body", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "css": { + "name": "css", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "html": { + "name": "html", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "wiki_templates_name_idx": { + "name": "wiki_templates_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wiki_templates_updated_at_idx": { + "name": "wiki_templates_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wiki_templates_created_at_idx": { + "name": "wiki_templates_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.projects": { + "name": "projects", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "lead_id": { + "name": "lead_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "enum_projects_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'active'" + }, + "default_assignee_id": { + "name": "default_assignee_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "projects_key_idx": { + "name": "projects_key_idx", + "columns": [ + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "projects_lead_idx": { + "name": "projects_lead_idx", + "columns": [ + { + "expression": "lead_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "projects_default_assignee_idx": { + "name": "projects_default_assignee_idx", + "columns": [ + { + "expression": "default_assignee_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "projects_updated_at_idx": { + "name": "projects_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "projects_created_at_idx": { + "name": "projects_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "projects_lead_id_users_id_fk": { + "name": "projects_lead_id_users_id_fk", + "tableFrom": "projects", + "tableTo": "users", + "columnsFrom": [ + "lead_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "projects_default_assignee_id_users_id_fk": { + "name": "projects_default_assignee_id_users_id_fk", + "tableFrom": "projects", + "tableTo": "users", + "columnsFrom": [ + "default_assignee_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sprints": { + "name": "sprints", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "project_id": { + "name": "project_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "goal": { + "name": "goal", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "start_date": { + "name": "start_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "end_date": { + "name": "end_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "enum_sprints_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'planning'" + }, + "capacity": { + "name": "capacity", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "sprints_project_idx": { + "name": "sprints_project_idx", + "columns": [ + { + "expression": "project_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sprints_updated_at_idx": { + "name": "sprints_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sprints_created_at_idx": { + "name": "sprints_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "sprints_project_id_projects_id_fk": { + "name": "sprints_project_id_projects_id_fk", + "tableFrom": "sprints", + "tableTo": "projects", + "columnsFrom": [ + "project_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.releases": { + "name": "releases", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "project_id": { + "name": "project_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "enum_releases_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "release_date": { + "name": "release_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "target_version": { + "name": "target_version", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "releases_project_idx": { + "name": "releases_project_idx", + "columns": [ + { + "expression": "project_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "releases_updated_at_idx": { + "name": "releases_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "releases_created_at_idx": { + "name": "releases_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "releases_project_id_projects_id_fk": { + "name": "releases_project_id_projects_id_fk", + "tableFrom": "releases", + "tableTo": "projects", + "columnsFrom": [ + "project_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.labels": { + "name": "labels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "color": { + "name": "color", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "'#6366f1'" + }, + "project_id": { + "name": "project_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "labels_project_idx": { + "name": "labels_project_idx", + "columns": [ + { + "expression": "project_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "labels_updated_at_idx": { + "name": "labels_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "labels_created_at_idx": { + "name": "labels_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "labels_project_id_projects_id_fk": { + "name": "labels_project_id_projects_id_fk", + "tableFrom": "labels", + "tableTo": "projects", + "columnsFrom": [ + "project_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.maps": { + "name": "maps", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "world_size_width": { + "name": "world_size_width", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 8192 + }, + "world_size_height": { + "name": "world_size_height", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 8192 + }, + "basemap_mode": { + "name": "basemap_mode", + "type": "enum_maps_basemap_mode", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'image'" + }, + "basemap_image_id": { + "name": "basemap_image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "tile_url_template": { + "name": "tile_url_template", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "min_zoom": { + "name": "min_zoom", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "max_zoom": { + "name": "max_zoom", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 12 + }, + "default_center_x": { + "name": "default_center_x", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "default_center_y": { + "name": "default_center_y", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "default_zoom": { + "name": "default_zoom", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 2 + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "maps_name_idx": { + "name": "maps_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "maps_basemap_image_idx": { + "name": "maps_basemap_image_idx", + "columns": [ + { + "expression": "basemap_image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "maps_updated_at_idx": { + "name": "maps_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "maps_created_at_idx": { + "name": "maps_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "maps_basemap_image_id_media_id_fk": { + "name": "maps_basemap_image_id_media_id_fk", + "tableFrom": "maps", + "tableTo": "media", + "columnsFrom": [ + "basemap_image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.map_roads": { + "name": "map_roads", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "map_id": { + "name": "map_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "surface": { + "name": "surface", + "type": "enum_map_roads_surface", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'paved'" + }, + "speed_multiplier": { + "name": "speed_multiplier", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "stroke_color": { + "name": "stroke_color", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "stroke_weight": { + "name": "stroke_weight", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 2 + }, + "stroke_style": { + "name": "stroke_style", + "type": "enum_map_roads_stroke_style", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'solid'" + }, + "label_visible": { + "name": "label_visible", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "points": { + "name": "points", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "map_roads_map_idx": { + "name": "map_roads_map_idx", + "columns": [ + { + "expression": "map_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "map_roads_updated_at_idx": { + "name": "map_roads_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "map_roads_created_at_idx": { + "name": "map_roads_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "map_roads_map_id_maps_id_fk": { + "name": "map_roads_map_id_maps_id_fk", + "tableFrom": "map_roads", + "tableTo": "maps", + "columnsFrom": [ + "map_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.map_zones": { + "name": "map_zones", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "map_id": { + "name": "map_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "enum_map_zones_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "fill_color": { + "name": "fill_color", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "stroke_color": { + "name": "stroke_color", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "fill_opacity": { + "name": "fill_opacity", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "stroke_weight": { + "name": "stroke_weight", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "label_visible": { + "name": "label_visible", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "points": { + "name": "points", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "map_zones_map_idx": { + "name": "map_zones_map_idx", + "columns": [ + { + "expression": "map_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "map_zones_updated_at_idx": { + "name": "map_zones_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "map_zones_created_at_idx": { + "name": "map_zones_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "map_zones_map_id_maps_id_fk": { + "name": "map_zones_map_id_maps_id_fk", + "tableFrom": "map_zones", + "tableTo": "maps", + "columnsFrom": [ + "map_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.map_zones_rels": { + "name": "map_zones_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "resources_id": { + "name": "resources_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "map_zones_rels_order_idx": { + "name": "map_zones_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "map_zones_rels_parent_idx": { + "name": "map_zones_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "map_zones_rels_path_idx": { + "name": "map_zones_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "map_zones_rels_resources_id_idx": { + "name": "map_zones_rels_resources_id_idx", + "columns": [ + { + "expression": "resources_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "map_zones_rels_parent_fk": { + "name": "map_zones_rels_parent_fk", + "tableFrom": "map_zones_rels", + "tableTo": "map_zones", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "map_zones_rels_resources_fk": { + "name": "map_zones_rels_resources_fk", + "tableFrom": "map_zones_rels", + "tableTo": "resources", + "columnsFrom": [ + "resources_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.resource_nodes": { + "name": "resource_nodes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "map_id": { + "name": "map_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "position": { + "name": "position", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "richness": { + "name": "richness", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 100 + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "resource_nodes_map_idx": { + "name": "resource_nodes_map_idx", + "columns": [ + { + "expression": "map_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "resource_nodes_updated_at_idx": { + "name": "resource_nodes_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "resource_nodes_created_at_idx": { + "name": "resource_nodes_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "resource_nodes_map_id_maps_id_fk": { + "name": "resource_nodes_map_id_maps_id_fk", + "tableFrom": "resource_nodes", + "tableTo": "maps", + "columnsFrom": [ + "map_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.resource_nodes_rels": { + "name": "resource_nodes_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "resources_id": { + "name": "resources_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "resource_nodes_rels_order_idx": { + "name": "resource_nodes_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "resource_nodes_rels_parent_idx": { + "name": "resource_nodes_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "resource_nodes_rels_path_idx": { + "name": "resource_nodes_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "resource_nodes_rels_resources_id_idx": { + "name": "resource_nodes_rels_resources_id_idx", + "columns": [ + { + "expression": "resources_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "resource_nodes_rels_parent_fk": { + "name": "resource_nodes_rels_parent_fk", + "tableFrom": "resource_nodes_rels", + "tableTo": "resource_nodes", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "resource_nodes_rels_resources_fk": { + "name": "resource_nodes_rels_resources_fk", + "tableFrom": "resource_nodes_rels", + "tableTo": "resources", + "columnsFrom": [ + "resources_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.narrative_events": { + "name": "narrative_events", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "summary": { + "name": "summary", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "flow_data": { + "name": "flow_data", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "triggers_type": { + "name": "triggers_type", + "type": "enum_narrative_events_triggers_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'manual'" + }, + "triggers_condition": { + "name": "triggers_condition", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "narrative_events_updated_at_idx": { + "name": "narrative_events_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "narrative_events_created_at_idx": { + "name": "narrative_events_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.story_beats": { + "name": "story_beats", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "occurred_at": { + "name": "occurred_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "order": { + "name": "order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "enum_story_beats_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'draft'" + }, + "body": { + "name": "body", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "mission_id": { + "name": "mission_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "story_beats_status_idx": { + "name": "story_beats_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "story_beats_mission_idx": { + "name": "story_beats_mission_idx", + "columns": [ + { + "expression": "mission_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "story_beats_updated_at_idx": { + "name": "story_beats_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "story_beats_created_at_idx": { + "name": "story_beats_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "story_beats_mission_id_missions_id_fk": { + "name": "story_beats_mission_id_missions_id_fk", + "tableFrom": "story_beats", + "tableTo": "missions", + "columnsFrom": [ + "mission_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.story_beat_states": { + "name": "story_beat_states", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "beat_id": { + "name": "beat_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "read_at": { + "name": "read_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "reaction": { + "name": "reaction", + "type": "enum_story_beat_states_reaction", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "story_beat_states_user_idx": { + "name": "story_beat_states_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "story_beat_states_beat_idx": { + "name": "story_beat_states_beat_idx", + "columns": [ + { + "expression": "beat_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "story_beat_states_updated_at_idx": { + "name": "story_beat_states_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "story_beat_states_created_at_idx": { + "name": "story_beat_states_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "story_beat_states_user_id_users_id_fk": { + "name": "story_beat_states_user_id_users_id_fk", + "tableFrom": "story_beat_states", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "story_beat_states_beat_id_story_beats_id_fk": { + "name": "story_beat_states_beat_id_story_beats_id_fk", + "tableFrom": "story_beat_states", + "tableTo": "story_beats", + "columnsFrom": [ + "beat_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mission_files": { + "name": "mission_files", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "mission_file_name": { + "name": "mission_file_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "author_id": { + "name": "author_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "url": { + "name": "url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "thumbnail_u_r_l": { + "name": "thumbnail_u_r_l", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "filename": { + "name": "filename", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "mime_type": { + "name": "mime_type", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "filesize": { + "name": "filesize", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "width": { + "name": "width", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "height": { + "name": "height", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "focal_x": { + "name": "focal_x", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "focal_y": { + "name": "focal_y", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "mission_files_author_idx": { + "name": "mission_files_author_idx", + "columns": [ + { + "expression": "author_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "mission_files_updated_at_idx": { + "name": "mission_files_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "mission_files_created_at_idx": { + "name": "mission_files_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "mission_files_filename_idx": { + "name": "mission_files_filename_idx", + "columns": [ + { + "expression": "filename", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "mission_files_author_id_users_id_fk": { + "name": "mission_files_author_id_users_id_fk", + "tableFrom": "mission_files", + "tableTo": "users", + "columnsFrom": [ + "author_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mod_lists": { + "name": "mod_lists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "modlist_name": { + "name": "modlist_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "author_id": { + "name": "author_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "url": { + "name": "url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "thumbnail_u_r_l": { + "name": "thumbnail_u_r_l", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "filename": { + "name": "filename", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "mime_type": { + "name": "mime_type", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "filesize": { + "name": "filesize", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "width": { + "name": "width", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "height": { + "name": "height", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "focal_x": { + "name": "focal_x", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "focal_y": { + "name": "focal_y", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "mod_lists_author_idx": { + "name": "mod_lists_author_idx", + "columns": [ + { + "expression": "author_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "mod_lists_updated_at_idx": { + "name": "mod_lists_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "mod_lists_created_at_idx": { + "name": "mod_lists_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "mod_lists_filename_idx": { + "name": "mod_lists_filename_idx", + "columns": [ + { + "expression": "filename", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "mod_lists_author_id_users_id_fk": { + "name": "mod_lists_author_id_users_id_fk", + "tableFrom": "mod_lists", + "tableTo": "users", + "columnsFrom": [ + "author_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_servers": { + "name": "game_servers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "server_id": { + "name": "server_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "enum_game_servers_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'offline'" + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "game_servers_server_id_idx": { + "name": "game_servers_server_id_idx", + "columns": [ + { + "expression": "server_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_servers_updated_at_idx": { + "name": "game_servers_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_servers_created_at_idx": { + "name": "game_servers_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.arma_sync_events": { + "name": "arma_sync_events", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "event_id": { + "name": "event_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "server_id": { + "name": "server_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "occurred_at": { + "name": "occurred_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + }, + "payload": { + "name": "payload", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "arma_sync_events_event_id_idx": { + "name": "arma_sync_events_event_id_idx", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "arma_sync_events_server_idx": { + "name": "arma_sync_events_server_idx", + "columns": [ + { + "expression": "server_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "arma_sync_events_type_idx": { + "name": "arma_sync_events_type_idx", + "columns": [ + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "arma_sync_events_updated_at_idx": { + "name": "arma_sync_events_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "arma_sync_events_created_at_idx": { + "name": "arma_sync_events_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "arma_sync_events_server_id_game_servers_id_fk": { + "name": "arma_sync_events_server_id_game_servers_id_fk", + "tableFrom": "arma_sync_events", + "tableTo": "game_servers", + "columnsFrom": [ + "server_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.arma_commands": { + "name": "arma_commands", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "command_id": { + "name": "command_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "server_id": { + "name": "server_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "payload": { + "name": "payload", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "enum_arma_commands_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'queued'" + }, + "result": { + "name": "result", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "error": { + "name": "error", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "delivered_at": { + "name": "delivered_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "arma_commands_command_id_idx": { + "name": "arma_commands_command_id_idx", + "columns": [ + { + "expression": "command_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "arma_commands_server_idx": { + "name": "arma_commands_server_idx", + "columns": [ + { + "expression": "server_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "arma_commands_updated_at_idx": { + "name": "arma_commands_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "arma_commands_created_at_idx": { + "name": "arma_commands_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "arma_commands_server_id_game_servers_id_fk": { + "name": "arma_commands_server_id_game_servers_id_fk", + "tableFrom": "arma_commands", + "tableTo": "game_servers", + "columnsFrom": [ + "server_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.respawn_tickets": { + "name": "respawn_tickets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "balance": { + "name": "balance", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "respawn_tickets_user_idx": { + "name": "respawn_tickets_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "respawn_tickets_updated_at_idx": { + "name": "respawn_tickets_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "respawn_tickets_created_at_idx": { + "name": "respawn_tickets_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "respawn_tickets_user_id_users_id_fk": { + "name": "respawn_tickets_user_id_users_id_fk", + "tableFrom": "respawn_tickets", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.operation_events": { + "name": "operation_events", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "source_event_id": { + "name": "source_event_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "event_id": { + "name": "event_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "operation_id": { + "name": "operation_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "version": { + "name": "version", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "status": { + "name": "status", + "type": "enum_operation_events_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'validated'" + }, + "error": { + "name": "error", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "payload_hash": { + "name": "payload_hash", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "actor_id": { + "name": "actor_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "server_id": { + "name": "server_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "mission_id": { + "name": "mission_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "occurred_at": { + "name": "occurred_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + }, + "validated_at": { + "name": "validated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "reconciliation_notes": { + "name": "reconciliation_notes", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "operation_events_source_event_idx": { + "name": "operation_events_source_event_idx", + "columns": [ + { + "expression": "source_event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_events_event_id_idx": { + "name": "operation_events_event_id_idx", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_events_operation_id_idx": { + "name": "operation_events_operation_id_idx", + "columns": [ + { + "expression": "operation_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_events_type_idx": { + "name": "operation_events_type_idx", + "columns": [ + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_events_actor_idx": { + "name": "operation_events_actor_idx", + "columns": [ + { + "expression": "actor_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_events_server_idx": { + "name": "operation_events_server_idx", + "columns": [ + { + "expression": "server_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_events_mission_idx": { + "name": "operation_events_mission_idx", + "columns": [ + { + "expression": "mission_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_events_updated_at_idx": { + "name": "operation_events_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_events_created_at_idx": { + "name": "operation_events_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_events_source_event_id_arma_sync_events_id_fk": { + "name": "operation_events_source_event_id_arma_sync_events_id_fk", + "tableFrom": "operation_events", + "tableTo": "arma_sync_events", + "columnsFrom": [ + "source_event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_events_actor_id_users_id_fk": { + "name": "operation_events_actor_id_users_id_fk", + "tableFrom": "operation_events", + "tableTo": "users", + "columnsFrom": [ + "actor_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_events_server_id_game_servers_id_fk": { + "name": "operation_events_server_id_game_servers_id_fk", + "tableFrom": "operation_events", + "tableTo": "game_servers", + "columnsFrom": [ + "server_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_events_mission_id_missions_id_fk": { + "name": "operation_events_mission_id_missions_id_fk", + "tableFrom": "operation_events", + "tableTo": "missions", + "columnsFrom": [ + "mission_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.operation_effects": { + "name": "operation_effects", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "operation_event_id": { + "name": "operation_event_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "source_event_id": { + "name": "source_event_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "operation_id": { + "name": "operation_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "effect_key": { + "name": "effect_key", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "effect_type": { + "name": "effect_type", + "type": "enum_operation_effects_effect_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "enum_operation_effects_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'applied'" + }, + "payload": { + "name": "payload", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "reversal_of_id": { + "name": "reversal_of_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "reversed_by_id": { + "name": "reversed_by_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "reconciliation_notes": { + "name": "reconciliation_notes", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "applied_at": { + "name": "applied_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "operation_effects_operation_event_idx": { + "name": "operation_effects_operation_event_idx", + "columns": [ + { + "expression": "operation_event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_effects_source_event_idx": { + "name": "operation_effects_source_event_idx", + "columns": [ + { + "expression": "source_event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_effects_operation_id_idx": { + "name": "operation_effects_operation_id_idx", + "columns": [ + { + "expression": "operation_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_effects_effect_key_idx": { + "name": "operation_effects_effect_key_idx", + "columns": [ + { + "expression": "effect_key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_effects_reversal_of_idx": { + "name": "operation_effects_reversal_of_idx", + "columns": [ + { + "expression": "reversal_of_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_effects_reversed_by_idx": { + "name": "operation_effects_reversed_by_idx", + "columns": [ + { + "expression": "reversed_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_effects_updated_at_idx": { + "name": "operation_effects_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_effects_created_at_idx": { + "name": "operation_effects_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_effects_operation_event_id_operation_events_id_fk": { + "name": "operation_effects_operation_event_id_operation_events_id_fk", + "tableFrom": "operation_effects", + "tableTo": "operation_events", + "columnsFrom": [ + "operation_event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_effects_source_event_id_arma_sync_events_id_fk": { + "name": "operation_effects_source_event_id_arma_sync_events_id_fk", + "tableFrom": "operation_effects", + "tableTo": "arma_sync_events", + "columnsFrom": [ + "source_event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_effects_reversal_of_id_operation_effects_id_fk": { + "name": "operation_effects_reversal_of_id_operation_effects_id_fk", + "tableFrom": "operation_effects", + "tableTo": "operation_effects", + "columnsFrom": [ + "reversal_of_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_effects_reversed_by_id_operation_effects_id_fk": { + "name": "operation_effects_reversed_by_id_operation_effects_id_fk", + "tableFrom": "operation_effects", + "tableTo": "operation_effects", + "columnsFrom": [ + "reversed_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.operation_reservations_personnel": { + "name": "operation_reservations_personnel", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "slot": { + "name": "slot", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "operation_reservations_personnel_order_idx": { + "name": "operation_reservations_personnel_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_personnel_parent_id_idx": { + "name": "operation_reservations_personnel_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_personnel_user_idx": { + "name": "operation_reservations_personnel_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_reservations_personnel_user_id_users_id_fk": { + "name": "operation_reservations_personnel_user_id_users_id_fk", + "tableFrom": "operation_reservations_personnel", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_reservations_personnel_parent_id_fk": { + "name": "operation_reservations_personnel_parent_id_fk", + "tableFrom": "operation_reservations_personnel", + "tableTo": "operation_reservations", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.operation_reservations_vehicles": { + "name": "operation_reservations_vehicles", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "vehicle_id": { + "name": "vehicle_id", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "operation_reservations_vehicles_order_idx": { + "name": "operation_reservations_vehicles_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_vehicles_parent_id_idx": { + "name": "operation_reservations_vehicles_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_vehicles_vehicle_idx": { + "name": "operation_reservations_vehicles_vehicle_idx", + "columns": [ + { + "expression": "vehicle_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_reservations_vehicles_vehicle_id_game_vehicles_id_fk": { + "name": "operation_reservations_vehicles_vehicle_id_game_vehicles_id_fk", + "tableFrom": "operation_reservations_vehicles", + "tableTo": "game_vehicles", + "columnsFrom": [ + "vehicle_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_reservations_vehicles_parent_id_fk": { + "name": "operation_reservations_vehicles_parent_id_fk", + "tableFrom": "operation_reservations_vehicles", + "tableTo": "operation_reservations", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.operation_reservations_cargo": { + "name": "operation_reservations_cargo", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "operation_reservations_cargo_order_idx": { + "name": "operation_reservations_cargo_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_cargo_parent_id_idx": { + "name": "operation_reservations_cargo_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_cargo_resource_idx": { + "name": "operation_reservations_cargo_resource_idx", + "columns": [ + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_reservations_cargo_resource_id_resources_id_fk": { + "name": "operation_reservations_cargo_resource_id_resources_id_fk", + "tableFrom": "operation_reservations_cargo", + "tableTo": "resources", + "columnsFrom": [ + "resource_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_reservations_cargo_parent_id_fk": { + "name": "operation_reservations_cargo_parent_id_fk", + "tableFrom": "operation_reservations_cargo", + "tableTo": "operation_reservations", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.operation_reservations": { + "name": "operation_reservations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "reservation_key": { + "name": "reservation_key", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "operation_id": { + "name": "operation_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "mission_id": { + "name": "mission_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "enum_operation_reservations_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'reserved'" + }, + "budget_account_id": { + "name": "budget_account_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "budget_amount": { + "name": "budget_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "origin_id": { + "name": "origin_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "destination_id": { + "name": "destination_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "settled_at": { + "name": "settled_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "settled_by_effect_id": { + "name": "settled_by_effect_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "settlement": { + "name": "settlement", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "operation_reservations_reservation_key_idx": { + "name": "operation_reservations_reservation_key_idx", + "columns": [ + { + "expression": "reservation_key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_operation_id_idx": { + "name": "operation_reservations_operation_id_idx", + "columns": [ + { + "expression": "operation_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_mission_idx": { + "name": "operation_reservations_mission_idx", + "columns": [ + { + "expression": "mission_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_budget_budget_account_idx": { + "name": "operation_reservations_budget_budget_account_idx", + "columns": [ + { + "expression": "budget_account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_origin_idx": { + "name": "operation_reservations_origin_idx", + "columns": [ + { + "expression": "origin_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_destination_idx": { + "name": "operation_reservations_destination_idx", + "columns": [ + { + "expression": "destination_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_created_by_idx": { + "name": "operation_reservations_created_by_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_settled_by_effect_idx": { + "name": "operation_reservations_settled_by_effect_idx", + "columns": [ + { + "expression": "settled_by_effect_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_updated_at_idx": { + "name": "operation_reservations_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "operation_reservations_created_at_idx": { + "name": "operation_reservations_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_reservations_mission_id_missions_id_fk": { + "name": "operation_reservations_mission_id_missions_id_fk", + "tableFrom": "operation_reservations", + "tableTo": "missions", + "columnsFrom": [ + "mission_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_reservations_budget_account_id_bank_accounts_id_fk": { + "name": "operation_reservations_budget_account_id_bank_accounts_id_fk", + "tableFrom": "operation_reservations", + "tableTo": "bank_accounts", + "columnsFrom": [ + "budget_account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_reservations_origin_id_game_structures_id_fk": { + "name": "operation_reservations_origin_id_game_structures_id_fk", + "tableFrom": "operation_reservations", + "tableTo": "game_structures", + "columnsFrom": [ + "origin_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_reservations_destination_id_game_structures_id_fk": { + "name": "operation_reservations_destination_id_game_structures_id_fk", + "tableFrom": "operation_reservations", + "tableTo": "game_structures", + "columnsFrom": [ + "destination_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_reservations_created_by_id_users_id_fk": { + "name": "operation_reservations_created_by_id_users_id_fk", + "tableFrom": "operation_reservations", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "operation_reservations_settled_by_effect_id_operation_effects_id_fk": { + "name": "operation_reservations_settled_by_effect_id_operation_effects_id_fk", + "tableFrom": "operation_reservations", + "tableTo": "operation_effects", + "columnsFrom": [ + "settled_by_effect_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.custom_minefields": { + "name": "custom_minefields", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "author_id": { + "name": "author_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "rows": { + "name": "rows", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "cols": { + "name": "cols", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "mines": { + "name": "mines", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "mine_count": { + "name": "mine_count", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "published": { + "name": "published", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "expose_edge_mines": { + "name": "expose_edge_mines", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "play_count": { + "name": "play_count", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "creator_xp_bank": { + "name": "creator_xp_bank", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "custom_minefields_author_idx": { + "name": "custom_minefields_author_idx", + "columns": [ + { + "expression": "author_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "custom_minefields_updated_at_idx": { + "name": "custom_minefields_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "custom_minefields_created_at_idx": { + "name": "custom_minefields_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "custom_minefields_author_id_users_id_fk": { + "name": "custom_minefields_author_id_users_id_fk", + "tableFrom": "custom_minefields", + "tableTo": "users", + "columnsFrom": [ + "author_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.custom_minefield_scores": { + "name": "custom_minefield_scores", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "minefield_id": { + "name": "minefield_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "seconds": { + "name": "seconds", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "flags": { + "name": "flags", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "won": { + "name": "won", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "custom_minefield_scores_minefield_idx": { + "name": "custom_minefield_scores_minefield_idx", + "columns": [ + { + "expression": "minefield_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "custom_minefield_scores_user_idx": { + "name": "custom_minefield_scores_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "custom_minefield_scores_updated_at_idx": { + "name": "custom_minefield_scores_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "custom_minefield_scores_created_at_idx": { + "name": "custom_minefield_scores_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "custom_minefield_scores_minefield_id_custom_minefields_id_fk": { + "name": "custom_minefield_scores_minefield_id_custom_minefields_id_fk", + "tableFrom": "custom_minefield_scores", + "tableTo": "custom_minefields", + "columnsFrom": [ + "minefield_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "custom_minefield_scores_user_id_users_id_fk": { + "name": "custom_minefield_scores_user_id_users_id_fk", + "tableFrom": "custom_minefield_scores", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.custom_radio_tests": { + "name": "custom_radio_tests", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "author_id": { + "name": "author_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "messages": { + "name": "messages", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "message_count": { + "name": "message_count", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "order": { + "name": "order", + "type": "enum_custom_radio_tests_order", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'fixed'" + }, + "published": { + "name": "published", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "play_count": { + "name": "play_count", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "custom_radio_tests_author_idx": { + "name": "custom_radio_tests_author_idx", + "columns": [ + { + "expression": "author_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "custom_radio_tests_updated_at_idx": { + "name": "custom_radio_tests_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "custom_radio_tests_created_at_idx": { + "name": "custom_radio_tests_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "custom_radio_tests_author_id_users_id_fk": { + "name": "custom_radio_tests_author_id_users_id_fk", + "tableFrom": "custom_radio_tests", + "tableTo": "users", + "columnsFrom": [ + "author_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.custom_radio_test_scores": { + "name": "custom_radio_test_scores", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "test_id": { + "name": "test_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "score": { + "name": "score", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "accuracy": { + "name": "accuracy", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "correct_messages": { + "name": "correct_messages", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "incorrect_messages": { + "name": "incorrect_messages", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "mode": { + "name": "mode", + "type": "enum_custom_radio_test_scores_mode", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "time_ms": { + "name": "time_ms", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "custom_radio_test_scores_test_idx": { + "name": "custom_radio_test_scores_test_idx", + "columns": [ + { + "expression": "test_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "custom_radio_test_scores_user_idx": { + "name": "custom_radio_test_scores_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "custom_radio_test_scores_updated_at_idx": { + "name": "custom_radio_test_scores_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "custom_radio_test_scores_created_at_idx": { + "name": "custom_radio_test_scores_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "custom_radio_test_scores_test_id_custom_radio_tests_id_fk": { + "name": "custom_radio_test_scores_test_id_custom_radio_tests_id_fk", + "tableFrom": "custom_radio_test_scores", + "tableTo": "custom_radio_tests", + "columnsFrom": [ + "test_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "custom_radio_test_scores_user_id_users_id_fk": { + "name": "custom_radio_test_scores_user_id_users_id_fk", + "tableFrom": "custom_radio_test_scores", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.plugin_ai_instructions_images": { + "name": "plugin_ai_instructions_images", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "plugin_ai_instructions_images_order_idx": { + "name": "plugin_ai_instructions_images_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "plugin_ai_instructions_images_parent_id_idx": { + "name": "plugin_ai_instructions_images_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "plugin_ai_instructions_images_image_idx": { + "name": "plugin_ai_instructions_images_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "plugin_ai_instructions_images_image_id_media_id_fk": { + "name": "plugin_ai_instructions_images_image_id_media_id_fk", + "tableFrom": "plugin_ai_instructions_images", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "plugin_ai_instructions_images_parent_id_fk": { + "name": "plugin_ai_instructions_images_parent_id_fk", + "tableFrom": "plugin_ai_instructions_images", + "tableTo": "plugin_ai_instructions", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.plugin_ai_instructions": { + "name": "plugin_ai_instructions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "schema_path": { + "name": "schema_path", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "field_type": { + "name": "field_type", + "type": "enum_plugin_ai_instructions_field_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'text'" + }, + "relation_to": { + "name": "relation_to", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "model_id": { + "name": "model_id", + "type": "enum_plugin_ai_instructions_model_id", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "disabled": { + "name": "disabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "prompt": { + "name": "prompt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "system": { + "name": "system", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "'INSTRUCTIONS:\nYou are a highly skilled and professional blog writer,\nrenowned for crafting engaging and well-organized articles.\nWhen given a title, you meticulously create blogs that are not only\ninformative and accurate but also captivating and beautifully structured.'" + }, + "layout": { + "name": "layout", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "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": { + "name": "unsloth_text_settings_model", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "'unsloth/gemma-4-E4B-it-qat-GGUF'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "plugin_ai_instructions_schema_path_idx": { + "name": "plugin_ai_instructions_schema_path_idx", + "columns": [ + { + "expression": "schema_path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "plugin_ai_instructions_updated_at_idx": { + "name": "plugin_ai_instructions_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "plugin_ai_instructions_created_at_idx": { + "name": "plugin_ai_instructions_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_mcp_api_keys": { + "name": "payload_mcp_api_keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "media_find": { + "name": "media_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "media_create": { + "name": "media_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "media_update": { + "name": "media_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "media_delete": { + "name": "media_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_hard_resources_find": { + "name": "game_hard_resources_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_hard_resources_create": { + "name": "game_hard_resources_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_hard_resources_update": { + "name": "game_hard_resources_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_hard_resources_delete": { + "name": "game_hard_resources_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_structures_find": { + "name": "game_structures_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_structures_create": { + "name": "game_structures_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_structures_update": { + "name": "game_structures_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_structures_delete": { + "name": "game_structures_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_vehicles_find": { + "name": "game_vehicles_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_vehicles_create": { + "name": "game_vehicles_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_vehicles_update": { + "name": "game_vehicles_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_vehicles_delete": { + "name": "game_vehicles_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_npcs_find": { + "name": "game_npcs_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_npcs_create": { + "name": "game_npcs_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_npcs_update": { + "name": "game_npcs_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_npcs_delete": { + "name": "game_npcs_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "npc_staffing_find": { + "name": "npc_staffing_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "npc_staffing_create": { + "name": "npc_staffing_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "npc_staffing_update": { + "name": "npc_staffing_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "npc_staffing_delete": { + "name": "npc_staffing_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "labor_classifications_find": { + "name": "labor_classifications_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "labor_classifications_create": { + "name": "labor_classifications_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "labor_classifications_update": { + "name": "labor_classifications_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "labor_classifications_delete": { + "name": "labor_classifications_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_event_logs_find": { + "name": "game_event_logs_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_event_logs_create": { + "name": "game_event_logs_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_event_logs_update": { + "name": "game_event_logs_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_event_logs_delete": { + "name": "game_event_logs_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "users_find": { + "name": "users_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "users_create": { + "name": "users_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "users_update": { + "name": "users_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "users_delete": { + "name": "users_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "roles_find": { + "name": "roles_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "roles_create": { + "name": "roles_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "roles_update": { + "name": "roles_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "roles_delete": { + "name": "roles_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ranks_find": { + "name": "ranks_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ranks_create": { + "name": "ranks_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ranks_update": { + "name": "ranks_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ranks_delete": { + "name": "ranks_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "profiles_find": { + "name": "profiles_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "profiles_create": { + "name": "profiles_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "profiles_update": { + "name": "profiles_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "profiles_delete": { + "name": "profiles_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "awards_find": { + "name": "awards_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "awards_create": { + "name": "awards_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "awards_update": { + "name": "awards_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "awards_delete": { + "name": "awards_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "qualifications_find": { + "name": "qualifications_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "qualifications_create": { + "name": "qualifications_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "qualifications_update": { + "name": "qualifications_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "qualifications_delete": { + "name": "qualifications_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assignments_find": { + "name": "assignments_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assignments_create": { + "name": "assignments_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assignments_update": { + "name": "assignments_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assignments_delete": { + "name": "assignments_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assignment_transfers_find": { + "name": "assignment_transfers_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assignment_transfers_create": { + "name": "assignment_transfers_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assignment_transfers_update": { + "name": "assignment_transfers_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assignment_transfers_delete": { + "name": "assignment_transfers_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "experience_find": { + "name": "experience_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "experience_create": { + "name": "experience_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "experience_update": { + "name": "experience_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "experience_delete": { + "name": "experience_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "user_notifications_find": { + "name": "user_notifications_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "user_notifications_create": { + "name": "user_notifications_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "user_notifications_update": { + "name": "user_notifications_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "user_notifications_delete": { + "name": "user_notifications_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "evaluations_find": { + "name": "evaluations_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "evaluations_create": { + "name": "evaluations_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "evaluations_update": { + "name": "evaluations_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "evaluations_delete": { + "name": "evaluations_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ribbon_submissions_find": { + "name": "ribbon_submissions_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ribbon_submissions_create": { + "name": "ribbon_submissions_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ribbon_submissions_update": { + "name": "ribbon_submissions_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ribbon_submissions_delete": { + "name": "ribbon_submissions_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "missions_find": { + "name": "missions_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "missions_create": { + "name": "missions_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "missions_update": { + "name": "missions_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "missions_delete": { + "name": "missions_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mission_attendances_find": { + "name": "mission_attendances_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mission_attendances_create": { + "name": "mission_attendances_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mission_attendances_update": { + "name": "mission_attendances_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mission_attendances_delete": { + "name": "mission_attendances_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "campaigns_find": { + "name": "campaigns_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "campaigns_create": { + "name": "campaigns_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "campaigns_update": { + "name": "campaigns_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "campaigns_delete": { + "name": "campaigns_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "factions_find": { + "name": "factions_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "factions_create": { + "name": "factions_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "factions_update": { + "name": "factions_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "factions_delete": { + "name": "factions_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "technologies_find": { + "name": "technologies_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "technologies_create": { + "name": "technologies_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "technologies_update": { + "name": "technologies_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "technologies_delete": { + "name": "technologies_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assets_find": { + "name": "assets_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assets_create": { + "name": "assets_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assets_update": { + "name": "assets_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "assets_delete": { + "name": "assets_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "resources_find": { + "name": "resources_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "resources_create": { + "name": "resources_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "resources_update": { + "name": "resources_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "resources_delete": { + "name": "resources_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "vehicles_find": { + "name": "vehicles_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "vehicles_create": { + "name": "vehicles_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "vehicles_update": { + "name": "vehicles_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "vehicles_delete": { + "name": "vehicles_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "structures_find": { + "name": "structures_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "structures_create": { + "name": "structures_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "structures_update": { + "name": "structures_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "structures_delete": { + "name": "structures_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "shipments_find": { + "name": "shipments_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "shipments_create": { + "name": "shipments_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "shipments_update": { + "name": "shipments_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "shipments_delete": { + "name": "shipments_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "bank_accounts_find": { + "name": "bank_accounts_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "bank_accounts_create": { + "name": "bank_accounts_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "bank_accounts_update": { + "name": "bank_accounts_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "bank_accounts_delete": { + "name": "bank_accounts_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "bank_transactions_find": { + "name": "bank_transactions_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "bank_transactions_create": { + "name": "bank_transactions_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "bank_transactions_update": { + "name": "bank_transactions_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "bank_transactions_delete": { + "name": "bank_transactions_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ledger_entries_find": { + "name": "ledger_entries_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ledger_entries_create": { + "name": "ledger_entries_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ledger_entries_update": { + "name": "ledger_entries_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ledger_entries_delete": { + "name": "ledger_entries_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "locker_storages_find": { + "name": "locker_storages_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "locker_storages_create": { + "name": "locker_storages_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "locker_storages_update": { + "name": "locker_storages_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "locker_storages_delete": { + "name": "locker_storages_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "loadouts_find": { + "name": "loadouts_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "loadouts_create": { + "name": "loadouts_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "loadouts_update": { + "name": "loadouts_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "loadouts_delete": { + "name": "loadouts_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_listings_find": { + "name": "market_listings_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_listings_create": { + "name": "market_listings_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_listings_update": { + "name": "market_listings_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_listings_delete": { + "name": "market_listings_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_negotiations_find": { + "name": "market_negotiations_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_negotiations_create": { + "name": "market_negotiations_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_negotiations_update": { + "name": "market_negotiations_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_negotiations_delete": { + "name": "market_negotiations_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_state_find": { + "name": "market_state_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_state_create": { + "name": "market_state_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_state_update": { + "name": "market_state_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "market_state_delete": { + "name": "market_state_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "voice_scripts_find": { + "name": "voice_scripts_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "voice_scripts_create": { + "name": "voice_scripts_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "voice_scripts_update": { + "name": "voice_scripts_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "voice_scripts_delete": { + "name": "voice_scripts_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "voice_submissions_find": { + "name": "voice_submissions_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "voice_submissions_create": { + "name": "voice_submissions_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "voice_submissions_update": { + "name": "voice_submissions_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "voice_submissions_delete": { + "name": "voice_submissions_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "tickets_find": { + "name": "tickets_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "tickets_create": { + "name": "tickets_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "tickets_update": { + "name": "tickets_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "tickets_delete": { + "name": "tickets_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ticket_votes_find": { + "name": "ticket_votes_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ticket_votes_create": { + "name": "ticket_votes_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ticket_votes_update": { + "name": "ticket_votes_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ticket_votes_delete": { + "name": "ticket_votes_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_pages_find": { + "name": "wiki_pages_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_pages_create": { + "name": "wiki_pages_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_pages_update": { + "name": "wiki_pages_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_pages_delete": { + "name": "wiki_pages_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_revisions_find": { + "name": "wiki_revisions_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_revisions_create": { + "name": "wiki_revisions_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_revisions_update": { + "name": "wiki_revisions_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_revisions_delete": { + "name": "wiki_revisions_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_templates_find": { + "name": "wiki_templates_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_templates_create": { + "name": "wiki_templates_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_templates_update": { + "name": "wiki_templates_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "wiki_templates_delete": { + "name": "wiki_templates_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "projects_find": { + "name": "projects_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "projects_create": { + "name": "projects_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "projects_update": { + "name": "projects_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "projects_delete": { + "name": "projects_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "sprints_find": { + "name": "sprints_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "sprints_create": { + "name": "sprints_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "sprints_update": { + "name": "sprints_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "sprints_delete": { + "name": "sprints_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "releases_find": { + "name": "releases_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "releases_create": { + "name": "releases_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "releases_update": { + "name": "releases_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "releases_delete": { + "name": "releases_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "labels_find": { + "name": "labels_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "labels_create": { + "name": "labels_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "labels_update": { + "name": "labels_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "labels_delete": { + "name": "labels_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "maps_find": { + "name": "maps_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "maps_create": { + "name": "maps_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "maps_update": { + "name": "maps_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "maps_delete": { + "name": "maps_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "map_roads_find": { + "name": "map_roads_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "map_roads_create": { + "name": "map_roads_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "map_roads_update": { + "name": "map_roads_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "map_roads_delete": { + "name": "map_roads_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "map_zones_find": { + "name": "map_zones_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "map_zones_create": { + "name": "map_zones_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "map_zones_update": { + "name": "map_zones_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "map_zones_delete": { + "name": "map_zones_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "resource_nodes_find": { + "name": "resource_nodes_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "resource_nodes_create": { + "name": "resource_nodes_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "resource_nodes_update": { + "name": "resource_nodes_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "resource_nodes_delete": { + "name": "resource_nodes_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "narrative_events_find": { + "name": "narrative_events_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "narrative_events_create": { + "name": "narrative_events_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "narrative_events_update": { + "name": "narrative_events_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "narrative_events_delete": { + "name": "narrative_events_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "story_beats_find": { + "name": "story_beats_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "story_beats_create": { + "name": "story_beats_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "story_beats_update": { + "name": "story_beats_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "story_beats_delete": { + "name": "story_beats_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "story_beat_states_find": { + "name": "story_beat_states_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "story_beat_states_create": { + "name": "story_beat_states_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "story_beat_states_update": { + "name": "story_beat_states_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "story_beat_states_delete": { + "name": "story_beat_states_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mission_files_find": { + "name": "mission_files_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mission_files_create": { + "name": "mission_files_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mission_files_update": { + "name": "mission_files_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mission_files_delete": { + "name": "mission_files_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mod_lists_find": { + "name": "mod_lists_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mod_lists_create": { + "name": "mod_lists_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mod_lists_update": { + "name": "mod_lists_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "mod_lists_delete": { + "name": "mod_lists_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_servers_find": { + "name": "game_servers_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_servers_create": { + "name": "game_servers_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_servers_update": { + "name": "game_servers_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "game_servers_delete": { + "name": "game_servers_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "arma_sync_events_find": { + "name": "arma_sync_events_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "arma_sync_events_create": { + "name": "arma_sync_events_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "arma_sync_events_update": { + "name": "arma_sync_events_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "arma_sync_events_delete": { + "name": "arma_sync_events_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "arma_commands_find": { + "name": "arma_commands_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "arma_commands_create": { + "name": "arma_commands_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "arma_commands_update": { + "name": "arma_commands_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "arma_commands_delete": { + "name": "arma_commands_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "respawn_tickets_find": { + "name": "respawn_tickets_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "respawn_tickets_create": { + "name": "respawn_tickets_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "respawn_tickets_update": { + "name": "respawn_tickets_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "respawn_tickets_delete": { + "name": "respawn_tickets_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_events_find": { + "name": "operation_events_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_events_create": { + "name": "operation_events_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_events_update": { + "name": "operation_events_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_events_delete": { + "name": "operation_events_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_effects_find": { + "name": "operation_effects_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_effects_create": { + "name": "operation_effects_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_effects_update": { + "name": "operation_effects_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_effects_delete": { + "name": "operation_effects_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_reservations_find": { + "name": "operation_reservations_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_reservations_create": { + "name": "operation_reservations_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_reservations_update": { + "name": "operation_reservations_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "operation_reservations_delete": { + "name": "operation_reservations_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_minefields_find": { + "name": "custom_minefields_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_minefields_create": { + "name": "custom_minefields_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_minefields_update": { + "name": "custom_minefields_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_minefields_delete": { + "name": "custom_minefields_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_minefield_scores_find": { + "name": "custom_minefield_scores_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_minefield_scores_create": { + "name": "custom_minefield_scores_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_minefield_scores_update": { + "name": "custom_minefield_scores_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_minefield_scores_delete": { + "name": "custom_minefield_scores_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_radio_tests_find": { + "name": "custom_radio_tests_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_radio_tests_create": { + "name": "custom_radio_tests_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_radio_tests_update": { + "name": "custom_radio_tests_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_radio_tests_delete": { + "name": "custom_radio_tests_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_radio_test_scores_find": { + "name": "custom_radio_test_scores_find", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_radio_test_scores_create": { + "name": "custom_radio_test_scores_create", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_radio_test_scores_update": { + "name": "custom_radio_test_scores_update", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "custom_radio_test_scores_delete": { + "name": "custom_radio_test_scores_delete", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "enable_a_p_i_key": { + "name": "enable_a_p_i_key", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "api_key": { + "name": "api_key", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "api_key_index": { + "name": "api_key_index", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "payload_mcp_api_keys_user_idx": { + "name": "payload_mcp_api_keys_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_mcp_api_keys_updated_at_idx": { + "name": "payload_mcp_api_keys_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_mcp_api_keys_created_at_idx": { + "name": "payload_mcp_api_keys_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "payload_mcp_api_keys_user_id_users_id_fk": { + "name": "payload_mcp_api_keys_user_id_users_id_fk", + "tableFrom": "payload_mcp_api_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_kv": { + "name": "payload_kv", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "data": { + "name": "data", + "type": "jsonb", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "payload_kv_key_idx": { + "name": "payload_kv_key_idx", + "columns": [ + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_locked_documents": { + "name": "payload_locked_documents", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "global_slug": { + "name": "global_slug", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "payload_locked_documents_global_slug_idx": { + "name": "payload_locked_documents_global_slug_idx", + "columns": [ + { + "expression": "global_slug", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_updated_at_idx": { + "name": "payload_locked_documents_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_created_at_idx": { + "name": "payload_locked_documents_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_locked_documents_rels": { + "name": "payload_locked_documents_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "media_id": { + "name": "media_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "game_hard_resources_id": { + "name": "game_hard_resources_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "game_structures_id": { + "name": "game_structures_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "game_vehicles_id": { + "name": "game_vehicles_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "game_npcs_id": { + "name": "game_npcs_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "npc_staffing_id": { + "name": "npc_staffing_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "labor_classifications_id": { + "name": "labor_classifications_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "game_event_logs_id": { + "name": "game_event_logs_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "users_id": { + "name": "users_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "roles_id": { + "name": "roles_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "ranks_id": { + "name": "ranks_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "profiles_id": { + "name": "profiles_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "awards_id": { + "name": "awards_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "qualifications_id": { + "name": "qualifications_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "assignments_id": { + "name": "assignments_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "assignment_transfers_id": { + "name": "assignment_transfers_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "experience_id": { + "name": "experience_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "user_notifications_id": { + "name": "user_notifications_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "evaluations_id": { + "name": "evaluations_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "ribbon_submissions_id": { + "name": "ribbon_submissions_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "missions_id": { + "name": "missions_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "mission_attendances_id": { + "name": "mission_attendances_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "campaigns_id": { + "name": "campaigns_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "factions_id": { + "name": "factions_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "technologies_id": { + "name": "technologies_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "assets_id": { + "name": "assets_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "resources_id": { + "name": "resources_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "vehicles_id": { + "name": "vehicles_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "structures_id": { + "name": "structures_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "shipments_id": { + "name": "shipments_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "bank_accounts_id": { + "name": "bank_accounts_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "bank_transactions_id": { + "name": "bank_transactions_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "ledger_entries_id": { + "name": "ledger_entries_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "locker_storages_id": { + "name": "locker_storages_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "loadouts_id": { + "name": "loadouts_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "market_listings_id": { + "name": "market_listings_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "market_negotiations_id": { + "name": "market_negotiations_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "market_state_id": { + "name": "market_state_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "voice_scripts_id": { + "name": "voice_scripts_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "voice_submissions_id": { + "name": "voice_submissions_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "tickets_id": { + "name": "tickets_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "ticket_votes_id": { + "name": "ticket_votes_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "wiki_pages_id": { + "name": "wiki_pages_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "wiki_revisions_id": { + "name": "wiki_revisions_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "wiki_templates_id": { + "name": "wiki_templates_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "projects_id": { + "name": "projects_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "sprints_id": { + "name": "sprints_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "releases_id": { + "name": "releases_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "labels_id": { + "name": "labels_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "maps_id": { + "name": "maps_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "map_roads_id": { + "name": "map_roads_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "map_zones_id": { + "name": "map_zones_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "resource_nodes_id": { + "name": "resource_nodes_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "narrative_events_id": { + "name": "narrative_events_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "story_beats_id": { + "name": "story_beats_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "story_beat_states_id": { + "name": "story_beat_states_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "mission_files_id": { + "name": "mission_files_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "mod_lists_id": { + "name": "mod_lists_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "game_servers_id": { + "name": "game_servers_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "arma_sync_events_id": { + "name": "arma_sync_events_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "arma_commands_id": { + "name": "arma_commands_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "respawn_tickets_id": { + "name": "respawn_tickets_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "operation_events_id": { + "name": "operation_events_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "operation_effects_id": { + "name": "operation_effects_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "operation_reservations_id": { + "name": "operation_reservations_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "custom_minefields_id": { + "name": "custom_minefields_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "custom_minefield_scores_id": { + "name": "custom_minefield_scores_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "custom_radio_tests_id": { + "name": "custom_radio_tests_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "custom_radio_test_scores_id": { + "name": "custom_radio_test_scores_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "plugin_ai_instructions_id": { + "name": "plugin_ai_instructions_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "payload_mcp_api_keys_id": { + "name": "payload_mcp_api_keys_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "payload_locked_documents_rels_order_idx": { + "name": "payload_locked_documents_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_parent_idx": { + "name": "payload_locked_documents_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_path_idx": { + "name": "payload_locked_documents_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_media_id_idx": { + "name": "payload_locked_documents_rels_media_id_idx", + "columns": [ + { + "expression": "media_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_game_hard_resources_id_idx": { + "name": "payload_locked_documents_rels_game_hard_resources_id_idx", + "columns": [ + { + "expression": "game_hard_resources_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_game_structures_id_idx": { + "name": "payload_locked_documents_rels_game_structures_id_idx", + "columns": [ + { + "expression": "game_structures_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_game_vehicles_id_idx": { + "name": "payload_locked_documents_rels_game_vehicles_id_idx", + "columns": [ + { + "expression": "game_vehicles_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_game_npcs_id_idx": { + "name": "payload_locked_documents_rels_game_npcs_id_idx", + "columns": [ + { + "expression": "game_npcs_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_npc_staffing_id_idx": { + "name": "payload_locked_documents_rels_npc_staffing_id_idx", + "columns": [ + { + "expression": "npc_staffing_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_labor_classifications_id_idx": { + "name": "payload_locked_documents_rels_labor_classifications_id_idx", + "columns": [ + { + "expression": "labor_classifications_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_game_event_logs_id_idx": { + "name": "payload_locked_documents_rels_game_event_logs_id_idx", + "columns": [ + { + "expression": "game_event_logs_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_users_id_idx": { + "name": "payload_locked_documents_rels_users_id_idx", + "columns": [ + { + "expression": "users_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_roles_id_idx": { + "name": "payload_locked_documents_rels_roles_id_idx", + "columns": [ + { + "expression": "roles_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_ranks_id_idx": { + "name": "payload_locked_documents_rels_ranks_id_idx", + "columns": [ + { + "expression": "ranks_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_profiles_id_idx": { + "name": "payload_locked_documents_rels_profiles_id_idx", + "columns": [ + { + "expression": "profiles_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_awards_id_idx": { + "name": "payload_locked_documents_rels_awards_id_idx", + "columns": [ + { + "expression": "awards_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_qualifications_id_idx": { + "name": "payload_locked_documents_rels_qualifications_id_idx", + "columns": [ + { + "expression": "qualifications_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_assignments_id_idx": { + "name": "payload_locked_documents_rels_assignments_id_idx", + "columns": [ + { + "expression": "assignments_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_assignment_transfers_id_idx": { + "name": "payload_locked_documents_rels_assignment_transfers_id_idx", + "columns": [ + { + "expression": "assignment_transfers_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_experience_id_idx": { + "name": "payload_locked_documents_rels_experience_id_idx", + "columns": [ + { + "expression": "experience_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_user_notifications_id_idx": { + "name": "payload_locked_documents_rels_user_notifications_id_idx", + "columns": [ + { + "expression": "user_notifications_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_evaluations_id_idx": { + "name": "payload_locked_documents_rels_evaluations_id_idx", + "columns": [ + { + "expression": "evaluations_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_ribbon_submissions_id_idx": { + "name": "payload_locked_documents_rels_ribbon_submissions_id_idx", + "columns": [ + { + "expression": "ribbon_submissions_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_missions_id_idx": { + "name": "payload_locked_documents_rels_missions_id_idx", + "columns": [ + { + "expression": "missions_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_mission_attendances_id_idx": { + "name": "payload_locked_documents_rels_mission_attendances_id_idx", + "columns": [ + { + "expression": "mission_attendances_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_campaigns_id_idx": { + "name": "payload_locked_documents_rels_campaigns_id_idx", + "columns": [ + { + "expression": "campaigns_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_factions_id_idx": { + "name": "payload_locked_documents_rels_factions_id_idx", + "columns": [ + { + "expression": "factions_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_technologies_id_idx": { + "name": "payload_locked_documents_rels_technologies_id_idx", + "columns": [ + { + "expression": "technologies_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_assets_id_idx": { + "name": "payload_locked_documents_rels_assets_id_idx", + "columns": [ + { + "expression": "assets_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_resources_id_idx": { + "name": "payload_locked_documents_rels_resources_id_idx", + "columns": [ + { + "expression": "resources_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_vehicles_id_idx": { + "name": "payload_locked_documents_rels_vehicles_id_idx", + "columns": [ + { + "expression": "vehicles_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_structures_id_idx": { + "name": "payload_locked_documents_rels_structures_id_idx", + "columns": [ + { + "expression": "structures_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_shipments_id_idx": { + "name": "payload_locked_documents_rels_shipments_id_idx", + "columns": [ + { + "expression": "shipments_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_bank_accounts_id_idx": { + "name": "payload_locked_documents_rels_bank_accounts_id_idx", + "columns": [ + { + "expression": "bank_accounts_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_bank_transactions_id_idx": { + "name": "payload_locked_documents_rels_bank_transactions_id_idx", + "columns": [ + { + "expression": "bank_transactions_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_ledger_entries_id_idx": { + "name": "payload_locked_documents_rels_ledger_entries_id_idx", + "columns": [ + { + "expression": "ledger_entries_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_locker_storages_id_idx": { + "name": "payload_locked_documents_rels_locker_storages_id_idx", + "columns": [ + { + "expression": "locker_storages_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_loadouts_id_idx": { + "name": "payload_locked_documents_rels_loadouts_id_idx", + "columns": [ + { + "expression": "loadouts_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_market_listings_id_idx": { + "name": "payload_locked_documents_rels_market_listings_id_idx", + "columns": [ + { + "expression": "market_listings_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_market_negotiations_id_idx": { + "name": "payload_locked_documents_rels_market_negotiations_id_idx", + "columns": [ + { + "expression": "market_negotiations_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_market_state_id_idx": { + "name": "payload_locked_documents_rels_market_state_id_idx", + "columns": [ + { + "expression": "market_state_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_voice_scripts_id_idx": { + "name": "payload_locked_documents_rels_voice_scripts_id_idx", + "columns": [ + { + "expression": "voice_scripts_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_voice_submissions_id_idx": { + "name": "payload_locked_documents_rels_voice_submissions_id_idx", + "columns": [ + { + "expression": "voice_submissions_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_tickets_id_idx": { + "name": "payload_locked_documents_rels_tickets_id_idx", + "columns": [ + { + "expression": "tickets_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_ticket_votes_id_idx": { + "name": "payload_locked_documents_rels_ticket_votes_id_idx", + "columns": [ + { + "expression": "ticket_votes_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_wiki_pages_id_idx": { + "name": "payload_locked_documents_rels_wiki_pages_id_idx", + "columns": [ + { + "expression": "wiki_pages_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_wiki_revisions_id_idx": { + "name": "payload_locked_documents_rels_wiki_revisions_id_idx", + "columns": [ + { + "expression": "wiki_revisions_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_wiki_templates_id_idx": { + "name": "payload_locked_documents_rels_wiki_templates_id_idx", + "columns": [ + { + "expression": "wiki_templates_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_projects_id_idx": { + "name": "payload_locked_documents_rels_projects_id_idx", + "columns": [ + { + "expression": "projects_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_sprints_id_idx": { + "name": "payload_locked_documents_rels_sprints_id_idx", + "columns": [ + { + "expression": "sprints_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_releases_id_idx": { + "name": "payload_locked_documents_rels_releases_id_idx", + "columns": [ + { + "expression": "releases_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_labels_id_idx": { + "name": "payload_locked_documents_rels_labels_id_idx", + "columns": [ + { + "expression": "labels_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_maps_id_idx": { + "name": "payload_locked_documents_rels_maps_id_idx", + "columns": [ + { + "expression": "maps_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_map_roads_id_idx": { + "name": "payload_locked_documents_rels_map_roads_id_idx", + "columns": [ + { + "expression": "map_roads_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_map_zones_id_idx": { + "name": "payload_locked_documents_rels_map_zones_id_idx", + "columns": [ + { + "expression": "map_zones_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_resource_nodes_id_idx": { + "name": "payload_locked_documents_rels_resource_nodes_id_idx", + "columns": [ + { + "expression": "resource_nodes_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_narrative_events_id_idx": { + "name": "payload_locked_documents_rels_narrative_events_id_idx", + "columns": [ + { + "expression": "narrative_events_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_story_beats_id_idx": { + "name": "payload_locked_documents_rels_story_beats_id_idx", + "columns": [ + { + "expression": "story_beats_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_story_beat_states_id_idx": { + "name": "payload_locked_documents_rels_story_beat_states_id_idx", + "columns": [ + { + "expression": "story_beat_states_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_mission_files_id_idx": { + "name": "payload_locked_documents_rels_mission_files_id_idx", + "columns": [ + { + "expression": "mission_files_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_mod_lists_id_idx": { + "name": "payload_locked_documents_rels_mod_lists_id_idx", + "columns": [ + { + "expression": "mod_lists_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_game_servers_id_idx": { + "name": "payload_locked_documents_rels_game_servers_id_idx", + "columns": [ + { + "expression": "game_servers_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_arma_sync_events_id_idx": { + "name": "payload_locked_documents_rels_arma_sync_events_id_idx", + "columns": [ + { + "expression": "arma_sync_events_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_arma_commands_id_idx": { + "name": "payload_locked_documents_rels_arma_commands_id_idx", + "columns": [ + { + "expression": "arma_commands_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_respawn_tickets_id_idx": { + "name": "payload_locked_documents_rels_respawn_tickets_id_idx", + "columns": [ + { + "expression": "respawn_tickets_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_operation_events_id_idx": { + "name": "payload_locked_documents_rels_operation_events_id_idx", + "columns": [ + { + "expression": "operation_events_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_operation_effects_id_idx": { + "name": "payload_locked_documents_rels_operation_effects_id_idx", + "columns": [ + { + "expression": "operation_effects_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_operation_reservations_id_idx": { + "name": "payload_locked_documents_rels_operation_reservations_id_idx", + "columns": [ + { + "expression": "operation_reservations_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_custom_minefields_id_idx": { + "name": "payload_locked_documents_rels_custom_minefields_id_idx", + "columns": [ + { + "expression": "custom_minefields_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_custom_minefield_scores_id_idx": { + "name": "payload_locked_documents_rels_custom_minefield_scores_id_idx", + "columns": [ + { + "expression": "custom_minefield_scores_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_custom_radio_tests_id_idx": { + "name": "payload_locked_documents_rels_custom_radio_tests_id_idx", + "columns": [ + { + "expression": "custom_radio_tests_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_custom_radio_test_scores_i_idx": { + "name": "payload_locked_documents_rels_custom_radio_test_scores_i_idx", + "columns": [ + { + "expression": "custom_radio_test_scores_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_plugin_ai_instructions_id_idx": { + "name": "payload_locked_documents_rels_plugin_ai_instructions_id_idx", + "columns": [ + { + "expression": "plugin_ai_instructions_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_payload_mcp_api_keys_id_idx": { + "name": "payload_locked_documents_rels_payload_mcp_api_keys_id_idx", + "columns": [ + { + "expression": "payload_mcp_api_keys_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "payload_locked_documents_rels_parent_fk": { + "name": "payload_locked_documents_rels_parent_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "payload_locked_documents", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_media_fk": { + "name": "payload_locked_documents_rels_media_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "media", + "columnsFrom": [ + "media_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_game_hard_resources_fk": { + "name": "payload_locked_documents_rels_game_hard_resources_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "game_hard_resources", + "columnsFrom": [ + "game_hard_resources_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_game_structures_fk": { + "name": "payload_locked_documents_rels_game_structures_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "game_structures", + "columnsFrom": [ + "game_structures_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_game_vehicles_fk": { + "name": "payload_locked_documents_rels_game_vehicles_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "game_vehicles", + "columnsFrom": [ + "game_vehicles_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_game_npcs_fk": { + "name": "payload_locked_documents_rels_game_npcs_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "game_npcs", + "columnsFrom": [ + "game_npcs_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_npc_staffing_fk": { + "name": "payload_locked_documents_rels_npc_staffing_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "npc_staffing", + "columnsFrom": [ + "npc_staffing_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_labor_classifications_fk": { + "name": "payload_locked_documents_rels_labor_classifications_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "labor_classifications", + "columnsFrom": [ + "labor_classifications_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_game_event_logs_fk": { + "name": "payload_locked_documents_rels_game_event_logs_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "game_event_logs", + "columnsFrom": [ + "game_event_logs_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_users_fk": { + "name": "payload_locked_documents_rels_users_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "users", + "columnsFrom": [ + "users_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_roles_fk": { + "name": "payload_locked_documents_rels_roles_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "roles", + "columnsFrom": [ + "roles_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_ranks_fk": { + "name": "payload_locked_documents_rels_ranks_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "ranks", + "columnsFrom": [ + "ranks_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_profiles_fk": { + "name": "payload_locked_documents_rels_profiles_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "profiles", + "columnsFrom": [ + "profiles_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_awards_fk": { + "name": "payload_locked_documents_rels_awards_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "awards", + "columnsFrom": [ + "awards_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_qualifications_fk": { + "name": "payload_locked_documents_rels_qualifications_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "qualifications", + "columnsFrom": [ + "qualifications_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_assignments_fk": { + "name": "payload_locked_documents_rels_assignments_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "assignments", + "columnsFrom": [ + "assignments_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_assignment_transfers_fk": { + "name": "payload_locked_documents_rels_assignment_transfers_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "assignment_transfers", + "columnsFrom": [ + "assignment_transfers_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_experience_fk": { + "name": "payload_locked_documents_rels_experience_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "experience", + "columnsFrom": [ + "experience_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_user_notifications_fk": { + "name": "payload_locked_documents_rels_user_notifications_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "user_notifications", + "columnsFrom": [ + "user_notifications_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_evaluations_fk": { + "name": "payload_locked_documents_rels_evaluations_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "evaluations", + "columnsFrom": [ + "evaluations_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_ribbon_submissions_fk": { + "name": "payload_locked_documents_rels_ribbon_submissions_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "ribbon_submissions", + "columnsFrom": [ + "ribbon_submissions_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_missions_fk": { + "name": "payload_locked_documents_rels_missions_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "missions", + "columnsFrom": [ + "missions_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_mission_attendances_fk": { + "name": "payload_locked_documents_rels_mission_attendances_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "mission_attendances", + "columnsFrom": [ + "mission_attendances_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_campaigns_fk": { + "name": "payload_locked_documents_rels_campaigns_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "campaigns", + "columnsFrom": [ + "campaigns_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_factions_fk": { + "name": "payload_locked_documents_rels_factions_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "factions", + "columnsFrom": [ + "factions_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_technologies_fk": { + "name": "payload_locked_documents_rels_technologies_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "technologies", + "columnsFrom": [ + "technologies_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_assets_fk": { + "name": "payload_locked_documents_rels_assets_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "assets", + "columnsFrom": [ + "assets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_resources_fk": { + "name": "payload_locked_documents_rels_resources_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "resources", + "columnsFrom": [ + "resources_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_vehicles_fk": { + "name": "payload_locked_documents_rels_vehicles_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "vehicles", + "columnsFrom": [ + "vehicles_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_structures_fk": { + "name": "payload_locked_documents_rels_structures_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "structures", + "columnsFrom": [ + "structures_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_shipments_fk": { + "name": "payload_locked_documents_rels_shipments_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "shipments", + "columnsFrom": [ + "shipments_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_bank_accounts_fk": { + "name": "payload_locked_documents_rels_bank_accounts_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "bank_accounts", + "columnsFrom": [ + "bank_accounts_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_bank_transactions_fk": { + "name": "payload_locked_documents_rels_bank_transactions_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "bank_transactions", + "columnsFrom": [ + "bank_transactions_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_ledger_entries_fk": { + "name": "payload_locked_documents_rels_ledger_entries_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "ledger_entries", + "columnsFrom": [ + "ledger_entries_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_locker_storages_fk": { + "name": "payload_locked_documents_rels_locker_storages_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "locker_storages", + "columnsFrom": [ + "locker_storages_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_loadouts_fk": { + "name": "payload_locked_documents_rels_loadouts_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "loadouts", + "columnsFrom": [ + "loadouts_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_market_listings_fk": { + "name": "payload_locked_documents_rels_market_listings_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "market_listings", + "columnsFrom": [ + "market_listings_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_market_negotiations_fk": { + "name": "payload_locked_documents_rels_market_negotiations_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "market_negotiations", + "columnsFrom": [ + "market_negotiations_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_market_state_fk": { + "name": "payload_locked_documents_rels_market_state_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "market_state", + "columnsFrom": [ + "market_state_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_voice_scripts_fk": { + "name": "payload_locked_documents_rels_voice_scripts_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "voice_scripts", + "columnsFrom": [ + "voice_scripts_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_voice_submissions_fk": { + "name": "payload_locked_documents_rels_voice_submissions_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "voice_submissions", + "columnsFrom": [ + "voice_submissions_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_tickets_fk": { + "name": "payload_locked_documents_rels_tickets_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "tickets", + "columnsFrom": [ + "tickets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_ticket_votes_fk": { + "name": "payload_locked_documents_rels_ticket_votes_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "ticket_votes", + "columnsFrom": [ + "ticket_votes_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_wiki_pages_fk": { + "name": "payload_locked_documents_rels_wiki_pages_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "wiki_pages", + "columnsFrom": [ + "wiki_pages_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_wiki_revisions_fk": { + "name": "payload_locked_documents_rels_wiki_revisions_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "wiki_revisions", + "columnsFrom": [ + "wiki_revisions_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_wiki_templates_fk": { + "name": "payload_locked_documents_rels_wiki_templates_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "wiki_templates", + "columnsFrom": [ + "wiki_templates_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_projects_fk": { + "name": "payload_locked_documents_rels_projects_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "projects", + "columnsFrom": [ + "projects_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_sprints_fk": { + "name": "payload_locked_documents_rels_sprints_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "sprints", + "columnsFrom": [ + "sprints_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_releases_fk": { + "name": "payload_locked_documents_rels_releases_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "releases", + "columnsFrom": [ + "releases_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_labels_fk": { + "name": "payload_locked_documents_rels_labels_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "labels", + "columnsFrom": [ + "labels_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_maps_fk": { + "name": "payload_locked_documents_rels_maps_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "maps", + "columnsFrom": [ + "maps_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_map_roads_fk": { + "name": "payload_locked_documents_rels_map_roads_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "map_roads", + "columnsFrom": [ + "map_roads_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_map_zones_fk": { + "name": "payload_locked_documents_rels_map_zones_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "map_zones", + "columnsFrom": [ + "map_zones_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_resource_nodes_fk": { + "name": "payload_locked_documents_rels_resource_nodes_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "resource_nodes", + "columnsFrom": [ + "resource_nodes_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_narrative_events_fk": { + "name": "payload_locked_documents_rels_narrative_events_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "narrative_events", + "columnsFrom": [ + "narrative_events_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_story_beats_fk": { + "name": "payload_locked_documents_rels_story_beats_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "story_beats", + "columnsFrom": [ + "story_beats_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_story_beat_states_fk": { + "name": "payload_locked_documents_rels_story_beat_states_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "story_beat_states", + "columnsFrom": [ + "story_beat_states_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_mission_files_fk": { + "name": "payload_locked_documents_rels_mission_files_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "mission_files", + "columnsFrom": [ + "mission_files_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_mod_lists_fk": { + "name": "payload_locked_documents_rels_mod_lists_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "mod_lists", + "columnsFrom": [ + "mod_lists_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_game_servers_fk": { + "name": "payload_locked_documents_rels_game_servers_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "game_servers", + "columnsFrom": [ + "game_servers_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_arma_sync_events_fk": { + "name": "payload_locked_documents_rels_arma_sync_events_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "arma_sync_events", + "columnsFrom": [ + "arma_sync_events_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_arma_commands_fk": { + "name": "payload_locked_documents_rels_arma_commands_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "arma_commands", + "columnsFrom": [ + "arma_commands_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_respawn_tickets_fk": { + "name": "payload_locked_documents_rels_respawn_tickets_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "respawn_tickets", + "columnsFrom": [ + "respawn_tickets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_operation_events_fk": { + "name": "payload_locked_documents_rels_operation_events_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "operation_events", + "columnsFrom": [ + "operation_events_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_operation_effects_fk": { + "name": "payload_locked_documents_rels_operation_effects_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "operation_effects", + "columnsFrom": [ + "operation_effects_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_operation_reservations_fk": { + "name": "payload_locked_documents_rels_operation_reservations_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "operation_reservations", + "columnsFrom": [ + "operation_reservations_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_custom_minefields_fk": { + "name": "payload_locked_documents_rels_custom_minefields_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "custom_minefields", + "columnsFrom": [ + "custom_minefields_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_custom_minefield_scores_fk": { + "name": "payload_locked_documents_rels_custom_minefield_scores_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "custom_minefield_scores", + "columnsFrom": [ + "custom_minefield_scores_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_custom_radio_tests_fk": { + "name": "payload_locked_documents_rels_custom_radio_tests_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "custom_radio_tests", + "columnsFrom": [ + "custom_radio_tests_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_custom_radio_test_scores_fk": { + "name": "payload_locked_documents_rels_custom_radio_test_scores_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "custom_radio_test_scores", + "columnsFrom": [ + "custom_radio_test_scores_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_plugin_ai_instructions_fk": { + "name": "payload_locked_documents_rels_plugin_ai_instructions_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "plugin_ai_instructions", + "columnsFrom": [ + "plugin_ai_instructions_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_payload_mcp_api_keys_fk": { + "name": "payload_locked_documents_rels_payload_mcp_api_keys_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "payload_mcp_api_keys", + "columnsFrom": [ + "payload_mcp_api_keys_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_preferences": { + "name": "payload_preferences", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "payload_preferences_key_idx": { + "name": "payload_preferences_key_idx", + "columns": [ + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_preferences_updated_at_idx": { + "name": "payload_preferences_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_preferences_created_at_idx": { + "name": "payload_preferences_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_preferences_rels": { + "name": "payload_preferences_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "users_id": { + "name": "users_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "payload_mcp_api_keys_id": { + "name": "payload_mcp_api_keys_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "payload_preferences_rels_order_idx": { + "name": "payload_preferences_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_preferences_rels_parent_idx": { + "name": "payload_preferences_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_preferences_rels_path_idx": { + "name": "payload_preferences_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_preferences_rels_users_id_idx": { + "name": "payload_preferences_rels_users_id_idx", + "columns": [ + { + "expression": "users_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_preferences_rels_payload_mcp_api_keys_id_idx": { + "name": "payload_preferences_rels_payload_mcp_api_keys_id_idx", + "columns": [ + { + "expression": "payload_mcp_api_keys_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "payload_preferences_rels_parent_fk": { + "name": "payload_preferences_rels_parent_fk", + "tableFrom": "payload_preferences_rels", + "tableTo": "payload_preferences", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_preferences_rels_users_fk": { + "name": "payload_preferences_rels_users_fk", + "tableFrom": "payload_preferences_rels", + "tableTo": "users", + "columnsFrom": [ + "users_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_preferences_rels_payload_mcp_api_keys_fk": { + "name": "payload_preferences_rels_payload_mcp_api_keys_fk", + "tableFrom": "payload_preferences_rels", + "tableTo": "payload_mcp_api_keys", + "columnsFrom": [ + "payload_mcp_api_keys_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_migrations": { + "name": "payload_migrations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "batch": { + "name": "batch", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "payload_migrations_updated_at_idx": { + "name": "payload_migrations_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_migrations_created_at_idx": { + "name": "payload_migrations_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_rules": { + "name": "game_rules", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "main_currency_id": { + "name": "main_currency_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "currency_name": { + "name": "currency_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "currency_symbol": { + "name": "currency_symbol", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "currency_singular": { + "name": "currency_singular", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "currency_plural": { + "name": "currency_plural", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "currency_denomination": { + "name": "currency_denomination", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "proximity_threshold": { + "name": "proximity_threshold", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 1000 + }, + "game_tick_interval_minutes": { + "name": "game_tick_interval_minutes", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 10 + }, + "locker_grid_width": { + "name": "locker_grid_width", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 10 + }, + "locker_grid_height": { + "name": "locker_grid_height", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 6 + }, + "staff_hiring_enabled": { + "name": "staff_hiring_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "staff_hiring_disabled_message": { + "name": "staff_hiring_disabled_message", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "economy_enabled": { + "name": "economy_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "economy_default_price_band": { + "name": "economy_default_price_band", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0.5 + }, + "economy_real_demand_window_ticks": { + "name": "economy_real_demand_window_ticks", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 24 + }, + "economy_real_demand_decay": { + "name": "economy_real_demand_decay", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0.5 + }, + "economy_artificial_demand_drift": { + "name": "economy_artificial_demand_drift", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0.05 + }, + "economy_cold_start_observations": { + "name": "economy_cold_start_observations", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 5 + }, + "economy_tick_interval_hint_minutes": { + "name": "economy_tick_interval_hint_minutes", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 60 + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "game_rules_main_currency_idx": { + "name": "game_rules_main_currency_idx", + "columns": [ + { + "expression": "main_currency_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_rules_main_currency_id_resources_id_fk": { + "name": "game_rules_main_currency_id_resources_id_fk", + "tableFrom": "game_rules", + "tableTo": "resources", + "columnsFrom": [ + "main_currency_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.game_rules_rels": { + "name": "game_rules_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "assignments_id": { + "name": "assignments_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "game_rules_rels_order_idx": { + "name": "game_rules_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_rules_rels_parent_idx": { + "name": "game_rules_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_rules_rels_path_idx": { + "name": "game_rules_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "game_rules_rels_assignments_id_idx": { + "name": "game_rules_rels_assignments_id_idx", + "columns": [ + { + "expression": "assignments_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "game_rules_rels_parent_fk": { + "name": "game_rules_rels_parent_fk", + "tableFrom": "game_rules_rels", + "tableTo": "game_rules", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "game_rules_rels_assignments_fk": { + "name": "game_rules_rels_assignments_fk", + "tableFrom": "game_rules_rels", + "tableTo": "assignments", + "columnsFrom": [ + "assignments_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shims_shims_targeting_roles": { + "name": "shims_shims_targeting_roles", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_shims_shims_targeting_roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "shims_shims_targeting_roles_order_idx": { + "name": "shims_shims_targeting_roles_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shims_shims_targeting_roles_parent_idx": { + "name": "shims_shims_targeting_roles_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "shims_shims_targeting_roles_parent_fk": { + "name": "shims_shims_targeting_roles_parent_fk", + "tableFrom": "shims_shims_targeting_roles", + "tableTo": "shims_shims", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shims_shims": { + "name": "shims_shims", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "summary": { + "name": "summary", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "type": { + "name": "type", + "type": "enum_shims_shims_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'css'" + }, + "content": { + "name": "content", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "targeting_audience": { + "name": "targeting_audience", + "type": "enum_shims_shims_targeting_audience", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'all'" + }, + "targeting_percentage": { + "name": "targeting_percentage", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 50 + }, + "paths_match_type": { + "name": "paths_match_type", + "type": "enum_shims_shims_paths_match_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'all'" + } + }, + "indexes": { + "shims_shims_order_idx": { + "name": "shims_shims_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shims_shims_parent_id_idx": { + "name": "shims_shims_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shims_shims_name_idx": { + "name": "shims_shims_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "shims_shims_parent_id_fk": { + "name": "shims_shims_parent_id_fk", + "tableFrom": "shims_shims", + "tableTo": "shims", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shims": { + "name": "shims", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shims_texts": { + "name": "shims_texts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "shims_texts_order_parent": { + "name": "shims_texts_order_parent", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "shims_texts_parent_fk": { + "name": "shims_texts_parent_fk", + "tableFrom": "shims_texts", + "tableTo": "shims", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.shims_rels": { + "name": "shims_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "users_id": { + "name": "users_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "shims_rels_order_idx": { + "name": "shims_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shims_rels_parent_idx": { + "name": "shims_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shims_rels_path_idx": { + "name": "shims_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "shims_rels_users_id_idx": { + "name": "shims_rels_users_id_idx", + "columns": [ + { + "expression": "users_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "shims_rels_parent_fk": { + "name": "shims_rels_parent_fk", + "tableFrom": "shims_rels", + "tableTo": "shims", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "shims_rels_users_fk": { + "name": "shims_rels_users_fk", + "tableFrom": "shims_rels", + "tableTo": "users", + "columnsFrom": [ + "users_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.enum_game_structures_staff_positions_position_type": { + "name": "enum_game_structures_staff_positions_position_type", + "schema": "public", + "values": [ + "administrative", + "technical", + "other" + ] + }, + "public.enum_game_structures_construction_status": { + "name": "enum_game_structures_construction_status", + "schema": "public", + "values": [ + "awaiting_materials", + "building", + "complete" + ] + }, + "public.enum_game_vehicles_status": { + "name": "enum_game_vehicles_status", + "schema": "public", + "values": [ + "idle", + "assigned", + "in_transit", + "damaged", + "destroyed" + ] + }, + "public.enum_npc_staffing_position_type": { + "name": "enum_npc_staffing_position_type", + "schema": "public", + "values": [ + "labor", + "administrative", + "technical", + "other" + ] + }, + "public.enum_npc_staffing_status": { + "name": "enum_npc_staffing_status", + "schema": "public", + "values": [ + "active", + "terminated" + ] + }, + "public.enum_game_event_logs_target_collection": { + "name": "enum_game_event_logs_target_collection", + "schema": "public", + "values": [ + "game-structures", + "game-vehicles", + "game-npcs", + "npc-staffing", + "structures", + "resources", + "assets", + "vehicles", + "factions", + "missions", + "campaigns", + "users", + "technologies", + "maps", + "shipments", + "bank-accounts", + "bank-transactions", + "ledger-entries", + "locker-storages", + "loadouts", + "market-listings", + "market-negotiations", + "market-state", + "evaluations", + "tickets", + "wiki-pages", + "wiki-revisions", + "wiki-templates", + "game-servers", + "assignment-transfers", + "voice-scripts", + "voice-submissions", + "story-beats", + "story-beat-states", + "custom-minefields", + "custom-minefield-scores", + "custom-radio-tests", + "custom-radio-test-scores", + "ribbon-submissions" + ] + }, + "public.enum_users_roles": { + "name": "enum_users_roles", + "schema": "public", + "values": [ + "guest", + "user", + "trusted", + "admin", + "developer" + ] + }, + "public.enum_users_preferences_notifications_muted_types": { + "name": "enum_users_preferences_notifications_muted_types", + "schema": "public", + "values": [ + "market:offer", + "market:counter", + "market:accept", + "market:reject", + "market:withdrawn", + "market:closed", + "market:sold", + "market:expired", + "award:granted", + "account:discord-request", + "finance:deposit", + "finance:withdraw", + "finance:transfer", + "shipment:completed", + "ticket:created", + "ticket:assigned", + "ticket:reply", + "ticket:status", + "poker:force-ended", + "poker:everyone-left", + "blackjack:force-ended", + "blackjack:everyone-left" + ] + }, + "public.enum_users_preferences_discord_muted_types": { + "name": "enum_users_preferences_discord_muted_types", + "schema": "public", + "values": [ + "market:offer", + "market:counter", + "market:accept", + "market:reject", + "market:withdrawn", + "market:closed", + "market:sold", + "market:expired", + "award:granted", + "account:discord-request", + "finance:deposit", + "finance:withdraw", + "finance:transfer", + "shipment:completed", + "ticket:created", + "ticket:assigned", + "ticket:reply", + "ticket:status", + "poker:force-ended", + "poker:everyone-left", + "blackjack:force-ended", + "blackjack:everyone-left" + ] + }, + "public.enum_users_preferences_display_lead_or_actual": { + "name": "enum_users_preferences_display_lead_or_actual", + "schema": "public", + "values": [ + "lead", + "actual" + ] + }, + "public.enum_roles_permissions": { + "name": "enum_roles_permissions", + "schema": "public", + "values": [ + "system:admin-access", + "media:create", + "media:read", + "media:update", + "media:delete", + "admin:media:manage", + "users:create", + "users:read", + "users:update", + "users:delete", + "users:unlock", + "users:assign-roles", + "admin:users:manage", + "roles:create", + "roles:read", + "roles:update", + "roles:delete", + "admin:roles:manage", + "ranks:create", + "ranks:read", + "ranks:update", + "ranks:delete", + "admin:ranks:manage", + "profiles:create", + "profiles:read", + "profiles:update", + "profiles:delete", + "admin:profiles:manage", + "awards:create", + "awards:read", + "awards:update", + "awards:delete", + "admin:awards:manage", + "qualifications:create", + "qualifications:read", + "qualifications:update", + "qualifications:delete", + "admin:qualifications:manage", + "assignments:create", + "assignments:read", + "assignments:update", + "assignments:delete", + "admin:assignments:manage", + "assignment-transfers:create", + "assignment-transfers:read", + "assignment-transfers:update", + "assignment-transfers:delete", + "admin:assignment-transfers:manage", + "experience:create", + "experience:read", + "experience:update", + "experience:delete", + "admin:experience:manage", + "user-notifications:create", + "user-notifications:read", + "user-notifications:update", + "user-notifications:delete", + "admin:user-notifications:manage", + "evaluations:create", + "evaluations:read", + "evaluations:update", + "evaluations:delete", + "admin:evaluations:manage", + "missions:create", + "missions:read", + "missions:update", + "missions:delete", + "missions:read-sensitive", + "admin:missions:manage", + "mission-attendances:create", + "mission-attendances:read", + "mission-attendances:update", + "mission-attendances:delete", + "admin:mission-attendances:manage", + "campaigns:create", + "campaigns:read", + "campaigns:update", + "campaigns:delete", + "admin:campaigns:manage", + "campaigns:manage", + "factions:create", + "factions:read", + "factions:update", + "factions:delete", + "admin:factions:manage", + "technologies:create", + "technologies:read", + "technologies:update", + "technologies:delete", + "admin:technologies:manage", + "assets:create", + "assets:read", + "assets:update", + "assets:delete", + "admin:assets:manage", + "resources:create", + "resources:read", + "resources:update", + "resources:delete", + "admin:resources:manage", + "vehicles:create", + "vehicles:read", + "vehicles:update", + "vehicles:delete", + "admin:vehicles:manage", + "structures:create", + "structures:read", + "structures:update", + "structures:delete", + "admin:structures:manage", + "shipments:create", + "shipments:read", + "shipments:update", + "shipments:delete", + "admin:shipments:manage", + "bank-accounts:create", + "bank-accounts:read", + "bank-accounts:update", + "bank-accounts:delete", + "admin:bank-accounts:manage", + "bank-transactions:create", + "bank-transactions:read", + "bank-transactions:update", + "bank-transactions:delete", + "admin:bank-transactions:manage", + "ledger-entries:create", + "ledger-entries:read", + "ledger-entries:update", + "ledger-entries:delete", + "admin:ledger-entries:manage", + "locker-storages:create", + "locker-storages:read", + "locker-storages:update", + "locker-storages:delete", + "admin:locker-storages:manage", + "loadouts:create", + "loadouts:read", + "loadouts:update", + "loadouts:delete", + "admin:loadouts:manage", + "market-listings:create", + "market-listings:read", + "market-listings:update", + "market-listings:delete", + "admin:market-listings:manage", + "market-negotiations:create", + "market-negotiations:read", + "market-negotiations:update", + "market-negotiations:delete", + "admin:market-negotiations:manage", + "market-state:create", + "market-state:read", + "market-state:update", + "market-state:delete", + "admin:market-state:manage", + "projects:create", + "projects:read", + "projects:update", + "projects:delete", + "admin:projects:manage", + "labels:create", + "labels:read", + "labels:update", + "labels:delete", + "admin:labels:manage", + "sprints:create", + "sprints:read", + "sprints:update", + "sprints:delete", + "admin:sprints:manage", + "releases:create", + "releases:read", + "releases:update", + "releases:delete", + "admin:releases:manage", + "tickets:create", + "tickets:read", + "tickets:update", + "tickets:delete", + "admin:tickets:manage", + "ticket-votes:create", + "ticket-votes:read", + "ticket-votes:update", + "ticket-votes:delete", + "admin:ticket-votes:manage", + "game-structures:create", + "game-structures:read", + "game-structures:update", + "game-structures:delete", + "admin:game-structures:manage", + "game-vehicles:create", + "game-vehicles:read", + "game-vehicles:update", + "game-vehicles:delete", + "admin:game-vehicles:manage", + "game-npcs:create", + "game-npcs:read", + "game-npcs:update", + "game-npcs:delete", + "admin:game-npcs:manage", + "game-hard-resources:create", + "game-hard-resources:read", + "game-hard-resources:update", + "game-hard-resources:delete", + "admin:game-hard-resources:manage", + "game-event-logs:create", + "game-event-logs:read", + "game-event-logs:update", + "game-event-logs:delete", + "admin:game-event-logs:manage", + "maps:create", + "maps:read", + "maps:update", + "maps:delete", + "admin:maps:manage", + "map-roads:read", + "admin:map-roads:manage", + "map-zones:read", + "admin:map-zones:manage", + "resource-nodes:read", + "admin:resource-nodes:manage", + "narrative-events:create", + "narrative-events:read", + "narrative-events:update", + "narrative-events:delete", + "admin:narrative-events:manage", + "mission-files:create", + "mission-files:read", + "mission-files:update", + "mission-files:delete", + "admin:mission-files:manage", + "mod-lists:create", + "mod-lists:read", + "mod-lists:update", + "mod-lists:delete", + "admin:mod-lists:manage", + "game-servers:create", + "game-servers:read", + "game-servers:update", + "game-servers:delete", + "admin:game-servers:manage", + "arma-sync-events:create", + "arma-sync-events:read", + "arma-sync-events:update", + "arma-sync-events:delete", + "admin:arma-sync-events:manage", + "arma-commands:create", + "arma-commands:read", + "arma-commands:update", + "arma-commands:delete", + "admin:arma-commands:manage", + "operation-events:create", + "operation-events:read", + "operation-events:update", + "operation-events:delete", + "admin:operation-events:manage", + "operation-effects:create", + "operation-effects:read", + "operation-effects:update", + "operation-effects:delete", + "admin:operation-effects:manage", + "operation-reservations:create", + "operation-reservations:read", + "operation-reservations:update", + "operation-reservations:delete", + "admin:operation-reservations:manage", + "game-rules:read", + "game-rules:update", + "shims:read", + "shims:update", + "logistics:manage", + "intelligence:manage", + "profiles:intel_excerpt:update", + "banking:manage", + "tickets:staff", + "discord:staff", + "discord:announce", + "custom-minefields:update", + "custom-minefields:delete", + "custom-minefield-scores:delete", + "custom-radio-tests:update", + "custom-radio-tests:delete", + "custom-radio-test-scores:delete" + ] + }, + "public.enum_awards_grant_config_allowed_grantor_assignment_types": { + "name": "enum_awards_grant_config_allowed_grantor_assignment_types", + "schema": "public", + "values": [ + "division", + "squad", + "team", + "special" + ] + }, + "public.enum_awards_type": { + "name": "enum_awards_type", + "schema": "public", + "values": [ + "commendation", + "ribbon", + "medal" + ] + }, + "public.enum_awards_grant_config_recipient_scope": { + "name": "enum_awards_grant_config_recipient_scope", + "schema": "public", + "values": [ + "same_command", + "whitelist", + "anyone" + ] + }, + "public.enum_assignments_type": { + "name": "enum_assignments_type", + "schema": "public", + "values": [ + "division", + "squad", + "team", + "special" + ] + }, + "public.enum_assignment_transfers_status": { + "name": "enum_assignment_transfers_status", + "schema": "public", + "values": [ + "pending", + "rejected", + "awaiting_superuser", + "completed", + "cancelled", + "denied" + ] + }, + "public.enum_assignment_transfers_escalation_reason": { + "name": "enum_assignment_transfers_escalation_reason", + "schema": "public", + "values": [ + "no_leaders", + "appeal", + "leader_changed" + ] + }, + "public.enum_assignment_transfers_from_leader_decision": { + "name": "enum_assignment_transfers_from_leader_decision", + "schema": "public", + "values": [ + "pending", + "approved", + "rejected", + "not_required" + ] + }, + "public.enum_assignment_transfers_to_leader_decision": { + "name": "enum_assignment_transfers_to_leader_decision", + "schema": "public", + "values": [ + "pending", + "approved", + "rejected", + "not_required" + ] + }, + "public.enum_evaluations_kind": { + "name": "enum_evaluations_kind", + "schema": "public", + "values": [ + "leader-direct", + "leader-indirect", + "subordinate" + ] + }, + "public.enum_evaluations_level": { + "name": "enum_evaluations_level", + "schema": "public", + "values": [ + "exceptional", + "excellent", + "proficient", + "adequate", + "moderate", + "under-review" + ] + }, + "public.enum_ribbon_submissions_grantor_types": { + "name": "enum_ribbon_submissions_grantor_types", + "schema": "public", + "values": [ + "division", + "squad", + "team", + "special" + ] + }, + "public.enum_ribbon_submissions_status": { + "name": "enum_ribbon_submissions_status", + "schema": "public", + "values": [ + "pending", + "approved", + "rejected" + ] + }, + "public.enum_ribbon_submissions_recipient_scope": { + "name": "enum_ribbon_submissions_recipient_scope", + "schema": "public", + "values": [ + "same_command", + "whitelist", + "anyone" + ] + }, + "public.enum_missions_factions_involved_threat_level": { + "name": "enum_missions_factions_involved_threat_level", + "schema": "public", + "values": [ + "ally", + "friendly", + "neutral", + "hostile" + ] + }, + "public.enum_missions_logistics_and_support_insertion": { + "name": "enum_missions_logistics_and_support_insertion", + "schema": "public", + "values": [ + "helicopter", + "aircraft", + "paradrop", + "boat", + "car", + "onFoot" + ] + }, + "public.enum_missions_logistics_and_support_extraction": { + "name": "enum_missions_logistics_and_support_extraction", + "schema": "public", + "values": [ + "helicopter", + "aircraft", + "paradrop", + "boat", + "car", + "onFoot" + ] + }, + "public.enum_missions_operation_type": { + "name": "enum_missions_operation_type", + "schema": "public", + "values": [ + "main", + "side", + "external" + ] + }, + "public.enum_missions_classification_mission_type": { + "name": "enum_missions_classification_mission_type", + "schema": "public", + "values": [ + "Zeus", + "PvE", + "PvP", + "PvPvE", + "Training", + "Special" + ] + }, + "public.enum_missions_ownership_and_status_status": { + "name": "enum_missions_ownership_and_status_status", + "schema": "public", + "values": [ + "Concept", + "Planning", + "Ready", + "Scheduled", + "Active", + "Completed", + "Cancelled" + ] + }, + "public.enum_missions_ownership_and_status_visibility": { + "name": "enum_missions_ownership_and_status_visibility", + "schema": "public", + "values": [ + "unit", + "leadership", + "intel", + "private" + ] + }, + "public.enum_missions_civilian_presence": { + "name": "enum_missions_civilian_presence", + "schema": "public", + "values": [ + "None", + "Low", + "Medium", + "High" + ] + }, + "public.enum_mission_attendances_response": { + "name": "enum_mission_attendances_response", + "schema": "public", + "values": [ + "yes", + "no", + "tentative" + ] + }, + "public.enum_campaigns_status": { + "name": "enum_campaigns_status", + "schema": "public", + "values": [ + "concept", + "inProgress", + "completed" + ] + }, + "public.enum_campaigns_campaign_mode": { + "name": "enum_campaigns_campaign_mode", + "schema": "public", + "values": [ + "official", + "custom" + ] + }, + "public.enum_factions_type": { + "name": "enum_factions_type", + "schema": "public", + "values": [ + "playerFaction", + "majorFaction", + "minorFaction", + "corporation", + "special" + ] + }, + "public.enum_technologies_approval_status": { + "name": "enum_technologies_approval_status", + "schema": "public", + "values": [ + "in_progress", + "ready_for_review", + "approved", + "rejected", + "revision_requested" + ] + }, + "public.enum_technologies_type": { + "name": "enum_technologies_type", + "schema": "public", + "values": [ + "asset", + "upgrade" + ] + }, + "public.enum_assets_skin_configuration_applies_to_asset_types": { + "name": "enum_assets_skin_configuration_applies_to_asset_types", + "schema": "public", + "values": [ + "weapon", + "uniform", + "vest", + "backpack", + "helmet" + ] + }, + "public.enum_assets_approval_status": { + "name": "enum_assets_approval_status", + "schema": "public", + "values": [ + "in_progress", + "ready_for_review", + "approved", + "rejected", + "revision_requested" + ] + }, + "public.enum_assets_asset_type": { + "name": "enum_assets_asset_type", + "schema": "public", + "values": [ + "weapon", + "magazine", + "optic", + "muzzle", + "bipod", + "uniform", + "vest", + "backpack", + "helmet", + "facewear", + "nvg", + "radio", + "medical", + "tool", + "explosive", + "skin", + "miscellaneous" + ] + }, + "public.enum_assets_weapon_configuration_slot_type": { + "name": "enum_assets_weapon_configuration_slot_type", + "schema": "public", + "values": [ + "primary", + "secondary", + "launcher" + ] + }, + "public.enum_assets_nightvision_configuration_nvg_generation": { + "name": "enum_assets_nightvision_configuration_nvg_generation", + "schema": "public", + "values": [ + "gen1", + "gen2", + "gen3" + ] + }, + "public.enum_assets_market_trading_rarity": { + "name": "enum_assets_market_trading_rarity", + "schema": "public", + "values": [ + "basic", + "common", + "uncommon", + "rare", + "veryRare", + "epic", + "legendary", + "unique" + ] + }, + "public.enum_resources_approval_status": { + "name": "enum_resources_approval_status", + "schema": "public", + "values": [ + "in_progress", + "ready_for_review", + "approved", + "rejected", + "revision_requested" + ] + }, + "public.enum_resources_type": { + "name": "enum_resources_type", + "schema": "public", + "values": [ + "physical", + "fluid", + "energy", + "abstract" + ] + }, + "public.enum_resources_rarity": { + "name": "enum_resources_rarity", + "schema": "public", + "values": [ + "common", + "uncommon", + "rare", + "epic", + "legendary", + "exotic", + "unique" + ] + }, + "public.enum_vehicles_category": { + "name": "enum_vehicles_category", + "schema": "public", + "values": [ + "civilian", + "utility", + "transport", + "weaponized", + "military" + ] + }, + "public.enum_vehicles_pylons_pylon_type": { + "name": "enum_vehicles_pylons_pylon_type", + "schema": "public", + "values": [ + "mountedWeapon", + "pylon" + ] + }, + "public.enum_vehicles_approval_status": { + "name": "enum_vehicles_approval_status", + "schema": "public", + "values": [ + "in_progress", + "ready_for_review", + "approved", + "rejected", + "revision_requested" + ] + }, + "public.enum_vehicles_transport_mode": { + "name": "enum_vehicles_transport_mode", + "schema": "public", + "values": [ + "ground", + "air", + "sea" + ] + }, + "public.enum_vehicles_armor_rating": { + "name": "enum_vehicles_armor_rating", + "schema": "public", + "values": [ + "none", + "light", + "medium", + "heavy", + "composite" + ] + }, + "public.enum_structures_staff_positions_position_type": { + "name": "enum_structures_staff_positions_position_type", + "schema": "public", + "values": [ + "administrative", + "technical", + "other" + ] + }, + "public.enum_structures_module_options_effects_type": { + "name": "enum_structures_module_options_effects_type", + "schema": "public", + "values": [ + "capacity_mass", + "production_multiplier", + "storage_slots" + ] + }, + "public.enum_structures_module_options_category": { + "name": "enum_structures_module_options_category", + "schema": "public", + "values": [ + "production", + "logistics", + "defense", + "utility" + ] + }, + "public.enum_structures_approval_status": { + "name": "enum_structures_approval_status", + "schema": "public", + "values": [ + "in_progress", + "ready_for_review", + "approved", + "rejected", + "revision_requested" + ] + }, + "public.enum_structures_category": { + "name": "enum_structures_category", + "schema": "public", + "values": [ + "logistics", + "military", + "civilian" + ] + }, + "public.enum_structures_terrain_type": { + "name": "enum_structures_terrain_type", + "schema": "public", + "values": [ + "land", + "water" + ] + }, + "public.enum_structures_aura_effect_type": { + "name": "enum_structures_aura_effect_type", + "schema": "public", + "values": [ + "production_multiplier", + "capacity_mass" + ] + }, + "public.enum_structures_function_type": { + "name": "enum_structures_function_type", + "schema": "public", + "values": [ + "producer", + "storage", + "sensor", + "converter", + "defense", + "miscellaneous" + ] + }, + "public.enum_shipments_status": { + "name": "enum_shipments_status", + "schema": "public", + "values": [ + "pending", + "dispatched", + "in_transit", + "arrived", + "completed", + "cancelled", + "failed", + "stranded" + ] + }, + "public.enum_bank_accounts_account_type": { + "name": "enum_bank_accounts_account_type", + "schema": "public", + "values": [ + "treasury", + "faction", + "personal" + ] + }, + "public.enum_bank_accounts_status": { + "name": "enum_bank_accounts_status", + "schema": "public", + "values": [ + "open", + "frozen", + "closed" + ] + }, + "public.enum_bank_transactions_type": { + "name": "enum_bank_transactions_type", + "schema": "public", + "values": [ + "deposit", + "withdrawal", + "transfer", + "payment", + "fee", + "salary", + "adjustment" + ] + }, + "public.enum_bank_transactions_status": { + "name": "enum_bank_transactions_status", + "schema": "public", + "values": [ + "completed", + "reversed" + ] + }, + "public.enum_ledger_entries_type": { + "name": "enum_ledger_entries_type", + "schema": "public", + "values": [ + "deposit", + "withdrawal", + "transfer", + "payment", + "fee", + "salary", + "adjustment" + ] + }, + "public.enum_market_listings_status": { + "name": "enum_market_listings_status", + "schema": "public", + "values": [ + "active", + "sold", + "cancelled", + "expired" + ] + }, + "public.enum_market_negotiations_history_from": { + "name": "enum_market_negotiations_history_from", + "schema": "public", + "values": [ + "buyer", + "seller" + ] + }, + "public.enum_market_negotiations_status": { + "name": "enum_market_negotiations_status", + "schema": "public", + "values": [ + "open", + "accepted", + "rejected", + "closed", + "cancelled", + "expired" + ] + }, + "public.enum_market_negotiations_proposed_by": { + "name": "enum_market_negotiations_proposed_by", + "schema": "public", + "values": [ + "buyer", + "seller" + ] + }, + "public.enum_market_state_item_type": { + "name": "enum_market_state_item_type", + "schema": "public", + "values": [ + "resource", + "asset" + ] + }, + "public.enum_voice_scripts_status": { + "name": "enum_voice_scripts_status", + "schema": "public", + "values": [ + "draft", + "open", + "closed" + ] + }, + "public.enum_voice_submissions_status": { + "name": "enum_voice_submissions_status", + "schema": "public", + "values": [ + "pending", + "accepted", + "rejected" + ] + }, + "public.enum_tickets_activity_type": { + "name": "enum_tickets_activity_type", + "schema": "public", + "values": [ + "system", + "agent_message", + "client_message" + ] + }, + "public.enum_tickets_category": { + "name": "enum_tickets_category", + "schema": "public", + "values": [ + "bug_report", + "feature_request", + "support_request", + "other" + ] + }, + "public.enum_tickets_priority": { + "name": "enum_tickets_priority", + "schema": "public", + "values": [ + "low", + "medium", + "high", + "critical" + ] + }, + "public.enum_tickets_status": { + "name": "enum_tickets_status", + "schema": "public", + "values": [ + "open", + "in_review", + "planning", + "in_progress", + "waiting_on_reporter", + "in_testing", + "resolved", + "canceled", + "closed" + ] + }, + "public.enum_tickets_type": { + "name": "enum_tickets_type", + "schema": "public", + "values": [ + "task", + "bug", + "story", + "epic", + "improvement" + ] + }, + "public.enum_tickets_resolution": { + "name": "enum_tickets_resolution", + "schema": "public", + "values": [ + "fixed", + "wontfix", + "duplicate", + "invalid" + ] + }, + "public.enum_wiki_pages_category": { + "name": "enum_wiki_pages_category", + "schema": "public", + "values": [ + "Campaign", + "World", + "Lore", + "Characters", + "Plot", + "Media", + "Guides", + "Meta" + ] + }, + "public.enum_wiki_revisions_type": { + "name": "enum_wiki_revisions_type", + "schema": "public", + "values": [ + "create", + "edit", + "restore" + ] + }, + "public.enum_projects_status": { + "name": "enum_projects_status", + "schema": "public", + "values": [ + "active", + "archived" + ] + }, + "public.enum_sprints_status": { + "name": "enum_sprints_status", + "schema": "public", + "values": [ + "planning", + "active", + "completed" + ] + }, + "public.enum_releases_status": { + "name": "enum_releases_status", + "schema": "public", + "values": [ + "draft", + "in_progress", + "released" + ] + }, + "public.enum_maps_basemap_mode": { + "name": "enum_maps_basemap_mode", + "schema": "public", + "values": [ + "image", + "tiles" + ] + }, + "public.enum_map_roads_surface": { + "name": "enum_map_roads_surface", + "schema": "public", + "values": [ + "paved", + "dirt", + "trail" + ] + }, + "public.enum_map_roads_stroke_style": { + "name": "enum_map_roads_stroke_style", + "schema": "public", + "values": [ + "solid", + "dashed", + "dotted" + ] + }, + "public.enum_map_zones_type": { + "name": "enum_map_zones_type", + "schema": "public", + "values": [ + "water", + "land", + "territory", + "border", + "other" + ] + }, + "public.enum_narrative_events_triggers_type": { + "name": "enum_narrative_events_triggers_type", + "schema": "public", + "values": [ + "manual", + "mission_complete", + "timer", + "condition" + ] + }, + "public.enum_story_beats_status": { + "name": "enum_story_beats_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_story_beat_states_reaction": { + "name": "enum_story_beat_states_reaction", + "schema": "public", + "values": [ + "like", + "heart", + "salute" + ] + }, + "public.enum_game_servers_status": { + "name": "enum_game_servers_status", + "schema": "public", + "values": [ + "online", + "offline" + ] + }, + "public.enum_arma_commands_status": { + "name": "enum_arma_commands_status", + "schema": "public", + "values": [ + "queued", + "delivered", + "succeeded", + "failed" + ] + }, + "public.enum_operation_events_status": { + "name": "enum_operation_events_status", + "schema": "public", + "values": [ + "validated", + "rejected", + "dead-letter" + ] + }, + "public.enum_operation_effects_effect_type": { + "name": "enum_operation_effects_effect_type", + "schema": "public", + "values": [ + "operation.started", + "operation.ended", + "operation.objective-updated", + "operation.extraction-recorded", + "operation.inventory-recorded" + ] + }, + "public.enum_operation_effects_status": { + "name": "enum_operation_effects_status", + "schema": "public", + "values": [ + "applied", + "pending", + "failed", + "reversed" + ] + }, + "public.enum_operation_reservations_status": { + "name": "enum_operation_reservations_status", + "schema": "public", + "values": [ + "reserved", + "settled", + "cancelled", + "expired", + "no-show" + ] + }, + "public.enum_custom_radio_tests_order": { + "name": "enum_custom_radio_tests_order", + "schema": "public", + "values": [ + "fixed", + "shuffled" + ] + }, + "public.enum_custom_radio_test_scores_mode": { + "name": "enum_custom_radio_test_scores_mode", + "schema": "public", + "values": [ + "sprint", + "watch" + ] + }, + "public.enum_plugin_ai_instructions_field_type": { + "name": "enum_plugin_ai_instructions_field_type", + "schema": "public", + "values": [ + "text", + "textarea", + "upload", + "richText" + ] + }, + "public.enum_plugin_ai_instructions_model_id": { + "name": "enum_plugin_ai_instructions_model_id", + "schema": "public", + "values": [ + "unsloth-text" + ] + }, + "public.enum_shims_shims_targeting_roles": { + "name": "enum_shims_shims_targeting_roles", + "schema": "public", + "values": [ + "guest", + "user", + "trusted", + "admin", + "developer" + ] + }, + "public.enum_shims_shims_type": { + "name": "enum_shims_shims_type", + "schema": "public", + "values": [ + "css", + "js" + ] + }, + "public.enum_shims_shims_targeting_audience": { + "name": "enum_shims_shims_targeting_audience", + "schema": "public", + "values": [ + "all", + "percentage", + "users", + "roles" + ] + }, + "public.enum_shims_shims_paths_match_type": { + "name": "enum_shims_shims_paths_match_type", + "schema": "public", + "values": [ + "all", + "include", + "exclude" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "id": "efeeab9d-646d-450d-9a47-4934bffc9990", + "prevId": "00000000-0000-0000-0000-000000000000" +} \ No newline at end of file diff --git a/src/migrations/20260918_194842_add_operation_allocation.ts b/src/migrations/20260918_194842_add_operation_allocation.ts new file mode 100644 index 0000000..7d780aa --- /dev/null +++ b/src/migrations/20260918_194842_add_operation_allocation.ts @@ -0,0 +1,116 @@ +import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres' + +export async function up({ db, payload, req }: MigrateUpArgs): Promise { + await db.execute(sql` + CREATE TYPE "public"."enum_operation_reservations_status" AS ENUM('reserved', 'settled', 'cancelled', 'expired', 'no-show'); + ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'operation-reservations:create' BEFORE 'game-rules:read'; + ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'operation-reservations:read' BEFORE 'game-rules:read'; + ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'operation-reservations:update' BEFORE 'game-rules:read'; + ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'operation-reservations:delete' BEFORE 'game-rules:read'; + ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'admin:operation-reservations:manage' BEFORE 'game-rules:read'; + CREATE TABLE "operation_reservations_personnel" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" varchar PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "slot" varchar + ); + + CREATE TABLE "operation_reservations_vehicles" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" varchar PRIMARY KEY NOT NULL, + "vehicle_id" integer NOT NULL + ); + + CREATE TABLE "operation_reservations_cargo" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" varchar PRIMARY KEY NOT NULL, + "resource_id" integer NOT NULL, + "amount" numeric NOT NULL + ); + + CREATE TABLE "operation_reservations" ( + "id" serial PRIMARY KEY NOT NULL, + "reservation_key" varchar NOT NULL, + "operation_id" varchar NOT NULL, + "mission_id" integer, + "status" "enum_operation_reservations_status" DEFAULT 'reserved' NOT NULL, + "budget_account_id" integer, + "budget_amount" numeric, + "origin_id" integer, + "destination_id" integer, + "expires_at" timestamp(3) with time zone, + "created_by_id" integer, + "settled_at" timestamp(3) with time zone, + "settled_by_effect_id" integer, + "settlement" jsonb, + "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, + "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL + ); + + ALTER TABLE "payload_mcp_api_keys" ADD COLUMN "operation_reservations_find" boolean DEFAULT false; + ALTER TABLE "payload_mcp_api_keys" ADD COLUMN "operation_reservations_create" boolean DEFAULT false; + ALTER TABLE "payload_mcp_api_keys" ADD COLUMN "operation_reservations_update" boolean DEFAULT false; + ALTER TABLE "payload_mcp_api_keys" ADD COLUMN "operation_reservations_delete" boolean DEFAULT false; + ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "operation_reservations_id" integer; + ALTER TABLE "operation_reservations_personnel" ADD CONSTRAINT "operation_reservations_personnel_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action; + ALTER TABLE "operation_reservations_personnel" ADD CONSTRAINT "operation_reservations_personnel_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."operation_reservations"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "operation_reservations_vehicles" ADD CONSTRAINT "operation_reservations_vehicles_vehicle_id_game_vehicles_id_fk" FOREIGN KEY ("vehicle_id") REFERENCES "public"."game_vehicles"("id") ON DELETE set null ON UPDATE no action; + ALTER TABLE "operation_reservations_vehicles" ADD CONSTRAINT "operation_reservations_vehicles_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."operation_reservations"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "operation_reservations_cargo" ADD CONSTRAINT "operation_reservations_cargo_resource_id_resources_id_fk" FOREIGN KEY ("resource_id") REFERENCES "public"."resources"("id") ON DELETE set null ON UPDATE no action; + ALTER TABLE "operation_reservations_cargo" ADD CONSTRAINT "operation_reservations_cargo_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."operation_reservations"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "operation_reservations" ADD CONSTRAINT "operation_reservations_mission_id_missions_id_fk" FOREIGN KEY ("mission_id") REFERENCES "public"."missions"("id") ON DELETE set null ON UPDATE no action; + ALTER TABLE "operation_reservations" ADD CONSTRAINT "operation_reservations_budget_account_id_bank_accounts_id_fk" FOREIGN KEY ("budget_account_id") REFERENCES "public"."bank_accounts"("id") ON DELETE set null ON UPDATE no action; + ALTER TABLE "operation_reservations" ADD CONSTRAINT "operation_reservations_origin_id_game_structures_id_fk" FOREIGN KEY ("origin_id") REFERENCES "public"."game_structures"("id") ON DELETE set null ON UPDATE no action; + ALTER TABLE "operation_reservations" ADD CONSTRAINT "operation_reservations_destination_id_game_structures_id_fk" FOREIGN KEY ("destination_id") REFERENCES "public"."game_structures"("id") ON DELETE set null ON UPDATE no action; + ALTER TABLE "operation_reservations" ADD CONSTRAINT "operation_reservations_created_by_id_users_id_fk" FOREIGN KEY ("created_by_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action; + ALTER TABLE "operation_reservations" ADD CONSTRAINT "operation_reservations_settled_by_effect_id_operation_effects_id_fk" FOREIGN KEY ("settled_by_effect_id") REFERENCES "public"."operation_effects"("id") ON DELETE set null ON UPDATE no action; + CREATE INDEX "operation_reservations_personnel_order_idx" ON "operation_reservations_personnel" USING btree ("_order"); + CREATE INDEX "operation_reservations_personnel_parent_id_idx" ON "operation_reservations_personnel" USING btree ("_parent_id"); + CREATE INDEX "operation_reservations_personnel_user_idx" ON "operation_reservations_personnel" USING btree ("user_id"); + CREATE INDEX "operation_reservations_vehicles_order_idx" ON "operation_reservations_vehicles" USING btree ("_order"); + CREATE INDEX "operation_reservations_vehicles_parent_id_idx" ON "operation_reservations_vehicles" USING btree ("_parent_id"); + CREATE INDEX "operation_reservations_vehicles_vehicle_idx" ON "operation_reservations_vehicles" USING btree ("vehicle_id"); + CREATE INDEX "operation_reservations_cargo_order_idx" ON "operation_reservations_cargo" USING btree ("_order"); + CREATE INDEX "operation_reservations_cargo_parent_id_idx" ON "operation_reservations_cargo" USING btree ("_parent_id"); + CREATE INDEX "operation_reservations_cargo_resource_idx" ON "operation_reservations_cargo" USING btree ("resource_id"); + CREATE UNIQUE INDEX "operation_reservations_reservation_key_idx" ON "operation_reservations" USING btree ("reservation_key"); + CREATE INDEX "operation_reservations_operation_id_idx" ON "operation_reservations" USING btree ("operation_id"); + CREATE INDEX "operation_reservations_mission_idx" ON "operation_reservations" USING btree ("mission_id"); + CREATE INDEX "operation_reservations_budget_budget_account_idx" ON "operation_reservations" USING btree ("budget_account_id"); + CREATE INDEX "operation_reservations_origin_idx" ON "operation_reservations" USING btree ("origin_id"); + CREATE INDEX "operation_reservations_destination_idx" ON "operation_reservations" USING btree ("destination_id"); + CREATE INDEX "operation_reservations_created_by_idx" ON "operation_reservations" USING btree ("created_by_id"); + CREATE INDEX "operation_reservations_settled_by_effect_idx" ON "operation_reservations" USING btree ("settled_by_effect_id"); + CREATE INDEX "operation_reservations_updated_at_idx" ON "operation_reservations" USING btree ("updated_at"); + CREATE INDEX "operation_reservations_created_at_idx" ON "operation_reservations" USING btree ("created_at"); + ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_operation_reservations_fk" FOREIGN KEY ("operation_reservations_id") REFERENCES "public"."operation_reservations"("id") ON DELETE cascade ON UPDATE no action; + CREATE INDEX "payload_locked_documents_rels_operation_reservations_id_idx" ON "payload_locked_documents_rels" USING btree ("operation_reservations_id");`) +} + +export async function down({ db, payload, req }: MigrateDownArgs): Promise { + await db.execute(sql` + ALTER TABLE "operation_reservations_personnel" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "operation_reservations_vehicles" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "operation_reservations_cargo" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "operation_reservations" DISABLE ROW LEVEL SECURITY; + DROP TABLE "operation_reservations_personnel" CASCADE; + DROP TABLE "operation_reservations_vehicles" CASCADE; + DROP TABLE "operation_reservations_cargo" CASCADE; + DROP TABLE "operation_reservations" CASCADE; + ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_operation_reservations_fk"; + + ALTER TABLE "roles_permissions" ALTER COLUMN "value" SET DATA TYPE text; + DROP TYPE "public"."enum_roles_permissions"; + CREATE TYPE "public"."enum_roles_permissions" AS ENUM('system:admin-access', 'media:create', 'media:read', 'media:update', 'media:delete', 'admin:media:manage', 'users:create', 'users:read', 'users:update', 'users:delete', 'users:unlock', 'users:assign-roles', 'admin:users:manage', 'roles:create', 'roles:read', 'roles:update', 'roles:delete', 'admin:roles:manage', 'ranks:create', 'ranks:read', 'ranks:update', 'ranks:delete', 'admin:ranks:manage', 'profiles:create', 'profiles:read', 'profiles:update', 'profiles:delete', 'admin:profiles:manage', 'awards:create', 'awards:read', 'awards:update', 'awards:delete', 'admin:awards:manage', 'qualifications:create', 'qualifications:read', 'qualifications:update', 'qualifications:delete', 'admin:qualifications:manage', 'assignments:create', 'assignments:read', 'assignments:update', 'assignments:delete', 'admin:assignments:manage', 'assignment-transfers:create', 'assignment-transfers:read', 'assignment-transfers:update', 'assignment-transfers:delete', 'admin:assignment-transfers:manage', 'experience:create', 'experience:read', 'experience:update', 'experience:delete', 'admin:experience:manage', 'user-notifications:create', 'user-notifications:read', 'user-notifications:update', 'user-notifications:delete', 'admin:user-notifications:manage', 'evaluations:create', 'evaluations:read', 'evaluations:update', 'evaluations:delete', 'admin:evaluations:manage', 'missions:create', 'missions:read', 'missions:update', 'missions:delete', 'missions:read-sensitive', 'admin:missions:manage', 'mission-attendances:create', 'mission-attendances:read', 'mission-attendances:update', 'mission-attendances:delete', 'admin:mission-attendances:manage', 'campaigns:create', 'campaigns:read', 'campaigns:update', 'campaigns:delete', 'admin:campaigns:manage', 'campaigns:manage', 'factions:create', 'factions:read', 'factions:update', 'factions:delete', 'admin:factions:manage', 'technologies:create', 'technologies:read', 'technologies:update', 'technologies:delete', 'admin:technologies:manage', 'assets:create', 'assets:read', 'assets:update', 'assets:delete', 'admin:assets:manage', 'resources:create', 'resources:read', 'resources:update', 'resources:delete', 'admin:resources:manage', 'vehicles:create', 'vehicles:read', 'vehicles:update', 'vehicles:delete', 'admin:vehicles:manage', 'structures:create', 'structures:read', 'structures:update', 'structures:delete', 'admin:structures:manage', 'shipments:create', 'shipments:read', 'shipments:update', 'shipments:delete', 'admin:shipments:manage', 'bank-accounts:create', 'bank-accounts:read', 'bank-accounts:update', 'bank-accounts:delete', 'admin:bank-accounts:manage', 'bank-transactions:create', 'bank-transactions:read', 'bank-transactions:update', 'bank-transactions:delete', 'admin:bank-transactions:manage', 'ledger-entries:create', 'ledger-entries:read', 'ledger-entries:update', 'ledger-entries:delete', 'admin:ledger-entries:manage', 'locker-storages:create', 'locker-storages:read', 'locker-storages:update', 'locker-storages:delete', 'admin:locker-storages:manage', 'loadouts:create', 'loadouts:read', 'loadouts:update', 'loadouts:delete', 'admin:loadouts:manage', 'market-listings:create', 'market-listings:read', 'market-listings:update', 'market-listings:delete', 'admin:market-listings:manage', 'market-negotiations:create', 'market-negotiations:read', 'market-negotiations:update', 'market-negotiations:delete', 'admin:market-negotiations:manage', 'market-state:create', 'market-state:read', 'market-state:update', 'market-state:delete', 'admin:market-state:manage', 'projects:create', 'projects:read', 'projects:update', 'projects:delete', 'admin:projects:manage', 'labels:create', 'labels:read', 'labels:update', 'labels:delete', 'admin:labels:manage', 'sprints:create', 'sprints:read', 'sprints:update', 'sprints:delete', 'admin:sprints:manage', 'releases:create', 'releases:read', 'releases:update', 'releases:delete', 'admin:releases:manage', 'tickets:create', 'tickets:read', 'tickets:update', 'tickets:delete', 'admin:tickets:manage', 'ticket-votes:create', 'ticket-votes:read', 'ticket-votes:update', 'ticket-votes:delete', 'admin:ticket-votes:manage', 'game-structures:create', 'game-structures:read', 'game-structures:update', 'game-structures:delete', 'admin:game-structures:manage', 'game-vehicles:create', 'game-vehicles:read', 'game-vehicles:update', 'game-vehicles:delete', 'admin:game-vehicles:manage', 'game-npcs:create', 'game-npcs:read', 'game-npcs:update', 'game-npcs:delete', 'admin:game-npcs:manage', 'game-hard-resources:create', 'game-hard-resources:read', 'game-hard-resources:update', 'game-hard-resources:delete', 'admin:game-hard-resources:manage', 'game-event-logs:create', 'game-event-logs:read', 'game-event-logs:update', 'game-event-logs:delete', 'admin:game-event-logs:manage', 'maps:create', 'maps:read', 'maps:update', 'maps:delete', 'admin:maps:manage', 'map-roads:read', 'admin:map-roads:manage', 'map-zones:read', 'admin:map-zones:manage', 'resource-nodes:read', 'admin:resource-nodes:manage', 'narrative-events:create', 'narrative-events:read', 'narrative-events:update', 'narrative-events:delete', 'admin:narrative-events:manage', 'mission-files:create', 'mission-files:read', 'mission-files:update', 'mission-files:delete', 'admin:mission-files:manage', 'mod-lists:create', 'mod-lists:read', 'mod-lists:update', 'mod-lists:delete', 'admin:mod-lists:manage', 'game-servers:create', 'game-servers:read', 'game-servers:update', 'game-servers:delete', 'admin:game-servers:manage', 'arma-sync-events:create', 'arma-sync-events:read', 'arma-sync-events:update', 'arma-sync-events:delete', 'admin:arma-sync-events:manage', 'arma-commands:create', 'arma-commands:read', 'arma-commands:update', 'arma-commands:delete', 'admin:arma-commands:manage', 'operation-events:create', 'operation-events:read', 'operation-events:update', 'operation-events:delete', 'admin:operation-events:manage', 'operation-effects:create', 'operation-effects:read', 'operation-effects:update', 'operation-effects:delete', 'admin:operation-effects:manage', 'game-rules:read', 'game-rules:update', 'shims:read', 'shims:update', 'logistics:manage', 'intelligence:manage', 'profiles:intel_excerpt:update', 'banking:manage', 'tickets:staff', 'discord:staff', 'discord:announce', 'custom-minefields:update', 'custom-minefields:delete', 'custom-minefield-scores:delete', 'custom-radio-tests:update', 'custom-radio-tests:delete', 'custom-radio-test-scores:delete'); + ALTER TABLE "roles_permissions" ALTER COLUMN "value" SET DATA TYPE "public"."enum_roles_permissions" USING "value"::"public"."enum_roles_permissions"; + DROP INDEX "payload_locked_documents_rels_operation_reservations_id_idx"; + ALTER TABLE "payload_mcp_api_keys" DROP COLUMN "operation_reservations_find"; + ALTER TABLE "payload_mcp_api_keys" DROP COLUMN "operation_reservations_create"; + ALTER TABLE "payload_mcp_api_keys" DROP COLUMN "operation_reservations_update"; + ALTER TABLE "payload_mcp_api_keys" DROP COLUMN "operation_reservations_delete"; + ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "operation_reservations_id"; + DROP TYPE "public"."enum_operation_reservations_status";`) +} diff --git a/tests/int/operation-allocation.int.spec.ts b/tests/int/operation-allocation.int.spec.ts new file mode 100644 index 0000000..af27f27 --- /dev/null +++ b/tests/int/operation-allocation.int.spec.ts @@ -0,0 +1,1071 @@ +import { getPayload, Payload } from "payload"; +import config from "@/payload.config"; +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import { + expireOperationReservations, + failOperationReservations, + reserveOperationAssets, + settleOperationReservation, + type SettlementRecord, +} from "@/lib/operations/allocation"; +import { applyTransaction, createAccount, getMainCurrencyId } from "@/lib/banking"; +import type { BankAccount, GameStructure, OperationReservation, Structure } from "@/payload-types"; + +let payload: Payload; +const RUN = `alloc-${Date.now().toString(36)}`; + +const LEXICAL_EMPTY = { + root: { + children: [{ text: "" }], + direction: null, + format: "" as const, + indent: 0, + type: "text", + version: 1, + }, +}; + +// --------------------------------------------------------------------------- +// Fixture tracking for cleanup +// --------------------------------------------------------------------------- +const reservationIds: number[] = []; +const syncEventIds: number[] = []; +const opEventIds: number[] = []; +const opEffectIds: number[] = []; +const userIds: number[] = []; +const roleIds: number[] = []; +const accountIds: number[] = []; +const gameStructureIds: number[] = []; +const blueprintIds: number[] = []; +const gameVehicleIds: number[] = []; +const vehicleBlueprintIds: number[] = []; +const resourceIds: number[] = []; +const missionIds: number[] = []; +const campaignIds: number[] = []; +const mapIds: number[] = []; +let serverId: number; + +let commandUserId: number; +let plainUserId: number; +let soldierOneId: number; +let soldierTwoId: number; +let mapId: number; +let campaignId: number; +let missionId: number; +let resourceAId: number; +let resourceBId: number; +let normalBlueprintId: number; +let restrictedBlueprintId: number; +let vehicleBlueprintId: number; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- +function relId(value: unknown): number { + return typeof value === "object" && value !== null + ? (value as { id: number }).id + : (value as number); +} + +function settlementOf(doc: OperationReservation): SettlementRecord { + return doc.settlement as unknown as SettlementRecord; +} + +async function makeUser(label: string, roleDocIds?: number[]): Promise { + const user = await payload.create({ + collection: "users", + data: { + username: `${RUN}-${label}`, + discordUsername: `${RUN}-${label}`, + displayName: `${RUN} ${label}`, + steamId: `7656119${Math.floor(Math.random() * 1e9)}`, + password: "Test1234", + roles: ["user"], + ...(roleDocIds && roleDocIds.length > 0 ? { roleDocs: roleDocIds } : {}), + }, + overrideAccess: true, + depth: 0, + }); + userIds.push(user.id); + return user.id; +} + +async function makeMission(label: string): Promise { + const mission = await payload.create({ + collection: "missions", + data: { + name: `${RUN} ${label}`, + codeName: `${RUN}-${label}`, + summary: "Allocation test mission", + operationType: "main", + classification: { + map: mapId, + missionType: "PvE", + campaign: campaignId, + startDateTime: new Date(Date.now() + 86_400_000).toISOString(), + estimatedDuration: 60, + }, + ownershipAndStatus: { + authors: [commandUserId], + status: "Scheduled", + visibility: "unit", + }, + missionRoles: { maxPlayers: 16 }, + gameDetails: { serverDetails: { serverIp: "127.0.0.1", serverPort: 2302 } }, + briefing: [], + }, + overrideAccess: true, + depth: 0, + }); + missionIds.push(mission.id); + return mission.id; +} + +async function makeOrigin(stock: { resourceId: number; amount: number }[]): Promise { + const site = await payload.create({ + collection: "game-structures", + data: { + name: `${RUN} origin ${gameStructureIds.length}`, + type: normalBlueprintId, + map: mapId, + coordinates: [100 + gameStructureIds.length, 100], + constructionStatus: "complete", + storedResources: stock.map((s, i) => ({ + resource: s.resourceId, + amount: s.amount, + gridX: 0, + gridY: i, + rotated: false, + })), + }, + overrideAccess: true, + depth: 0, + }); + gameStructureIds.push(site.id); + return site.id; +} + +async function makeDestination(restricted = false): Promise { + const site = await payload.create({ + collection: "game-structures", + data: { + name: `${RUN} dest ${gameStructureIds.length}`, + type: restricted ? restrictedBlueprintId : normalBlueprintId, + map: mapId, + coordinates: [500 + gameStructureIds.length, 500], + constructionStatus: "complete", + }, + overrideAccess: true, + depth: 0, + }); + gameStructureIds.push(site.id); + return site.id; +} + +async function makeVehicle(atId: number, status: "idle" | "damaged" = "idle"): Promise { + const vehicle = await payload.create({ + collection: "game-vehicles", + data: { + name: `${RUN} vic ${gameVehicleIds.length}`, + type: vehicleBlueprintId, + deployedAt: atId, + status, + currentFuel: 1000, + currentHealth: 100, + }, + overrideAccess: true, + depth: 0, + }); + gameVehicleIds.push(vehicle.id); + return vehicle.id; +} + +async function makeFundedAccount(amount: number): Promise { + const account = await createAccount(payload, { + name: `${RUN} Treasury ${accountIds.length}`, + accountType: "treasury", + }); + accountIds.push(account.id); + if (amount > 0) { + await applyTransaction(payload, { + type: "deposit", + toAccountId: account.id, + amount, + memo: `${RUN} test funding`, + }); + } + return account; +} + +async function findByKey(key: string): Promise { + const res = await payload.find({ + collection: "operation-reservations", + where: { reservationKey: { equals: key } }, + limit: 1, + depth: 0, + overrideAccess: true, + }); + return (res.docs[0] as OperationReservation | undefined) ?? null; +} + +async function storedAmountAt(siteId: number, resourceId: number): Promise { + const doc = (await payload.findByID({ + collection: "game-structures", + id: siteId, + depth: 0, + overrideAccess: true, + })) as unknown as GameStructure; + return (doc.storedResources ?? []) + .filter((r) => relId(r.resource) === resourceId) + .reduce((sum, r) => sum + r.amount, 0); +} + +// --------------------------------------------------------------------------- +// Setup / teardown +// --------------------------------------------------------------------------- +beforeAll(async () => { + const payloadConfig = await config; + payload = await getPayload({ config: payloadConfig }); + + const currencyId = await getMainCurrencyId(payload); + if (!currencyId) throw new Error("Test requires a main currency in Game Rules."); + + const superRole = await payload.create({ + collection: "roles", + data: { name: `${RUN} Command`, slug: `${RUN}-command`, isSuperuser: true }, + overrideAccess: true, + depth: 0, + }); + roleIds.push(superRole.id); + + commandUserId = await makeUser("command", [superRole.id]); + plainUserId = await makeUser("plain"); + soldierOneId = await makeUser("soldier1"); + soldierTwoId = await makeUser("soldier2"); + + const map = await payload.create({ + collection: "maps", + data: { name: `${RUN} Map`, worldSizeWidth: 8192, worldSizeHeight: 8192, basemapMode: "image" }, + overrideAccess: true, + depth: 0, + }); + mapId = map.id; + mapIds.push(map.id); + + const campaign = await payload.create({ + collection: "campaigns", + data: { + name: `${RUN} Campaign`, + summary: "Allocation test campaign", + status: "concept", + campaignMode: "custom", + }, + overrideAccess: true, + depth: 0, + }); + campaignId = campaign.id; + campaignIds.push(campaign.id); + + missionId = await makeMission("Main"); + + const server = await payload.create({ + collection: "game-servers", + data: { serverId: `${RUN}-srv`, name: `${RUN} Server`, status: "online" }, + overrideAccess: true, + depth: 0, + }); + serverId = server.id; + + for (const label of ["alpha", "bravo"] as const) { + const resource = await payload.create({ + collection: "resources", + data: { + name: `${RUN} ${label}`, + codeName: `${RUN}-${label}`, + approvalStatus: "in_progress", + type: "physical", + baseValue: 1, + rarity: "common", + unitOfMeasure: "kg", + massPerUnit: 1, + gridWidth: 1, + gridHeight: 1, + }, + overrideAccess: true, + depth: 0, + }); + resourceIds.push(resource.id); + if (label === "alpha") resourceAId = resource.id; + else resourceBId = resource.id; + } + + const normalBlueprint = await payload.create({ + collection: "structures", + data: { + name: `${RUN} Depot`, + codeName: `${RUN}-depot`, + approvalStatus: "in_progress", + description: LEXICAL_EMPTY as unknown as Structure["description"], + category: "logistics", + materials: [{ resource: resourceAId, amount: 1 }], + constructionDurationMinutes: 1, + terrainType: "land", + maxHealth: 100, + }, + overrideAccess: true, + depth: 0, + }); + normalBlueprintId = normalBlueprint.id; + blueprintIds.push(normalBlueprint.id); + + const restrictedBlueprint = await payload.create({ + collection: "structures", + data: { + name: `${RUN} Vault`, + codeName: `${RUN}-vault`, + approvalStatus: "in_progress", + description: LEXICAL_EMPTY as unknown as Structure["description"], + category: "logistics", + materials: [{ resource: resourceAId, amount: 1 }], + constructionDurationMinutes: 1, + terrainType: "land", + maxHealth: 100, + restrictToAllowed: true, + allowedStorage: [], + }, + overrideAccess: true, + depth: 0, + }); + restrictedBlueprintId = restrictedBlueprint.id; + blueprintIds.push(restrictedBlueprint.id); + + const vehicleBlueprint = await payload.create({ + collection: "vehicles", + data: { + name: `${RUN} Truck`, + approvalStatus: "in_progress", + transportMode: "ground", + maxSpeedOnRoad: 60, + fuel: { fuelType: resourceAId, fuelCapacity: 1000, fuelConsumptionRate: 0.01 }, + }, + overrideAccess: true, + depth: 0, + }); + vehicleBlueprintId = vehicleBlueprint.id; + vehicleBlueprintIds.push(vehicleBlueprint.id); +}); + +afterAll(async () => { + if (!payload) return; + for (const id of reservationIds) { + await payload.delete({ collection: "operation-reservations", id, overrideAccess: true }).catch(() => {}); + } + for (const id of opEffectIds) { + await payload.delete({ collection: "operation-effects", id, overrideAccess: true }).catch(() => {}); + } + for (const id of opEventIds) { + await payload.delete({ collection: "operation-events", id, overrideAccess: true }).catch(() => {}); + } + for (const id of syncEventIds) { + await payload.delete({ collection: "arma-sync-events", id, overrideAccess: true }).catch(() => {}); + } + for (const id of gameVehicleIds) { + await payload.delete({ collection: "game-vehicles", id, overrideAccess: true }).catch(() => {}); + } + for (const id of gameStructureIds) { + await payload.delete({ collection: "game-structures", id, overrideAccess: true }).catch(() => {}); + } + for (const id of vehicleBlueprintIds) { + await payload.delete({ collection: "vehicles", id, overrideAccess: true }).catch(() => {}); + } + for (const id of blueprintIds) { + await payload.delete({ collection: "structures", id, overrideAccess: true }).catch(() => {}); + } + for (const id of resourceIds) { + await payload.delete({ collection: "resources", id, overrideAccess: true }).catch(() => {}); + } + for (const id of missionIds) { + await payload.delete({ collection: "missions", id, overrideAccess: true }).catch(() => {}); + } + for (const id of campaignIds) { + await payload.delete({ collection: "campaigns", id, overrideAccess: true }).catch(() => {}); + } + for (const id of mapIds) { + await payload.delete({ collection: "maps", id, overrideAccess: true }).catch(() => {}); + } + + const deleteAccountChain = async (accountId: number) => { + const txns = await payload.find({ + collection: "bank-transactions", + where: { or: [{ fromAccount: { equals: accountId } }, { toAccount: { equals: accountId } }] }, + limit: 100, + depth: 0, + overrideAccess: true, + }); + for (const txn of txns.docs) { + const entries = await payload.find({ + collection: "ledger-entries", + where: { transaction: { equals: txn.id } }, + limit: 100, + depth: 0, + overrideAccess: true, + }); + for (const entry of entries.docs) { + await payload.delete({ collection: "ledger-entries", id: entry.id, overrideAccess: true }).catch(() => {}); + } + await payload.delete({ collection: "bank-transactions", id: txn.id, overrideAccess: true }).catch(() => {}); + } + await payload.delete({ collection: "bank-accounts", id: accountId, overrideAccess: true }).catch(() => {}); + }; + + for (const id of accountIds) { + await deleteAccountChain(id); + } + for (const userId of userIds) { + const profiles = await payload.find({ + collection: "profiles", + where: { user: { equals: userId } }, + limit: 5, + depth: 0, + overrideAccess: true, + }); + for (const profile of profiles.docs) { + await payload.delete({ collection: "profiles", id: profile.id, overrideAccess: true }).catch(() => {}); + } + const accounts = await payload.find({ + collection: "bank-accounts", + where: { ownerUser: { equals: userId } }, + limit: 5, + depth: 0, + overrideAccess: true, + }); + for (const account of accounts.docs) { + await deleteAccountChain(account.id); + } + await payload.delete({ collection: "users", id: userId, overrideAccess: true }).catch(() => {}); + } + for (const id of roleIds) { + await payload.delete({ collection: "roles", id, overrideAccess: true }).catch(() => {}); + } + if (serverId) { + await payload.delete({ collection: "game-servers", id: serverId, overrideAccess: true }).catch(() => {}); + } +}); + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- +describe("Operation allocation", () => { + describe("reserveOperationAssets", () => { + it("reserves personnel, vehicles, cargo, and budget in one record", async () => { + const originId = await makeOrigin([{ resourceId: resourceAId, amount: 100 }]); + const destinationId = await makeDestination(); + const vehicleId = await makeVehicle(originId); + const account = await makeFundedAccount(1000); + const key = `${RUN}-happy`; + + const doc = await reserveOperationAssets(payload, { + reservationKey: key, + operationId: `${RUN}-op-happy`, + actorId: commandUserId, + missionId, + personnel: [{ userId: soldierOneId, slot: "Team Lead" }], + vehicleIds: [vehicleId], + cargo: [{ resourceId: resourceAId, amount: 40 }], + budget: { accountId: account.id, amount: 200 }, + originId, + destinationId, + expiresAt: new Date(Date.now() + 3_600_000).toISOString(), + }); + reservationIds.push(doc.id); + + expect(doc.reservationKey).toBe(key); + expect(doc.status).toBe("reserved"); + expect(doc.operationId).toBe(`${RUN}-op-happy`); + expect(relId(doc.mission)).toBe(missionId); + expect(doc.personnel).toHaveLength(1); + expect(relId(doc.personnel?.[0]?.user)).toBe(soldierOneId); + expect(doc.personnel?.[0]?.slot).toBe("Team Lead"); + expect(doc.vehicles).toHaveLength(1); + expect(relId(doc.vehicles?.[0]?.vehicle)).toBe(vehicleId); + expect(doc.cargo).toHaveLength(1); + expect(relId(doc.cargo?.[0]?.resource)).toBe(resourceAId); + expect(doc.cargo?.[0]?.amount).toBe(40); + expect(relId(doc.budget?.account)).toBe(account.id); + expect(doc.budget?.amount).toBe(200); + expect(relId(doc.origin)).toBe(originId); + expect(relId(doc.destination)).toBe(destinationId); + expect(relId(doc.createdBy)).toBe(commandUserId); + }); + + it("is idempotent for a retry with the same reservation key", async () => { + const originId = await makeOrigin([{ resourceId: resourceAId, amount: 50 }]); + const key = `${RUN}-retry`; + const input = { + reservationKey: key, + operationId: `${RUN}-op-retry`, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 10 }], + originId, + }; + + const first = await reserveOperationAssets(payload, input); + const second = await reserveOperationAssets(payload, input); + reservationIds.push(first.id); + + expect(second.id).toBe(first.id); + const all = await payload.find({ + collection: "operation-reservations", + where: { reservationKey: { equals: key } }, + limit: 10, + depth: 0, + overrideAccess: true, + }); + expect(all.docs).toHaveLength(1); + }); + + it("rejects an unauthorized actor without writing anything", async () => { + const originId = await makeOrigin([{ resourceId: resourceAId, amount: 100 }]); + const key = `${RUN}-unauthorized`; + + await expect( + reserveOperationAssets(payload, { + reservationKey: key, + operationId: `${RUN}-op-unauthorized`, + actorId: plainUserId, + cargo: [{ resourceId: resourceAId, amount: 10 }], + originId, + }), + ).rejects.toThrow(/not authorized/i); + + expect(await findByKey(key)).toBeNull(); + }); + + it("fails insufficient cargo without partial writes", async () => { + const originId = await makeOrigin([{ resourceId: resourceAId, amount: 100 }]); + const key = `${RUN}-insufficient`; + + await expect( + reserveOperationAssets(payload, { + reservationKey: key, + operationId: `${RUN}-op-insufficient`, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 101 }], + originId, + }), + ).rejects.toThrow(/insufficient cargo/i); + + expect(await findByKey(key)).toBeNull(); + expect(await storedAmountAt(originId, resourceAId)).toBe(100); + }); + + it("requires an origin structure when cargo is reserved", async () => { + const key = `${RUN}-no-origin`; + await expect( + reserveOperationAssets(payload, { + reservationKey: key, + operationId: `${RUN}-op-no-origin`, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 1 }], + }), + ).rejects.toThrow(/origin/i); + expect(await findByKey(key)).toBeNull(); + }); + + it("accounts for cargo already reserved by other active reservations", async () => { + const originId = await makeOrigin([{ resourceId: resourceAId, amount: 100 }]); + + const first = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-spend-1`, + operationId: `${RUN}-op-spend`, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 60 }], + originId, + }); + reservationIds.push(first.id); + + await expect( + reserveOperationAssets(payload, { + reservationKey: `${RUN}-spend-2`, + operationId: `${RUN}-op-spend`, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 50 }], + originId, + }), + ).rejects.toThrow(/insufficient cargo/i); + expect(await findByKey(`${RUN}-spend-2`)).toBeNull(); + + const third = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-spend-3`, + operationId: `${RUN}-op-spend`, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 40 }], + originId, + }); + reservationIds.push(third.id); + expect(third.status).toBe("reserved"); + }); + + it("enforces destination storage rules at reserve time", async () => { + const originId = await makeOrigin([{ resourceId: resourceAId, amount: 100 }]); + const restrictedDestinationId = await makeDestination(true); + const key = `${RUN}-dest-rules`; + + await expect( + reserveOperationAssets(payload, { + reservationKey: key, + operationId: `${RUN}-op-dest-rules`, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 10 }], + originId, + destinationId: restrictedDestinationId, + }), + ).rejects.toThrow(/allowed storage list/i); + expect(await findByKey(key)).toBeNull(); + }); + + it("rejects unavailable vehicles", async () => { + const originId = await makeOrigin([]); + const otherOriginId = await makeOrigin([]); + const reservedVehicleId = await makeVehicle(originId); + const damagedVehicleId = await makeVehicle(originId, "damaged"); + const elsewhereVehicleId = await makeVehicle(otherOriginId); + + const first = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-vic-1`, + operationId: `${RUN}-op-vic`, + actorId: commandUserId, + vehicleIds: [reservedVehicleId], + originId, + }); + reservationIds.push(first.id); + + await expect( + reserveOperationAssets(payload, { + reservationKey: `${RUN}-vic-2`, + operationId: `${RUN}-op-vic`, + actorId: commandUserId, + vehicleIds: [reservedVehicleId], + originId, + }), + ).rejects.toThrow(/already reserved/i); + + await expect( + reserveOperationAssets(payload, { + reservationKey: `${RUN}-vic-3`, + operationId: `${RUN}-op-vic`, + actorId: commandUserId, + vehicleIds: [damagedVehicleId], + originId, + }), + ).rejects.toThrow(/not available/i); + + await expect( + reserveOperationAssets(payload, { + reservationKey: `${RUN}-vic-4`, + operationId: `${RUN}-op-vic`, + actorId: commandUserId, + vehicleIds: [elsewhereVehicleId], + originId, + }), + ).rejects.toThrow(/not stationed/i); + + expect(await findByKey(`${RUN}-vic-2`)).toBeNull(); + expect(await findByKey(`${RUN}-vic-3`)).toBeNull(); + expect(await findByKey(`${RUN}-vic-4`)).toBeNull(); + }); + + it("rejects an overdrawn treasury budget, including other reservations' earmarks", async () => { + const account = await makeFundedAccount(500); + + await expect( + reserveOperationAssets(payload, { + reservationKey: `${RUN}-budget-1`, + operationId: `${RUN}-op-budget`, + actorId: commandUserId, + budget: { accountId: account.id, amount: 600 }, + }), + ).rejects.toThrow(/insufficient budget/i); + + const ok = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-budget-2`, + operationId: `${RUN}-op-budget`, + actorId: commandUserId, + budget: { accountId: account.id, amount: 500 }, + }); + reservationIds.push(ok.id); + + await expect( + reserveOperationAssets(payload, { + reservationKey: `${RUN}-budget-3`, + operationId: `${RUN}-op-budget`, + actorId: commandUserId, + budget: { accountId: account.id, amount: 1 }, + }), + ).rejects.toThrow(/insufficient budget/i); + + expect(await findByKey(`${RUN}-budget-1`)).toBeNull(); + expect(await findByKey(`${RUN}-budget-3`)).toBeNull(); + + const fresh = (await payload.findByID({ + collection: "bank-accounts", + id: account.id, + depth: 0, + overrideAccess: true, + })) as unknown as BankAccount; + expect(fresh.balance).toBe(500); + }); + + it("rejects personnel already booked on the same mission", async () => { + const personnelMissionId = await makeMission("Personnel"); + + const first = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-pers-1`, + operationId: `${RUN}-op-pers`, + actorId: commandUserId, + missionId: personnelMissionId, + personnel: [{ userId: soldierTwoId }], + }); + reservationIds.push(first.id); + + await expect( + reserveOperationAssets(payload, { + reservationKey: `${RUN}-pers-2`, + operationId: `${RUN}-op-pers`, + actorId: commandUserId, + missionId: personnelMissionId, + personnel: [{ userId: soldierTwoId }], + }), + ).rejects.toThrow(/already reserved/i); + + const otherMission = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-pers-3`, + operationId: `${RUN}-op-pers`, + actorId: commandUserId, + missionId, + personnel: [{ userId: soldierTwoId }], + }); + reservationIds.push(otherMission.id); + expect(otherMission.status).toBe("reserved"); + }); + }); + + describe("settleOperationReservation", () => { + it("cancels: returns everything, exactly once", async () => { + const originId = await makeOrigin([{ resourceId: resourceAId, amount: 100 }]); + const vehicleId = await makeVehicle(originId); + const account = await makeFundedAccount(300); + const doc = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-cancel`, + operationId: `${RUN}-op-cancel`, + actorId: commandUserId, + personnel: [{ userId: soldierOneId }], + vehicleIds: [vehicleId], + cargo: [{ resourceId: resourceAId, amount: 25 }], + budget: { accountId: account.id, amount: 120 }, + originId, + }); + reservationIds.push(doc.id); + + const settled = await settleOperationReservation( + payload, + { reservationId: doc.id }, + { outcome: "cancelled", actorId: commandUserId }, + ); + expect(settled.status).toBe("cancelled"); + expect(settled.settledAt).toBeTruthy(); + + const record = settlementOf(settled); + expect(record.outcome).toBe("cancelled"); + expect(record.reason).toBe("cancelled"); + expect(record.consumed).toEqual({ personnel: [], vehicles: [], cargo: [], budget: 0 }); + expect(record.returned.personnel).toEqual([soldierOneId]); + expect(record.returned.vehicles).toEqual([vehicleId]); + expect(record.returned.cargo).toEqual([{ resource: resourceAId, amount: 25 }]); + expect(record.returned.budget).toBe(120); + + // Second settle is a no-op: same status, same settlement timestamp. + const again = await settleOperationReservation( + payload, + { reservationId: doc.id }, + { outcome: "cancelled", actorId: commandUserId }, + ); + expect(again.status).toBe("cancelled"); + expect(again.settledAt).toBe(settled.settledAt); + + // A different outcome cannot re-settle either. + const third = await settleOperationReservation( + payload, + { reservationId: doc.id }, + { outcome: "settled", consumed: { budgetAmount: 120 }, actorId: commandUserId }, + ); + expect(third.status).toBe("cancelled"); + expect(third.settledAt).toBe(settled.settledAt); + }); + + it("settles a partial success with exact consumed/returned math, exactly once", async () => { + const originId = await makeOrigin([ + { resourceId: resourceAId, amount: 100 }, + { resourceId: resourceBId, amount: 10 }, + ]); + const vehicleId = await makeVehicle(originId); + const account = await makeFundedAccount(400); + const doc = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-partial`, + operationId: `${RUN}-op-partial`, + actorId: commandUserId, + personnel: [{ userId: soldierOneId }, { userId: soldierTwoId }], + vehicleIds: [vehicleId], + cargo: [ + { resourceId: resourceAId, amount: 50 }, + { resourceId: resourceBId, amount: 10 }, + ], + budget: { accountId: account.id, amount: 300 }, + originId, + }); + reservationIds.push(doc.id); + + // Over-consumption is rejected before any write. + await expect( + settleOperationReservation( + payload, + { reservationId: doc.id }, + { outcome: "settled", consumed: { cargo: [{ resourceId: resourceAId, amount: 51 }] } }, + ), + ).rejects.toThrow(/exceeds the reserved amount/i); + expect((await findByKey(`${RUN}-partial`))?.status).toBe("reserved"); + + const settled = await settleOperationReservation( + payload, + { reservationId: doc.id }, + { + outcome: "settled", + reason: "partial-success", + consumed: { + personnel: [soldierOneId], + vehicleIds: [vehicleId], + cargo: [{ resourceId: resourceAId, amount: 20 }], + budgetAmount: 100, + }, + actorId: commandUserId, + }, + ); + expect(settled.status).toBe("settled"); + + const record = settlementOf(settled); + expect(record.outcome).toBe("settled"); + expect(record.reason).toBe("partial-success"); + expect(record.consumed.personnel).toEqual([soldierOneId]); + expect(record.consumed.vehicles).toEqual([vehicleId]); + expect(record.consumed.cargo).toEqual([{ resource: resourceAId, amount: 20 }]); + expect(record.consumed.budget).toBe(100); + expect(record.returned.personnel).toEqual([soldierTwoId]); + expect(record.returned.vehicles).toEqual([]); + expect(record.returned.cargo).toEqual([ + { resource: resourceAId, amount: 30 }, + { resource: resourceBId, amount: 10 }, + ]); + expect(record.returned.budget).toBe(200); + + const again = await settleOperationReservation( + payload, + { reservationId: doc.id }, + { outcome: "settled", reason: "partial-success", consumed: { budgetAmount: 100 } }, + ); + expect(again.settledAt).toBe(settled.settledAt); + expect(settlementOf(again).consumed.budget).toBe(100); + }); + + it("records a no-show as a distinct, auditable outcome", async () => { + const originId = await makeOrigin([{ resourceId: resourceAId, amount: 50 }]); + const doc = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-noshow`, + operationId: `${RUN}-op-noshow`, + actorId: commandUserId, + personnel: [{ userId: soldierOneId }], + cargo: [{ resourceId: resourceAId, amount: 10 }], + originId, + }); + reservationIds.push(doc.id); + + const settled = await settleOperationReservation( + payload, + { reservationKey: `${RUN}-noshow` }, + { outcome: "no-show", actorId: commandUserId }, + ); + expect(settled.status).toBe("no-show"); + + const record = settlementOf(settled); + expect(record.outcome).toBe("no-show"); + expect(record.reason).toBe("no-show"); + expect(record.consumed).toEqual({ personnel: [], vehicles: [], cargo: [], budget: 0 }); + expect(record.returned.personnel).toEqual([soldierOneId]); + expect(record.returned.cargo).toEqual([{ resource: resourceAId, amount: 10 }]); + }); + }); + + describe("expireOperationReservations", () => { + it("settles overdue reservations as expired and leaves future ones reserved", async () => { + const originId = await makeOrigin([{ resourceId: resourceAId, amount: 100 }]); + + const overdue = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-exp-overdue`, + operationId: `${RUN}-op-exp`, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 5 }], + originId, + expiresAt: new Date(Date.now() - 60_000).toISOString(), + }); + reservationIds.push(overdue.id); + + const future = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-exp-future`, + operationId: `${RUN}-op-exp`, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 5 }], + originId, + expiresAt: new Date(Date.now() + 3_600_000).toISOString(), + }); + reservationIds.push(future.id); + + const settledCount = await expireOperationReservations(payload); + expect(settledCount).toBeGreaterThanOrEqual(1); + + const overdueDoc = await findByKey(`${RUN}-exp-overdue`); + expect(overdueDoc?.status).toBe("expired"); + expect(settlementOf(overdueDoc as OperationReservation).returned.cargo).toEqual([ + { resource: resourceAId, amount: 5 }, + ]); + + const futureDoc = await findByKey(`${RUN}-exp-future`); + expect(futureDoc?.status).toBe("reserved"); + + // Sweeping again is a no-op for the already-expired row. + const secondCount = await expireOperationReservations(payload); + const overdueAgain = await findByKey(`${RUN}-exp-overdue`); + expect(overdueAgain?.settledAt).toBe(overdueDoc?.settledAt); + expect(secondCount).toBe(0); + }); + }); + + describe("failOperationReservations", () => { + it("settles only unextracted reservations and never reverses a recorded extraction", async () => { + const operationId = `${RUN}-op-fail`; + + // Validated extraction evidence through the real hook path. + const syncEvent = await payload.create({ + collection: "arma-sync-events", + data: { + eventId: `${RUN}-extract-1`, + server: serverId, + type: "operation.extraction", + occurredAt: new Date().toISOString(), + payload: { operationId, version: 1, player: `${RUN} soldier1` }, + }, + overrideAccess: true, + depth: 0, + }); + syncEventIds.push(syncEvent.id); + + const opEvents = await payload.find({ + collection: "operation-events", + where: { sourceEvent: { equals: syncEvent.id } }, + limit: 1, + depth: 0, + overrideAccess: true, + }); + expect(opEvents.docs).toHaveLength(1); + opEventIds.push(opEvents.docs[0].id); + + const effects = await payload.find({ + collection: "operation-effects", + where: { operationEvent: { equals: opEvents.docs[0].id } }, + limit: 10, + depth: 0, + overrideAccess: true, + }); + expect(effects.docs).toHaveLength(1); + const extractionEffect = effects.docs[0]; + expect(extractionEffect.effectType).toBe("operation.extraction-recorded"); + expect(extractionEffect.status).toBe("applied"); + opEffectIds.push(extractionEffect.id); + + // One reservation already settled by the extraction (partial success); + // one still reserved (unextracted). + const originId = await makeOrigin([{ resourceId: resourceAId, amount: 100 }]); + const extracted = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-fail-extracted`, + operationId, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 10 }], + originId, + }); + reservationIds.push(extracted.id); + const preSettled = await settleOperationReservation( + payload, + { reservationId: extracted.id }, + { + outcome: "settled", + reason: "partial-success", + consumed: { cargo: [{ resourceId: resourceAId, amount: 4 }] }, + effectId: extractionEffect.id, + actorId: commandUserId, + }, + ); + expect(preSettled.status).toBe("settled"); + + const pending = await reserveOperationAssets(payload, { + reservationKey: `${RUN}-fail-pending`, + operationId, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 10 }], + originId, + }); + reservationIds.push(pending.id); + + const settledCount = await failOperationReservations(payload, operationId, { + effectId: extractionEffect.id, + actorId: commandUserId, + }); + expect(settledCount).toBe(1); + + // The still-reserved row settles as mission-failed with everything returned. + const failedDoc = await findByKey(`${RUN}-fail-pending`); + expect(failedDoc?.status).toBe("settled"); + const failedRecord = settlementOf(failedDoc as OperationReservation); + expect(failedRecord.reason).toBe("mission-failed"); + expect(failedRecord.consumed).toEqual({ personnel: [], vehicles: [], cargo: [], budget: 0 }); + expect(failedRecord.returned.cargo).toEqual([{ resource: resourceAId, amount: 10 }]); + expect(failedRecord.effectId).toBe(extractionEffect.id); + expect(relId(failedDoc?.settledByEffect)).toBe(extractionEffect.id); + + // The previously settled (extracted) row is untouched. + const extractedDoc = await findByKey(`${RUN}-fail-extracted`); + expect(extractedDoc?.status).toBe("settled"); + expect(extractedDoc?.settledAt).toBe(preSettled.settledAt); + const extractedRecord = settlementOf(extractedDoc as OperationReservation); + expect(extractedRecord.reason).toBe("partial-success"); + expect(extractedRecord.consumed.cargo).toEqual([{ resource: resourceAId, amount: 4 }]); + + // The extraction effect is final: still applied, never reversed, and + // failure settlement wrote no new effects for the operation. + const freshEffect = await payload.findByID({ + collection: "operation-effects", + id: extractionEffect.id, + depth: 0, + overrideAccess: true, + }); + expect(freshEffect.status).toBe("applied"); + expect(freshEffect.reversedBy).toBeNull(); + + const effectsAfter = await payload.find({ + collection: "operation-effects", + where: { operationId: { equals: operationId } }, + limit: 10, + depth: 0, + overrideAccess: true, + }); + expect(effectsAfter.docs).toHaveLength(1); + }); + }); +}); diff --git a/tests/int/operation-settlement.int.spec.ts b/tests/int/operation-settlement.int.spec.ts new file mode 100644 index 0000000..044567b --- /dev/null +++ b/tests/int/operation-settlement.int.spec.ts @@ -0,0 +1,850 @@ +import { getPayload, Payload } from "payload"; +import config from "@/payload.config"; +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import { processOperationEvent } from "@/lib/operations/process"; +import { reserveOperationAssets, type SettlementRecord } from "@/lib/operations/allocation"; +import { ensureLockerStorage, getLockerGridDimensions } from "@/lib/locker"; +import type { GameStructure, LockerStorage, OperationReservation, Structure } from "@/payload-types"; + +let payload: Payload; +const RUN = `settle-${Date.now().toString(36)}`; + +const LEXICAL_EMPTY = { + root: { + children: [{ text: "" }], + direction: null, + format: "" as const, + indent: 0, + type: "text", + version: 1, + }, +}; + +// --------------------------------------------------------------------------- +// Fixture tracking for cleanup +// --------------------------------------------------------------------------- +const reservationIds: number[] = []; +const syncEventIds: number[] = []; +const opEventIds: number[] = []; +const opEffectIds: number[] = []; +const userIds: number[] = []; +const roleIds: number[] = []; +const gameStructureIds: number[] = []; +const blueprintIds: number[] = []; +const resourceIds: number[] = []; +const assetIds: number[] = []; +const missionIds: number[] = []; +const campaignIds: number[] = []; +const mapIds: number[] = []; +let serverId: number; + +let commandUserId: number; +let extractorId: number; +let deathUserId: number; +let fullLockerUserId: number; +let malformedUserId: number; +let mapId: number; +let campaignId: number; +let missionId: number; +let resourceAId: number; +let stackableAssetId: number; +let fillerAssetId: number; +let hqBlueprintId: number; +let cappedBlueprintId: number; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- +function relId(value: unknown): number { + return typeof value === "object" && value !== null + ? (value as { id: number }).id + : (value as number); +} + +function settlementOf(doc: OperationReservation): SettlementRecord { + return doc.settlement as unknown as SettlementRecord; +} + +async function makeUser(label: string, roleDocIds?: number[]): Promise { + const user = await payload.create({ + collection: "users", + data: { + username: `${RUN}-${label}`, + discordUsername: `${RUN}-${label}`, + displayName: `${RUN} ${label}`, + steamId: `7656119${Math.floor(Math.random() * 1e9)}`, + password: "Test1234", + roles: ["user"], + ...(roleDocIds && roleDocIds.length > 0 ? { roleDocs: roleDocIds } : {}), + }, + overrideAccess: true, + depth: 0, + }); + userIds.push(user.id); + return user.id; +} + +async function makeStructure( + label: string, + blueprintId: number, + stock: { resourceId: number; amount: number }[] = [], +): Promise { + const site = await payload.create({ + collection: "game-structures", + data: { + name: `${RUN} ${label} ${gameStructureIds.length}`, + type: blueprintId, + map: mapId, + coordinates: [100 + gameStructureIds.length, 100], + constructionStatus: "complete", + storedResources: stock.map((s, i) => ({ + resource: s.resourceId, + amount: s.amount, + gridX: 0, + gridY: i, + rotated: false, + })), + }, + overrideAccess: true, + depth: 0, + }); + gameStructureIds.push(site.id); + return site.id; +} + +async function storedAmountAt(siteId: number, resourceId: number): Promise { + const doc = (await payload.findByID({ + collection: "game-structures", + id: siteId, + depth: 0, + overrideAccess: true, + })) as unknown as GameStructure; + return (doc.storedResources ?? []) + .filter((r) => relId(r.resource) === resourceId) + .reduce((sum, r) => sum + r.amount, 0); +} + +type JsonObject = { [k: string]: unknown }; + +async function emitRawEvent(eventId: string, type: string, eventPayload: JsonObject): Promise { + const syncDoc = await payload.create({ + collection: "arma-sync-events", + data: { + eventId, + server: serverId, + type, + occurredAt: new Date().toISOString(), + payload: eventPayload, + }, + overrideAccess: true, + depth: 0, + }); + syncEventIds.push(syncDoc.id); + + const opEvents = await payload.find({ + collection: "operation-events", + where: { sourceEvent: { equals: syncDoc.id } }, + limit: 1, + depth: 0, + overrideAccess: true, + }); + for (const doc of opEvents.docs) opEventIds.push(doc.id); +} + +async function effectsForOperation(operationId: string) { + const effects = await payload.find({ + collection: "operation-effects", + where: { operationId: { equals: operationId } }, + limit: 20, + depth: 0, + overrideAccess: true, + }); + for (const doc of effects.docs) { + if (!opEffectIds.includes(doc.id)) opEffectIds.push(doc.id); + } + return effects.docs; +} + +async function notificationsFor(userId: number, type: string) { + const found = await payload.find({ + collection: "user-notifications", + where: { and: [{ user: { equals: userId } }, { type: { equals: type } }] }, + limit: 20, + depth: 0, + overrideAccess: true, + }); + return found.docs; +} + +async function lockerOf(userId: number): Promise { + const found = await payload.find({ + collection: "locker-storages", + where: { ownerUser: { equals: userId } }, + limit: 1, + depth: 1, + overrideAccess: true, + }); + return (found.docs[0] as unknown as LockerStorage | undefined) ?? null; +} + +async function findReservation(key: string): Promise { + const res = await payload.find({ + collection: "operation-reservations", + where: { reservationKey: { equals: key } }, + limit: 1, + depth: 0, + overrideAccess: true, + }); + return (res.docs[0] as OperationReservation | undefined) ?? null; +} + +// --------------------------------------------------------------------------- +// Setup / teardown +// --------------------------------------------------------------------------- +beforeAll(async () => { + const payloadConfig = await config; + payload = await getPayload({ config: payloadConfig }); + + const superRole = await payload.create({ + collection: "roles", + data: { name: `${RUN} Command`, slug: `${RUN}-command`, isSuperuser: true }, + overrideAccess: true, + depth: 0, + }); + roleIds.push(superRole.id); + + commandUserId = await makeUser("command", [superRole.id]); + extractorId = await makeUser("extractor"); + deathUserId = await makeUser("dead"); + fullLockerUserId = await makeUser("packed"); + malformedUserId = await makeUser("glitch"); + + const map = await payload.create({ + collection: "maps", + data: { name: `${RUN} Map`, worldSizeWidth: 8192, worldSizeHeight: 8192, basemapMode: "image" }, + overrideAccess: true, + depth: 0, + }); + mapId = map.id; + mapIds.push(map.id); + + const campaign = await payload.create({ + collection: "campaigns", + data: { + name: `${RUN} Campaign`, + summary: "Settlement test campaign", + status: "concept", + campaignMode: "custom", + }, + overrideAccess: true, + depth: 0, + }); + campaignId = campaign.id; + campaignIds.push(campaign.id); + + const mission = await payload.create({ + collection: "missions", + data: { + name: `${RUN} Mission`, + codeName: `${RUN}-mission`, + summary: "Settlement test mission", + operationType: "main", + classification: { + map: mapId, + missionType: "PvE", + campaign: campaignId, + startDateTime: new Date(Date.now() + 86_400_000).toISOString(), + estimatedDuration: 60, + }, + ownershipAndStatus: { + authors: [commandUserId], + status: "Scheduled", + visibility: "unit", + }, + missionRoles: { maxPlayers: 16 }, + gameDetails: { serverDetails: { serverIp: "127.0.0.1", serverPort: 2302 } }, + briefing: [], + }, + overrideAccess: true, + depth: 0, + }); + missionId = mission.id; + missionIds.push(mission.id); + + const server = await payload.create({ + collection: "game-servers", + data: { serverId: `${RUN}-srv`, name: `${RUN} Server`, status: "online" }, + overrideAccess: true, + depth: 0, + }); + serverId = server.id; + + const resource = await payload.create({ + collection: "resources", + data: { + name: `${RUN} Supplies`, + codeName: `${RUN}-supplies`, + approvalStatus: "in_progress", + type: "physical", + baseValue: 1, + rarity: "common", + unitOfMeasure: "kg", + massPerUnit: 1, + gridWidth: 1, + gridHeight: 1, + }, + overrideAccess: true, + depth: 0, + }); + resourceAId = resource.id; + resourceIds.push(resource.id); + + const stackableAsset = await payload.create({ + collection: "assets", + data: { + name: `${RUN} Ammo Box`, + className: `${RUN}_ammo_box`, + assetType: "magazine", + approvalStatus: "in_progress", + crafting: { craftable: false, craftingData: { craftingTimePerUnit: 1, batchSize: 1 } }, + storageDimensions: { gridWidth: 1, gridHeight: 1, stackable: true, maxStackSize: 10 }, + }, + overrideAccess: true, + depth: 0, + }); + stackableAssetId = stackableAsset.id; + assetIds.push(stackableAsset.id); + + const fillerAsset = await payload.create({ + collection: "assets", + data: { + name: `${RUN} Rifle`, + className: `${RUN}_rifle`, + assetType: "weapon", + approvalStatus: "in_progress", + crafting: { craftable: false, craftingData: { craftingTimePerUnit: 1, batchSize: 1 } }, + storageDimensions: { gridWidth: 1, gridHeight: 1, stackable: false }, + }, + overrideAccess: true, + depth: 0, + }); + fillerAssetId = fillerAsset.id; + assetIds.push(fillerAsset.id); + + const hqBlueprint = await payload.create({ + collection: "structures", + data: { + name: `${RUN} HQ Depot`, + codeName: `${RUN}-hq-depot`, + approvalStatus: "in_progress", + description: LEXICAL_EMPTY as unknown as Structure["description"], + category: "logistics", + materials: [{ resource: resourceAId, amount: 1 }], + constructionDurationMinutes: 1, + terrainType: "land", + maxHealth: 100, + }, + overrideAccess: true, + depth: 0, + }); + hqBlueprintId = hqBlueprint.id; + blueprintIds.push(hqBlueprint.id); + + const cappedBlueprint = await payload.create({ + collection: "structures", + data: { + name: `${RUN} Cramped Shed`, + codeName: `${RUN}-cramped-shed`, + approvalStatus: "in_progress", + description: LEXICAL_EMPTY as unknown as Structure["description"], + category: "logistics", + materials: [{ resource: resourceAId, amount: 1 }], + constructionDurationMinutes: 1, + terrainType: "land", + maxHealth: 100, + maxCapacityMass: 5, + }, + overrideAccess: true, + depth: 0, + }); + cappedBlueprintId = cappedBlueprint.id; + blueprintIds.push(cappedBlueprint.id); +}); + +afterAll(async () => { + if (!payload) return; + for (const id of reservationIds) { + await payload.delete({ collection: "operation-reservations", id, overrideAccess: true }).catch(() => {}); + } + for (const id of opEffectIds) { + await payload.delete({ collection: "operation-effects", id, overrideAccess: true }).catch(() => {}); + } + for (const id of opEventIds) { + await payload.delete({ collection: "operation-events", id, overrideAccess: true }).catch(() => {}); + } + for (const id of syncEventIds) { + await payload.delete({ collection: "arma-sync-events", id, overrideAccess: true }).catch(() => {}); + } + for (const id of gameStructureIds) { + await payload.delete({ collection: "game-structures", id, overrideAccess: true }).catch(() => {}); + } + for (const id of blueprintIds) { + await payload.delete({ collection: "structures", id, overrideAccess: true }).catch(() => {}); + } + for (const id of assetIds) { + await payload.delete({ collection: "assets", id, overrideAccess: true }).catch(() => {}); + } + for (const id of resourceIds) { + await payload.delete({ collection: "resources", id, overrideAccess: true }).catch(() => {}); + } + for (const id of missionIds) { + await payload.delete({ collection: "missions", id, overrideAccess: true }).catch(() => {}); + } + for (const id of campaignIds) { + await payload.delete({ collection: "campaigns", id, overrideAccess: true }).catch(() => {}); + } + for (const id of mapIds) { + await payload.delete({ collection: "maps", id, overrideAccess: true }).catch(() => {}); + } + + const eventLogs = await payload.find({ + collection: "game-event-logs", + where: { actor: { in: userIds } }, + limit: 200, + depth: 0, + overrideAccess: true, + }); + for (const doc of eventLogs.docs) { + await payload.delete({ collection: "game-event-logs", id: doc.id, overrideAccess: true }).catch(() => {}); + } + + for (const userId of userIds) { + const notifications = await payload.find({ + collection: "user-notifications", + where: { user: { equals: userId } }, + limit: 50, + depth: 0, + overrideAccess: true, + }); + for (const doc of notifications.docs) { + await payload.delete({ collection: "user-notifications", id: doc.id, overrideAccess: true }).catch(() => {}); + } + const lockers = await payload.find({ + collection: "locker-storages", + where: { ownerUser: { equals: userId } }, + limit: 5, + depth: 0, + overrideAccess: true, + }); + for (const doc of lockers.docs) { + await payload.delete({ collection: "locker-storages", id: doc.id, overrideAccess: true }).catch(() => {}); + } + const profiles = await payload.find({ + collection: "profiles", + where: { user: { equals: userId } }, + limit: 5, + depth: 0, + overrideAccess: true, + }); + for (const profile of profiles.docs) { + await payload.delete({ collection: "profiles", id: profile.id, overrideAccess: true }).catch(() => {}); + } + await payload.delete({ collection: "users", id: userId, overrideAccess: true }).catch(() => {}); + } + for (const id of roleIds) { + await payload.delete({ collection: "roles", id, overrideAccess: true }).catch(() => {}); + } + if (serverId) { + await payload.delete({ collection: "game-servers", id: serverId, overrideAccess: true }).catch(() => {}); + } +}); + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- +describe("Operation settlement", () => { + it("settles a logistics extraction into one provenance-linked HQ deposit and settles its reservation", async () => { + const operationId = `${RUN}-op-log`; + const originId = await makeStructure("origin", hqBlueprintId, [ + { resourceId: resourceAId, amount: 100 }, + ]); + const hqId = await makeStructure("hq", hqBlueprintId); + const reservationKey = `${RUN}-res-log`; + const reservation = await reserveOperationAssets(payload, { + reservationKey, + operationId, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 40 }], + originId, + }); + reservationIds.push(reservation.id); + + await emitRawEvent(`${RUN}-evt-log`, "operation.extraction", { + operationId, + version: 1, + actorId: extractorId, + kind: "logistics", + hqStructureId: hqId, + reservationKey, + items: [{ resourceId: resourceAId, amount: 25 }], + consumed: { cargo: [{ resourceId: resourceAId, amount: 15 }] }, + }); + + const effects = await effectsForOperation(operationId); + expect(effects).toHaveLength(1); + const effect = effects[0]; + expect(effect.effectType).toBe("operation.extraction-recorded"); + expect(effect.status).toBe("applied"); + expect(effect.appliedAt).toBeTruthy(); + + // Exactly one deposit: 25 units at the designated HQ, none at the origin. + expect(await storedAmountAt(hqId, resourceAId)).toBe(25); + expect(await storedAmountAt(originId, resourceAId)).toBe(100); + + // The linked reservation settled exactly once from the effect. + const settled = await findReservation(reservationKey); + expect(settled?.status).toBe("settled"); + const record = settlementOf(settled as OperationReservation); + expect(record.reason).toBe("extracted"); + expect(record.consumed.cargo).toEqual([{ resource: resourceAId, amount: 15 }]); + expect(record.returned.cargo).toEqual([{ resource: resourceAId, amount: 25 }]); + expect(record.effectId).toBe(effect.id); + expect(relId(settled?.settledByEffect)).toBe(effect.id); + + const notifications = await notificationsFor(extractorId, "operation:extraction"); + expect(notifications.length).toBeGreaterThanOrEqual(1); + }); + + it("settles a player extraction into one provenance-linked locker credit and settles its reservation", async () => { + const operationId = `${RUN}-op-player`; + const reservationKey = `${RUN}-res-player`; + const reservation = await reserveOperationAssets(payload, { + reservationKey, + operationId, + actorId: commandUserId, + missionId, + personnel: [{ userId: extractorId }], + }); + reservationIds.push(reservation.id); + + await emitRawEvent(`${RUN}-evt-player`, "operation.extraction", { + operationId, + version: 1, + actorId: extractorId, + kind: "player", + reservationKey, + items: [{ assetId: stackableAssetId, quantity: 3 }], + }); + + const effects = await effectsForOperation(operationId); + expect(effects).toHaveLength(1); + expect(effects[0].status).toBe("applied"); + + const locker = await lockerOf(extractorId); + expect(locker).not.toBeNull(); + const entries = (locker?.items ?? []).filter((e) => relId(e.asset) === stackableAssetId); + expect(entries).toHaveLength(1); + expect(entries[0].quantity).toBe(3); + + const settled = await findReservation(reservationKey); + expect(settled?.status).toBe("settled"); + const record = settlementOf(settled as OperationReservation); + expect(record.reason).toBe("extracted"); + expect(record.consumed).toEqual({ personnel: [], vehicles: [], cargo: [], budget: 0 }); + expect(record.returned.personnel).toEqual([extractorId]); + expect(record.effectId).toBe(effects[0].id); + + const notifications = await notificationsFor(extractorId, "operation:extraction"); + expect(notifications.length).toBeGreaterThanOrEqual(1); + }); + + it("applies a duplicate extraction event as a no-op with no second deposit", async () => { + const operationId = `${RUN}-op-dup`; + const hqId = await makeStructure("hq-dup", hqBlueprintId); + + const syncDoc = await payload.create({ + collection: "arma-sync-events", + data: { + eventId: `${RUN}-evt-dup`, + server: serverId, + type: "operation.extraction", + occurredAt: new Date().toISOString(), + payload: { + operationId, + version: 1, + actorId: extractorId, + kind: "logistics", + hqStructureId: hqId, + items: [{ resourceId: resourceAId, amount: 10 }], + }, + }, + overrideAccess: true, + depth: 0, + }); + syncEventIds.push(syncDoc.id); + const opEvents = await payload.find({ + collection: "operation-events", + where: { sourceEvent: { equals: syncDoc.id } }, + limit: 1, + depth: 0, + overrideAccess: true, + }); + for (const doc of opEvents.docs) opEventIds.push(doc.id); + + // A replay of the same raw event is idempotent by sourceEvent. + await processOperationEvent(payload, { + id: syncDoc.id, + eventId: syncDoc.eventId, + server: serverId, + type: syncDoc.type, + occurredAt: syncDoc.occurredAt, + payload: syncDoc.payload, + }); + + const effects = await effectsForOperation(operationId); + expect(effects).toHaveLength(1); + expect(effects[0].status).toBe("applied"); + expect(await storedAmountAt(hqId, resourceAId)).toBe(10); + }); + + it("records death loss evidence for unextracted inventory only, with no reward", async () => { + const operationId = `${RUN}-op-death`; + + await emitRawEvent(`${RUN}-evt-death`, "operation.inventory", { + operationId, + version: 1, + actorId: deathUserId, + reason: "death", + items: [{ assetId: stackableAssetId, quantity: 2 }], + }); + + const effects = await effectsForOperation(operationId); + expect(effects).toHaveLength(1); + expect(effects[0].effectType).toBe("operation.inventory-recorded"); + expect(effects[0].status).toBe("applied"); + + // No inventory was credited anywhere. + const locker = await lockerOf(deathUserId); + expect(locker).toBeNull(); + + // Loss evidence: notification + combat:death event log entry. + const notifications = await notificationsFor(deathUserId, "operation:death"); + expect(notifications).toHaveLength(1); + const deathEvents = await payload.find({ + collection: "game-event-logs", + where: { and: [{ type: { equals: "combat:death" } }, { targetId: { equals: deathUserId } }] }, + limit: 10, + depth: 0, + overrideAccess: true, + }); + expect(deathEvents.docs).toHaveLength(1); + + // No scoreboard write: the XP hook would turn any scoreboard key into XP. + const profiles = await payload.find({ + collection: "profiles", + where: { user: { equals: deathUserId } }, + limit: 1, + depth: 0, + overrideAccess: true, + }); + const scoreboard = (profiles.docs[0]?.progression?.scoreboard ?? {}) as Record; + expect(scoreboard.deaths ?? 0).toBe(0); + expect(scoreboard.infantryKills ?? 0).toBe(0); + }); + + it("fails recoverably on a full HQ with no partial deposit", async () => { + const operationId = `${RUN}-op-full-hq`; + const hqId = await makeStructure("hq-capped", cappedBlueprintId); + + await emitRawEvent(`${RUN}-evt-full-hq`, "operation.extraction", { + operationId, + version: 1, + actorId: extractorId, + kind: "logistics", + hqStructureId: hqId, + items: [{ resourceId: resourceAId, amount: 10 }], + }); + + const effects = await effectsForOperation(operationId); + expect(effects).toHaveLength(1); + expect(effects[0].status).toBe("failed"); + expect(effects[0].reconciliationNotes).toContain("hq-capacity"); + expect(await storedAmountAt(hqId, resourceAId)).toBe(0); + }); + + it("fails recoverably on a full locker with no partial credit", async () => { + const operationId = `${RUN}-op-full-locker`; + const locker = await ensureLockerStorage(payload, fullLockerUserId); + const grid = await getLockerGridDimensions(payload); + const fill = []; + for (let y = 0; y < grid.height; y++) { + for (let x = 0; x < grid.width; x++) { + fill.push({ asset: fillerAssetId, quantity: 1, gridX: x, gridY: y, rotated: false }); + } + } + await payload.update({ + collection: "locker-storages", + id: locker.id, + data: { items: fill }, + overrideAccess: true, + depth: 0, + }); + + await emitRawEvent(`${RUN}-evt-full-locker`, "operation.extraction", { + operationId, + version: 1, + actorId: fullLockerUserId, + kind: "player", + items: [{ assetId: stackableAssetId, quantity: 1 }], + }); + + const effects = await effectsForOperation(operationId); + expect(effects).toHaveLength(1); + expect(effects[0].status).toBe("failed"); + expect(effects[0].reconciliationNotes).toContain("locker-full"); + + const after = await lockerOf(fullLockerUserId); + expect(after?.items ?? []).toHaveLength(grid.width * grid.height); + }); + + it("rejects malformed and unresolved asset references without guessing", async () => { + const unresolvedOp = `${RUN}-op-unresolved`; + await emitRawEvent(`${RUN}-evt-unresolved`, "operation.extraction", { + operationId: unresolvedOp, + version: 1, + actorId: malformedUserId, + kind: "player", + items: [{ assetId: 99999999, quantity: 1 }], + }); + + const unresolvedEffects = await effectsForOperation(unresolvedOp); + expect(unresolvedEffects).toHaveLength(1); + expect(unresolvedEffects[0].status).toBe("failed"); + expect(unresolvedEffects[0].reconciliationNotes).toContain("unresolved-asset"); + + const malformedOp = `${RUN}-op-malformed`; + await emitRawEvent(`${RUN}-evt-malformed`, "operation.extraction", { + operationId: malformedOp, + version: 1, + actorId: malformedUserId, + kind: "player", + items: [{ assetId: "abc", quantity: 1 }], + }); + + const malformedEffects = await effectsForOperation(malformedOp); + expect(malformedEffects).toHaveLength(1); + expect(malformedEffects[0].status).toBe("failed"); + expect(malformedEffects[0].reconciliationNotes).toContain("malformed-asset"); + + // Nothing was credited; validation failed before the locker was even created. + expect(await lockerOf(malformedUserId)).toBeNull(); + }); + + it("preserves an extraction deposit after a later mission failure", async () => { + const operationId = `${RUN}-op-fail`; + const originId = await makeStructure("origin-fail", hqBlueprintId, [ + { resourceId: resourceAId, amount: 100 }, + ]); + const hqId = await makeStructure("hq-fail", hqBlueprintId); + + const extractedKey = `${RUN}-fail-extracted`; + const extracted = await reserveOperationAssets(payload, { + reservationKey: extractedKey, + operationId, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 10 }], + originId, + }); + reservationIds.push(extracted.id); + + const pendingKey = `${RUN}-fail-pending`; + const pending = await reserveOperationAssets(payload, { + reservationKey: pendingKey, + operationId, + actorId: commandUserId, + cargo: [{ resourceId: resourceAId, amount: 10 }], + originId, + }); + reservationIds.push(pending.id); + + await emitRawEvent(`${RUN}-evt-fail-extract`, "operation.extraction", { + operationId, + version: 1, + actorId: extractorId, + kind: "logistics", + hqStructureId: hqId, + reservationKey: extractedKey, + items: [{ resourceId: resourceAId, amount: 4 }], + consumed: { cargo: [{ resourceId: resourceAId, amount: 6 }] }, + }); + + await emitRawEvent(`${RUN}-evt-fail-end`, "operation.end", { + operationId, + version: 1, + actorId: commandUserId, + outcome: "failed", + }); + + const effects = await effectsForOperation(operationId); + expect(effects).toHaveLength(2); + const extractionEffect = effects.find((e) => e.effectType === "operation.extraction-recorded"); + const endEffect = effects.find((e) => e.effectType === "operation.ended"); + expect(extractionEffect?.status).toBe("applied"); + expect(endEffect?.status).toBe("applied"); + expect(endEffect?.reconciliationNotes).toContain("mission-failed"); + + // The deposit is final: mission failure never claws it back. + expect(await storedAmountAt(hqId, resourceAId)).toBe(4); + + // The extraction-settled reservation is untouched by the failure sweep. + const extractedDoc = await findReservation(extractedKey); + expect(extractedDoc?.status).toBe("settled"); + expect(settlementOf(extractedDoc as OperationReservation).reason).toBe("extracted"); + + // The still-reserved row settles as mission-failed via the end effect. + const failedDoc = await findReservation(pendingKey); + expect(failedDoc?.status).toBe("settled"); + const failedRecord = settlementOf(failedDoc as OperationReservation); + expect(failedRecord.reason).toBe("mission-failed"); + expect(failedRecord.returned.cargo).toEqual([{ resource: resourceAId, amount: 10 }]); + expect(failedRecord.effectId).toBe(endEffect?.id); + + // The extraction effect was never reversed. + const freshExtraction = await payload.findByID({ + collection: "operation-effects", + id: extractionEffect?.id as number, + depth: 0, + overrideAccess: true, + }); + expect(freshExtraction.status).toBe("applied"); + expect(freshExtraction.reversedBy).toBeNull(); + }); + + it("updates the AAR for an objective-only operation without touching inventory", async () => { + const operationId = `${RUN}-op-obj`; + const hqId = await makeStructure("hq-obj", hqBlueprintId); + const lockerBefore = await lockerOf(extractorId); + const countBefore = (lockerBefore?.items ?? []).reduce((sum, e) => sum + e.quantity, 0); + + await emitRawEvent(`${RUN}-evt-obj`, "operation.objective", { + operationId, + version: 1, + actorId: extractorId, + objective: { id: "obj-1", name: "Secure the depot", status: "complete" }, + }); + + const effects = await effectsForOperation(operationId); + expect(effects).toHaveLength(1); + expect(effects[0].effectType).toBe("operation.objective-updated"); + expect(effects[0].status).toBe("applied"); + + const notifications = await notificationsFor(extractorId, "operation:objective"); + expect(notifications).toHaveLength(1); + + // No inventory movement anywhere. + expect(await storedAmountAt(hqId, resourceAId)).toBe(0); + const lockerAfter = await lockerOf(extractorId); + const countAfter = (lockerAfter?.items ?? []).reduce((sum, e) => sum + e.quantity, 0); + expect(countAfter).toBe(countBefore); + }); +});