feat(backend): include status, cooldownUntil, lastSeenAt and sleep flag

This commit is contained in:
chahinebrini 2026-06-16 20:28:21 +02:00
parent 4ee6849f3f
commit 97977011ae
3 changed files with 48 additions and 2 deletions

View File

@ -43,6 +43,7 @@ export default defineEventHandler(async (event) => {
listProtectedDevices(user.id), listProtectedDevices(user.id),
]); ]);
const now = new Date();
const magicItems = magic.map((d) => { const magicItems = magic.map((d) => {
let releaseAvailableAt: string | null = null; let releaseAvailableAt: string | null = null;
if (d.releaseRequestedAt) { if (d.releaseRequestedAt) {
@ -50,15 +51,28 @@ export default defineEventHandler(async (event) => {
d.releaseRequestedAt.getTime() + 24 * 60 * 60 * 1000, d.releaseRequestedAt.getTime() + 24 * 60 * 60 * 1000,
).toISOString(); ).toISOString();
} }
const inCooldown = d.magicCooldownUntil && d.magicCooldownUntil > now;
const status = d.magicRevokedAt
? "revoked"
: inCooldown
? "cooldown"
: d.magicEnrolledAt
? "active"
: "pending";
return { return {
source: "magic" as const, source: "magic" as const,
deviceId: d.deviceId, deviceId: d.deviceId,
hostname: d.hostname ?? "Unbenanntes Ger\u00e4t", hostname: d.hostname ?? "Unbenanntes Ger\u00e4t",
model: d.model, model: d.model,
osVersion: d.osVersion, osVersion: d.osVersion,
magicEnrolledAt: d.magicEnrolledAt.toISOString(), magicEnrolledAt: d.magicEnrolledAt?.toISOString() ?? null,
releaseRequestedAt: d.releaseRequestedAt?.toISOString() ?? null, releaseRequestedAt: d.releaseRequestedAt?.toISOString() ?? null,
releaseAvailableAt, 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(), magicEnrolledAt: d.lastSeenAt.toISOString(),
releaseRequestedAt: d.releaseRequestedAt?.toISOString() ?? null, releaseRequestedAt: d.releaseRequestedAt?.toISOString() ?? null,
releaseAvailableAt, 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(), magicEnrolledAt: (d.installedAt ?? d.createdAt).toISOString(),
releaseRequestedAt: null as string | null, releaseRequestedAt: null as string | null,
releaseAvailableAt: null as string | null, releaseAvailableAt: null as string | null,
status: "active" as const,
lastSeenAt: null,
cooldownUntil: null,
})); }));
return { return {

View File

@ -27,10 +27,23 @@ export default defineEventHandler(async (event) => {
const device = await findMagicDeviceByToken(token); const device = await findMagicDeviceByToken(token);
if (!device) {
return { return {
success: true, success: true,
data: { data: {
active: device !== null, active: false,
sleep: false,
},
};
}
const inCooldown = device.magicCooldownUntil && device.magicCooldownUntil > new Date();
return {
success: true,
data: {
active: !device.magicRevokedAt && !!device.magicEnrolledAt,
sleep: !!inCooldown,
}, },
}; };
}); });

View File

@ -423,6 +423,9 @@ export interface MagicDeviceRecord {
osVersion: string | null; osVersion: string | null;
magicEnrolledAt: Date; magicEnrolledAt: Date;
releaseRequestedAt: Date | null; releaseRequestedAt: Date | null;
magicRevokedAt: Date | null;
magicCooldownUntil: Date | null;
lastSeenAt: Date | null;
} }
/** /**
@ -447,6 +450,9 @@ export async function listMagicDevices(
osVersion: true, osVersion: true,
magicEnrolledAt: true, magicEnrolledAt: true,
releaseRequestedAt: true, releaseRequestedAt: true,
magicRevokedAt: true,
magicCooldownUntil: true,
lastSeenAt: true,
}, },
}); });
@ -457,6 +463,9 @@ export async function listMagicDevices(
osVersion: d.osVersion, osVersion: d.osVersion,
magicEnrolledAt: d.magicEnrolledAt!, magicEnrolledAt: d.magicEnrolledAt!,
releaseRequestedAt: d.releaseRequestedAt, releaseRequestedAt: d.releaseRequestedAt,
magicRevokedAt: d.magicRevokedAt,
magicCooldownUntil: d.magicCooldownUntil,
lastSeenAt: d.lastSeenAt,
})); }));
} }
@ -484,6 +493,9 @@ export async function findMagicDeviceByToken(
): Promise< ): Promise<
| (DeviceRecord & { | (DeviceRecord & {
magicDnsToken: string; magicDnsToken: string;
magicEnrolledAt: Date | null;
magicRevokedAt: Date | null;
magicCooldownUntil: Date | null;
magicRemovalPassword: string | null; magicRemovalPassword: string | null;
}) })
| null | null
@ -498,6 +510,7 @@ export async function findMagicDeviceByToken(
magicDnsToken: true, magicDnsToken: true,
magicEnrolledAt: true, magicEnrolledAt: true,
magicRevokedAt: true, magicRevokedAt: true,
magicCooldownUntil: true,
magicHostname: true, magicHostname: true,
magicRemovalPassword: true, magicRemovalPassword: true,
}, },