64 lines
2.0 KiB
TypeScript
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 ');
|
|
};
|