API: Projects ============== Base URL: ``/projects`` Endpoints ---------- List Projects ~~~~~~~~~~~~~~ .. code-block:: http GET /projects Returns all projects the authenticated user has access to. **Headers:** - ``Authorization: Bearer `` (required) **Response (200):** .. code-block:: json [ { "id": "uuid", "name": "Climate Resilience Service", "slug": "climate-resilience", "description": "...", "author": "user-001", "status": "active", "currentPhaseId": "1", "memberCount": 3, "createdAt": "2026-01-15T10:30:00Z" } ] Create Project ~~~~~~~~~~~~~~~ .. code-block:: http POST /projects **Request Body:** .. code-block:: json { "userId": "user-001", "name": "Climate Resilience EO Service", "slug": "climate-resilience", "description": "EO-based climate adaptation service", "objectives": "monitor,predict,alert", "domain": "climate", "organization": "Eurobios", "expertise": "Remote sensing, Climate science", "serviceIdea": "Real-time climate risk assessment" } **Response (201):** .. code-block:: json { "id": "uuid", "author": "user-001", "name": "Climate Resilience EO Service", "inviteCode": "AB12CD34", "status": "draft", "currentPhaseId": "1", "members": [{"userId": "user-001", "role": "ADMIN", "status": "ACCEPTED"}], "templateInstances": [], "threads": [] } Update Project ~~~~~~~~~~~~~~~ .. code-block:: http PUT /projects/{projectId} **Request Body:** Partial project fields to update. **Response (200):** Updated project object. Delete Project ~~~~~~~~~~~~~~~ .. code-block:: http DELETE /projects/{projectId} **Permission:** Admin only. **Response (204):** No content. Get Project Members ~~~~~~~~~~~~~~~~~~~~ .. code-block:: http GET /projects/{projectId}/project_user **Response (200):** .. code-block:: json [ { "projectId": "uuid", "userId": "user-001", "role": "ADMIN", "status": "ACCEPTED", "userName": "Alice" }, { "projectId": "uuid", "userId": "user-002", "role": "MEMBER", "status": "PENDING", "userName": "Bob" } ] Get Invite Code ~~~~~~~~~~~~~~~~ .. code-block:: http GET /projects/{projectId}/invite **Permission:** Admin only. **Response (200):** .. code-block:: json { "code": "AB12CD34", "projectId": "uuid" } Verify Invite Code ~~~~~~~~~~~~~~~~~~~ .. code-block:: http POST /projects/verify-code **Request Body:** .. code-block:: json {"code": "AB12CD34"} **Response (200):** Project preview (name, description, member count). Join Project ~~~~~~~~~~~~~ .. code-block:: http POST /projects/join **Request Body:** .. code-block:: json {"code": "AB12CD34"} **Response (201):** Membership created with status PENDING.