From 996339e4acf7f5973775ff60e0d776d87145a3fe Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Mon, 18 Dec 2023 11:52:43 -0600 Subject: [PATCH] Adjust sql/priority handling --- src/app/(static)/p/[photoId]/layout.tsx | 4 +-- src/services/vercel-postgres.ts | 35 +++++++++++++------------ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/app/(static)/p/[photoId]/layout.tsx b/src/app/(static)/p/[photoId]/layout.tsx index 24a7dea0..eac8b33f 100644 --- a/src/app/(static)/p/[photoId]/layout.tsx +++ b/src/app/(static)/p/[photoId]/layout.tsx @@ -62,13 +62,13 @@ export default async function PhotoPage({ photosAfter, ] = await Promise.all([ getPhotosCached({ - ...(PRIORITY_ORDER_ENABLED && photo.priorityOrder !== undefined) + ...(PRIORITY_ORDER_ENABLED && photo.priorityOrder !== null) ? { beforePriorityOrder: photo.priorityOrder } : { takenBefore: photo.takenAt }, limit: 1, }), getPhotosCached({ - ...(PRIORITY_ORDER_ENABLED && photo.priorityOrder !== undefined) + ...(PRIORITY_ORDER_ENABLED && photo.priorityOrder !== null) ? { afterPriorityOrderInclusive: photo.priorityOrder } : { takenAfterInclusive: photo.takenAt }, limit: GRID_THUMBNAILS_TO_SHOW_MAX + 1, diff --git a/src/services/vercel-postgres.ts b/src/services/vercel-postgres.ts index 2f6f52e9..2fb440e2 100644 --- a/src/services/vercel-postgres.ts +++ b/src/services/vercel-postgres.ts @@ -319,69 +319,70 @@ export const getPhotos = async (options: GetPhotosOptions = {}) => { includeHidden, } = options; - let sql = 'SELECT * FROM photos'; + let sql = ['SELECT * FROM photos']; + let values = [] as (string | number)[]; + let valueIndex = 1; // WHERE let wheres = [] as string[]; - let values = [] as (string | number)[]; - let valueNumber = 1; if (!includeHidden) { wheres.push('hidden IS NOT TRUE'); } if (takenBefore) { - wheres.push(`taken_at > $${valueNumber++}`); + wheres.push(`taken_at > $${valueIndex++}`); values.push(takenBefore.toISOString()); } if (takenAfterInclusive) { - wheres.push(`taken_at <= $${valueNumber++}`); + wheres.push(`taken_at <= $${valueIndex++}`); values.push(takenAfterInclusive.toISOString()); } if (tag) { - wheres.push(`$${valueNumber++}=ANY(tags)`); + wheres.push(`$${valueIndex++}=ANY(tags)`); values.push(tag); } if (camera) { - wheres.push(`LOWER(make)=$${valueNumber++}`); - wheres.push(`LOWER(REPLACE(model, ' ', '-'))=$${valueNumber++}`); + wheres.push(`LOWER(make)=$${valueIndex++}`); + wheres.push(`LOWER(REPLACE(model, ' ', '-'))=$${valueIndex++}`); values.push(parameterize(camera.make)); values.push(parameterize(camera.model)); } if (simulation) { - wheres.push(`film_simulation=$${valueNumber++}`); + wheres.push(`film_simulation=$${valueIndex++}`); values.push(simulation); } if (beforePriorityOrder !== undefined) { - wheres.push(`id < $${valueNumber++}`); + wheres.push(`priority_order < $${valueIndex++}`); values.push(beforePriorityOrder); } if (afterPriorityOrderInclusive !== undefined) { - wheres.push(`id >= $${valueNumber++}`); + // eslint-disable-next-line max-len + wheres.push(`priority_order >= $${valueIndex++} OR priority_order IS NULL`); values.push(afterPriorityOrderInclusive); } if (wheres.length > 0) { - sql += ` WHERE ${wheres.join(' AND ')}`; + sql.push(`WHERE ${wheres.join(' AND ')}`); } // ORDER BY switch (sortBy) { case 'createdAt': - sql += ' ORDER BY created_at DESC'; + sql.push('ORDER BY created_at DESC'); break; case 'takenAt': - sql += ' ORDER BY taken_at DESC'; + sql.push('ORDER BY taken_at DESC'); break; case 'priority': - sql += ' ORDER BY priority_order ASC, taken_at DESC'; + sql.push('ORDER BY priority_order ASC, taken_at DESC'); break; } // LIMIT + OFFSET - sql += ` LIMIT $${valueNumber++} OFFSET $${valueNumber++}`; + sql.push(`LIMIT $${valueIndex++} OFFSET $${valueIndex++}`); values.push(limit, offset); const client = await db.connect(); - return safelyQueryPhotos(() => client.query(sql, values)) + return safelyQueryPhotos(() => client.query(sql.join(' '), values)) .then(({ rows }) => rows.map(parsePhotoFromDb)); };