feat(missions): make campaign optional and track side-op creators
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
parent
6fce7c4f86
commit
4f4e2b136f
8 changed files with 46503 additions and 4 deletions
|
|
@ -206,6 +206,15 @@ export const Missions: CollectionConfig = {
|
|||
hidden: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "createdBy",
|
||||
type: "relationship",
|
||||
relationTo: "users",
|
||||
admin: {
|
||||
description:
|
||||
"Player who scheduled this mission via the Friday Ops calendar (ownership + scheduling-cap tracking). Set automatically; leave empty for staff-created missions.",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "coverImage",
|
||||
type: "upload",
|
||||
|
|
@ -244,7 +253,7 @@ export const Missions: CollectionConfig = {
|
|||
name: "campaign",
|
||||
type: "relationship",
|
||||
relationTo: "campaigns",
|
||||
required: true,
|
||||
required: false,
|
||||
},
|
||||
{
|
||||
name: "customScripts",
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ export interface MissionCardProps {
|
|||
readonly startDateTime: string;
|
||||
readonly estimatedDuration: number;
|
||||
readonly map: number | Map;
|
||||
readonly campaign: number | Campaign;
|
||||
readonly campaign?: number | Campaign | null;
|
||||
};
|
||||
readonly ownershipAndStatus: {
|
||||
readonly status:
|
||||
|
|
|
|||
23223
src/migrations/20260907_012326_add_missions_created_by.json
Normal file
23223
src/migrations/20260907_012326_add_missions_created_by.json
Normal file
File diff suppressed because it is too large
Load diff
16
src/migrations/20260907_012326_add_missions_created_by.ts
Normal file
16
src/migrations/20260907_012326_add_missions_created_by.ts
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
|
||||
|
||||
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
|
||||
await db.execute(sql`
|
||||
ALTER TABLE "missions" ADD COLUMN "created_by_id" integer;
|
||||
ALTER TABLE "missions" ADD CONSTRAINT "missions_created_by_id_users_id_fk" FOREIGN KEY ("created_by_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;
|
||||
CREATE INDEX "missions_created_by_idx" ON "missions" USING btree ("created_by_id");`)
|
||||
}
|
||||
|
||||
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
|
||||
await db.execute(sql`
|
||||
ALTER TABLE "missions" DROP CONSTRAINT "missions_created_by_id_users_id_fk";
|
||||
|
||||
DROP INDEX "missions_created_by_idx";
|
||||
ALTER TABLE "missions" DROP COLUMN "created_by_id";`)
|
||||
}
|
||||
23223
src/migrations/20260907_013724_make_missions_campaign_optional.json
Normal file
23223
src/migrations/20260907_013724_make_missions_campaign_optional.json
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,11 @@
|
|||
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
|
||||
|
||||
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
|
||||
await db.execute(sql`
|
||||
ALTER TABLE "missions" ALTER COLUMN "classification_campaign_id" DROP NOT NULL;`)
|
||||
}
|
||||
|
||||
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
|
||||
await db.execute(sql`
|
||||
ALTER TABLE "missions" ALTER COLUMN "classification_campaign_id" SET NOT NULL;`)
|
||||
}
|
||||
|
|
@ -35,6 +35,8 @@ import * as migration_20260906_065405_add_wiki_template_html from './20260906_06
|
|||
import * as migration_20260906_100908_add_market_economy_state from './20260906_100908_add_market_economy_state';
|
||||
import * as migration_20260906_165837_add_market_state_event_target from './20260906_165837_add_market_state_event_target';
|
||||
import * as migration_20260906_202925_add_voice_submissions from './20260906_202925_add_voice_submissions';
|
||||
import * as migration_20260907_012326_add_missions_created_by from './20260907_012326_add_missions_created_by';
|
||||
import * as migration_20260907_013724_make_missions_campaign_optional from './20260907_013724_make_missions_campaign_optional';
|
||||
|
||||
export const migrations = [
|
||||
{
|
||||
|
|
@ -220,6 +222,16 @@ export const migrations = [
|
|||
{
|
||||
up: migration_20260906_202925_add_voice_submissions.up,
|
||||
down: migration_20260906_202925_add_voice_submissions.down,
|
||||
name: '20260906_202925_add_voice_submissions'
|
||||
name: '20260906_202925_add_voice_submissions',
|
||||
},
|
||||
{
|
||||
up: migration_20260907_012326_add_missions_created_by.up,
|
||||
down: migration_20260907_012326_add_missions_created_by.down,
|
||||
name: '20260907_012326_add_missions_created_by',
|
||||
},
|
||||
{
|
||||
up: migration_20260907_013724_make_missions_campaign_optional.up,
|
||||
down: migration_20260907_013724_make_missions_campaign_optional.down,
|
||||
name: '20260907_013724_make_missions_campaign_optional'
|
||||
},
|
||||
];
|
||||
|
|
|
|||
|
|
@ -2376,6 +2376,10 @@ export interface Mission {
|
|||
* When evaluation reminder DMs were sent for this mission (managed by the bot, one-shot).
|
||||
*/
|
||||
evaluationRemindersSentAt?: string | null;
|
||||
/**
|
||||
* Player who scheduled this mission via the Friday Ops calendar (ownership + scheduling-cap tracking). Set automatically; leave empty for staff-created missions.
|
||||
*/
|
||||
createdBy?: (number | null) | User;
|
||||
/**
|
||||
* Background image for the mission page hero header. Renders translucent with a top-to-bottom fade to black. Recommended aspect ratio: 16:9 or wider.
|
||||
*/
|
||||
|
|
@ -2383,7 +2387,7 @@ export interface Mission {
|
|||
classification: {
|
||||
map: number | Map;
|
||||
missionType: 'Zeus' | 'PvE' | 'PvP' | 'PvPvE' | 'Training' | 'Special';
|
||||
campaign: number | Campaign;
|
||||
campaign?: (number | null) | Campaign;
|
||||
/**
|
||||
* This mission contains custom SQF scripts.
|
||||
*/
|
||||
|
|
@ -4468,6 +4472,7 @@ export interface MissionsSelect<T extends boolean = true> {
|
|||
discordAttendanceHash?: T;
|
||||
discordAttendanceSentAt?: T;
|
||||
evaluationRemindersSentAt?: T;
|
||||
createdBy?: T;
|
||||
coverImage?: T;
|
||||
classification?:
|
||||
| T
|
||||
|
|
|
|||
Loading…
Reference in a new issue