feat: show managed integration status

- Render a record-keyed status view for managed profiles\n- Refuse shared Settings links before actor controls mount\n- Localize intentional unavailable states
This commit is contained in:
Marc-André Bombeck committed 2026-08-06 02:38:54 +02:00
1 parent 54cd3e3959
commit 03ee01ba56
17 files changed
+343 -32

No files matched your search

@@ -4,12 +4,16 @@ import {
SharingAccessDeniedError,
} from "@/lib/api-handler";
import { apiSuccess } from "@/lib/api-response";
import { prisma } from "@/lib/db";
import {
getIntegrationStatus,
type IntegrationKey,
} from "@/lib/integrations/status";
import { annotate } from "@/lib/logging/context";
import { resolveGuardianRecordSettingsAccess } from "@/lib/record-settings";
import {
resolveGuardianRecordSettingsAccess,
resolveManagedIntegrationState,
} from "@/lib/record-settings";
export const dynamic = "force-dynamic";
@@ -33,17 +37,49 @@ export const GET = apiHandler(async () => {
const context = await requireGuardianAuth();
const access = resolveGuardianRecordSettingsAccess(context);
if (!access) throw new SharingAccessDeniedError();
const integrations = await Promise.all(
MANAGED_INTEGRATIONS.map(async (integration) => {
const status = await getIntegrationStatus(access.recordId, integration);
return {
integration: status.integration,
state: status.state,
lastSuccessAt: status.lastSuccessAt,
lastAttemptAt: status.lastAttemptAt,
};
const [statuses, withings, whoop, fitbit, googleHealth] = await Promise.all([
Promise.all(
MANAGED_INTEGRATIONS.map((integration) =>
getIntegrationStatus(access.recordId, integration),
),
),
prisma.withingsConnection.findUnique({
where: { userId: access.recordId },
select: { id: true },
}),
);
prisma.whoopConnection.findUnique({
where: { userId: access.recordId },
select: { whoopUserId: true },
}),
prisma.fitbitConnection.findUnique({
where: { userId: access.recordId },
select: { id: true },
}),
prisma.googleHealthConnection.findUnique({
where: { userId: access.recordId },
select: { id: true },
}),
]);
const connected: Record<IntegrationKey, boolean> = {
withings: withings !== null,
whoop: whoop?.whoopUserId != null,
fitbit: fitbit !== null,
"google-health": googleHealth !== null,
nightscout: context.user.nightscoutUrlEncrypted !== null,
polar: context.user.polarAccessTokenEncrypted !== null,
oura: context.user.ouraAccessTokenEncrypted !== null,
strava: context.user.stravaAccessTokenEncrypted !== null,
};
const integrations = statuses.map((status) => ({
integration: status.integration,
state: resolveManagedIntegrationState(
status.state,
connected,
status.integration,
),
lastSuccessAt: status.lastSuccessAt,
lastAttemptAt: status.lastAttemptAt,
}));
annotate({ action: { name: "record-settings.integrations.get" } });