diff --git a/__tests__/path.test.ts b/__tests__/path.test.ts index eb4828bf..b994166c 100644 --- a/__tests__/path.test.ts +++ b/__tests__/path.test.ts @@ -13,12 +13,12 @@ import { isPathTagPhotoShare, isPathTagShare, } from '@/site/paths'; -import { getMakeModelFromCameraString } from '@/camera'; +import { getCameraFromKey } from '@/camera'; const PHOTO_ID = 'UsKSGcbt'; const TAG = 'tag-name'; const CAMERA = 'fujifilm-x-t1'; -const CAMERA_OBJECT = getMakeModelFromCameraString(CAMERA); +const CAMERA_OBJECT = getCameraFromKey(CAMERA); const SHARE = 'share'; const PATH_ROOT = '/'; diff --git a/src/app/(static)/shot-on/[camera]/image/route.tsx b/src/app/(static)/shot-on/[camera]/image/route.tsx index be0111fa..88fd7569 100644 --- a/src/app/(static)/shot-on/[camera]/image/route.tsx +++ b/src/app/(static)/shot-on/[camera]/image/route.tsx @@ -1,6 +1,6 @@ import { auth } from '@/auth'; import { getImageCacheHeadersForAuth, getPhotosCached } from '@/cache'; -import { getMakeModelFromCameraString } from '@/camera'; +import { getCameraFromKey } from '@/camera'; import { IMAGE_OG_SMALL_SIZE, MAX_PHOTOS_TO_SHOW_PER_TAG, @@ -15,7 +15,7 @@ export async function GET( _: Request, context: { params: { camera: string } }, ) { - const camera = getMakeModelFromCameraString(context.params.camera); + const camera = getCameraFromKey(context.params.camera); const [ photos, diff --git a/src/app/(static)/shot-on/[camera]/page.tsx b/src/app/(static)/shot-on/[camera]/page.tsx index b5c3bb6a..ca213df1 100644 --- a/src/app/(static)/shot-on/[camera]/page.tsx +++ b/src/app/(static)/shot-on/[camera]/page.tsx @@ -1,4 +1,4 @@ -import { getMakeModelFromCameraString } from '@/camera'; +import { getCameraFromKey } from '@/camera'; import { Metadata } from 'next'; import { generateMetaForCamera } from '@/camera/meta'; import { GRID_THUMBNAILS_TO_SHOW_MAX } from '@/photo'; @@ -18,7 +18,7 @@ interface CameraProps { export async function generateMetadata({ params, }: CameraProps): Promise { - const camera = getMakeModelFromCameraString(params.camera); + const camera = getCameraFromKey(params.camera); const [ photos, @@ -57,7 +57,7 @@ export default async function CameraPage({ params, searchParams, }: CameraProps & PaginationParams) { - const camera = getMakeModelFromCameraString(params.camera); + const camera = getCameraFromKey(params.camera); const { photos, diff --git a/src/app/(static)/shot-on/[camera]/share/page.tsx b/src/app/(static)/shot-on/[camera]/share/page.tsx index 2b2ca338..1c8b51f2 100644 --- a/src/app/(static)/shot-on/[camera]/share/page.tsx +++ b/src/app/(static)/shot-on/[camera]/share/page.tsx @@ -1,4 +1,4 @@ -import { cameraFromPhoto, getMakeModelFromCameraString } from '@/camera'; +import { cameraFromPhoto, getCameraFromKey } from '@/camera'; import CameraShareModal from '@/camera/CameraShareModal'; import { generateMetaForCamera } from '@/camera/meta'; import { Metadata } from 'next'; @@ -19,7 +19,7 @@ interface CameraProps { export async function generateMetadata({ params, }: CameraProps): Promise { - const camera = getMakeModelFromCameraString(params.camera); + const camera = getCameraFromKey(params.camera); const [ photos, @@ -58,7 +58,7 @@ export default async function Share({ params, searchParams, }: CameraProps & PaginationParams) { - const cameraFromParams = getMakeModelFromCameraString(params.camera); + const cameraFromParams = getCameraFromKey(params.camera); const { photos, diff --git a/src/app/(static)/t/[tag]/page.tsx b/src/app/(static)/t/[tag]/page.tsx index ef37b920..30e1193b 100644 --- a/src/app/(static)/t/[tag]/page.tsx +++ b/src/app/(static)/t/[tag]/page.tsx @@ -20,6 +20,7 @@ export async function generateMetadata({ const [ photos, count, + dateRange, ] = await getPhotosTagDataCached({ tag, limit: GRID_THUMBNAILS_TO_SHOW_MAX, @@ -30,7 +31,7 @@ export async function generateMetadata({ title, description, images, - } = generateMetaForTag(tag, photos, count); + } = generateMetaForTag(tag, photos, count, dateRange); return { title, diff --git a/src/cache/index.ts b/src/cache/index.ts index a3ce19e5..178e0d05 100644 --- a/src/cache/index.ts +++ b/src/cache/index.ts @@ -69,14 +69,14 @@ const getPhotoCacheTag = (photoId: string) => `photo-${photoId}`; const getPhotoTagCountTag = (tag: string) => `${TAG_PHOTOS_COUNT}-${TAG_TAGS}-${tag}`; -const getPhotoCameraCountTag = ({ make, model }: Camera) => - `${TAG_PHOTOS_COUNT}-${TAG_CAMERAS}-${createCameraKey(make, model)}`; +const getPhotoCameraCountTag = (camera: Camera) => + `${TAG_PHOTOS_COUNT}-${TAG_CAMERAS}-${createCameraKey(camera)}`; const getPhotoTagDateRangeTag = (tag: string) => `${TAG_PHOTOS_DATE_RANGE}-${TAG_TAGS}-${tag}`; -const getPhotoCameraDateRangeTag = ({ make, model }: Camera) => - `${TAG_PHOTOS_DATE_RANGE}-${TAG_CAMERAS}-${createCameraKey(make, model)}`; +const getPhotoCameraDateRangeTag = (camera: Camera) => + `${TAG_PHOTOS_DATE_RANGE}-${TAG_CAMERAS}-${createCameraKey(camera)}`; export const revalidatePhotosTag = () => revalidateTag(TAG_PHOTOS); diff --git a/src/camera/index.ts b/src/camera/index.ts index 5f609c28..0d75b338 100644 --- a/src/camera/index.ts +++ b/src/camera/index.ts @@ -8,12 +8,12 @@ export type Camera = { model: string }; -export const createCameraKey = (make: string, model: string) => +export const createCameraKey = ({ make, model }: Camera) => parameterize(`${make}-${model}`); // Assumes no makes ('Fujifilm,' 'Apple,' 'Canon', etc.) have dashes -export const getMakeModelFromCameraString = (camera: string): Camera => { - const [make, model] = camera.toLowerCase().split(/[-| ](.*)/s); +export const getCameraFromKey = (cameraKey: string): Camera => { + const [make, model] = cameraKey.toLowerCase().split(/[-| ](.*)/s); return { make, model }; }; @@ -24,7 +24,7 @@ export const cameraFromPhoto = ( photo?.make && photo?.model ? { make: photo.make, model: photo.model } : typeof fallback === 'string' - ? getMakeModelFromCameraString(fallback) + ? getCameraFromKey(fallback) : fallback ?? CAMERA_PLACEHOLDER; export const formatCameraText = ({ make, model }: Camera) => diff --git a/src/services/postgres.ts b/src/services/postgres.ts index 3ed1a1fb..30a7b9d6 100644 --- a/src/services/postgres.ts +++ b/src/services/postgres.ts @@ -281,7 +281,7 @@ const sqlGetUniqueCameras = async () => sql` WHERE hidden IS NOT TRUE ORDER BY camera ASC `.then(({ rows }) => rows.map(({ make, model }) => ({ - cameraKey: createCameraKey(make, model), + cameraKey: createCameraKey({ make, model }), camera: { make, model } as Camera, }))); diff --git a/src/site/paths.ts b/src/site/paths.ts index c636db01..e8529434 100644 --- a/src/site/paths.ts +++ b/src/site/paths.ts @@ -3,7 +3,7 @@ import { BASE_URL } from './config'; import { Camera, createCameraKey, - getMakeModelFromCameraString, + getCameraFromKey, } from '@/camera'; // Prefixes @@ -81,11 +81,8 @@ export const pathForTag = (tag: string, next?: number) => export const pathForTagShare = (tag: string) => `${pathForTag(tag)}/${SHARE}`; -export const pathForCamera = ({ make, model }: Camera, next?: number) => - pathWithNext( - `${PREFIX_CAMERA}/${createCameraKey(make, model)}`, - next, - ); +export const pathForCamera = (camera: Camera, next?: number) => + pathWithNext(`${PREFIX_CAMERA}/${createCameraKey(camera)}`, next); export const pathForCameraShare = (camera: Camera) => `${pathForCamera(camera)}/${SHARE}`; @@ -177,7 +174,7 @@ export const getPathComponents = (pathname = ''): { const tag = pathname.match(/^\/t\/([^/]+)/)?.[1]; const cameraString = pathname.match(/^\/shot-on\/([^/]+)/)?.[1]; const camera = cameraString - ? getMakeModelFromCameraString(cameraString) + ? getCameraFromKey(cameraString) : undefined; return { photoId: (