🗃️ add sqlite table for labels

This commit is contained in:
Fred KISSIE
2026-05-05 21:08:22 +02:00
parent 3253d60900
commit 09baf2f32e

View File

@@ -183,6 +183,47 @@ export const resources = sqliteTable("resources", {
wildcard: integer("wildcard", { mode: "boolean" }).notNull().default(false) wildcard: integer("wildcard", { mode: "boolean" }).notNull().default(false)
}); });
export const labels = sqliteTable("labels", {
labelId: integer("labelId").primaryKey({ autoIncrement: true }),
name: text("name").notNull(),
color: text("color").notNull(),
orgId: text("orgId")
.references(() => orgs.orgId, {
onDelete: "cascade"
})
.notNull()
});
export const siteLabels = sqliteTable("siteLabels", {
siteLabelId: integer("siteLabelId").primaryKey({ autoIncrement: true }),
siteId: integer("siteId")
.references(() => sites.siteId, {
onDelete: "cascade"
})
.notNull(),
labelId: integer("labelId")
.references(() => labels.labelId, {
onDelete: "cascade"
})
.notNull()
});
export const resourceLabels = sqliteTable("resourceLabels", {
resourceLabelId: integer("resourceLabelId").primaryKey({
autoIncrement: true
}),
resourceId: integer("resourceId")
.references(() => resources.resourceId, {
onDelete: "cascade"
})
.notNull(),
labelId: integer("labelId")
.references(() => labels.labelId, {
onDelete: "cascade"
})
.notNull()
});
export const targets = sqliteTable("targets", { export const targets = sqliteTable("targets", {
targetId: integer("targetId").primaryKey({ autoIncrement: true }), targetId: integer("targetId").primaryKey({ autoIncrement: true }),
resourceId: integer("resourceId") resourceId: integer("resourceId")
@@ -219,9 +260,11 @@ export const targetHealthCheck = sqliteTable("targetHealthCheck", {
onDelete: "cascade" onDelete: "cascade"
}) })
.notNull(), .notNull(),
siteId: integer("siteId").references(() => sites.siteId, { siteId: integer("siteId")
onDelete: "cascade" .references(() => sites.siteId, {
}).notNull(), onDelete: "cascade"
})
.notNull(),
name: text("name"), name: text("name"),
hcEnabled: integer("hcEnabled", { mode: "boolean" }) hcEnabled: integer("hcEnabled", { mode: "boolean" })
.notNull() .notNull()
@@ -1196,19 +1239,30 @@ export const roundTripMessageTracker = sqliteTable("roundTripMessageTracker", {
complete: integer("complete", { mode: "boolean" }).notNull().default(false) complete: integer("complete", { mode: "boolean" }).notNull().default(false)
}); });
export const statusHistory = sqliteTable("statusHistory", { export const statusHistory = sqliteTable(
id: integer("id").primaryKey({ autoIncrement: true }), "statusHistory",
entityType: text("entityType").notNull(), // "site" | "healthCheck" {
entityId: integer("entityId").notNull(), // siteId or targetHealthCheckId id: integer("id").primaryKey({ autoIncrement: true }),
orgId: text("orgId") entityType: text("entityType").notNull(), // "site" | "healthCheck"
.notNull() entityId: integer("entityId").notNull(), // siteId or targetHealthCheckId
.references(() => orgs.orgId, { onDelete: "cascade" }), orgId: text("orgId")
status: text("status").notNull(), // "online"/"offline" for sites; "healthy"/"unhealthy"/"unknown" for healthChecks .notNull()
timestamp: integer("timestamp").notNull(), // unix epoch seconds .references(() => orgs.orgId, { onDelete: "cascade" }),
}, (table) => [ status: text("status").notNull(), // "online"/"offline" for sites; "healthy"/"unhealthy"/"unknown" for healthChecks
index("idx_statusHistory_entity").on(table.entityType, table.entityId, table.timestamp), timestamp: integer("timestamp").notNull() // unix epoch seconds
index("idx_statusHistory_org_timestamp").on(table.orgId, table.timestamp), },
]); (table) => [
index("idx_statusHistory_entity").on(
table.entityType,
table.entityId,
table.timestamp
),
index("idx_statusHistory_org_timestamp").on(
table.orgId,
table.timestamp
)
]
);
export type Org = InferSelectModel<typeof orgs>; export type Org = InferSelectModel<typeof orgs>;
export type User = InferSelectModel<typeof users>; export type User = InferSelectModel<typeof users>;
@@ -1278,3 +1332,4 @@ export type RoundTripMessageTracker = InferSelectModel<
typeof roundTripMessageTracker typeof roundTripMessageTracker
>; >;
export type StatusHistory = InferSelectModel<typeof statusHistory>; export type StatusHistory = InferSelectModel<typeof statusHistory>;
export type Label = InferSelectModel<typeof labels>;