Skip to content

Commit d10f9e5

Browse files
author
Miriad
committed
feat: add content engine Sanity schemas (contentIdea, automatedVideo, sponsorLead, sponsorPool)
1 parent 19a86d6 commit d10f9e5

File tree

5 files changed

+426
-0
lines changed

5 files changed

+426
-0
lines changed

sanity.config.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ import settings from "@/sanity/schemas/singletons/settings";
4545
import sponsor from "@/sanity/schemas/documents/sponsor";
4646
import sponsorshipRequest from "@/sanity/schemas/documents/sponsorshipRequest";
4747
import youtubeUpdateTask from "@/sanity/schemas/documents/youtubeUpdateTask";
48+
import contentIdea from "@/sanity/schemas/documents/contentIdea";
49+
import automatedVideo from "@/sanity/schemas/documents/automatedVideo";
50+
import sponsorLead from "@/sanity/schemas/documents/sponsorLead";
51+
import sponsorPool from "@/sanity/schemas/documents/sponsorPool";
4852
import { resolveHref } from "@/sanity/lib/utils";
4953

5054
const homeLocation = {
@@ -142,6 +146,10 @@ export default defineConfig({
142146
youtubeUpdateTask,
143147
previewSession,
144148
sponsorshipRequest,
149+
contentIdea,
150+
automatedVideo,
151+
sponsorLead,
152+
sponsorPool,
145153
],
146154
},
147155
document: {
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
import {defineField, defineType} from 'sanity'
2+
import {HiOutlineVideoCamera} from 'react-icons/hi'
3+
4+
export default defineType({
5+
name: 'automatedVideo',
6+
title: 'Automated Video',
7+
type: 'document',
8+
icon: HiOutlineVideoCamera,
9+
fields: [
10+
defineField({
11+
name: 'title',
12+
title: 'Title',
13+
type: 'string',
14+
validation: (Rule) => Rule.required(),
15+
}),
16+
defineField({
17+
name: 'slug',
18+
title: 'Slug',
19+
type: 'slug',
20+
options: {
21+
source: 'title',
22+
},
23+
validation: (Rule) => Rule.required(),
24+
}),
25+
defineField({
26+
name: 'contentIdea',
27+
title: 'Content Idea',
28+
type: 'reference',
29+
to: [{type: 'contentIdea'}],
30+
}),
31+
defineField({
32+
name: 'script',
33+
title: 'Script',
34+
type: 'object',
35+
fields: [
36+
defineField({
37+
name: 'hook',
38+
title: 'Hook',
39+
type: 'text',
40+
validation: (Rule) => Rule.required(),
41+
}),
42+
defineField({
43+
name: 'scenes',
44+
title: 'Scenes',
45+
type: 'array',
46+
of: [
47+
{
48+
type: 'object',
49+
fields: [
50+
defineField({
51+
name: 'sceneNumber',
52+
title: 'Scene Number',
53+
type: 'number',
54+
}),
55+
defineField({
56+
name: 'narration',
57+
title: 'Narration',
58+
type: 'text',
59+
validation: (Rule) => Rule.required(),
60+
}),
61+
defineField({
62+
name: 'visualDescription',
63+
title: 'Visual Description',
64+
type: 'text',
65+
}),
66+
defineField({
67+
name: 'bRollKeywords',
68+
title: 'B-Roll Keywords',
69+
type: 'array',
70+
of: [{type: 'string'}],
71+
}),
72+
defineField({
73+
name: 'durationEstimate',
74+
title: 'Duration Estimate',
75+
type: 'number',
76+
}),
77+
],
78+
},
79+
],
80+
}),
81+
defineField({
82+
name: 'cta',
83+
title: 'Call to Action',
84+
type: 'text',
85+
validation: (Rule) => Rule.required(),
86+
}),
87+
],
88+
}),
89+
defineField({
90+
name: 'scriptQualityScore',
91+
title: 'Script Quality Score',
92+
type: 'number',
93+
}),
94+
defineField({
95+
name: 'status',
96+
title: 'Status',
97+
type: 'string',
98+
options: {
99+
list: [
100+
{title: 'Draft', value: 'draft'},
101+
{title: 'Script Ready', value: 'script_ready'},
102+
{title: 'Audio Generation', value: 'audio_gen'},
103+
{title: 'Video Generation', value: 'video_gen'},
104+
{title: 'Flagged', value: 'flagged'},
105+
{title: 'Uploading', value: 'uploading'},
106+
{title: 'Published', value: 'published'},
107+
],
108+
},
109+
initialValue: 'draft',
110+
validation: (Rule) => Rule.required(),
111+
}),
112+
defineField({
113+
name: 'audioUrl',
114+
title: 'Audio URL',
115+
type: 'url',
116+
}),
117+
defineField({
118+
name: 'videoUrl',
119+
title: 'Video URL',
120+
type: 'url',
121+
}),
122+
defineField({
123+
name: 'shortUrl',
124+
title: 'Short URL',
125+
type: 'url',
126+
}),
127+
defineField({
128+
name: 'youtubeId',
129+
title: 'YouTube ID',
130+
type: 'string',
131+
}),
132+
defineField({
133+
name: 'youtubeShortId',
134+
title: 'YouTube Short ID',
135+
type: 'string',
136+
}),
137+
defineField({
138+
name: 'scheduledPublishAt',
139+
title: 'Scheduled Publish At',
140+
type: 'datetime',
141+
}),
142+
defineField({
143+
name: 'sponsorSlot',
144+
title: 'Sponsor Slot',
145+
type: 'reference',
146+
to: [{type: 'sponsorLead'}],
147+
}),
148+
defineField({
149+
name: 'flaggedReason',
150+
title: 'Flagged Reason',
151+
type: 'text',
152+
}),
153+
],
154+
orderings: [
155+
{
156+
title: 'Status',
157+
name: 'statusAsc',
158+
by: [{field: 'status', direction: 'asc'}],
159+
},
160+
{
161+
title: 'Scheduled Publish Date',
162+
name: 'scheduledPublishAtDesc',
163+
by: [{field: 'scheduledPublishAt', direction: 'desc'}],
164+
},
165+
],
166+
preview: {
167+
select: {
168+
title: 'title',
169+
subtitle: 'status',
170+
},
171+
},
172+
})
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import {defineField, defineType} from 'sanity'
2+
import {HiOutlineLightBulb} from 'react-icons/hi'
3+
4+
export default defineType({
5+
name: 'contentIdea',
6+
title: 'Content Idea',
7+
type: 'document',
8+
icon: HiOutlineLightBulb,
9+
fields: [
10+
defineField({
11+
name: 'sourceUrl',
12+
title: 'Source URL',
13+
type: 'url',
14+
}),
15+
defineField({
16+
name: 'title',
17+
title: 'Title',
18+
type: 'string',
19+
validation: (Rule) => Rule.required(),
20+
}),
21+
defineField({
22+
name: 'summary',
23+
title: 'Summary',
24+
type: 'text',
25+
}),
26+
defineField({
27+
name: 'topics',
28+
title: 'Topics',
29+
type: 'array',
30+
of: [{type: 'string'}],
31+
}),
32+
defineField({
33+
name: 'collectedAt',
34+
title: 'Collected At',
35+
type: 'datetime',
36+
validation: (Rule) => Rule.required(),
37+
}),
38+
defineField({
39+
name: 'status',
40+
title: 'Status',
41+
type: 'string',
42+
options: {
43+
list: [
44+
{title: 'New', value: 'new'},
45+
{title: 'Approved', value: 'approved'},
46+
{title: 'Rejected', value: 'rejected'},
47+
],
48+
},
49+
initialValue: 'new',
50+
validation: (Rule) => Rule.required(),
51+
}),
52+
defineField({
53+
name: 'reasonRejected',
54+
title: 'Reason Rejected',
55+
type: 'text',
56+
}),
57+
],
58+
preview: {
59+
select: {
60+
title: 'title',
61+
subtitle: 'status',
62+
},
63+
},
64+
})
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import {defineField, defineType} from 'sanity'
2+
import {HiOutlineCurrencyDollar} from 'react-icons/hi'
3+
4+
export default defineType({
5+
name: 'sponsorLead',
6+
title: 'Sponsor Lead',
7+
type: 'document',
8+
icon: HiOutlineCurrencyDollar,
9+
fields: [
10+
defineField({
11+
name: 'companyName',
12+
title: 'Company Name',
13+
type: 'string',
14+
validation: (Rule) => Rule.required(),
15+
}),
16+
defineField({
17+
name: 'contactName',
18+
title: 'Contact Name',
19+
type: 'string',
20+
}),
21+
defineField({
22+
name: 'contactEmail',
23+
title: 'Contact Email',
24+
type: 'string',
25+
validation: (Rule) => Rule.required().email(),
26+
}),
27+
defineField({
28+
name: 'source',
29+
title: 'Source',
30+
type: 'string',
31+
options: {
32+
list: [
33+
{title: 'Inbound', value: 'inbound'},
34+
{title: 'Outbound', value: 'outbound'},
35+
],
36+
},
37+
validation: (Rule) => Rule.required(),
38+
}),
39+
defineField({
40+
name: 'status',
41+
title: 'Status',
42+
type: 'string',
43+
options: {
44+
list: [
45+
{title: 'New', value: 'new'},
46+
{title: 'Contacted', value: 'contacted'},
47+
{title: 'Replied', value: 'replied'},
48+
{title: 'Negotiating', value: 'negotiating'},
49+
{title: 'Booked', value: 'booked'},
50+
{title: 'Paid', value: 'paid'},
51+
],
52+
},
53+
initialValue: 'new',
54+
validation: (Rule) => Rule.required(),
55+
}),
56+
defineField({
57+
name: 'intent',
58+
title: 'Intent',
59+
type: 'text',
60+
}),
61+
defineField({
62+
name: 'rateCard',
63+
title: 'Rate Card',
64+
type: 'string',
65+
}),
66+
defineField({
67+
name: 'stripeInvoiceId',
68+
title: 'Stripe Invoice ID',
69+
type: 'string',
70+
}),
71+
defineField({
72+
name: 'bookedSlot',
73+
title: 'Booked Slot',
74+
type: 'reference',
75+
to: [{type: 'automatedVideo'}],
76+
}),
77+
defineField({
78+
name: 'threadId',
79+
title: 'Thread ID',
80+
type: 'string',
81+
}),
82+
defineField({
83+
name: 'lastEmailAt',
84+
title: 'Last Email At',
85+
type: 'datetime',
86+
}),
87+
defineField({
88+
name: 'notes',
89+
title: 'Notes',
90+
type: 'text',
91+
}),
92+
],
93+
preview: {
94+
select: {
95+
title: 'companyName',
96+
status: 'status',
97+
source: 'source',
98+
},
99+
prepare({title, status, source}) {
100+
return {
101+
title,
102+
subtitle: [status, source].filter(Boolean).join(' \u00b7 '),
103+
}
104+
},
105+
},
106+
})

0 commit comments

Comments
 (0)