S2a: purge legacy Form Builder PHP code and routes
This commit is contained in:
120
dev-docs/API.md
120
dev-docs/API.md
@@ -605,30 +605,6 @@ Response: `{ "confirmed": 2, "errors": [{ "match_id": "ulid3", "error": "User al
|
||||
- `GET /organisations/{org}/events/{event}/persons?tag={person_tag_id}` — filter persons by single tag
|
||||
- `GET /organisations/{org}/events/{event}/persons?tags=ulid1,ulid2` — filter persons by multiple tags (AND logic: must have all)
|
||||
|
||||
## Public Registration Data
|
||||
|
||||
- `GET /public/events/{slug}/registration-data` — public, no auth. Returns event info, available sections, and volunteer time slots for the registration form. Only returns events with status `registration_open`. Only includes sections with `show_in_registration = true` and `type = standard`. For festivals: returns child event sections only (deduplicated by name), excluding parent operational sections. Only includes time slots with `person_type = VOLUNTEER`. Resolves sub-events to parent festival.
|
||||
|
||||
### Response
|
||||
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"event": { "id": "01JXYZ...", "name": "Echt Feesten 2026", "start_date": "2026-07-10", "end_date": "2026-07-12", "organisation_id": "01JXYZ..." },
|
||||
"sections": [{ "id": "01JXYZ...", "name": "Hoofdpodium Bar", "category": "Bar", "icon": "tabler-glass", "registration_description": "Tap bier en drankjes voor festivalgangers" }],
|
||||
"time_slots": [{ "id": "01JXYZ...", "name": "Vrijdag Avond", "date": "2026-07-10", "start_time": "18:00:00", "end_time": "02:00:00", "duration_hours": 8 }]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Error Responses
|
||||
|
||||
- `404` — Event not found or not accepting registrations
|
||||
|
||||
## Volunteer Registration
|
||||
|
||||
- `POST /events/{event}/volunteer-register` — public, auth-aware (optional Sanctum). Registers a volunteer for an event. Resolves sub-events to the parent festival. Accepts name, email, phone, tshirt_size, motivation, section_preferences, availabilities. Authenticated users have their name/email taken from the auth token. Returns `PersonResource` (201 on new, 200 on re-registration of rejected person).
|
||||
|
||||
## Portal
|
||||
|
||||
- `POST /portal/token-auth` — public. Validates a portal token against artists/production_requests tables. Returns `{ context, data, event }` on success. Returns 501 if token tables don't exist yet, 401 if token is invalid.
|
||||
@@ -675,99 +651,27 @@ Response: `{ "confirmed": 2, "errors": [{ "match_id": "ulid3", "error": "User al
|
||||
}
|
||||
```
|
||||
|
||||
## Registration Field Templates (Organisation Settings)
|
||||
## Form Builder
|
||||
|
||||
- `GET /organisations/{org}/registration-field-templates` — list active templates (ordered)
|
||||
- `POST /organisations/{org}/registration-field-templates` — create template
|
||||
- `PUT /organisations/{org}/registration-field-templates/{template}` — update template
|
||||
- `DELETE /organisations/{org}/registration-field-templates/{template}` — delete (org-created) or deactivate (system)
|
||||
|
||||
> Templates: organisation-level reusable field definitions. System templates
|
||||
> are seeded on org creation. Org-admins can customize and add their own.
|
||||
|
||||
## Registration Form Fields (Event Settings)
|
||||
|
||||
- `GET /organisations/{org}/events/{event}/registration-fields` — list all fields (ordered by sort_order)
|
||||
- `POST /organisations/{org}/events/{event}/registration-fields` — create field (manually or from template)
|
||||
- `POST /organisations/{org}/events/{event}/registration-fields/from-template` — create field from template
|
||||
- `PUT /organisations/{org}/events/{event}/registration-fields/{field}` — update field
|
||||
- `DELETE /organisations/{org}/events/{event}/registration-fields/{field}` — delete field definition (answers preserved)
|
||||
- `POST /organisations/{org}/events/{event}/registration-fields/reorder` — bulk reorder
|
||||
- `POST /organisations/{org}/events/{event}/registration-fields/import-from-event` — copy fields from another event
|
||||
|
||||
### From-Template Body
|
||||
|
||||
```json
|
||||
{ "template_id": "ulid" }
|
||||
```
|
||||
|
||||
Creates a COPY of the template as an event field. The copy is independent — changes don't propagate back to the template.
|
||||
|
||||
### Import Body
|
||||
|
||||
```json
|
||||
{ "source_event_id": "ulid" }
|
||||
```
|
||||
|
||||
Copies all `registration_form_fields` from the source event. Source must belong to the same organisation. Existing fields on the target event are kept.
|
||||
|
||||
### Response Fields
|
||||
|
||||
Each registration form field response includes:
|
||||
|
||||
- `options` — raw stored format (string array or object array, for backwards compatibility)
|
||||
- `normalized_options` — always `[{label, description}]` format (null when field has no options). Descriptions are null when not set. Use this for rendering.
|
||||
- `display_width` — `"full"` or `"half"`, controls form layout column width. Auto-set based on field type when not explicitly provided.
|
||||
|
||||
### Tag Picker Fields
|
||||
|
||||
For `tag_picker` fields: the API response includes `available_tags` array (from `person_tags`, filtered by `tag_category` if set) so the frontend knows which tags to render as options.
|
||||
|
||||
## Person Field Values
|
||||
|
||||
- `GET /organisations/{org}/events/{event}/persons/{person}/field-values` — all answers for a person
|
||||
- `PUT /organisations/{org}/events/{event}/persons/{person}/field-values` — bulk upsert answers
|
||||
|
||||
### Bulk Upsert Body
|
||||
|
||||
```json
|
||||
{
|
||||
"values": {
|
||||
"field_slug": "value_or_array",
|
||||
"shirtmaat": "L",
|
||||
"dieetwensen": ["Vegetarisch", "Glutenvrij"],
|
||||
"certificaten": ["01JXYZ...", "01JABC..."]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Replaces all field values for this person in one request. Used by both the registration form and the organiser backend. For `tag_picker` fields: values are arrays of `person_tag_id` ULIDs. If person has a `user_id`, tag sync is triggered automatically.
|
||||
|
||||
## Person Section Preferences
|
||||
|
||||
- `GET /organisations/{org}/events/{event}/persons/{person}/section-preferences` — list preferences
|
||||
- `PUT /organisations/{org}/events/{event}/persons/{person}/section-preferences` — replace all preferences
|
||||
|
||||
### Replace Body
|
||||
|
||||
```json
|
||||
{
|
||||
"preferences": [
|
||||
{ "festival_section_id": "01JXYZ...", "priority": 1 },
|
||||
{ "festival_section_id": "01JABC...", "priority": 2 },
|
||||
{ "festival_section_id": "01JDEF...", "priority": 3 }
|
||||
]
|
||||
}
|
||||
```
|
||||
The legacy registration-form-fields / person-field-values /
|
||||
registration-field-templates / person-section-preferences endpoints were
|
||||
purged in S2a. Their replacements (new Form Builder CRUD, public form
|
||||
submission endpoints, tag-sync listener) land in S2b+. This section will
|
||||
be filled in then — see `/dev-docs/ARCH-FORM-BUILDER.md` §4 for the
|
||||
target schema and §31 for integration contracts.
|
||||
|
||||
## Person List Filtering (extended)
|
||||
|
||||
Additional filter parameters on `GET /organisations/{org}/events/{event}/persons`:
|
||||
|
||||
- `?field[slug]=value` — filter by registration field value (exact match for single-value, `JSON_CONTAINS` for multiselect)
|
||||
- `?section_preference={section_id}` — filter by section preference (has this section as any priority)
|
||||
- `?has_preference=true` — only persons who submitted section preferences
|
||||
|
||||
Form-field-value filtering (`?field[slug]=value`) was served by the legacy
|
||||
endpoints that were purged in S2a. It returns in S2b on top of
|
||||
`form_values` + `form_value_options` via the FilterQueryBuilder described
|
||||
in `/dev-docs/ARCH-FORM-BUILDER.md` §7.
|
||||
|
||||
_(Extend this contract per module as endpoints are implemented.)_
|
||||
|
||||
## Platform Admin
|
||||
|
||||
Reference in New Issue
Block a user