feat: crowd lists audit, enum, factory, service and tests
Audit and complete the Crowd Lists module: - Add CrowdListType enum (internal/external) with proper casts - Create CrowdListService for business logic (add/remove person, max_persons enforcement, auto_approve, activity logging) - Create CrowdListFactory with Dutch names and states - Create AddPersonToCrowdListRequest form request - Fix FormRequests to use Rule::enum instead of hardcoded strings - Fix CrowdListResource to use enum->value and add is_full field - Refactor controller to be thin (delegates to service) - Add eager loading for crowdType and recipientCompany - Write 18 comprehensive tests (CRUD, auth, edge cases) - Update API.md with request/response documentation Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -163,12 +163,56 @@ Response: `{ "confirmed": 2, "errors": [{ "match_id": "ulid3", "error": "User al
|
||||
|
||||
## Crowd Lists
|
||||
|
||||
- `GET /events/{event}/crowd-lists`
|
||||
- `POST /events/{event}/crowd-lists`
|
||||
- `PUT /events/{event}/crowd-lists/{list}`
|
||||
- `DELETE /events/{event}/crowd-lists/{list}`
|
||||
- `POST /events/{event}/crowd-lists/{list}/persons`
|
||||
- `DELETE /events/{event}/crowd-lists/{list}/persons/{person}`
|
||||
- `GET /events/{event}/crowd-lists` — list all crowd lists for event (includes `persons_count`)
|
||||
- `POST /events/{event}/crowd-lists` — create crowd list
|
||||
- `PUT /events/{event}/crowd-lists/{list}` — update crowd list
|
||||
- `DELETE /events/{event}/crowd-lists/{list}` — delete crowd list
|
||||
- `POST /events/{event}/crowd-lists/{list}/persons` — add person to list
|
||||
- `DELETE /events/{event}/crowd-lists/{list}/persons/{person}` — remove person from list
|
||||
|
||||
### Create/Update Body
|
||||
|
||||
```json
|
||||
{
|
||||
"crowd_type_id": "01JXYZ...",
|
||||
"name": "VIP Gastenlijst",
|
||||
"type": "internal|external",
|
||||
"recipient_company_id": "01JXYZ... (nullable, for external lists)",
|
||||
"auto_approve": false,
|
||||
"max_persons": 50
|
||||
}
|
||||
```
|
||||
|
||||
### Add Person Body
|
||||
|
||||
```json
|
||||
{
|
||||
"person_id": "01JXYZ..."
|
||||
}
|
||||
```
|
||||
|
||||
**Business rules:**
|
||||
- `max_persons`: when set, adding a person beyond the limit returns 422
|
||||
- `auto_approve`: when true, adding a person with status `pending` automatically sets their status to `approved`
|
||||
- Duplicate person on same list returns 422
|
||||
|
||||
### CrowdListResource
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "01JXYZ...",
|
||||
"event_id": "01JXYZ...",
|
||||
"crowd_type_id": "01JXYZ...",
|
||||
"name": "VIP Gastenlijst",
|
||||
"type": "internal",
|
||||
"recipient_company_id": null,
|
||||
"auto_approve": false,
|
||||
"max_persons": 50,
|
||||
"is_full": false,
|
||||
"created_at": "2026-04-10T12:00:00+00:00",
|
||||
"persons_count": 12
|
||||
}
|
||||
```
|
||||
|
||||
## Locations
|
||||
|
||||
|
||||
Reference in New Issue
Block a user