Skip to content

Commit 377b4c0

Browse files
authored
feat(sanity): add scheduled cron function for nightly dataset sync with org-scoped stack (#700)
1 parent 243d65b commit 377b4c0

3 files changed

Lines changed: 44 additions & 4 deletions

File tree

‎.github/workflows/deploy.yml‎

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,17 @@ jobs:
3838
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
3939
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
4040

41+
- name: Promote Stack to Organization Scope
42+
run: |
43+
pnpm exec sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force
44+
env:
45+
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
46+
4147
- name: Deploy Sanity Blueprints Functions
4248
run: |
43-
pnpm exec sanity blueprints deploy --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }}
49+
pnpm exec sanity blueprints deploy --stack ${{ vars.SANITY_STUDIO_DATASET }}
4450
env:
4551
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
46-
SANITY_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
4752
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
4853
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
4954
YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }}
@@ -75,12 +80,17 @@ jobs:
7580
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
7681
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
7782

83+
- name: Promote Stack to Organization Scope
84+
run: |
85+
pnpm exec sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force
86+
env:
87+
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
88+
7889
- name: Deploy Sanity Blueprints Functions
7990
run: |
80-
pnpm exec sanity blueprints deploy --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }}
91+
pnpm exec sanity blueprints deploy --stack ${{ vars.SANITY_STUDIO_DATASET }}
8192
env:
8293
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
83-
SANITY_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
8494
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
8595
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
8696
YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }}

‎apps/sanity/functions/sync-nightly-dataset/index.ts‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ export const handler = scheduledEventHandler(async ({ context }) => {
2323
const targetDataset = "dev";
2424
const sourceDataset = "production";
2525

26+
if (
27+
process.env.SANITY_STUDIO_DATASET &&
28+
process.env.SANITY_STUDIO_DATASET !== "production"
29+
) {
30+
console.log(
31+
`[Sync Nightly Dataset] Stack is "${process.env.SANITY_STUDIO_DATASET}". Nightly dataset sync only executes on production. Skipping.`,
32+
);
33+
return;
34+
}
35+
2636
console.log(
2737
`[Sync Nightly Dataset] Resetting dataset "${targetDataset}" from source "${sourceDataset}" for project ${projectId}...`,
2838
);

‎sanity.blueprint.ts‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import {
22
defineBlueprint,
33
defineDocumentFunction,
4+
defineScheduledFunction,
45
} from "@sanity/blueprints";
56

67
export default defineBlueprint({
78
resources: [
89
defineDocumentFunction({
910
name: "syndicate-content",
1011
displayName: "Syndicate Content (Dev.to & Hashnode)",
12+
project: process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w",
1113
event: {
1214
on: ["create", "update"],
1315
filter: '_type in ["post", "podcast"] && !(_id in path("drafts.**"))',
@@ -19,6 +21,7 @@ export default defineBlueprint({
1921
defineDocumentFunction({
2022
name: "sync-youtube-transcript",
2123
displayName: "Sync YouTube Transcripts & Video Intelligence",
24+
project: process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w",
2225
event: {
2326
on: ["create", "update"],
2427
filter: 'defined(youtube) && !(_id in path("drafts.**"))',
@@ -30,5 +33,22 @@ export default defineBlueprint({
3033
YOUTUBE_API_KEY: process.env.YOUTUBE_API_KEY || "",
3134
},
3235
}),
36+
defineScheduledFunction({
37+
name: "sync-nightly-dataset",
38+
displayName: "Nightly Dataset Sync (Production -> Dev)",
39+
src: "./apps/sanity/functions/sync-nightly-dataset",
40+
event: {
41+
expression: "0 4 * * *", // 4:00 AM UTC
42+
},
43+
runtime: "nodejs22.x",
44+
timeout: 300,
45+
env: {
46+
SANITY_AUTH_TOKEN: process.env.SANITY_AUTH_TOKEN || "",
47+
SANITY_STUDIO_PROJECT_ID:
48+
process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w",
49+
SANITY_STUDIO_DATASET:
50+
process.env.SANITY_STUDIO_DATASET || "production",
51+
},
52+
}),
3353
],
3454
});

0 commit comments

Comments
 (0)