fix(find): use getUserHeaders() for Immich smart search auth

The /api/find/search handler was hard-coding `Authorization: Bearer ${currentUser?.accessToken}`. When Power Tools authenticates via `IMMICH_API_KEY` (no cookie session), `accessToken` is undefined and Immich returns 401 — which surfaces in the UI as "No results found", making the feature silently unusable in API-key deployments.

This swaps the inline header construction for the existing `getUserHeaders()` helper in `src/helpers/user.helper.ts`, which already handles both modes: `x-api-key` when `isUsingAPIKey`, `Authorization: Bearer …` otherwise.

Also adds an explicit 403 when there's no authenticated user, instead of letting the request flow forward with `Bearer undefined`.

Repro (before):
  curl -X POST http://localhost:8001/api/find/search -d '{"query":"beach"}' \
  → {"assets":[],"filters":{…},"error":"Failed to fetch assets"}

After:
  same request → 40 assets with embeddings matching "beach"
This commit is contained in:
David Gil Pérez
2026-04-19 14:52:01 +02:00
parent 04edb99217
commit d2a0c9a76d
+5 -4
View File
@@ -4,6 +4,7 @@ import { ASSET_VIDEO_PATH } from "@/config/routes";
import { getCurrentUser } from "@/handlers/serverUtils/user.utils";
import { cleanUpAsset, isFlipped } from "@/helpers/asset.helper";
import { parseFindQuery } from "@/helpers/ai.helper";
import { getUserHeaders } from "@/helpers/user.helper";
import { person } from "@/schema";
import { Person } from "@/schema/person.schema";
import { inArray } from "drizzle-orm";
@@ -16,6 +17,9 @@ export default async function search(
try {
const { query } = req.body;
const currentUser = await getCurrentUser(req);
if (!currentUser) {
return res.status(403).json({ message: "Not authenticated" });
}
const parsedQuery = await parseFindQuery(query as string);
const { personIds } = parsedQuery;
@@ -32,10 +36,7 @@ export default async function search(
return fetch(url, {
method: "POST",
body: JSON.stringify({ ...parsedQuery, withExif: true }),
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${currentUser?.accessToken}`,
},
headers: getUserHeaders(currentUser, { "Content-Type": "application/json" }),
})
.then((response) => {
if (response.status !== 200) {