Skip to content

Commit e9674e6

Browse files
Han2-RoMrGreenTea
andauthored
Add validation logic (#37)
* feat(app): require content if slug is not null * feat(app): check if start so before or equal to end * feat(app): validate slug allow empty slug and more helpful description * fix: seeding failing validation --------- Co-authored-by: Jonas <jonas@bulik.dev>
1 parent d80c768 commit e9674e6

3 files changed

Lines changed: 46 additions & 15 deletions

File tree

src/collections/Events.ts

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,44 @@ export const Events: CollectionConfig = {
4444
displayFormat: "dd.MM.yyyy",
4545
},
4646
},
47+
validate: (value: string, options) => {
48+
if (options.siblingData.start > value) {
49+
return "Das Enddatum muss nach dem Startdatum sein.";
50+
} else {
51+
return true;
52+
}
53+
},
4754
required: true,
4855
},
4956
{
50-
name: "timetable",
57+
name: "shortDescription",
58+
type: "text",
59+
required: true,
60+
},
61+
{
62+
name: "calendarCover",
5163
type: "relationship",
5264
relationTo: ["media"],
65+
required: true,
5366
},
5467
{
55-
name: "shortDescription",
68+
name: "slug",
5669
type: "text",
57-
required: true,
70+
required: false,
71+
unique: true,
72+
admin: {
73+
description: ({ value }: { value?: unknown }) =>
74+
value
75+
? `Eventseite erreichbar unter: https://youngvision.org/events/${value ?? ""} Entferne den slug um keine Eventseite zu generieren.`
76+
: "Es wird keine Eventseite erstellt, weil der slug leer ist."
77+
},
78+
validate(value: string, options) {
79+
if (value && value.match(/^[a-z0-9][a-z0-9\-]+[a-z0-9]$/) == null) {
80+
return "Es sind nur Kleinbuchstaben(a-z), Ziffern(0-9) und Bindestriche(-) erlaubt. Der slug muss mindestens 3 Zeichen lang sein. Bindestriche dürfen nich am Anfang oder Ende sein.";
81+
} else {
82+
return true;
83+
}
84+
}
5885
},
5986
{
6087
name: "address",
@@ -99,6 +126,12 @@ export const Events: CollectionConfig = {
99126
name: "content",
100127
type: "richText",
101128
required: false,
129+
validate: (value: string, options) => {
130+
if (options.data.slug && !value) {
131+
return "Bitte füge einen Text hinzu oder deaktiviere die Eventseite (slug löschen).";
132+
}
133+
return true;
134+
},
102135
editor: lexicalEditor({
103136
features: ({ defaultFeatures }) => [
104137
...defaultFeatures,
@@ -144,22 +177,12 @@ export const Events: CollectionConfig = {
144177
required: false,
145178
},
146179
{
147-
name: "slug",
148-
type: "text",
149-
required: false,
150-
admin: {
151-
description: ({ value }: { value?: unknown }) =>
152-
`Erreichbar unter: https://youngvision.org/events/${value ?? ""}`,
153-
},
154-
},
155-
{
156-
name: "calendarCover",
180+
name: "heroImage",
157181
type: "relationship",
158182
relationTo: ["media"],
159-
required: true,
160183
},
161184
{
162-
name: "heroImage",
185+
name: "timetable",
163186
type: "relationship",
164187
relationTo: ["media"],
165188
},

src/seed/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ async function create_events(images: (String | Number)[], payload: Payload) {
5555
audience: 'A-Z',
5656
cost: '123€',
5757
contentTitle: 'Silvester Whoop whoop',
58+
content: 'Silvester gonna be good',
5859
calendarCover: {
5960
relationTo: 'media',
6061
value: images[0],

src/validations.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export function require_if_slug(value: string, options) {
2+
if (options.data.slug && !value) {
3+
return "Dieses Feld ist erfordelich für die Eventseite.";
4+
} else {
5+
return true;
6+
}
7+
}

0 commit comments

Comments
 (0)