mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-10 13:22:14 +00:00
The 409 email-conflict branch had a safe, specific message already, but no errorCode - the account-section fallback would have had nothing to translate it through once it stopped echoing json.error verbatim. Give it profile.update.emailInUse so it renders in the active locale like every other profile-save outcome, and propagate errorCode through both route handlers even on the (non-issues) conflict path. Also updates the /api/user/profile route test for the reported scenario directly: a valid timeFormat now lands even when gender in the same PATCH is unsupported, instead of the whole request failing.
47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
import {
|
|
apiSuccess,
|
|
apiError,
|
|
apiValidationError,
|
|
getClientIp,
|
|
safeJson,
|
|
} from "@/lib/api-response";
|
|
import { NextRequest } from "next/server";
|
|
import { apiHandler, requireAuth } from "@/lib/api-handler";
|
|
import { annotate } from "@/lib/logging/context";
|
|
import { applyProfileUpdate } from "@/lib/auth/profile-update";
|
|
|
|
export const PUT = apiHandler(async (request: NextRequest) => {
|
|
const { user } = await requireAuth();
|
|
|
|
const { data: body, error: jsonError } = await safeJson(request, {
|
|
maxBytes: 64 * 1024,
|
|
});
|
|
if (jsonError) return jsonError;
|
|
|
|
const result = await applyProfileUpdate(user.id, body, getClientIp(request));
|
|
if (!result.ok) {
|
|
const meta = result.errorCode ? { errorCode: result.errorCode } : undefined;
|
|
return result.issues
|
|
? apiValidationError(result.message, result.issues, result.status, meta)
|
|
: apiError(result.message, result.status, meta);
|
|
}
|
|
|
|
annotate({ action: { name: "auth.profile.update" } });
|
|
|
|
return apiSuccess({
|
|
id: result.user.id,
|
|
username: result.user.username,
|
|
email: result.user.email,
|
|
role: result.user.role,
|
|
heightCm: result.user.heightCm,
|
|
dateOfBirth: result.user.dateOfBirth,
|
|
gender: result.user.gender,
|
|
timezone: result.user.timezone,
|
|
fullName: result.user.fullName,
|
|
insurerName: result.user.insurerName,
|
|
insurerIkNumber: result.user.insurerIkNumber,
|
|
hasInsuranceNumber: result.user.hasInsuranceNumber,
|
|
...(result.rejectedFields ? { rejectedFields: result.rejectedFields } : {}),
|
|
});
|
|
});
|