get versions using rest

This commit is contained in:
Anupam
2022-12-28 14:43:50 +00:00
parent cc7196aa1d
commit e521d9e753
5 changed files with 113 additions and 413 deletions
+46 -173
View File
@@ -1,193 +1,66 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import {GraphQlQueryResponse} from '@octokit/graphql/dist-types/types'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import {Observable, from, throwError} from 'rxjs'
/* eslint-disable @typescript-eslint/no-unused-vars */
import {from, Observable, merge, throwError, of} from 'rxjs'
import {catchError, map} from 'rxjs/operators'
import {graphql} from './graphql'
import {Octokit} from '@octokit/rest'
import {RestEndpointMethodTypes} from '@octokit/plugin-rest-endpoint-methods/dist-types/generated/parameters-and-response-types'
export interface VersionInfo {
id: string
export interface RestVersionInfo {
id: number
version: string
}
export interface QueryInfo {
versions: VersionInfo[]
cursor: string
export interface RestQueryInfo {
versions: RestVersionInfo[]
page: number
paginate: boolean
totalCount: number
}
export interface GetVersionsQueryResponse {
repository: {
packages: {
edges: {
node: {
name: string
versions: {
totalCount: number
edges: {node: VersionInfo}[]
pageInfo: {
startCursor: string
hasPreviousPage: boolean
}
}
}
}[]
}
}
}
const query = `
query getVersions($owner: String!, $repo: String!, $package: String!, $last: Int!) {
repository(owner: $owner, name: $repo) {
packages(first: 1, names: [$package]) {
edges {
node {
name
versions(last: $last) {
totalCount
edges {
node {
id
version
}
}
pageInfo {
startCursor
hasPreviousPage
}
}
}
}
}
}
}`
const Paginatequery = `
query getVersions($owner: String!, $repo: String!, $package: String!, $last: Int!, $before: String!) {
repository(owner: $owner, name: $repo) {
packages(first: 1, names: [$package]) {
edges {
node {
name
versions(last: $last, before: $before) {
totalCount
edges {
node {
id
version
}
}
pageInfo{
startCursor
hasPreviousPage
}
}
}
}
}
}
}`
export function queryForOldestVersions(
owner: string,
repo: string,
packageName: string,
numVersions: number,
startCursor: string,
token: string
): Observable<GetVersionsQueryResponse> {
if (startCursor === '') {
return from(
graphql(token, query, {
owner,
repo,
package: packageName,
last: numVersions,
headers: {
Accept: 'application/vnd.github.packages-preview+json'
}
}) as Promise<GetVersionsQueryResponse>
).pipe(
catchError((err: GraphQlQueryResponse<unknown>) => {
const msg = 'query for oldest version failed.'
return throwError(
err.errors && err.errors.length > 0
? `${msg} ${err.errors[0].message}`
: `${msg} verify input parameters are correct`
)
})
)
} else {
return from(
graphql(token, Paginatequery, {
owner,
repo,
package: packageName,
last: numVersions,
before: startCursor,
headers: {
Accept: 'application/vnd.github.packages-preview+json'
}
}) as Promise<GetVersionsQueryResponse>
).pipe(
catchError((err: GraphQlQueryResponse<unknown>) => {
const msg = 'query for oldest version failed.'
return throwError(
err.errors && err.errors.length > 0
? `${msg} ${err.errors[0].message}`
: `${msg} verify input parameters are correct`
)
})
)
}
}
type PackageType = RestEndpointMethodTypes['packages']['getAllPackageVersionsForPackageOwnedByUser']['parameters']['package_type']
type GetVersionsResponse = RestEndpointMethodTypes['packages']['getAllPackageVersionsForPackageOwnedByUser']['response']['data']
export function getOldestVersions(
owner: string,
repo: string,
packageName: string,
packageType: string,
numVersions: number,
startCursor: string,
page: number,
token: string
): Observable<QueryInfo> {
return queryForOldestVersions(
owner,
repo,
packageName,
numVersions,
startCursor,
token
): Observable<RestQueryInfo> {
const octokit = new Octokit({
auth: token
})
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(
map(result => {
let r: QueryInfo
if (result.repository.packages.edges.length < 1) {
console.log(
`package: ${packageName} not found for owner: ${owner} in repo: ${repo}`
)
r = {
versions: [] as VersionInfo[],
cursor: '',
paginate: false,
totalCount: 0
}
return r
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 => {
return {
versions: response.data.map((version: GetVersionsResponse[0]) => {
return {
id: version.id,
version: version.name
}
}),
page: page + 1,
paginate: response.data.length === numVersions,
totalCount: response.data.length
}
const versions = result.repository.packages.edges[0].node.versions.edges
const pages = result.repository.packages.edges[0].node.versions.pageInfo
const count = result.repository.packages.edges[0].node.versions.totalCount
r = {
versions: versions
.map(value => ({id: value.node.id, version: value.node.version}))
.reverse(),
cursor: pages.startCursor,
paginate: pages.hasPreviousPage,
totalCount: count
}
return r
})
)
}