feat(missions): add generate-mission bin for next Saturday template
This commit is contained in:
parent
f065aa6796
commit
ad774121b0
2 changed files with 91 additions and 0 deletions
|
|
@ -155,6 +155,10 @@ export default buildConfig({
|
||||||
scriptPath: path.resolve(dirname, "scripts/marketTick.ts"),
|
scriptPath: path.resolve(dirname, "scripts/marketTick.ts"),
|
||||||
key: "market-tick",
|
key: "market-tick",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
scriptPath: path.resolve(dirname, "scripts/generateNextMission.ts"),
|
||||||
|
key: "generate-mission",
|
||||||
|
},
|
||||||
],
|
],
|
||||||
plugins: [
|
plugins: [
|
||||||
// payloadCloudPlugin(),
|
// payloadCloudPlugin(),
|
||||||
|
|
|
||||||
87
src/scripts/generateNextMission.ts
Normal file
87
src/scripts/generateNextMission.ts
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
import type { SanitizedConfig } from "payload";
|
||||||
|
import { getPayload } from "payload";
|
||||||
|
|
||||||
|
export const script = async (config: SanitizedConfig) => {
|
||||||
|
const payload = await getPayload({ config });
|
||||||
|
|
||||||
|
payload.logger.info(
|
||||||
|
"[Generate Mission] Starting next mission template generation...",
|
||||||
|
);
|
||||||
|
|
||||||
|
const latest = await payload.find({
|
||||||
|
collection: "missions",
|
||||||
|
where: { operationType: { equals: "main" } },
|
||||||
|
sort: "-createdAt",
|
||||||
|
limit: 1,
|
||||||
|
depth: 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
const source = latest.docs[0];
|
||||||
|
if (!source) {
|
||||||
|
payload.logger.info(
|
||||||
|
'[Generate Mission] No "main" operation mission found; skipping. Create the first one manually.',
|
||||||
|
);
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Same logic as the Missions collection startDateTime default: the upcoming
|
||||||
|
// Saturday at 20:00, always at least a week out.
|
||||||
|
const today = new Date();
|
||||||
|
const day = today.getDay();
|
||||||
|
const diff = (6 - day) % 7;
|
||||||
|
const nextSaturday = new Date(today);
|
||||||
|
nextSaturday.setDate(today.getDate() + diff + 7);
|
||||||
|
nextSaturday.setHours(20, 0, 0, 0);
|
||||||
|
|
||||||
|
const dateStamp = [
|
||||||
|
nextSaturday.getFullYear(),
|
||||||
|
String(nextSaturday.getMonth() + 1).padStart(2, "0"),
|
||||||
|
String(nextSaturday.getDate()).padStart(2, "0"),
|
||||||
|
].join("");
|
||||||
|
|
||||||
|
const codeName = `${source.codeName}-${dateStamp}`;
|
||||||
|
|
||||||
|
const existing = await payload.find({
|
||||||
|
collection: "missions",
|
||||||
|
where: { codeName: { equals: codeName } },
|
||||||
|
limit: 1,
|
||||||
|
depth: 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (existing.docs.length > 0) {
|
||||||
|
payload.logger.info(
|
||||||
|
`[Generate Mission] Mission with codeName "${codeName}" already exists; skipping.`,
|
||||||
|
);
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
const {
|
||||||
|
id: _sourceId,
|
||||||
|
createdAt: _sourceCreatedAt,
|
||||||
|
updatedAt: _sourceUpdatedAt,
|
||||||
|
...template
|
||||||
|
} = source;
|
||||||
|
|
||||||
|
const mission = await payload.create({
|
||||||
|
collection: "missions",
|
||||||
|
data: {
|
||||||
|
...template,
|
||||||
|
codeName,
|
||||||
|
classification: {
|
||||||
|
...template.classification,
|
||||||
|
startDateTime: nextSaturday.toISOString(),
|
||||||
|
},
|
||||||
|
ownershipAndStatus: {
|
||||||
|
...template.ownershipAndStatus,
|
||||||
|
status: "Concept",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
overrideAccess: true,
|
||||||
|
depth: 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
payload.logger.info(
|
||||||
|
`[Generate Mission] Created next mission template: id=${mission.id} name="${mission.name}" codeName="${mission.codeName}" startDateTime=${mission.classification.startDateTime}`,
|
||||||
|
);
|
||||||
|
process.exit(0);
|
||||||
|
};
|
||||||
Loading…
Reference in a new issue