1
0
Fork 0

feat(server): add game-server sync collections

Add GameServers, ArmaSyncEvents and ArmaCommands collections plus registration in payload config and regenerated types.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
Jason Fraley 2026-08-23 18:51:24 -04:00
parent bfb3e1495a
commit 347cbdf956
5 changed files with 192 additions and 0 deletions

View file

@ -0,0 +1,18 @@
import { CollectionConfig } from "payload";
export const ArmaCommands: CollectionConfig = {
slug: "arma-commands",
admin: { group: "Server", useAsTitle: "commandId", defaultColumns: ["commandId", "type", "status", "server"] },
access: { read: ({ req }) => !!req.user, create: () => false, update: () => false, delete: () => false },
fields: [
{ name: "commandId", type: "text", required: true, unique: true, index: true },
{ name: "server", type: "relationship", relationTo: "game-servers", required: true, index: true },
{ name: "type", type: "text", required: true },
{ name: "payload", type: "json", required: true },
{ name: "status", type: "select", required: true, defaultValue: "queued", options: ["queued", "delivered", "succeeded", "failed"] },
{ name: "result", type: "json" },
{ name: "error", type: "text" },
{ name: "deliveredAt", type: "date" },
{ name: "completedAt", type: "date" },
],
};

View file

@ -0,0 +1,14 @@
import { CollectionConfig } from "payload";
export const ArmaSyncEvents: CollectionConfig = {
slug: "arma-sync-events",
admin: { group: "Server", useAsTitle: "eventId", defaultColumns: ["eventId", "type", "server", "occurredAt"] },
access: { read: ({ req }) => !!req.user, create: () => false, update: () => false, delete: () => false },
fields: [
{ name: "eventId", type: "text", required: true, unique: true, index: true },
{ name: "server", type: "relationship", relationTo: "game-servers", required: true, index: true },
{ name: "type", type: "text", required: true, index: true },
{ name: "occurredAt", type: "date", required: true },
{ name: "payload", type: "json", required: true },
],
};

View file

@ -0,0 +1,14 @@
import { CollectionConfig } from "payload";
export const GameServers: CollectionConfig = {
slug: "game-servers",
admin: { group: "Server", useAsTitle: "name", defaultColumns: ["name", "serverId", "status", "lastSeenAt"] },
access: { read: ({ req }) => !!req.user, create: () => false, update: () => false, delete: () => false },
fields: [
{ name: "serverId", type: "text", required: true, unique: true, index: true },
{ name: "name", type: "text", required: true },
{ name: "status", type: "select", required: true, defaultValue: "offline", options: ["online", "offline"] },
{ name: "lastSeenAt", type: "date" },
{ name: "metadata", type: "json" },
],
};

View file

@ -108,6 +108,9 @@ export interface Config {
'narrative-events': NarrativeEvent;
'mission-files': MissionFile;
'mod-lists': ModList;
'game-servers': GameServer;
'arma-sync-events': ArmaSyncEvent;
'arma-commands': ArmaCommand;
'plugin-ai-instructions': PluginAiInstruction;
'payload-kv': PayloadKv;
'payload-locked-documents': PayloadLockedDocument;
@ -164,6 +167,9 @@ export interface Config {
'narrative-events': NarrativeEventsSelect<false> | NarrativeEventsSelect<true>;
'mission-files': MissionFilesSelect<false> | MissionFilesSelect<true>;
'mod-lists': ModListsSelect<false> | ModListsSelect<true>;
'game-servers': GameServersSelect<false> | GameServersSelect<true>;
'arma-sync-events': ArmaSyncEventsSelect<false> | ArmaSyncEventsSelect<true>;
'arma-commands': ArmaCommandsSelect<false> | ArmaCommandsSelect<true>;
'plugin-ai-instructions': PluginAiInstructionsSelect<false> | PluginAiInstructionsSelect<true>;
'payload-kv': PayloadKvSelect<false> | PayloadKvSelect<true>;
'payload-locked-documents': PayloadLockedDocumentsSelect<false> | PayloadLockedDocumentsSelect<true>;
@ -2746,6 +2752,84 @@ export interface NarrativeEvent {
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "game-servers".
*/
export interface GameServer {
id: number;
serverId: string;
name: string;
status: 'online' | 'offline';
lastSeenAt?: string | null;
metadata?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "arma-sync-events".
*/
export interface ArmaSyncEvent {
id: number;
eventId: string;
server: number | GameServer;
type: string;
occurredAt: string;
payload:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "arma-commands".
*/
export interface ArmaCommand {
id: number;
commandId: string;
server: number | GameServer;
type: string;
payload:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
status: 'queued' | 'delivered' | 'succeeded' | 'failed';
result?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
error?: string | null;
deliveredAt?: string | null;
completedAt?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "plugin-ai-instructions".
@ -2975,6 +3059,18 @@ export interface PayloadLockedDocument {
relationTo: 'mod-lists';
value: number | ModList;
} | null)
| ({
relationTo: 'game-servers';
value: number | GameServer;
} | null)
| ({
relationTo: 'arma-sync-events';
value: number | ArmaSyncEvent;
} | null)
| ({
relationTo: 'arma-commands';
value: number | ArmaCommand;
} | null)
| ({
relationTo: 'plugin-ai-instructions';
value: number | PluginAiInstruction;
@ -3183,6 +3279,7 @@ export interface UsersSelect<T extends boolean = true> {
showCallsign?: T;
leadOrActual?: T;
showVersionOverlay?: T;
xpDisplayMini?: T;
};
discord?:
| T
@ -4196,6 +4293,49 @@ export interface ModListsSelect<T extends boolean = true> {
focalX?: T;
focalY?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "game-servers_select".
*/
export interface GameServersSelect<T extends boolean = true> {
serverId?: T;
name?: T;
status?: T;
lastSeenAt?: T;
metadata?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "arma-sync-events_select".
*/
export interface ArmaSyncEventsSelect<T extends boolean = true> {
eventId?: T;
server?: T;
type?: T;
occurredAt?: T;
payload?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "arma-commands_select".
*/
export interface ArmaCommandsSelect<T extends boolean = true> {
commandId?: T;
server?: T;
type?: T;
payload?: T;
status?: T;
result?: T;
error?: T;
deliveredAt?: T;
completedAt?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "plugin-ai-instructions_select".

View file

@ -19,6 +19,9 @@ import { Campaigns } from "@/collections/intelligence/Campaigns";
import { Qualifications } from "@/collections/users/Qualifications";
import { MissionFiles } from "@/collections/server/MissionFiles";
import { ModLists } from "@/collections/server/ModLists";
import { GameServers } from "@/collections/server/GameServers";
import { ArmaSyncEvents } from "@/collections/server/ArmaSyncEvents";
import { ArmaCommands } from "@/collections/server/ArmaCommands";
import { Factions } from "@/collections/intelligence/Factions";
import { Assets } from "@/collections/logistics/Assets";
import { NarrativeEvents } from "@/collections/world/NarrativeEvents";
@ -247,6 +250,9 @@ export default buildConfig({
// Server
MissionFiles,
ModLists,
GameServers,
ArmaSyncEvents,
ArmaCommands,
],
editor: lexicalEditor({
features: ({ rootFeatures }) => {