improve common app pipeline history layout
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
2026-07-09 11:01:39 +09:00
parent 76cc887371
commit dceb20b26a
+26 -4
View File
@@ -46,7 +46,7 @@ export class WoodpeckerService {
const page = Math.max(1, input.page || 1); const page = Math.max(1, input.page || 1);
const limit = Math.min(50, Math.max(1, input.limit || 5)); const limit = Math.min(50, Math.max(1, input.limit || 5));
const body = await this.request<unknown>( const { body, headers } = await this.requestWithHeaders<unknown>(
`/api/repos/${encodeURIComponent(repoId)}/pipelines?page=${page}&limit=${limit + 1}`, `/api/repos/${encodeURIComponent(repoId)}/pipelines?page=${page}&limit=${limit + 1}`,
); );
const rows = Array.isArray(body) const rows = Array.isArray(body)
@@ -54,6 +54,7 @@ export class WoodpeckerService {
: isRecord(body) && Array.isArray(body.pipelines) : isRecord(body) && Array.isArray(body.pipelines)
? body.pipelines ? body.pipelines
: []; : [];
const total = getTotalCount(body, headers);
const pipelines = rows const pipelines = rows
.filter(isRecord) .filter(isRecord)
.slice(0, limit) .slice(0, limit)
@@ -62,7 +63,9 @@ export class WoodpeckerService {
return { return {
page, page,
pageSize: limit, pageSize: limit,
hasNext: rows.length > limit, total,
totalPages: total === null ? null : Math.max(1, Math.ceil(total / limit)),
hasNext: total === null ? rows.length > limit : page < Math.max(1, Math.ceil(total / limit)),
pipelines, pipelines,
}; };
} }
@@ -88,6 +91,11 @@ export class WoodpeckerService {
} }
private async request<T>(path: string): Promise<T> { private async request<T>(path: string): Promise<T> {
const { body } = await this.requestWithHeaders<T>(path);
return body;
}
private async requestWithHeaders<T>(path: string): Promise<{ body: T; headers: Headers }> {
const response = await fetch(`${this.baseUrl}${path}`, { const response = await fetch(`${this.baseUrl}${path}`, {
headers: { headers: {
Accept: 'application/json', Accept: 'application/json',
@@ -104,7 +112,7 @@ export class WoodpeckerService {
}); });
} }
return (await response.json()) as T; return { body: (await response.json()) as T, headers: response.headers };
} }
private assertToken() { private assertToken() {
@@ -193,6 +201,20 @@ function getPipelineTimestamp(value: unknown) {
return 0; return 0;
} }
function getTotalCount(body: unknown, headers: Headers) {
const bodyTotal = isRecord(body)
? getNumber(body.total) ?? getNumber(body.count) ?? getNumber(body.total_count) ?? getNumber(body.totalCount)
: null;
if (bodyTotal !== null) return bodyTotal;
const headerTotal = headers.get('x-total-count')
?? headers.get('x-total')
?? headers.get('x-pagination-total')
?? headers.get('x-page-total')
?? headers.get('total');
return getNumber(headerTotal);
}
function joinRepoName(repo: WoodpeckerRepo) { function joinRepoName(repo: WoodpeckerRepo) {
const owner = getString(repo.owner); const owner = getString(repo.owner);
const name = getString(repo.name); const name = getString(repo.name);
@@ -205,7 +227,7 @@ function getString(value: unknown) {
function getNumber(value: unknown) { function getNumber(value: unknown) {
const number = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN; const number = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN;
return Number.isFinite(number) ? number : null; return Number.isFinite(number) && number >= 0 ? number : null;
} }
function isRecord(value: unknown): value is Record<string, unknown> { function isRecord(value: unknown): value is Record<string, unknown> {