Skip to content

Commit

Permalink
update migrations
Browse files Browse the repository at this point in the history
  • Loading branch information
koechkevin committed Jan 10, 2024
1 parent b3f8cab commit 594c216
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 19 deletions.
14 changes: 7 additions & 7 deletions apps/charterafrica/payload.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export default buildConfig({
editor: slateEditor({}),
db: mongooseAdapter({
url: process.env.MONGO_URL,
migrationDir: "./migrations/v2",
migrationDir: "./src/migrations",
}),
collections: [
Authors,
Expand Down Expand Up @@ -111,12 +111,12 @@ export default buildConfig({
] as GlobalConfig[],
...(locales?.length
? {
localization: {
locales,
defaultLocale,
fallback: true,
},
}
localization: {
locales,
defaultLocale,
fallback: true,
},
}
: undefined),

admin: {
Expand Down
21 changes: 9 additions & 12 deletions apps/charterafrica/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -40,15 +37,15 @@ const start = async (): Promise<void> => {
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,
Expand Down
107 changes: 107 additions & 0 deletions apps/charterafrica/src/migrations/20240110_095710_versions_v1_v2.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import {
MigrateUpArgs,
MigrateDownArgs,
} from "@payloadcms/db-mongodb";

export async function up({ payload }: MigrateUpArgs): Promise<void> {
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<void> {
// Migration code
};

0 comments on commit 594c216

Please sign in to comment.