طلبات المشاريع — any approved member may PROPOSE a project; a manager decides. Approving creates the Project, owned by the requester.
- 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:
projects:manageorprojects: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}/project-requests | List requests (managers) |
POST | /api/communities/{communityId}/project-requests | Submit a project request |
GET | /api/communities/{communityId}/project-requests/{requestId} | One request (the requester, or a manager) |
POST | /api/communities/{communityId}/project-requests/{requestId}/approve | Approve — creates the project (managers) |
POST | /api/communities/{communityId}/project-requests/{requestId}/reject | Reject with a reason (managers) |
GET | /api/communities/{communityId}/project-requests/count/pending | Count of pending requests (managers) |
GET | /api/communities/{communityId}/project-requests/my-requests | My requests |
GET | /api/communities/{communityId}/project-requests/my-requests/count | Count of my requests |
GET /api/communities/{communityId}/project-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}/project-requestsAuth: Bearer JWT required.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
communityId | path | yes | string (uuid) | — |
Request body (required) — multipart/form-data
Type: ProjectWriteForm
Responses
| Status | Description | Body |
|---|---|---|
201 | Submitted; data is a ProjectRequest in PENDING | — |
400 | Validation error or COMMUNITY_MISMATCH | — |
GET /api/communities/{communityId}/project-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}/project-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}/project-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}/project-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}/project-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}/project-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 } | — |