Slim gallery face payloads for home SSR and search API.

Grid only needs location + person names; drop landmarks/pose/detector fields.
This commit is contained in:
2026-08-04 21:34:23 -04:00
parent d0b9a0c40d
commit 66e5ec3a45
3 changed files with 25 additions and 65 deletions
+2 -32
View File
@@ -3,6 +3,7 @@ import { prisma, prismaAuth } from '@/lib/db';
import { serializePhotos } from '@/lib/serialize';
import { auth } from '@/app/api/auth/[...nextauth]/route';
import { photoIdsMatchingAll } from '@/lib/search-filter-sql';
import { gridFaceSelect } from '@/lib/grid-face-select';
export async function GET(request: NextRequest) {
try {
@@ -265,38 +266,7 @@ export async function GET(request: NextRequest) {
try {
faces = await prisma.face.findMany({
where: { photo_id: { in: photoIds } },
select: {
id: true,
photo_id: true,
person_id: true,
location: true,
confidence: true,
quality_score: true,
is_primary_encoding: true,
detector_backend: true,
model_name: true,
face_confidence: true,
exif_orientation: true,
pose_mode: true,
yaw_angle: true,
pitch_angle: true,
roll_angle: true,
landmarks: true,
identified_by_user_id: true,
excluded: true,
Person: {
select: {
id: true,
first_name: true,
last_name: true,
middle_name: true,
maiden_name: true,
date_of_birth: true,
created_date: true,
},
},
// Exclude encoding field (Bytes) to avoid P2023 conversion errors
},
select: gridFaceSelect,
});
} catch (faceError: any) {
if (faceError?.code === 'P2023' || faceError?.message?.includes('Conversion failed')) {
+2 -33
View File
@@ -1,8 +1,8 @@
import { Suspense } from 'react';
import { prisma } from '@/lib/db';
import { HomePageContent } from './HomePageContent';
import { Photo } from '@prisma/client';
import { serializePhotos, serializePeople, serializeTags } from '@/lib/serialize';
import { gridFaceSelect } from '@/lib/grid-face-select';
// Force dynamic rendering to prevent database queries during build
export const dynamic = 'force-dynamic';
@@ -171,38 +171,7 @@ export default async function HomePage() {
const photoIds = photosBase.map(p => p.id);
const faces = await prisma.face.findMany({
where: { photo_id: { in: photoIds } },
select: {
id: true,
photo_id: true,
person_id: true,
location: true,
confidence: true,
quality_score: true,
is_primary_encoding: true,
detector_backend: true,
model_name: true,
face_confidence: true,
exif_orientation: true,
pose_mode: true,
yaw_angle: true,
pitch_angle: true,
roll_angle: true,
landmarks: true,
identified_by_user_id: true,
excluded: true,
Person: {
select: {
id: true,
first_name: true,
last_name: true,
middle_name: true,
maiden_name: true,
date_of_birth: true,
created_date: true,
},
},
// Exclude encoding field (Bytes) to avoid P2023 conversion errors
},
select: gridFaceSelect,
});
// Combine the data manually
+21
View File
@@ -0,0 +1,21 @@
/**
* Minimal face fields for gallery grid (tooltips / hover names only).
* Avoids loading landmarks, pose, detector metadata on every home/search request.
*/
export const gridFaceSelect = {
id: true,
photo_id: true,
person_id: true,
location: true,
Person: {
select: {
id: true,
first_name: true,
last_name: true,
middle_name: true,
maiden_name: true,
date_of_birth: true,
created_date: true,
},
},
} as const;