From 0f87bd3b5ce8a8524bcb96baf7d41840844f7a99 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Wed, 1 Nov 2023 09:57:25 -0500 Subject: [PATCH] Simplify EXIF data form handling --- .../admin/uploads/[uploadPath]/page.tsx | 15 ++++++------ src/photo/actions.ts | 15 +++++------- src/photo/form.ts | 23 ++++-------------- src/photo/server.ts | 24 +++++++++---------- 4 files changed, 30 insertions(+), 47 deletions(-) diff --git a/src/app/(auth-state)/admin/uploads/[uploadPath]/page.tsx b/src/app/(auth-state)/admin/uploads/[uploadPath]/page.tsx index 8852e404..7c031239 100644 --- a/src/app/(auth-state)/admin/uploads/[uploadPath]/page.tsx +++ b/src/app/(auth-state)/admin/uploads/[uploadPath]/page.tsx @@ -1,7 +1,8 @@ import PhotoForm from '@/photo/PhotoForm'; import AdminChildPage from '@/components/AdminChildPage'; -import { PATH_ADMIN_UPLOADS } from '@/site/paths'; -import { extractFormDataFromUploadPath } from '@/photo/server'; +import { PATH_ADMIN, PATH_ADMIN_UPLOADS } from '@/site/paths'; +import { extractExifDataFromBlobPath } from '@/photo/server'; +import { redirect } from 'next/navigation'; interface Params { params: { uploadPath: string } @@ -10,8 +11,10 @@ interface Params { export default async function UploadPage({ params: { uploadPath } }: Params) { const { blobId, - photoForm, - } = await extractFormDataFromUploadPath(uploadPath); + photoFormExif, + } = await extractExifDataFromBlobPath(uploadPath); + + if (!photoFormExif) { redirect(PATH_ADMIN); } return ( - {photoForm - ? - : null} + ); }; diff --git a/src/photo/actions.ts b/src/photo/actions.ts index 7223beaf..168da4ad 100644 --- a/src/photo/actions.ts +++ b/src/photo/actions.ts @@ -11,7 +11,6 @@ import { import { PhotoFormData, convertFormDataToPhotoDbInsert, - convertPhotoFormDataToPhotoDbInsert, convertPhotoToFormData, } from './form'; import { redirect } from 'next/navigation'; @@ -26,7 +25,7 @@ import { revalidatePhotosKey, } from '@/cache'; import { PATH_ADMIN_PHOTOS, PATH_ADMIN_TAGS } from '@/site/paths'; -import { extractFormDataFromUploadPath } from './server'; +import { extractExifDataFromBlobPath } from './server'; export async function createPhotoAction(formData: FormData) { const photo = convertFormDataToPhotoDbInsert(formData, true); @@ -98,9 +97,9 @@ export async function getExifDataAction( ): Promise> { const { url } = photoFormPrevious; if (url) { - const { photoForm } = await extractFormDataFromUploadPath(url); - if (photoForm) { - return photoForm; + const { photoFormExif } = await extractExifDataFromBlobPath(url); + if (photoFormExif) { + return photoFormExif; } } return {}; @@ -111,11 +110,9 @@ export async function syncPhotoExifDataAction(formData: FormData) { if (photoId) { const photo = await getPhoto(photoId); if (photo) { - const { - photoForm: photoFormExif, - } = await extractFormDataFromUploadPath(photo.url); + const { photoFormExif } = await extractExifDataFromBlobPath(photo.url); if (photoFormExif) { - const photoFormDbInsert = convertPhotoFormDataToPhotoDbInsert({ + const photoFormDbInsert = convertFormDataToPhotoDbInsert({ ...convertPhotoToFormData(photo), ...photoFormExif, }); diff --git a/src/photo/form.ts b/src/photo/form.ts index 860fd610..fed777d6 100644 --- a/src/photo/form.ts +++ b/src/photo/form.ts @@ -124,10 +124,12 @@ export const convertExifToFormData = ( }); export const convertFormDataToPhotoDbInsert = ( - formData: FormData, + formData: FormData | PhotoFormData, generateId?: boolean, ): PhotoDbInsert => { - const photoForm = Object.fromEntries(formData) as PhotoFormData; + const photoForm = formData instanceof FormData + ? Object.fromEntries(formData) as PhotoFormData + : formData; // Parse FormData: // - remove server action ID @@ -178,20 +180,3 @@ export const convertFormDataToPhotoDbInsert = ( hidden: photoForm.hidden === 'true', }; }; - -const convertPhotoFormDataToFormData = ( - photoFormData: PhotoFormData, -) => { - const formData = new FormData(); - for (const key in photoFormData) { - formData.append(key, photoFormData[key as keyof PhotoFormData]); - } - return formData; -}; - -export const convertPhotoFormDataToPhotoDbInsert = ( - photoFormData: PhotoFormData, -) => { - const formData = convertPhotoFormDataToFormData(photoFormData); - return convertFormDataToPhotoDbInsert(formData); -}; diff --git a/src/photo/server.ts b/src/photo/server.ts index cf8969e5..5b916114 100644 --- a/src/photo/server.ts +++ b/src/photo/server.ts @@ -8,24 +8,24 @@ import { import { ExifData, ExifParserFactory } from 'ts-exif-parser'; import { PhotoFormData } from './form'; -export const extractFormDataFromUploadPath = async ( - uploadPath: string +export const extractExifDataFromBlobPath = async ( + blobPath: string ): Promise<{ blobId?: string - photoForm?: Partial + photoFormExif?: Partial }> => { - const url = decodeURIComponent(uploadPath); + const url = decodeURIComponent(blobPath); const blobId = getIdFromBlobUrl(url); const extension = getExtensionFromBlobUrl(url); - const fileBytes = uploadPath + const fileBytes = blobPath ? await fetch(url) .then(res => res.arrayBuffer()) : undefined; - let exifDataForm: ExifData | undefined; + let exifData: ExifData | undefined; let filmSimulation: FujifilmSimulation | undefined; if (fileBytes) { @@ -33,10 +33,10 @@ export const extractFormDataFromUploadPath = async ( // Data for form parser.enableBinaryFields(false); - exifDataForm = parser.parse(); + exifData = parser.parse(); // Capture film simulation for Fujifilm cameras - if (isExifForFujifilm(exifDataForm)) { + if (isExifForFujifilm(exifData)) { // Parse exif data again with binary fields // in order to access MakerNote tag parser.enableBinaryFields(true); @@ -50,11 +50,11 @@ export const extractFormDataFromUploadPath = async ( return { blobId, - ...exifDataForm && { - photoForm: { - ...convertExifToFormData(exifDataForm, filmSimulation), + ...exifData && { + photoFormExif: { + ...convertExifToFormData(exifData, filmSimulation), extension, - url: decodeURIComponent(uploadPath), + url, }, }, };