52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
import { requireUser } from "../../utils/auth";
|
|
import { getActiveCooldown, resolveCooldown } from "../../db/cooldown";
|
|
import { getProfile } from "../../db/profile";
|
|
|
|
/**
|
|
* GET /api/protection/state
|
|
* Combined protection + cooldown state polled every 30 s by the app.
|
|
*/
|
|
export default defineEventHandler(async (event) => {
|
|
const user = await requireUser(event);
|
|
|
|
const [cooldown, profile] = await Promise.all([
|
|
getActiveCooldown(user.id),
|
|
getProfile(user.id),
|
|
]);
|
|
|
|
const now = new Date();
|
|
let active = false;
|
|
let remainingSeconds = 0;
|
|
let cooldownEndsAt: string | null = null;
|
|
|
|
if (cooldown) {
|
|
const expired = now >= cooldown.cooldownEndsAt;
|
|
if (expired) {
|
|
await resolveCooldown(cooldown.id);
|
|
// After resolve: no active cooldown
|
|
} else {
|
|
active = true;
|
|
remainingSeconds = Math.max(
|
|
0,
|
|
Math.floor((cooldown.cooldownEndsAt.getTime() - now.getTime()) / 1000),
|
|
);
|
|
cooldownEndsAt = cooldown.cooldownEndsAt.toISOString();
|
|
}
|
|
}
|
|
|
|
const plan = (profile?.plan ?? "free") as "free" | "pro" | "legend";
|
|
|
|
return {
|
|
success: true,
|
|
data: {
|
|
protectionShouldBeActive: !active,
|
|
cooldown: {
|
|
active,
|
|
remainingSeconds,
|
|
cooldownEndsAt,
|
|
},
|
|
plan,
|
|
},
|
|
};
|
|
});
|