fix(ui): use zod to parse metdata when fetching from api

This commit is contained in:
psychedelicious 2023-09-08 11:55:25 +10:00
parent e4035a51af
commit 56399a650a

View File

@ -1,4 +1,5 @@
import { EntityState, Update } from '@reduxjs/toolkit'; import { EntityState, Update } from '@reduxjs/toolkit';
import { fetchBaseQuery } from '@reduxjs/toolkit/dist/query';
import { PatchCollection } from '@reduxjs/toolkit/dist/query/core/buildThunks'; import { PatchCollection } from '@reduxjs/toolkit/dist/query/core/buildThunks';
import { import {
ASSETS_CATEGORIES, ASSETS_CATEGORIES,
@ -6,9 +7,14 @@ import {
IMAGE_CATEGORIES, IMAGE_CATEGORIES,
IMAGE_LIMIT, IMAGE_LIMIT,
} from 'features/gallery/store/types'; } from 'features/gallery/store/types';
import {
ImageMetadataAndWorkflow,
zCoreMetadata,
} from 'features/nodes/types/types';
import { getMetadataAndWorkflowFromImageBlob } from 'features/nodes/util/getMetadataAndWorkflowFromImageBlob'; import { getMetadataAndWorkflowFromImageBlob } from 'features/nodes/util/getMetadataAndWorkflowFromImageBlob';
import { keyBy } from 'lodash-es'; import { keyBy } from 'lodash-es';
import { ApiFullTagDescription, LIST_TAG, api } from '..'; import { ApiFullTagDescription, LIST_TAG, api } from '..';
import { $authToken, $projectId } from '../client';
import { components, paths } from '../schema'; import { components, paths } from '../schema';
import { import {
DeleteBoardResult, DeleteBoardResult,
@ -27,9 +33,6 @@ import {
imagesSelectors, imagesSelectors,
} from '../util'; } from '../util';
import { boardsApi } from './boards'; import { boardsApi } from './boards';
import { ImageMetadataAndWorkflow } from 'features/nodes/types/types';
import { fetchBaseQuery } from '@reduxjs/toolkit/dist/query';
import { $authToken, $projectId } from '../client';
export const imagesApi = api.injectEndpoints({ export const imagesApi = api.injectEndpoints({
endpoints: (build) => ({ endpoints: (build) => ({
@ -158,18 +161,23 @@ export const imagesApi = api.injectEndpoints({
let metadata = blobData.metadata; let metadata = blobData.metadata;
if (args.shouldFetchMetadataFromApi) { if (args.shouldFetchMetadataFromApi) {
const metadataResult = await fetchWithBaseQuery( const metadataResponse = await fetchWithBaseQuery(
`images/i/${args.image.image_name}/metadata` `images/i/${args.image.image_name}/metadata`
); );
if (metadataResult.data) { if (metadataResponse.data) {
metadata = (metadataResult.data as UnsafeImageMetadata) const metadataResult = zCoreMetadata.safeParse(
.metadata as UnsafeImageMetadata['metadata']; // eslint-disable-next-line @typescript-eslint/no-explicit-any
(metadataResponse.data as any)?.metadata
);
if (metadataResult.success) {
metadata = metadataResult.data;
}
} }
} }
return { data: { ...blobData, metadata } }; return { data: { ...blobData, metadata } };
}, },
providesTags: (result, error, { image, shouldFetchMetadataFromApi }) => [ providesTags: (result, error, { image }) => [
{ type: 'ImageMetadataFromFile', id: image.image_name }, { type: 'ImageMetadataFromFile', id: image.image_name },
], ],
keepUnusedDataFor: 86400, // 24 hours keepUnusedDataFor: 86400, // 24 hours