Skip to content
Snippets Groups Projects
Commit ae4121ba authored by Konrad Mohrfeldt's avatar Konrad Mohrfeldt :koala:
Browse files

fix(API): always use actual id property type references

Using the ID type makes type errors more likely because we accept a
wider range of types as arguments for API operations than we actually
support on a logic level, i.e. when using maps because

	Map<ID, T>.get('1') !== Map<ID,T>.get(1)
parent 49da3b3d
No related branches found
No related tags found
No related merge requests found
......@@ -45,7 +45,7 @@ export class APIResponseError extends APIError {
type APIObject = { id: ID }
type ExtendableAPI<T extends APIObject> = {
itemMap: Ref<Map<ID, T>>
itemMap: Ref<Map<T['id'], T>>
endpoint: URLBuilder
maybeRaiseResponse: (res: Response) => Promise<void>
createRequest: (
......@@ -100,11 +100,11 @@ function createURLBuilder(basepath: string, useTrailingSlash = true): Prefixable
export const createTankURL = createURLBuilder(import.meta.env.VUE_APP_API_TANK, false)
export const createSteeringURL = createURLBuilder(import.meta.env.VUE_APP_API_STEERING)
export function createExtendableAPI<T extends APIObject, K = T['id']>(
export function createExtendableAPI<T extends APIObject>(
endpoint: URLBuilder,
options?: APIStoreOptions<T>,
) {
const itemMap = ref<Map<K, T>>(new Map())
const itemMap = ref<Map<T['id'], T>>(new Map())
const items = computed<T[]>(() => Array.from(itemMap.value.values()))
const error = ref<Error>()
......@@ -242,7 +242,7 @@ export function APIListPaginated<T extends APIObject>(
export function APIRetrieve<T extends APIObject>(api: ExtendableAPI<T>) {
async function retrieve(
id: ID,
id: T['id'],
requestInit?: RequestInit | undefined,
options?: { useCached?: boolean },
): Promise<T | null> {
......@@ -267,7 +267,7 @@ export function APIRetrieve<T extends APIObject>(api: ExtendableAPI<T>) {
export function APIUpdate<T extends APIObject, TData = Partial<T>>(api: ExtendableAPI<T>) {
async function update(
id: ID,
id: T['id'],
data: TData | FormData,
requestInit?: RequestInit | undefined,
): Promise<T> {
......@@ -308,7 +308,7 @@ export function APICreate<T extends APIObject, TData = Partial<Omit<T, 'id'>>>(
}
export function APIRemove<T extends APIObject>(api: ExtendableAPI<T>) {
async function remove(id: ID, requestInit?: RequestInit | undefined): Promise<void> {
async function remove(id: T['id'], requestInit?: RequestInit | undefined): Promise<void> {
const res = await fetch(
api.createRequest(api.endpoint(id.toString()), requestInit, { method: 'DELETE' }),
)
......@@ -339,10 +339,10 @@ export function createUnpaginatedAPIStore<T extends APIObject>(
export function useAPIObject<T extends APIObject>(
store: {
itemMap: Map<ID, T>
itemMap: Map<T['id'], T>
retrieve: ReturnType<typeof APIRetrieve<T>>['retrieve']
},
id: MaybeRefOrGetter<ID | null>,
id: MaybeRefOrGetter<T['id'] | null>,
) {
const _id = toRef(id)
const obj = computed<T | null>(() => {
......
......@@ -6,7 +6,6 @@ import {
APIRetrieve,
createExtendableAPI,
createSteeringURL,
ID,
useAPIObject,
} from '@/api'
import { License } from '@/types'
......@@ -17,7 +16,7 @@ type LicensedWork = {
isUseExplicitlyGrantedByAuthor: boolean
}
export function useSelectedLicense(licenseId: MaybeRefOrGetter<ID | null>) {
export function useSelectedLicense(licenseId: MaybeRefOrGetter<License['id'] | null>) {
const store = useLicenseStore()
const { obj } = useAPIObject(store, licenseId)
return obj
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment