diff --git a/.github/workflows/get-versions.ts b/.github/workflows/get-versions.ts new file mode 100644 index 0000000..342cad2 --- /dev/null +++ b/.github/workflows/get-versions.ts @@ -0,0 +1,83 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import {from, Observable, merge, throwError, of} from 'rxjs' +import {catchError, map} from 'rxjs/operators' +import {Octokit} from '@octokit/rest' +import {RestEndpointMethodTypes} from '@octokit/plugin-rest-endpoint-methods/dist-types/generated/parameters-and-response-types' + +export interface RestVersionInfo { + id: number + version: string + created_at: string + tagged: boolean +} + +export interface RestQueryInfo { + versions: RestVersionInfo[] + page: number + paginate: boolean + totalCount: number +} + +type PackageType = + RestEndpointMethodTypes['packages']['getAllPackageVersionsForPackageOwnedByUser']['parameters']['package_type'] +type GetVersionsResponse = + RestEndpointMethodTypes['packages']['getAllPackageVersionsForPackageOwnedByUser']['response']['data'] + +export function getOldestVersions( + owner: string, + packageName: string, + packageType: string, + numVersions: number, + page: number, + token: string +): Observable { + const octokit = new Octokit({ + auth: token, + baseUrl: process.env.GITHUB_API_URL || 'https://api.github.com' + }) + const package_type: PackageType = packageType as PackageType + + return from( + octokit.rest.packages.getAllPackageVersionsForPackageOwnedByUser({ + package_type, + package_name: packageName, + username: owner, + per_page: numVersions, + page + }) + ).pipe( + catchError(err => { + const msg = 'get versions API failed.' + return throwError( + err.errors && err.errors.length > 0 + ? `${msg} ${err.errors[0].message}` + : `${msg} ${err.message}` + ) + }), + map(response => { + const resp = { + versions: response.data.map((version: GetVersionsResponse[0]) => { + let tagged = false + if ( + package_type === 'container' && + version.metadata && + version.metadata.container + ) { + tagged = version.metadata.container.tags.length > 0 + } + + return { + id: version.id, + version: version.name, + created_at: version.created_at, + tagged + } + }), + page, + paginate: response.data.length === numVersions, + totalCount: response.data.length + } + return resp + }) + ) +}