Vercel/src/photo/sync.ts
2025-04-19 23:25:01 -05:00

64 lines
2.0 KiB
TypeScript

import { MAKE_FUJIFILM } from '@/platforms/fujifilm';
import { Photo, PhotoDb } from '.';
import { AI_TEXT_AUTO_GENERATED_FIELDS } from '@/app/config';
import { AiAutoGeneratedField } from './ai';
export interface PhotoSyncStatus {
isOutdated: boolean;
missingAiTextFields: AiAutoGeneratedField[];
}
export const SYNC_QUERY_LIMIT = 1000;
export const UPDATED_BEFORE_01 = new Date('2024-06-16');
// UTC 2025-02-24 05:30:00
export const UPDATED_BEFORE_02 = new Date(Date.UTC(2025, 1, 24, 5, 30, 0));
const isPhotoOutdated = (photo: PhotoDb) =>
photo.updatedAt < UPDATED_BEFORE_01 || (
photo.updatedAt < UPDATED_BEFORE_02 &&
photo.make === MAKE_FUJIFILM
);
const getMissingAiTextFields = ({
title,
caption,
tags,
semanticDescription,
}: PhotoDb | Photo): AiAutoGeneratedField[] =>
AI_TEXT_AUTO_GENERATED_FIELDS.reduce((fields, field) => {
switch (field) {
case 'title':
return !title ? [...fields, 'title'] : fields;
case 'caption':
return !caption ? [...fields, 'caption'] : fields;
case 'tags':
return (tags ?? []).length === 0 ? [...fields, 'tags'] : fields;
case 'semantic':
return !semanticDescription ? [...fields, 'semantic'] : fields;
}
}, [] as AiAutoGeneratedField[]);
export const generatePhotoSyncStatus = (photo: PhotoDb): PhotoSyncStatus => ({
isOutdated: isPhotoOutdated(photo),
missingAiTextFields: getMissingAiTextFields(photo),
});
export const photoHasSyncStatusText = (photo: Photo) =>
photo.syncStatus.isOutdated ||
photo.syncStatus.missingAiTextFields.length > 0;
export const photoSyncStatusText = (photo: Photo) => {
const { isOutdated, missingAiTextFields } = photo.syncStatus;
const text: string[] = [];
if (isOutdated) {
text.push('Outdated Data');
} else if (missingAiTextFields.length > 0) {
const missingFieldsText = missingAiTextFields
.map(field => field.toLocaleUpperCase())
.join(', ');
text.push(`Missing AI Text (${missingFieldsText})`);
}
return text.join(' and ');
};