dockerhub: getRepositoryTags

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
CrazyMax
2023-02-14 04:30:26 +01:00
parent 01219141e4
commit c2dfc9dae8
5 changed files with 8313 additions and 2 deletions

View File

@@ -18,7 +18,7 @@ import * as core from '@actions/core';
import * as httpm from '@actions/http-client';
import {HttpCodes} from '@actions/http-client';
import {RepositoryRequest, RepositoryResponse, TokenRequest, TokenResponse, UpdateRepoDescriptionRequest} from './types/dockerhub';
import {RepositoryRequest, RepositoryResponse, RepositoryTagsRequest, RepositoryTagsResponse, TokenRequest, TokenResponse, UpdateRepoDescriptionRequest} from './types/dockerhub';
export interface DockerHubOpts {
credentials: TokenRequest;
@@ -49,6 +49,36 @@ export class DockerHub {
);
}
public async getRepositoryTags(req: RepositoryTagsRequest): Promise<RepositoryTagsResponse> {
const url = new URL(`${repositoriesURL}${req.namespace}/${req.name}/tags`);
if (req.page) {
url.searchParams.append('page', req.page.toString());
}
if (req.page_size) {
url.searchParams.append('page_size', req.page_size.toString());
}
const resp: httpm.HttpClientResponse = await this.httpc.get(url.toString());
return <RepositoryTagsResponse>JSON.parse(await DockerHub.handleResponse(resp));
}
public async getRepositoryAllTags(req: RepositoryTagsRequest): Promise<RepositoryTagsResponse> {
const tags: RepositoryTagsResponse = await this.getRepositoryTags(req);
while (tags.next) {
const nextURL = new URL(tags.next);
const pageNumber = Number(nextURL.searchParams.get('page'));
const pageSize = Number(nextURL.searchParams.get('page_size')) || undefined;
const nextTags = await this.getRepositoryTags({
namespace: req.namespace,
name: req.name,
page: pageNumber,
page_size: pageSize || req.page_size
} as RepositoryTagsRequest);
tags.results.push(...nextTags.results);
tags.next = nextTags.next;
}
return tags;
}
public async getRepository(req: RepositoryRequest): Promise<RepositoryResponse> {
const resp: httpm.HttpClientResponse = await this.httpc.get(`${repositoriesURL}${req.namespace}/${req.name}`);
return <RepositoryResponse>JSON.parse(await DockerHub.handleResponse(resp));

View File

@@ -58,6 +58,53 @@ export interface RepositoryResponse {
content_types: Array<string>;
}
export interface RepositoryTagsRequest {
namespace: string;
name: string;
page?: number;
page_size?: number;
}
export interface RepositoryTagsResponse {
count: number;
next?: string;
previous?: string;
results: Array<RepositoryTagsResult>;
}
export interface RepositoryTagsResult {
creator: number;
id: number;
images: Array<RepositoryTagsResultImage>;
last_updated: Date;
last_updater: number;
last_updater_username: string;
name: string;
repository: number;
full_size: number;
v2: boolean;
tag_status: string;
tag_last_pulled: Date;
tag_last_pushed: Date;
media_type: string;
content_type: string;
digest: string;
}
export interface RepositoryTagsResultImage {
architecture: string;
features: string;
variant?: string;
digest: string;
os: string;
os_features: string;
os_version?: string;
size: number;
status: string;
last_pulled: Date;
last_pushed: Date;
}
export interface UpdateRepoDescriptionRequest {
name: string;
namespace: string;