From 97977011aee29508600f444493667e7deee99acd Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Tue, 16 Jun 2026 20:28:21 +0200 Subject: [PATCH] feat(backend): include status, cooldownUntil, lastSeenAt and sleep flag --- backend/server/api/magic/devices.get.ts | 22 +++++++++++++++++++++- backend/server/api/magic/status.get.ts | 15 ++++++++++++++- backend/server/db/devices.ts | 13 +++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/backend/server/api/magic/devices.get.ts b/backend/server/api/magic/devices.get.ts index 61104b6..7c78c91 100644 --- a/backend/server/api/magic/devices.get.ts +++ b/backend/server/api/magic/devices.get.ts @@ -43,6 +43,7 @@ export default defineEventHandler(async (event) => { listProtectedDevices(user.id), ]); + const now = new Date(); const magicItems = magic.map((d) => { let releaseAvailableAt: string | null = null; if (d.releaseRequestedAt) { @@ -50,15 +51,28 @@ export default defineEventHandler(async (event) => { d.releaseRequestedAt.getTime() + 24 * 60 * 60 * 1000, ).toISOString(); } + + const inCooldown = d.magicCooldownUntil && d.magicCooldownUntil > now; + const status = d.magicRevokedAt + ? "revoked" + : inCooldown + ? "cooldown" + : d.magicEnrolledAt + ? "active" + : "pending"; + return { source: "magic" as const, deviceId: d.deviceId, hostname: d.hostname ?? "Unbenanntes Ger\u00e4t", model: d.model, osVersion: d.osVersion, - magicEnrolledAt: d.magicEnrolledAt.toISOString(), + magicEnrolledAt: d.magicEnrolledAt?.toISOString() ?? null, releaseRequestedAt: d.releaseRequestedAt?.toISOString() ?? null, releaseAvailableAt, + cooldownUntil: d.magicCooldownUntil?.toISOString() ?? null, + status, + lastSeenAt: d.lastSeenAt?.toISOString() ?? null, }; }); @@ -78,6 +92,9 @@ export default defineEventHandler(async (event) => { magicEnrolledAt: d.lastSeenAt.toISOString(), releaseRequestedAt: d.releaseRequestedAt?.toISOString() ?? null, releaseAvailableAt, + status: "active" as const, + lastSeenAt: d.lastSeenAt?.toISOString() ?? null, + cooldownUntil: null, }; }); @@ -121,6 +138,9 @@ export default defineEventHandler(async (event) => { magicEnrolledAt: (d.installedAt ?? d.createdAt).toISOString(), releaseRequestedAt: null as string | null, releaseAvailableAt: null as string | null, + status: "active" as const, + lastSeenAt: null, + cooldownUntil: null, })); return { diff --git a/backend/server/api/magic/status.get.ts b/backend/server/api/magic/status.get.ts index e0c5195..12de8e1 100644 --- a/backend/server/api/magic/status.get.ts +++ b/backend/server/api/magic/status.get.ts @@ -27,10 +27,23 @@ export default defineEventHandler(async (event) => { const device = await findMagicDeviceByToken(token); + if (!device) { + return { + success: true, + data: { + active: false, + sleep: false, + }, + }; + } + + const inCooldown = device.magicCooldownUntil && device.magicCooldownUntil > new Date(); + return { success: true, data: { - active: device !== null, + active: !device.magicRevokedAt && !!device.magicEnrolledAt, + sleep: !!inCooldown, }, }; }); diff --git a/backend/server/db/devices.ts b/backend/server/db/devices.ts index cecb053..78e5d19 100644 --- a/backend/server/db/devices.ts +++ b/backend/server/db/devices.ts @@ -423,6 +423,9 @@ export interface MagicDeviceRecord { osVersion: string | null; magicEnrolledAt: Date; releaseRequestedAt: Date | null; + magicRevokedAt: Date | null; + magicCooldownUntil: Date | null; + lastSeenAt: Date | null; } /** @@ -447,6 +450,9 @@ export async function listMagicDevices( osVersion: true, magicEnrolledAt: true, releaseRequestedAt: true, + magicRevokedAt: true, + magicCooldownUntil: true, + lastSeenAt: true, }, }); @@ -457,6 +463,9 @@ export async function listMagicDevices( osVersion: d.osVersion, magicEnrolledAt: d.magicEnrolledAt!, releaseRequestedAt: d.releaseRequestedAt, + magicRevokedAt: d.magicRevokedAt, + magicCooldownUntil: d.magicCooldownUntil, + lastSeenAt: d.lastSeenAt, })); } @@ -484,6 +493,9 @@ export async function findMagicDeviceByToken( ): Promise< | (DeviceRecord & { magicDnsToken: string; + magicEnrolledAt: Date | null; + magicRevokedAt: Date | null; + magicCooldownUntil: Date | null; magicRemovalPassword: string | null; }) | null @@ -498,6 +510,7 @@ export async function findMagicDeviceByToken( magicDnsToken: true, magicEnrolledAt: true, magicRevokedAt: true, + magicCooldownUntil: true, magicHostname: true, magicRemovalPassword: true, },