طلبات المشاريع ٢ — any approved member may PROPOSE a project; a manager decides. Approving creates the project, owned by the requester.
Two gates, two bodies (both 403): the community's page switch
(settings.pageVisibility.projects2, off by default) → FEATURE_DISABLED;
the plan lacks projects2 → FEATURE_NOT_AVAILABLE. Every route needs both.
- submit, and read/count your own: any approved member (not restricted from
media — 403
RESTRICTION_BLOCKED); uploads count against the storage quota. - list, pending count, approve, reject:
projects2:manageorprojects2:moderate. GET /{requestId}: the requester, or a manager.- a request is decided ONCE. Approving or rejecting a request that is no longer
PENDING — including two reviewers at the same moment — answers 409
PROJECT_REQUEST_NOT_PENDING; exactly one project is ever created.
8 endpoints.
| Method | Path | Summary |
|---|---|---|
GET | /api/communities/{communityId}/projects2/requests | List requests (managers) |
POST | /api/communities/{communityId}/projects2/requests | Submit a project request |
GET | /api/communities/{communityId}/projects2/requests/{requestId} | One request (the requester, or a manager) |
POST | /api/communities/{communityId}/projects2/requests/{requestId}/approve | Approve — creates the project (managers) |
POST | /api/communities/{communityId}/projects2/requests/{requestId}/reject | Reject with a reason (managers) |
GET | /api/communities/{communityId}/projects2/requests/count/pending | Count of pending requests (managers) |
GET | /api/communities/{communityId}/projects2/requests/my-requests | My requests |
GET | /api/communities/{communityId}/projects2/requests/my-requests/count | Count of my requests |
GET /api/communities/{communityId}/projects2/requestsAuth: Bearer JWT required.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
communityId | path | yes | string (uuid) | — |
status | query | no | enum: PENDING, APPROVED, REJECTED | — |
page | query | no | integer | — |
pageSize | query | no | integer | — |
Responses
| Status | Description | Body |
|---|---|---|
200 | { success, data: ProjectRequest[], page, pageSize, total, hasNext } | — |
POST /api/communities/{communityId}/projects2/requestsAuth: Bearer JWT required.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
communityId | path | yes | string (uuid) | — |
Request body (required) — multipart/form-data
Type: Project2WriteForm
Responses
| Status | Description | Body |
|---|---|---|
201 | Submitted; data is a ProjectRequest in PENDING | — |
400 | Validation error or COMMUNITY_MISMATCH | — |
GET /api/communities/{communityId}/projects2/requests/{requestId}Auth: Bearer JWT required.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
communityId | path | yes | string (uuid) | — |
requestId | path | yes | string (uuid) | — |
Responses
| Status | Description | Body |
|---|---|---|
200 | data is a ProjectRequest | — |
403 | Neither the requester nor a manager | — |
404 | Not found | — |
POST /api/communities/{communityId}/projects2/requests/{requestId}/approveAuth: Bearer JWT required.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
communityId | path | yes | string (uuid) | — |
requestId | path | yes | string (uuid) | — |
Responses
| Status | Description | Body |
|---|---|---|
200 | data: { request, project } | — |
404 | Not found | — |
409 | PROJECT_REQUEST_NOT_PENDING | — |
POST /api/communities/{communityId}/projects2/requests/{requestId}/rejectAuth: Bearer JWT required.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
communityId | path | yes | string (uuid) | — |
requestId | path | yes | string (uuid) | — |
Request body (required) — application/json
| Field | Type | Required | Description |
|---|---|---|---|
reason | string | yes | — |
Responses
| Status | Description | Body |
|---|---|---|
200 | data is the rejected ProjectRequest | — |
400 | Reason shorter than 10 or longer than 500 characters | — |
409 | PROJECT_REQUEST_NOT_PENDING | — |
GET /api/communities/{communityId}/projects2/requests/count/pendingAuth: Bearer JWT required.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
communityId | path | yes | string (uuid) | — |
Responses
| Status | Description | Body |
|---|---|---|
200 | { success, count } | — |
GET /api/communities/{communityId}/projects2/requests/my-requestsAuth: Bearer JWT required.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
communityId | path | yes | string (uuid) | — |
status | query | no | enum: PENDING, APPROVED, REJECTED | — |
page | query | no | integer | — |
pageSize | query | no | integer | — |
Responses
| Status | Description | Body |
|---|---|---|
200 | Same page shape as the manager list | — |
GET /api/communities/{communityId}/projects2/requests/my-requests/countAuth: Bearer JWT required.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
communityId | path | yes | string (uuid) | — |
Responses
| Status | Description | Body |
|---|---|---|
200 | { success, count } | — |