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),
]);
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 {

View File

@ -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,
},
};
});

View File

@ -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,
},