diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 3a40e2d48..947631056 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -38,12 +38,17 @@ jobs: SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} + - name: Promote Stack to Organization Scope + run: | + pnpm exec sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force + env: + SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} + - name: Deploy Sanity Blueprints Functions run: | - pnpm exec sanity blueprints deploy --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} + pnpm exec sanity blueprints deploy --stack ${{ vars.SANITY_STUDIO_DATASET }} env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} - SANITY_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }} @@ -75,12 +80,17 @@ jobs: SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} + - name: Promote Stack to Organization Scope + run: | + pnpm exec sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force + env: + SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} + - name: Deploy Sanity Blueprints Functions run: | - pnpm exec sanity blueprints deploy --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} + pnpm exec sanity blueprints deploy --stack ${{ vars.SANITY_STUDIO_DATASET }} env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} - SANITY_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }} diff --git a/apps/sanity/functions/sync-nightly-dataset/index.ts b/apps/sanity/functions/sync-nightly-dataset/index.ts index 7095957dc..8acb9f119 100644 --- a/apps/sanity/functions/sync-nightly-dataset/index.ts +++ b/apps/sanity/functions/sync-nightly-dataset/index.ts @@ -23,6 +23,16 @@ export const handler = scheduledEventHandler(async ({ context }) => { const targetDataset = "dev"; const sourceDataset = "production"; + if ( + process.env.SANITY_STUDIO_DATASET && + process.env.SANITY_STUDIO_DATASET !== "production" + ) { + console.log( + `[Sync Nightly Dataset] Stack is "${process.env.SANITY_STUDIO_DATASET}". Nightly dataset sync only executes on production. Skipping.`, + ); + return; + } + console.log( `[Sync Nightly Dataset] Resetting dataset "${targetDataset}" from source "${sourceDataset}" for project ${projectId}...`, ); diff --git a/sanity.blueprint.ts b/sanity.blueprint.ts index aae87e0e1..5230f3936 100644 --- a/sanity.blueprint.ts +++ b/sanity.blueprint.ts @@ -1,6 +1,7 @@ import { defineBlueprint, defineDocumentFunction, + defineScheduledFunction, } from "@sanity/blueprints"; export default defineBlueprint({ @@ -8,6 +9,7 @@ export default defineBlueprint({ defineDocumentFunction({ name: "syndicate-content", displayName: "Syndicate Content (Dev.to & Hashnode)", + project: process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w", event: { on: ["create", "update"], filter: '_type in ["post", "podcast"] && !(_id in path("drafts.**"))', @@ -19,6 +21,7 @@ export default defineBlueprint({ defineDocumentFunction({ name: "sync-youtube-transcript", displayName: "Sync YouTube Transcripts & Video Intelligence", + project: process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w", event: { on: ["create", "update"], filter: 'defined(youtube) && !(_id in path("drafts.**"))', @@ -30,5 +33,22 @@ export default defineBlueprint({ YOUTUBE_API_KEY: process.env.YOUTUBE_API_KEY || "", }, }), + defineScheduledFunction({ + name: "sync-nightly-dataset", + displayName: "Nightly Dataset Sync (Production -> Dev)", + src: "./apps/sanity/functions/sync-nightly-dataset", + event: { + expression: "0 4 * * *", // 4:00 AM UTC + }, + runtime: "nodejs22.x", + timeout: 300, + env: { + SANITY_AUTH_TOKEN: process.env.SANITY_AUTH_TOKEN || "", + SANITY_STUDIO_PROJECT_ID: + process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w", + SANITY_STUDIO_DATASET: + process.env.SANITY_STUDIO_DATASET || "production", + }, + }), ], });