feat: a public showcase of each project

A public endpoint sums up a public project for websites: epics with their
dates and progress, the latest releases with the notes of shipped ones,
the sprint under way and open tickets labelled good-first-issue.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-08 19:13:56 +02:00
parent bec39da46d
commit feea58d0e8
11 changed files with 721 additions and 3 deletions

View File

@@ -6245,6 +6245,44 @@
"security": []
}
},
"/api/explore/projects/{project}/showcase": {
"get": {
"description": "For public websites: epics with their dates and progress, the latest releases (with the notes of shipped ones), the sprint under way and open tickets labelled good-first-issue. Paths point into the web app.",
"operationId": "ExploreController_showcase",
"parameters": [
{
"name": "project",
"required": true,
"in": "path",
"description": "Project id or key",
"schema": {
"example": "WEB",
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ShowcaseDto"
}
}
}
},
"404": {
"description": "Not a public project"
}
},
"summary": "A public project's showcase (no token needed)",
"tags": [
"Explore"
],
"security": []
}
},
"/api/me/notifications": {
"get": {
"operationId": "NotificationsController_mine",
@@ -11526,6 +11564,210 @@
"markdown"
]
},
"ShowcaseProjectDto": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"key": {
"type": "string",
"example": "WEB"
},
"name": {
"type": "string"
},
"description": {
"type": "string",
"nullable": true
}
},
"required": [
"id",
"key",
"name",
"description"
]
},
"ShowcaseSprintDto": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"goal": {
"type": "string",
"nullable": true
},
"startDate": {
"type": "string",
"format": "date"
},
"endDate": {
"type": "string",
"format": "date"
},
"percent": {
"type": "number"
}
},
"required": [
"name",
"goal",
"startDate",
"endDate",
"percent"
]
},
"ShowcaseEpicDto": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"title": {
"type": "string"
},
"startDate": {
"type": "string",
"nullable": true,
"format": "date"
},
"dueDate": {
"type": "string",
"nullable": true,
"format": "date"
},
"percent": {
"type": "number"
},
"done": {
"type": "boolean"
},
"path": {
"type": "string",
"example": "/p/WEB/issues/WEB-3",
"description": "In the web app"
}
},
"required": [
"key",
"title",
"startDate",
"dueDate",
"percent",
"done",
"path"
]
},
"ShowcaseReleaseDto": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"status": {
"allOf": [
{
"$ref": "#/components/schemas/ReleaseStatus"
}
]
},
"targetDate": {
"type": "string",
"nullable": true
},
"releasedAt": {
"type": "string",
"nullable": true
},
"percent": {
"type": "number"
},
"notes": {
"type": "string",
"nullable": true,
"description": "Shipped ones only"
}
},
"required": [
"name",
"status",
"targetDate",
"releasedAt",
"percent",
"notes"
]
},
"ShowcaseIssueDto": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"title": {
"type": "string"
},
"type": {
"type": "string",
"description": "A ticket type id"
},
"path": {
"type": "string",
"example": "/p/WEB/issues/WEB-9"
}
},
"required": [
"key",
"title",
"type",
"path"
]
},
"ShowcaseDto": {
"type": "object",
"properties": {
"project": {
"$ref": "#/components/schemas/ShowcaseProjectDto"
},
"activeSprint": {
"nullable": true,
"type": "object",
"allOf": [
{
"$ref": "#/components/schemas/ShowcaseSprintDto"
}
]
},
"roadmap": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ShowcaseEpicDto"
}
},
"releases": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ShowcaseReleaseDto"
}
},
"goodFirst": {
"description": "Open tickets labelled good-first-issue",
"type": "array",
"items": {
"$ref": "#/components/schemas/ShowcaseIssueDto"
}
}
},
"required": [
"project",
"activeSprint",
"roadmap",
"releases",
"goodFirst"
]
},
"Object": {
"type": "object",
"properties": {}