init
This commit is contained in:
72
lib/db/schema.ts
Normal file
72
lib/db/schema.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
import {
|
||||
mysqlTable,
|
||||
varchar,
|
||||
int,
|
||||
bigint,
|
||||
decimal,
|
||||
datetime,
|
||||
json,
|
||||
index,
|
||||
} from "drizzle-orm/mysql-core";
|
||||
import { sql } from "drizzle-orm";
|
||||
|
||||
export const lobsters = mysqlTable("lobsters", {
|
||||
id: varchar("id", { length: 21 }).primaryKey(),
|
||||
apiKey: varchar("api_key", { length: 64 }).notNull().unique(),
|
||||
name: varchar("name", { length: 100 }).notNull(),
|
||||
platform: varchar("platform", { length: 20 }),
|
||||
model: varchar("model", { length: 50 }),
|
||||
ip: varchar("ip", { length: 45 }),
|
||||
latitude: decimal("latitude", { precision: 10, scale: 7 }),
|
||||
longitude: decimal("longitude", { precision: 10, scale: 7 }),
|
||||
city: varchar("city", { length: 100 }),
|
||||
country: varchar("country", { length: 100 }),
|
||||
countryCode: varchar("country_code", { length: 5 }),
|
||||
region: varchar("region", { length: 50 }),
|
||||
lastHeartbeat: datetime("last_heartbeat"),
|
||||
totalTasks: int("total_tasks").default(0),
|
||||
createdAt: datetime("created_at").default(sql`NOW()`),
|
||||
updatedAt: datetime("updated_at").default(sql`NOW()`),
|
||||
});
|
||||
|
||||
export const heartbeats = mysqlTable(
|
||||
"heartbeats",
|
||||
{
|
||||
id: bigint("id", { mode: "number" }).primaryKey().autoincrement(),
|
||||
lobsterId: varchar("lobster_id", { length: 21 }).notNull(),
|
||||
ip: varchar("ip", { length: 45 }),
|
||||
timestamp: datetime("timestamp").default(sql`NOW()`),
|
||||
},
|
||||
(table) => [
|
||||
index("heartbeats_lobster_id_idx").on(table.lobsterId),
|
||||
index("heartbeats_timestamp_idx").on(table.timestamp),
|
||||
]
|
||||
);
|
||||
|
||||
export const tasks = mysqlTable(
|
||||
"tasks",
|
||||
{
|
||||
id: bigint("id", { mode: "number" }).primaryKey().autoincrement(),
|
||||
lobsterId: varchar("lobster_id", { length: 21 }).notNull(),
|
||||
summary: varchar("summary", { length: 500 }),
|
||||
durationMs: int("duration_ms"),
|
||||
model: varchar("model", { length: 50 }),
|
||||
toolsUsed: json("tools_used").$type<string[]>(),
|
||||
timestamp: datetime("timestamp").default(sql`NOW()`),
|
||||
},
|
||||
(table) => [
|
||||
index("tasks_lobster_id_idx").on(table.lobsterId),
|
||||
index("tasks_timestamp_idx").on(table.timestamp),
|
||||
]
|
||||
);
|
||||
|
||||
export const geoCache = mysqlTable("geo_cache", {
|
||||
ip: varchar("ip", { length: 45 }).primaryKey(),
|
||||
latitude: decimal("latitude", { precision: 10, scale: 7 }),
|
||||
longitude: decimal("longitude", { precision: 10, scale: 7 }),
|
||||
city: varchar("city", { length: 100 }),
|
||||
country: varchar("country", { length: 100 }),
|
||||
countryCode: varchar("country_code", { length: 5 }),
|
||||
region: varchar("region", { length: 50 }),
|
||||
updatedAt: datetime("updated_at").default(sql`NOW()`),
|
||||
});
|
||||
Reference in New Issue
Block a user