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": {}

View File

@@ -917,6 +917,26 @@ export interface paths {
patch?: never;
trace?: never;
};
"/api/explore/projects/{project}/showcase": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* A public project's showcase (no token needed)
* @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.
*/
get: operations["ExploreController_showcase"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/me/notifications": {
parameters: {
query?: never;
@@ -2115,6 +2135,63 @@ export interface components {
*/
markdown: string;
};
ShowcaseProjectDto: {
/** Format: uuid */
id: string;
/** @example WEB */
key: string;
name: string;
description: string | null;
};
ShowcaseSprintDto: {
name: string;
goal: string | null;
/** Format: date */
startDate: string;
/** Format: date */
endDate: string;
percent: number;
};
ShowcaseEpicDto: {
key: string;
title: string;
/** Format: date */
startDate: string | null;
/** Format: date */
dueDate: string | null;
percent: number;
done: boolean;
/**
* @description In the web app
* @example /p/WEB/issues/WEB-3
*/
path: string;
};
ShowcaseReleaseDto: {
name: string;
status: components["schemas"]["ReleaseStatus"];
targetDate: string | null;
releasedAt: string | null;
percent: number;
/** @description Shipped ones only */
notes: string | null;
};
ShowcaseIssueDto: {
key: string;
title: string;
/** @description A ticket type id */
type: string;
/** @example /p/WEB/issues/WEB-9 */
path: string;
};
ShowcaseDto: {
project: components["schemas"]["ShowcaseProjectDto"];
activeSprint: components["schemas"]["ShowcaseSprintDto"] | null;
roadmap: components["schemas"]["ShowcaseEpicDto"][];
releases: components["schemas"]["ShowcaseReleaseDto"][];
/** @description Open tickets labelled good-first-issue */
goodFirst: components["schemas"]["ShowcaseIssueDto"][];
};
Object: Record<string, never>;
/** @enum {string} */
NotificationKind: "ASSIGNED" | "STATUS_CHANGED" | "QA_FAILED" | "COMMENTED" | "MENTIONED" | "WATCHED" | "ADDED_TO_PROJECT" | "REMINDER";
@@ -6652,6 +6729,35 @@ export interface operations {
};
};
};
ExploreController_showcase: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Project id or key */
project: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ShowcaseDto"];
};
};
/** @description Not a public project */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
NotificationsController_mine: {
parameters: {
query?: {