98e06cb
/** 发布记录领域:仓库 release 的读写。 */
import { unwrapApi } from '@app/lib'
import type { CreateReleaseCmd, EnvelopeReleaseDto, UpdateReleaseCmd } from '@app/services/api'
import Apis from '@app/services/api'
export type Release = NonNullable<EnvelopeReleaseDto['data']>
/** 生成器把分页响应用泛型 `Page` 表达,因此在这里声明行类型。 */
export interface ReleaseListPage {
items: Release[]
total: number
limit: number
offset: number
}
export const listReleases = async (
space: string,
repo: string,
params: { limit?: number; offset?: number; draft?: boolean } = {},
): Promise<ReleaseListPage> => {
// Go through `unwrapApi` like every other list: bypassing it turned a 4xx/5xx
// into an empty page, so the tab could never show why it was empty.
const page = await unwrapApi<ReleaseListPage | null>(
Apis.releases.list_releases({
pathParams: { space_name: space, repo_name: repo },
params: { limit: params.limit, offset: params.offset, draft: params.draft },
}),
)
return page ?? { items: [], total: 0, limit: 0, offset: 0 }
}
export const getRelease = (space: string, repo: string, tag: string) =>
unwrapApi<Release>(Apis.releases.get_release({ pathParams: { space_name: space, repo_name: repo, tag } }))
export const createRelease = (space: string, repo: string, cmd: CreateReleaseCmd) =>
unwrapApi<Release>(
Apis.releases.create_release({
pathParams: { space_name: space, repo_name: repo },
data: cmd,
}),
)
export const updateRelease = (space: string, repo: string, tag: string, cmd: UpdateReleaseCmd) =>
unwrapApi<Release>(
Apis.releases.update_release({
pathParams: { space_name: space, repo_name: repo, tag },
data: cmd,
}),
)
export const deleteRelease = (space: string, repo: string, tag: string) =>
unwrapApi<unknown>(Apis.releases.delete_release({ pathParams: { space_name: space, repo_name: repo, tag } }))