import { AppData } from "@/src/data/app-data"; import { ClientRuleProtocols, ClientRuleTypes, } from "@/src/dict/client-rules-dict"; import { MediaParadigms, MediaTypes } from "@/src/dict/media-dict"; import { UserTypes } from "@/src/dict/user-types-dict"; import { Variables } from "@/src/dict/variables-dict"; import type { BUN_SQLITE_DatabaseSchemaType } from "@moduletrace/bun-sqlite/types"; const schema: BUN_SQLITE_DatabaseSchemaType = { tables: [ { tableName: "users", fields: [ { fieldName: "first_name", dataType: "TEXT", }, { fieldName: "last_name", dataType: "TEXT", }, { fieldName: "email", dataType: "TEXT", unique: true, }, { fieldName: "username", dataType: "TEXT", unique: true, }, { fieldName: "password", dataType: "TEXT", }, { fieldName: "bio", dataType: "TEXT", html: true, }, { fieldName: "archived", dataType: "INTEGER", options: [0, 1], defaultValue: 0, }, ], }, { tableName: "user_types", fields: [ { fieldName: "user_id", dataType: "INTEGER", }, { fieldName: "user_type", dataType: "TEXT", options: UserTypes.map((ut) => ut.value), }, ], }, { tableName: "media", fields: [ { fieldName: "user_id", dataType: "INTEGER", }, { fieldName: "title", dataType: "TEXT", }, { fieldName: "description", dataType: "TEXT", }, { fieldName: "summary", dataType: "TEXT", }, { fieldName: "media_type", dataType: "TEXT", options: MediaTypes.map((it) => it.value), }, { fieldName: "media_write_path", dataType: "TEXT", }, { fieldName: "media_thumbnail_write_path", dataType: "TEXT", }, { fieldName: "mime_type", dataType: "TEXT", }, { fieldName: "text_content", dataType: "TEXT", }, { fieldName: "is_primary", dataType: "INTEGER", options: [0, 1], }, { fieldName: "is_rag_ingested", dataType: "INTEGER", options: [0, 1], }, { fieldName: "is_private", dataType: "INTEGER", options: [0, 1], }, { fieldName: "archived", dataType: "INTEGER", options: [0, 1], }, ], uniqueConstraints: [ { alias: "one_user_per_primary_profile_image", constraintName: "One User per primary profile image", constraintTableFields: [ { value: "user_id" }, { value: "is_primary" }, ], }, ], }, { tableName: "media_paradigms", fields: [ { fieldName: "media_id", dataType: "INTEGER", }, { fieldName: "media_paradigm", dataType: "TEXT", options: MediaParadigms.map((mp) => mp.value), }, ], }, { tableName: "clients", fields: [ { fieldName: "user_id", dataType: "INTEGER", }, { fieldName: "host_id", dataType: "INTEGER", defaultValue: 0, }, { fieldName: "name", dataType: "TEXT", }, { fieldName: "wg_ip_address", dataType: "TEXT", }, { fieldName: "public_ip_address", dataType: "TEXT", }, { fieldName: "public_key", dataType: "TEXT", }, { fieldName: "allowed_ips", dataType: "TEXT", }, { fieldName: "allow_all_ips", dataType: "INTEGER", options: [0, 1], }, { fieldName: "notes", dataType: "TEXT", }, ], uniqueConstraints: [ { constraintName: "Unique client IPs per host", alias: "unique_client_ip_per_host", constraintTableFields: [ { value: "host_id", }, { value: "wg_ip_address", }, ], }, ], }, { tableName: "hosts", fields: [ { fieldName: "user_id", dataType: "INTEGER", }, { fieldName: "name", dataType: "TEXT", defaultValue: "Main", }, { fieldName: "short_description", dataType: "TEXT", }, { fieldName: "public_ip_address", dataType: "TEXT", }, { fieldName: "listen_port", dataType: "INTEGER", defaultValue: AppData["DefaultWGListenPort"], }, { fieldName: "interface", dataType: "TEXT", }, { fieldName: "wg_ip_address", dataType: "TEXT", }, { fieldName: "public_key", dataType: "TEXT", }, ], }, { tableName: "client_rules", tableDescription: `IP table rules for this client`, fields: [ { fieldName: "user_id", dataType: "INTEGER", }, { fieldName: "host_id", dataType: "INTEGER", defaultValue: 0, }, { fieldName: "client_id", dataType: "INTEGER", }, { fieldName: "rule_type", dataType: "TEXT", options: ClientRuleTypes.map((rt) => rt.value), }, { fieldName: "destination", dataType: "TEXT", }, { fieldName: "ports", dataType: "TEXT", }, { fieldName: "protocol", dataType: "TEXT", options: ClientRuleProtocols.map((p) => p.value), }, ], }, { tableName: "client_routes", tableDescription: `TLS routes served to WireGuard clients`, fields: [ { fieldName: "user_id", dataType: "INTEGER", }, { fieldName: "host_id", dataType: "INTEGER", defaultValue: 0, }, { fieldName: "name", dataType: "TEXT", }, { fieldName: "hostname", dataType: "TEXT", }, { fieldName: "path_prefix", dataType: "TEXT", defaultValue: "/", }, { fieldName: "strip_prefix", dataType: "INTEGER", options: [0, 1], defaultValue: 0, }, { fieldName: "upstream_url", dataType: "TEXT", }, { fieldName: "upstream_tls_verify", dataType: "INTEGER", options: [0, 1], defaultValue: 1, }, { fieldName: "enabled", dataType: "INTEGER", options: [0, 1], defaultValue: 1, }, { fieldName: "notes", dataType: "TEXT", }, { fieldName: "acme_email", dataType: "TEXT", }, { fieldName: "acme_dns_provider", dataType: "TEXT", }, { fieldName: "acme_staging", dataType: "INTEGER", options: [0, 1], defaultValue: 0, }, { fieldName: "acme_credentials", dataType: "TEXT", }, ], uniqueConstraints: [ { constraintName: "Unique path per route hostname", alias: "unique_path_per_route_hostname", constraintTableFields: [ { value: "hostname" }, { value: "path_prefix" }, ], }, ], }, { tableName: "tls_certificates", tableDescription: `TLS certificates served by the Caddy ingress`, fields: [ { fieldName: "user_id", dataType: "INTEGER", }, { fieldName: "hostname", dataType: "TEXT", unique: true, }, { fieldName: "provider", dataType: "TEXT", defaultValue: "letsencrypt", }, { fieldName: "challenge", dataType: "TEXT", defaultValue: "dns-01", }, { fieldName: "dns_provider", dataType: "TEXT", }, { fieldName: "cert_path", dataType: "TEXT", }, { fieldName: "key_path", dataType: "TEXT", }, { fieldName: "expires_at", dataType: "INTEGER", }, { fieldName: "status", dataType: "TEXT", options: [ "missing", "issuing", "active", "error", "expiring", ], defaultValue: "missing", }, { fieldName: "last_error", dataType: "TEXT", }, { fieldName: "auto_renew", dataType: "INTEGER", options: [0, 1], defaultValue: 1, }, ], }, { tableName: "variables", fields: [ { fieldName: "key", dataType: "TEXT", options: Variables.map((v) => v.value), unique: true, }, { fieldName: "value", dataType: "TEXT", }, ], }, ], }; export default schema;