Next.js 16 static export + PHP 8 API for cPanel/Apache hosting. - Location-aware campus finder (IP estimate, optional precise location, ZIP search) - Three-step Plan Your Visit form with separate email/SMS consent - PHP API: validation, anti-spam, rate limiting, SQLite lead store, Mailchimp and Sinch Engage adapters, idempotent retries via cron - Attribution capture (utm_*, gclid/gbraid/wbraid, fbclid, ttclid, twclid) and consent-aware analytics hooks - Vitest and PHP test suites, cPanel deployment script and docs Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
49 lines
2.3 KiB
JSON
49 lines
2.3 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"title": "Waters Church campuses",
|
|
"type": "object",
|
|
"required": ["campuses"],
|
|
"properties": {
|
|
"campuses": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["id", "name", "label", "status", "address", "coordinates", "serviceTimes", "phone", "campusUrl", "directionsUrl"],
|
|
"properties": {
|
|
"id": { "type": "string", "pattern": "^[a-z0-9-]+$" },
|
|
"name": { "type": "string" },
|
|
"label": { "type": "string" },
|
|
"status": { "enum": ["open", "launching", "hidden"] },
|
|
"isCentral": { "type": "boolean" },
|
|
"address": {
|
|
"type": "object",
|
|
"required": ["line1", "city", "state", "postalCode"],
|
|
"properties": {
|
|
"line1": { "type": "string" }, "city": { "type": "string" },
|
|
"state": { "type": "string" }, "postalCode": { "type": "string" }
|
|
}
|
|
},
|
|
"coordinates": { "type": "object", "required": ["lat", "lng"], "properties": { "lat": { "type": "number" }, "lng": { "type": "number" } } },
|
|
"timezone": { "type": "string" },
|
|
"serviceTimes": {
|
|
"type": "array",
|
|
"items": { "type": "object", "required": ["day", "times"], "properties": { "day": { "type": "string" }, "times": { "type": "array", "items": { "type": "string" } }, "note": { "type": ["string", "null"] } } }
|
|
},
|
|
"phone": { "type": "string", "pattern": "^\\+[1-9][0-9]{6,14}$" },
|
|
"smsNumber": { "type": ["string", "null"], "pattern": "^\\+[1-9][0-9]{6,14}$" },
|
|
"sinchAccountId": { "type": ["string", "null"] },
|
|
"email": { "type": ["string", "null"] },
|
|
"campusUrl": { "type": "string", "format": "uri" },
|
|
"directionsUrl": { "type": "string", "format": "uri" },
|
|
"leader": { "type": ["object", "null"], "properties": { "title": { "type": "string" }, "name": { "type": "string" } } },
|
|
"arrivalNotes": { "type": ["string", "null"] },
|
|
"parkingNotes": { "type": ["string", "null"] },
|
|
"kidsNotes": { "type": ["string", "null"] },
|
|
"image": { "type": ["string", "null"] },
|
|
"verify": { "type": "array", "items": { "type": "string" } }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|