diff --git a/apps/charterafrica/payload.config.ts b/apps/charterafrica/payload.config.ts index a23b8117a..754a6f198 100644 --- a/apps/charterafrica/payload.config.ts +++ b/apps/charterafrica/payload.config.ts @@ -79,7 +79,7 @@ export default buildConfig({ editor: slateEditor({}), db: mongooseAdapter({ url: process.env.MONGO_URL, - migrationDir: "./migrations/v2", + migrationDir: "./src/migrations", }), collections: [ Authors, @@ -111,12 +111,12 @@ export default buildConfig({ ] as GlobalConfig[], ...(locales?.length ? { - localization: { - locales, - defaultLocale, - fallback: true, - }, - } + localization: { + locales, + defaultLocale, + fallback: true, + }, + } : undefined), admin: { diff --git a/apps/charterafrica/server.ts b/apps/charterafrica/server.ts index 2a1f2e85e..791f2c7b5 100644 --- a/apps/charterafrica/server.ts +++ b/apps/charterafrica/server.ts @@ -7,9 +7,6 @@ import next from "next"; import nodemailerSendgrid from "nodemailer-sendgrid"; import payload from "payload"; import { Payload } from "payload/dist/payload"; -import dotenv from "dotenv"; - -dotenv.config({ path: path.resolve(__dirname, "./.env.local") }); const projectDir = process.cwd(); loadEnvConfig(projectDir); @@ -40,15 +37,15 @@ const start = async (): Promise => { localPayload = await payload.init({ ...(sendGridAPIKey ? { - email: { - transportOptions: nodemailerSendgrid({ - apiKey: sendGridAPIKey, - }), - fromName: process.env.SENDGRID_FROM_NAME || "Admin", - fromAddress: - process.env.SENDGRID_FROM_EMAIL || "admin@example.com", - }, - } + email: { + transportOptions: nodemailerSendgrid({ + apiKey: sendGridAPIKey, + }), + fromName: process.env.SENDGRID_FROM_NAME || "Admin", + fromAddress: + process.env.SENDGRID_FROM_EMAIL || "admin@example.com", + }, + } : undefined), secret: process.env.PAYLOAD_SECRET_KEY, express: server, diff --git a/apps/charterafrica/src/migrations/20240110_095710_versions_v1_v2.ts b/apps/charterafrica/src/migrations/20240110_095710_versions_v1_v2.ts new file mode 100644 index 000000000..b25834db3 --- /dev/null +++ b/apps/charterafrica/src/migrations/20240110_095710_versions_v1_v2.ts @@ -0,0 +1,107 @@ +import { + MigrateUpArgs, + MigrateDownArgs, +} from "@payloadcms/db-mongodb"; + +export async function up({ payload }: MigrateUpArgs): Promise { + async function migrateCollectionDocs(slug: string, docsAtATime = 100) { + const VersionsModel = payload.db.versions[slug] + const remainingDocs = await VersionsModel.aggregate( + [ + // Sort so that newest are first + { + $sort: { + updatedAt: -1, + }, + }, + // Group by parent ID + // take the $first of each + { + $group: { + _id: '$parent', + _versionID: { $first: '$_id' }, + createdAt: { $first: '$createdAt' }, + latest: { $first: '$latest' }, + updatedAt: { $first: '$updatedAt' }, + version: { $first: '$version' }, + }, + }, + { + $match: { + latest: { $eq: null }, + }, + }, + { + $limit: docsAtATime, + }, + ], + { + allowDiskUse: true, + }, + ).exec() + + if (!remainingDocs || remainingDocs.length === 0) { + const newVersions = await VersionsModel.find({ + latest: { + $eq: true, + }, + }) + + if (newVersions?.length) { + payload.logger.info( + `Migrated ${newVersions.length} documents in the "${slug}" versions collection.`, + ) + } + + return + } + + const remainingDocIds = remainingDocs.map((doc) => doc._versionID) + + await VersionsModel.updateMany( + { + _id: { + $in: remainingDocIds, + }, + }, + { + latest: true, + }, + ) + + await migrateCollectionDocs(slug) + } + + // For each collection + await Promise.all( + payload.config.collections.map(async ({ slug, versions }) => { + if (versions?.drafts) { + return migrateCollectionDocs(slug) + } + }), + ) + + // For each global + await Promise.all( + payload.config.globals.map(async ({ slug, versions }) => { + if (versions) { + const VersionsModel = payload.db.versions[slug] + + await VersionsModel.findOneAndUpdate( + {}, + { latest: true }, + { + sort: { updatedAt: -1 }, + }, + ).exec() + + payload.logger.info(`Migrated the "${slug}" global.`) + } + }), + ) + +}; + +export async function down({ payload }: MigrateDownArgs): Promise { + // Migration code +};