From e168a8ddf53bc05151100ded3d2e373417a5d4bf Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Sun, 22 Mar 2026 19:42:12 +0100 Subject: [PATCH] revert: remove db agents for now --- .../20260311132215_fair_rogue/migration.sql | 29 - .../20260311132215_fair_rogue/snapshot.json | 2480 ----------------- app/server/db/relations.ts | 24 - app/server/db/schema.ts | 55 - app/server/modules/agents/agent-tokens.ts | 77 +- 5 files changed, 1 insertion(+), 2664 deletions(-) delete mode 100644 app/drizzle/20260311132215_fair_rogue/migration.sql delete mode 100644 app/drizzle/20260311132215_fair_rogue/snapshot.json diff --git a/app/drizzle/20260311132215_fair_rogue/migration.sql b/app/drizzle/20260311132215_fair_rogue/migration.sql deleted file mode 100644 index a9cf5250..00000000 --- a/app/drizzle/20260311132215_fair_rogue/migration.sql +++ /dev/null @@ -1,29 +0,0 @@ -CREATE TABLE `agent_tokens` ( - `id` text PRIMARY KEY, - `name` text NOT NULL, - `token_hash` text NOT NULL, - `token_prefix` text NOT NULL, - `agent_id` text NOT NULL, - `created_by` text NOT NULL, - `last_used_at` integer, - `revoked_at` integer, - `created_at` integer DEFAULT (unixepoch() * 1000) NOT NULL, - CONSTRAINT `fk_agent_tokens_agent_id_agents_id_fk` FOREIGN KEY (`agent_id`) REFERENCES `agents`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_agent_tokens_created_by_users_table_id_fk` FOREIGN KEY (`created_by`) REFERENCES `users_table`(`id`) ON DELETE CASCADE -); ---> statement-breakpoint -CREATE TABLE `agents` ( - `id` text PRIMARY KEY, - `name` text NOT NULL, - `organization_id` text NOT NULL, - `created_by` text NOT NULL, - `last_seen_at` integer, - `created_at` integer DEFAULT (unixepoch() * 1000) NOT NULL, - CONSTRAINT `fk_agents_organization_id_organization_id_fk` FOREIGN KEY (`organization_id`) REFERENCES `organization`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_agents_created_by_users_table_id_fk` FOREIGN KEY (`created_by`) REFERENCES `users_table`(`id`) ON DELETE CASCADE, - CONSTRAINT `agents_name_org_uidx` UNIQUE(`name`,`organization_id`) -); ---> statement-breakpoint -CREATE UNIQUE INDEX `agent_tokens_token_hash_uidx` ON `agent_tokens` (`token_hash`);--> statement-breakpoint -CREATE INDEX `agent_tokens_agent_id_idx` ON `agent_tokens` (`agent_id`);--> statement-breakpoint -CREATE INDEX `agents_organization_id_idx` ON `agents` (`organization_id`); \ No newline at end of file diff --git a/app/drizzle/20260311132215_fair_rogue/snapshot.json b/app/drizzle/20260311132215_fair_rogue/snapshot.json deleted file mode 100644 index c8bfa8ca..00000000 --- a/app/drizzle/20260311132215_fair_rogue/snapshot.json +++ /dev/null @@ -1,2480 +0,0 @@ -{ - "version": "7", - "dialect": "sqlite", - "id": "264f849c-734e-4874-b2d0-b6c7c47c6b14", - "prevIds": ["c84e81d9-8676-45ec-990f-530f98531c2d"], - "ddl": [ - { - "name": "account", - "entityType": "tables" - }, - { - "name": "agent_tokens", - "entityType": "tables" - }, - { - "name": "agents", - "entityType": "tables" - }, - { - "name": "app_metadata", - "entityType": "tables" - }, - { - "name": "backup_schedule_mirrors_table", - "entityType": "tables" - }, - { - "name": "backup_schedule_notifications_table", - "entityType": "tables" - }, - { - "name": "backup_schedules_table", - "entityType": "tables" - }, - { - "name": "invitation", - "entityType": "tables" - }, - { - "name": "member", - "entityType": "tables" - }, - { - "name": "notification_destinations_table", - "entityType": "tables" - }, - { - "name": "organization", - "entityType": "tables" - }, - { - "name": "repositories_table", - "entityType": "tables" - }, - { - "name": "sessions_table", - "entityType": "tables" - }, - { - "name": "sso_provider", - "entityType": "tables" - }, - { - "name": "two_factor", - "entityType": "tables" - }, - { - "name": "users_table", - "entityType": "tables" - }, - { - "name": "verification", - "entityType": "tables" - }, - { - "name": "volumes_table", - "entityType": "tables" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "account" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "account_id", - "entityType": "columns", - "table": "account" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "provider_id", - "entityType": "columns", - "table": "account" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "user_id", - "entityType": "columns", - "table": "account" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "access_token", - "entityType": "columns", - "table": "account" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "refresh_token", - "entityType": "columns", - "table": "account" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id_token", - "entityType": "columns", - "table": "account" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "access_token_expires_at", - "entityType": "columns", - "table": "account" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "refresh_token_expires_at", - "entityType": "columns", - "table": "account" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "scope", - "entityType": "columns", - "table": "account" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "password", - "entityType": "columns", - "table": "account" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "account" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "updated_at", - "entityType": "columns", - "table": "account" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "agent_tokens" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "name", - "entityType": "columns", - "table": "agent_tokens" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "token_hash", - "entityType": "columns", - "table": "agent_tokens" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "token_prefix", - "entityType": "columns", - "table": "agent_tokens" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "agent_id", - "entityType": "columns", - "table": "agent_tokens" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "created_by", - "entityType": "columns", - "table": "agent_tokens" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "last_used_at", - "entityType": "columns", - "table": "agent_tokens" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "revoked_at", - "entityType": "columns", - "table": "agent_tokens" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "agent_tokens" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "agents" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "name", - "entityType": "columns", - "table": "agents" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "organization_id", - "entityType": "columns", - "table": "agents" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "created_by", - "entityType": "columns", - "table": "agents" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "last_seen_at", - "entityType": "columns", - "table": "agents" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "agents" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "key", - "entityType": "columns", - "table": "app_metadata" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "value", - "entityType": "columns", - "table": "app_metadata" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "app_metadata" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "updated_at", - "entityType": "columns", - "table": "app_metadata" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": true, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "backup_schedule_mirrors_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "schedule_id", - "entityType": "columns", - "table": "backup_schedule_mirrors_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "repository_id", - "entityType": "columns", - "table": "backup_schedule_mirrors_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "true", - "generated": null, - "name": "enabled", - "entityType": "columns", - "table": "backup_schedule_mirrors_table" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "last_copy_at", - "entityType": "columns", - "table": "backup_schedule_mirrors_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "last_copy_status", - "entityType": "columns", - "table": "backup_schedule_mirrors_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "last_copy_error", - "entityType": "columns", - "table": "backup_schedule_mirrors_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "backup_schedule_mirrors_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "schedule_id", - "entityType": "columns", - "table": "backup_schedule_notifications_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "destination_id", - "entityType": "columns", - "table": "backup_schedule_notifications_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "false", - "generated": null, - "name": "notify_on_start", - "entityType": "columns", - "table": "backup_schedule_notifications_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "false", - "generated": null, - "name": "notify_on_success", - "entityType": "columns", - "table": "backup_schedule_notifications_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "true", - "generated": null, - "name": "notify_on_warning", - "entityType": "columns", - "table": "backup_schedule_notifications_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "true", - "generated": null, - "name": "notify_on_failure", - "entityType": "columns", - "table": "backup_schedule_notifications_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "backup_schedule_notifications_table" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": true, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "short_id", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "name", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "volume_id", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "repository_id", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "true", - "generated": null, - "name": "enabled", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "cron_expression", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "retention_policy", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": "'[]'", - "generated": null, - "name": "exclude_patterns", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": "'[]'", - "generated": null, - "name": "exclude_if_present", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": "'[]'", - "generated": null, - "name": "include_patterns", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "last_backup_at", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "last_backup_status", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "last_backup_error", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "next_backup_at", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "false", - "generated": null, - "name": "one_file_system", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": "'[]'", - "generated": null, - "name": "custom_restic_params", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "0", - "generated": null, - "name": "sort_order", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "updated_at", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "organization_id", - "entityType": "columns", - "table": "backup_schedules_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "invitation" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "organization_id", - "entityType": "columns", - "table": "invitation" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "email", - "entityType": "columns", - "table": "invitation" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "role", - "entityType": "columns", - "table": "invitation" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": "'pending'", - "generated": null, - "name": "status", - "entityType": "columns", - "table": "invitation" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "expires_at", - "entityType": "columns", - "table": "invitation" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "invitation" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "inviter_id", - "entityType": "columns", - "table": "invitation" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "member" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "organization_id", - "entityType": "columns", - "table": "member" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "user_id", - "entityType": "columns", - "table": "member" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": "'member'", - "generated": null, - "name": "role", - "entityType": "columns", - "table": "member" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "member" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": true, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "notification_destinations_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "name", - "entityType": "columns", - "table": "notification_destinations_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "true", - "generated": null, - "name": "enabled", - "entityType": "columns", - "table": "notification_destinations_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "type", - "entityType": "columns", - "table": "notification_destinations_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "config", - "entityType": "columns", - "table": "notification_destinations_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "notification_destinations_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "updated_at", - "entityType": "columns", - "table": "notification_destinations_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "organization_id", - "entityType": "columns", - "table": "notification_destinations_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "organization" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "name", - "entityType": "columns", - "table": "organization" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "slug", - "entityType": "columns", - "table": "organization" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "logo", - "entityType": "columns", - "table": "organization" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "organization" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "metadata", - "entityType": "columns", - "table": "organization" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "short_id", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "name", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "type", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "config", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": "'auto'", - "generated": null, - "name": "compression_mode", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": "'unknown'", - "generated": null, - "name": "status", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "last_checked", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "last_error", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "doctor_result", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "stats", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "stats_updated_at", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "false", - "generated": null, - "name": "upload_limit_enabled", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "real", - "notNull": true, - "autoincrement": false, - "default": "1", - "generated": null, - "name": "upload_limit_value", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": "'Mbps'", - "generated": null, - "name": "upload_limit_unit", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "false", - "generated": null, - "name": "download_limit_enabled", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "real", - "notNull": true, - "autoincrement": false, - "default": "1", - "generated": null, - "name": "download_limit_value", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": "'Mbps'", - "generated": null, - "name": "download_limit_unit", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "updated_at", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "organization_id", - "entityType": "columns", - "table": "repositories_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "sessions_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "user_id", - "entityType": "columns", - "table": "sessions_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "token", - "entityType": "columns", - "table": "sessions_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "expires_at", - "entityType": "columns", - "table": "sessions_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "sessions_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "updated_at", - "entityType": "columns", - "table": "sessions_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "ip_address", - "entityType": "columns", - "table": "sessions_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "user_agent", - "entityType": "columns", - "table": "sessions_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "impersonated_by", - "entityType": "columns", - "table": "sessions_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "active_organization_id", - "entityType": "columns", - "table": "sessions_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "sso_provider" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "provider_id", - "entityType": "columns", - "table": "sso_provider" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "organization_id", - "entityType": "columns", - "table": "sso_provider" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "user_id", - "entityType": "columns", - "table": "sso_provider" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "issuer", - "entityType": "columns", - "table": "sso_provider" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "domain", - "entityType": "columns", - "table": "sso_provider" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "false", - "generated": null, - "name": "auto_link_matching_emails", - "entityType": "columns", - "table": "sso_provider" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "oidc_config", - "entityType": "columns", - "table": "sso_provider" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "saml_config", - "entityType": "columns", - "table": "sso_provider" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "sso_provider" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "updated_at", - "entityType": "columns", - "table": "sso_provider" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "two_factor" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "secret", - "entityType": "columns", - "table": "two_factor" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "backup_codes", - "entityType": "columns", - "table": "two_factor" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "user_id", - "entityType": "columns", - "table": "two_factor" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "username", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "password_hash", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "false", - "generated": null, - "name": "has_downloaded_restic_password", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "updated_at", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "name", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "email", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "false", - "generated": null, - "name": "email_verified", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "image", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "display_username", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "false", - "generated": null, - "name": "two_factor_enabled", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": "'user'", - "generated": null, - "name": "role", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "false", - "generated": null, - "name": "banned", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "ban_reason", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "ban_expires", - "entityType": "columns", - "table": "users_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "verification" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "identifier", - "entityType": "columns", - "table": "verification" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "value", - "entityType": "columns", - "table": "verification" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "expires_at", - "entityType": "columns", - "table": "verification" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "verification" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "updated_at", - "entityType": "columns", - "table": "verification" - }, - { - "type": "integer", - "notNull": false, - "autoincrement": true, - "default": null, - "generated": null, - "name": "id", - "entityType": "columns", - "table": "volumes_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "short_id", - "entityType": "columns", - "table": "volumes_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "name", - "entityType": "columns", - "table": "volumes_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "type", - "entityType": "columns", - "table": "volumes_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": "'unmounted'", - "generated": null, - "name": "status", - "entityType": "columns", - "table": "volumes_table" - }, - { - "type": "text", - "notNull": false, - "autoincrement": false, - "default": null, - "generated": null, - "name": "last_error", - "entityType": "columns", - "table": "volumes_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "last_health_check", - "entityType": "columns", - "table": "volumes_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "created_at", - "entityType": "columns", - "table": "volumes_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "(unixepoch() * 1000)", - "generated": null, - "name": "updated_at", - "entityType": "columns", - "table": "volumes_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "config", - "entityType": "columns", - "table": "volumes_table" - }, - { - "type": "integer", - "notNull": true, - "autoincrement": false, - "default": "true", - "generated": null, - "name": "auto_remount", - "entityType": "columns", - "table": "volumes_table" - }, - { - "type": "text", - "notNull": true, - "autoincrement": false, - "default": null, - "generated": null, - "name": "organization_id", - "entityType": "columns", - "table": "volumes_table" - }, - { - "columns": ["user_id"], - "tableTo": "users_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "account_user_id_users_table_id_fk", - "entityType": "fks", - "table": "account" - }, - { - "columns": ["agent_id"], - "tableTo": "agents", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "fk_agent_tokens_agent_id_agents_id_fk", - "entityType": "fks", - "table": "agent_tokens" - }, - { - "columns": ["created_by"], - "tableTo": "users_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "fk_agent_tokens_created_by_users_table_id_fk", - "entityType": "fks", - "table": "agent_tokens" - }, - { - "columns": ["organization_id"], - "tableTo": "organization", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "fk_agents_organization_id_organization_id_fk", - "entityType": "fks", - "table": "agents" - }, - { - "columns": ["created_by"], - "tableTo": "users_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "fk_agents_created_by_users_table_id_fk", - "entityType": "fks", - "table": "agents" - }, - { - "columns": ["schedule_id"], - "tableTo": "backup_schedules_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "backup_schedule_mirrors_table_schedule_id_backup_schedules_table_id_fk", - "entityType": "fks", - "table": "backup_schedule_mirrors_table" - }, - { - "columns": ["repository_id"], - "tableTo": "repositories_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "backup_schedule_mirrors_table_repository_id_repositories_table_id_fk", - "entityType": "fks", - "table": "backup_schedule_mirrors_table" - }, - { - "columns": ["schedule_id"], - "tableTo": "backup_schedules_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "backup_schedule_notifications_table_schedule_id_backup_schedules_table_id_fk", - "entityType": "fks", - "table": "backup_schedule_notifications_table" - }, - { - "columns": ["destination_id"], - "tableTo": "notification_destinations_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "backup_schedule_notifications_table_destination_id_notification_destinations_table_id_fk", - "entityType": "fks", - "table": "backup_schedule_notifications_table" - }, - { - "columns": ["volume_id"], - "tableTo": "volumes_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "backup_schedules_table_volume_id_volumes_table_id_fk", - "entityType": "fks", - "table": "backup_schedules_table" - }, - { - "columns": ["repository_id"], - "tableTo": "repositories_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "backup_schedules_table_repository_id_repositories_table_id_fk", - "entityType": "fks", - "table": "backup_schedules_table" - }, - { - "columns": ["organization_id"], - "tableTo": "organization", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "backup_schedules_table_organization_id_organization_id_fk", - "entityType": "fks", - "table": "backup_schedules_table" - }, - { - "columns": ["organization_id"], - "tableTo": "organization", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "invitation_organization_id_organization_id_fk", - "entityType": "fks", - "table": "invitation" - }, - { - "columns": ["inviter_id"], - "tableTo": "users_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "invitation_inviter_id_users_table_id_fk", - "entityType": "fks", - "table": "invitation" - }, - { - "columns": ["organization_id"], - "tableTo": "organization", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "member_organization_id_organization_id_fk", - "entityType": "fks", - "table": "member" - }, - { - "columns": ["user_id"], - "tableTo": "users_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "member_user_id_users_table_id_fk", - "entityType": "fks", - "table": "member" - }, - { - "columns": ["organization_id"], - "tableTo": "organization", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "notification_destinations_table_organization_id_organization_id_fk", - "entityType": "fks", - "table": "notification_destinations_table" - }, - { - "columns": ["organization_id"], - "tableTo": "organization", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "repositories_table_organization_id_organization_id_fk", - "entityType": "fks", - "table": "repositories_table" - }, - { - "columns": ["user_id"], - "tableTo": "users_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "sessions_table_user_id_users_table_id_fk", - "entityType": "fks", - "table": "sessions_table" - }, - { - "columns": ["organization_id"], - "tableTo": "organization", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "fk_sso_provider_organization_id_organization_id_fk", - "entityType": "fks", - "table": "sso_provider" - }, - { - "columns": ["user_id"], - "tableTo": "users_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "SET NULL", - "nameExplicit": false, - "name": "fk_sso_provider_user_id_users_table_id_fk", - "entityType": "fks", - "table": "sso_provider" - }, - { - "columns": ["user_id"], - "tableTo": "users_table", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "two_factor_user_id_users_table_id_fk", - "entityType": "fks", - "table": "two_factor" - }, - { - "columns": ["organization_id"], - "tableTo": "organization", - "columnsTo": ["id"], - "onUpdate": "NO ACTION", - "onDelete": "CASCADE", - "nameExplicit": false, - "name": "volumes_table_organization_id_organization_id_fk", - "entityType": "fks", - "table": "volumes_table" - }, - { - "columns": ["schedule_id", "destination_id"], - "nameExplicit": false, - "name": "backup_schedule_notifications_table_schedule_id_destination_id_pk", - "entityType": "pks", - "table": "backup_schedule_notifications_table" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "account_pk", - "table": "account", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "agent_tokens_pk", - "table": "agent_tokens", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "agents_pk", - "table": "agents", - "entityType": "pks" - }, - { - "columns": ["key"], - "nameExplicit": false, - "name": "app_metadata_pk", - "table": "app_metadata", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "backup_schedule_mirrors_table_pk", - "table": "backup_schedule_mirrors_table", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "backup_schedules_table_pk", - "table": "backup_schedules_table", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "invitation_pk", - "table": "invitation", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "member_pk", - "table": "member", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "notification_destinations_table_pk", - "table": "notification_destinations_table", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "organization_pk", - "table": "organization", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "repositories_table_pk", - "table": "repositories_table", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "sessions_table_pk", - "table": "sessions_table", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "sso_provider_pk", - "table": "sso_provider", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "two_factor_pk", - "table": "two_factor", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "users_table_pk", - "table": "users_table", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "verification_pk", - "table": "verification", - "entityType": "pks" - }, - { - "columns": ["id"], - "nameExplicit": false, - "name": "volumes_table_pk", - "table": "volumes_table", - "entityType": "pks" - }, - { - "columns": [ - { - "value": "user_id", - "isExpression": false - } - ], - "isUnique": false, - "where": null, - "origin": "manual", - "name": "account_userId_idx", - "entityType": "indexes", - "table": "account" - }, - { - "columns": [ - { - "value": "token_hash", - "isExpression": false - } - ], - "isUnique": true, - "where": null, - "origin": "manual", - "name": "agent_tokens_token_hash_uidx", - "entityType": "indexes", - "table": "agent_tokens" - }, - { - "columns": [ - { - "value": "agent_id", - "isExpression": false - } - ], - "isUnique": false, - "where": null, - "origin": "manual", - "name": "agent_tokens_agent_id_idx", - "entityType": "indexes", - "table": "agent_tokens" - }, - { - "columns": [ - { - "value": "organization_id", - "isExpression": false - } - ], - "isUnique": false, - "where": null, - "origin": "manual", - "name": "agents_organization_id_idx", - "entityType": "indexes", - "table": "agents" - }, - { - "columns": [ - { - "value": "organization_id", - "isExpression": false - } - ], - "isUnique": false, - "where": null, - "origin": "manual", - "name": "invitation_organizationId_idx", - "entityType": "indexes", - "table": "invitation" - }, - { - "columns": [ - { - "value": "email", - "isExpression": false - } - ], - "isUnique": false, - "where": null, - "origin": "manual", - "name": "invitation_email_idx", - "entityType": "indexes", - "table": "invitation" - }, - { - "columns": [ - { - "value": "organization_id", - "isExpression": false - } - ], - "isUnique": false, - "where": null, - "origin": "manual", - "name": "member_organizationId_idx", - "entityType": "indexes", - "table": "member" - }, - { - "columns": [ - { - "value": "user_id", - "isExpression": false - } - ], - "isUnique": false, - "where": null, - "origin": "manual", - "name": "member_userId_idx", - "entityType": "indexes", - "table": "member" - }, - { - "columns": [ - { - "value": "organization_id", - "isExpression": false - }, - { - "value": "user_id", - "isExpression": false - } - ], - "isUnique": true, - "where": null, - "origin": "manual", - "name": "member_org_user_uidx", - "entityType": "indexes", - "table": "member" - }, - { - "columns": [ - { - "value": "slug", - "isExpression": false - } - ], - "isUnique": true, - "where": null, - "origin": "manual", - "name": "organization_slug_uidx", - "entityType": "indexes", - "table": "organization" - }, - { - "columns": [ - { - "value": "user_id", - "isExpression": false - } - ], - "isUnique": false, - "where": null, - "origin": "manual", - "name": "sessionsTable_userId_idx", - "entityType": "indexes", - "table": "sessions_table" - }, - { - "columns": [ - { - "value": "secret", - "isExpression": false - } - ], - "isUnique": false, - "where": null, - "origin": "manual", - "name": "twoFactor_secret_idx", - "entityType": "indexes", - "table": "two_factor" - }, - { - "columns": [ - { - "value": "user_id", - "isExpression": false - } - ], - "isUnique": false, - "where": null, - "origin": "manual", - "name": "twoFactor_userId_idx", - "entityType": "indexes", - "table": "two_factor" - }, - { - "columns": [ - { - "value": "identifier", - "isExpression": false - } - ], - "isUnique": false, - "where": null, - "origin": "manual", - "name": "verification_identifier_idx", - "entityType": "indexes", - "table": "verification" - }, - { - "columns": ["name", "organization_id"], - "nameExplicit": true, - "name": "agents_name_org_uidx", - "entityType": "uniques", - "table": "agents" - }, - { - "columns": ["schedule_id", "repository_id"], - "nameExplicit": false, - "name": "backup_schedule_mirrors_table_schedule_id_repository_id_unique", - "entityType": "uniques", - "table": "backup_schedule_mirrors_table" - }, - { - "columns": ["name", "organization_id"], - "nameExplicit": false, - "name": "volumes_table_name_organization_id_unique", - "entityType": "uniques", - "table": "volumes_table" - }, - { - "columns": ["short_id"], - "nameExplicit": false, - "name": "backup_schedules_table_short_id_unique", - "entityType": "uniques", - "table": "backup_schedules_table" - }, - { - "columns": ["short_id"], - "nameExplicit": false, - "name": "repositories_table_short_id_unique", - "entityType": "uniques", - "table": "repositories_table" - }, - { - "columns": ["token"], - "nameExplicit": false, - "name": "sessions_table_token_unique", - "entityType": "uniques", - "table": "sessions_table" - }, - { - "columns": ["provider_id"], - "nameExplicit": false, - "name": "sso_provider_provider_id_unique", - "entityType": "uniques", - "table": "sso_provider" - }, - { - "columns": ["username"], - "nameExplicit": false, - "name": "users_table_username_unique", - "entityType": "uniques", - "table": "users_table" - }, - { - "columns": ["email"], - "nameExplicit": false, - "name": "users_table_email_unique", - "entityType": "uniques", - "table": "users_table" - }, - { - "columns": ["short_id"], - "nameExplicit": false, - "name": "volumes_table_short_id_unique", - "entityType": "uniques", - "table": "volumes_table" - } - ], - "renames": [] -} diff --git a/app/server/db/relations.ts b/app/server/db/relations.ts index 3028fe16..708d9356 100644 --- a/app/server/db/relations.ts +++ b/app/server/db/relations.ts @@ -95,29 +95,6 @@ export const relations = defineRelations(schema, (r) => ({ to: r.usersTable.id, }), }, - agentsTable: { - organization: r.one.organization({ - from: r.agentsTable.organizationId, - to: r.organization.id, - optional: false, - }), - createdByUser: r.one.usersTable({ - from: r.agentsTable.createdBy, - to: r.usersTable.id, - }), - tokens: r.many.agentTokensTable(), - }, - agentTokensTable: { - agent: r.one.agentsTable({ - from: r.agentTokensTable.agentId, - to: r.agentsTable.id, - optional: false, - }), - createdByUser: r.one.usersTable({ - from: r.agentTokensTable.createdBy, - to: r.usersTable.id, - }), - }, organization: { users: r.many.usersTable({ alias: "usersTable_id_organization_id_via_member", @@ -129,7 +106,6 @@ export const relations = defineRelations(schema, (r) => ({ members: r.many.member(), invitations: r.many.invitation(), ssoProviders: r.many.ssoProvider(), - agents: r.many.agentsTable(), }, ssoProvider: { user: r.one.usersTable({ diff --git a/app/server/db/schema.ts b/app/server/db/schema.ts index 6c1b7302..83ab98ca 100644 --- a/app/server/db/schema.ts +++ b/app/server/db/schema.ts @@ -413,61 +413,6 @@ export const appMetadataTable = sqliteTable("app_metadata", { }); export type AppMetadata = typeof appMetadataTable.$inferSelect; -/** - * Agents Table - */ -export const agentsTable = sqliteTable( - "agents", - { - id: text("id").primaryKey(), - name: text("name").notNull(), - organizationId: text("organization_id") - .notNull() - .references(() => organization.id, { onDelete: "cascade" }), - createdBy: text("created_by") - .notNull() - .references(() => usersTable.id, { onDelete: "cascade" }), - lastSeenAt: int("last_seen_at", { mode: "number" }), - createdAt: int("created_at", { mode: "number" }) - .notNull() - .default(sql`(unixepoch() * 1000)`), - }, - (table) => [ - index("agents_organization_id_idx").on(table.organizationId), - unique("agents_name_org_uidx").on(table.name, table.organizationId), - ], -); -export type Agent = typeof agentsTable.$inferSelect; - -/** - * Agent Tokens Table - */ -export const agentTokensTable = sqliteTable( - "agent_tokens", - { - id: text("id").primaryKey(), - name: text("name").notNull(), - tokenHash: text("token_hash").notNull(), - tokenPrefix: text("token_prefix").notNull(), - agentId: text("agent_id") - .notNull() - .references(() => agentsTable.id, { onDelete: "cascade" }), - createdBy: text("created_by") - .notNull() - .references(() => usersTable.id, { onDelete: "cascade" }), - lastUsedAt: int("last_used_at", { mode: "number" }), - revokedAt: int("revoked_at", { mode: "number" }), - createdAt: int("created_at", { mode: "number" }) - .notNull() - .default(sql`(unixepoch() * 1000)`), - }, - (table) => [ - uniqueIndex("agent_tokens_token_hash_uidx").on(table.tokenHash), - index("agent_tokens_agent_id_idx").on(table.agentId), - ], -); -export type AgentToken = typeof agentTokensTable.$inferSelect; - export const twoFactor = sqliteTable( "two_factor", { diff --git a/app/server/modules/agents/agent-tokens.ts b/app/server/modules/agents/agent-tokens.ts index b5703327..febb9d94 100644 --- a/app/server/modules/agents/agent-tokens.ts +++ b/app/server/modules/agents/agent-tokens.ts @@ -1,46 +1,7 @@ -import crypto from "node:crypto"; -import { eq } from "drizzle-orm"; -import { db } from "~/server/db/db"; -import { agentTokensTable } from "~/server/db/schema"; import { cryptoUtils } from "~/server/utils/crypto"; -export const generateToken = () => { - return `zbk_${crypto.randomBytes(32).toString("hex")}`; -}; - -export const hashToken = (token: string) => { - return crypto.createHash("sha256").update(token).digest("hex"); -}; - export const deriveLocalAgentToken = async () => { - const derived = await cryptoUtils.deriveSecret("zerobyte:local-agent-token"); - return `zbk_${derived}`; -}; - -export const createAgentToken = async ({ - name, - agentId, - createdBy, -}: { - name: string; - agentId: string; - createdBy: string; -}) => { - const plaintext = generateToken(); - const tokenHash = hashToken(plaintext); - const tokenPrefix = plaintext.slice(0, 12); - - const id = Bun.randomUUIDv7(); - await db.insert(agentTokensTable).values({ - id, - name, - tokenHash, - tokenPrefix, - agentId, - createdBy, - }); - - return { id, name, tokenPrefix, plaintext }; + return cryptoUtils.deriveSecret("zerobyte:local-agent-token"); }; export const validateAgentToken = async (token: string) => { @@ -48,40 +9,4 @@ export const validateAgentToken = async (token: string) => { if (token === localToken) { return { agentId: "local", organizationId: null, agentName: "local" }; } - - const tokenHash = hashToken(token); - - const record = await db.query.agentTokensTable.findFirst({ - where: { tokenHash, revokedAt: { isNull: true } }, - with: { agent: true }, - }); - - if (!record) return null; - - await db.update(agentTokensTable).set({ lastUsedAt: Date.now() }).where(eq(agentTokensTable.id, record.id)); - - return { - agentId: record.agentId, - organizationId: record.agent.organizationId, - agentName: record.name, - }; -}; - -export const revokeAgentToken = async (tokenId: string, agentId: string) => { - const token = await db.query.agentTokensTable.findFirst({ - where: { id: tokenId, agentId, revokedAt: { isNull: true } }, - }); - - if (!token) return false; - - await db.update(agentTokensTable).set({ revokedAt: Date.now() }).where(eq(agentTokensTable.id, tokenId)); - - return true; -}; - -export const listAgentTokens = async (agentId: string) => { - return db.query.agentTokensTable.findMany({ - where: { agentId }, - columns: { id: true, name: true, tokenPrefix: true, lastUsedAt: true, revokedAt: true, createdAt: true }, - }); };