diff --git a/bun.lock b/bun.lock index f76ce9a..1c6c31b 100644 --- a/bun.lock +++ b/bun.lock @@ -5,9 +5,11 @@ "name": "graff-mate-server", "dependencies": { "@elysiajs/cors": "^1.2.0", + "date-fns": "^4.1.0", "drizzle-orm": "^0.40.0", "elysia": "latest", "jose": "^6.0.10", + "node-cron": "^4.1.0", "postgres": "^3.4.5", }, "devDependencies": { @@ -95,6 +97,8 @@ "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], + "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], "drizzle-kit": ["drizzle-kit@0.30.5", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.19.7", "esbuild-register": "^3.5.0", "gel": "^2.0.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA=="], @@ -123,6 +127,8 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "node-cron": ["node-cron@4.1.0", "", {}, "sha512-OS+3ORu+h03/haS6Di8Qr7CrVs4YaKZZOynZwQpyPZDnR3tqRbwJmuP2gVR16JfhLgyNlloAV1VTrrWlRogCFA=="], + "obuf": ["obuf@1.1.2", "", {}, "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="], "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], diff --git a/package.json b/package.json index 43ad00d..edb1066 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,11 @@ }, "dependencies": { "@elysiajs/cors": "^1.2.0", + "date-fns": "^4.1.0", "drizzle-orm": "^0.40.0", "elysia": "latest", "jose": "^6.0.10", + "node-cron": "^4.1.0", "postgres": "^3.4.5" }, "devDependencies": { diff --git a/src/db/schema/servers.ts b/src/db/schema/servers.ts index c314297..0e776ed 100644 --- a/src/db/schema/servers.ts +++ b/src/db/schema/servers.ts @@ -19,6 +19,9 @@ export const serversTable = pgTable("servers", { .notNull() .defaultNow() .$onUpdate(() => new Date()), + status: varchar("status", { enum: ["online", "offline"] }) + .notNull() + .default("online"), }); export const serversRelations = relations(serversTable, ({ one, many }) => ({ diff --git a/src/index.ts b/src/index.ts index 4f530af..8eae118 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ +import { differenceInSeconds } from "date-fns"; import { Elysia } from "elysia"; import cors from "@elysiajs/cors"; import authController from "./controllers/authController"; @@ -6,6 +7,10 @@ import sessionsController from "./controllers/sessionsController"; import serversController from "./controllers/serversController"; import appsController from "./controllers/appsController"; import { clientsController } from "./controllers/clientsController"; +import db from "./db"; +import { serversTable } from "./db/schema/servers"; +import { eq } from "drizzle-orm"; +import cron from "node-cron"; const app = new Elysia(); @@ -24,6 +29,19 @@ app.use(clientsController); app.listen(3000); +async function checkServersStatus() { + const servers = await db.query.serversTable.findMany(); + for (const { status, updatedAt, id } of servers) { + if (status === "online" && differenceInSeconds(new Date(), updatedAt) > 20) + await db + .update(serversTable) + .set({ status: "offline" }) + .where(eq(serversTable.id, id)); + } +} + +cron.schedule("*/10 * * * * *", checkServersStatus); + console.log( `🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}` );