From 0686b74fd581467bc4598e124c4d6fed42fa7eea Mon Sep 17 00:00:00 2001 From: npmrun <1549469775@qq.com> Date: Fri, 24 Apr 2026 01:01:25 +0800 Subject: [PATCH] feat(export): add export task schema and migration Introduce user export task persistence with schema exports and migration metadata so export jobs can be queued, tracked, and evolved safely. Made-with: Cursor --- .../drizzle-pkg/database/sqlite/schema/export.ts | 31 ++ .../drizzle-pkg/database/sqlite/schema/index.ts | 5 + packages/drizzle-pkg/lib/schema/content.ts | 1 + packages/drizzle-pkg/lib/schema/export.ts | 1 + .../migrations/0010_user_export_tasks.sql | 20 + .../drizzle-pkg/migrations/meta/0010_snapshot.json | 567 +++++++++++++++++++++ packages/drizzle-pkg/migrations/meta/_journal.json | 7 + 7 files changed, 632 insertions(+) create mode 100644 packages/drizzle-pkg/database/sqlite/schema/export.ts create mode 100644 packages/drizzle-pkg/database/sqlite/schema/index.ts create mode 100644 packages/drizzle-pkg/lib/schema/export.ts create mode 100644 packages/drizzle-pkg/migrations/0010_user_export_tasks.sql create mode 100644 packages/drizzle-pkg/migrations/meta/0010_snapshot.json diff --git a/packages/drizzle-pkg/database/sqlite/schema/export.ts b/packages/drizzle-pkg/database/sqlite/schema/export.ts new file mode 100644 index 0000000..697d75a --- /dev/null +++ b/packages/drizzle-pkg/database/sqlite/schema/export.ts @@ -0,0 +1,31 @@ +import { index, integer, sqliteTable, text } from "drizzle-orm/sqlite-core"; + +import { users } from "./auth"; + +export const userExportTasks = sqliteTable( + "user_export_tasks", + { + id: integer().primaryKey(), + userId: integer("user_id") + .notNull() + .references(() => users.id, { onDelete: "cascade" }), + status: text().notNull().default("queued"), + maskPolicy: text("mask_policy").notNull().default("masked"), + exportCutoffAt: integer("export_cutoff_at", { mode: "timestamp_ms" }), + outputDir: text("output_dir"), + outputName: text("output_name"), + totalBytes: integer("total_bytes"), + errorCode: text("error_code"), + errorMessage: text("error_message"), + expiresAt: integer("expires_at", { mode: "timestamp_ms" }), + createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), + updatedAt: integer("updated_at", { mode: "timestamp_ms" }) + .defaultNow() + .$onUpdate(() => new Date()) + .notNull(), + }, + (table) => [ + index("user_export_tasks_user_id_idx").on(table.userId), + index("user_export_tasks_status_idx").on(table.status), + ], +); diff --git a/packages/drizzle-pkg/database/sqlite/schema/index.ts b/packages/drizzle-pkg/database/sqlite/schema/index.ts new file mode 100644 index 0000000..4887b3a --- /dev/null +++ b/packages/drizzle-pkg/database/sqlite/schema/index.ts @@ -0,0 +1,5 @@ +export { users, sessions } from "./auth"; +export { appConfigs, userConfigs } from "./config"; +export { mediaAssets, mediaRefs, postComments, posts, timelineEvents } from "./content"; +export { userExportTasks } from "./export"; +export { rssFeeds, rssItems } from "./rss"; diff --git a/packages/drizzle-pkg/lib/schema/content.ts b/packages/drizzle-pkg/lib/schema/content.ts index 4f5d2b2..cde0d1a 100644 --- a/packages/drizzle-pkg/lib/schema/content.ts +++ b/packages/drizzle-pkg/lib/schema/content.ts @@ -1 +1,2 @@ export { mediaAssets, mediaRefs, postComments, posts, timelineEvents } from "../../database/sqlite/schema/content"; +export { userExportTasks } from "../../database/sqlite/schema/export"; diff --git a/packages/drizzle-pkg/lib/schema/export.ts b/packages/drizzle-pkg/lib/schema/export.ts new file mode 100644 index 0000000..0539ee3 --- /dev/null +++ b/packages/drizzle-pkg/lib/schema/export.ts @@ -0,0 +1 @@ +export { userExportTasks } from "../../database/sqlite/schema/export"; diff --git a/packages/drizzle-pkg/migrations/0010_user_export_tasks.sql b/packages/drizzle-pkg/migrations/0010_user_export_tasks.sql new file mode 100644 index 0000000..59297c7 --- /dev/null +++ b/packages/drizzle-pkg/migrations/0010_user_export_tasks.sql @@ -0,0 +1,20 @@ +CREATE TABLE `user_export_tasks` ( + `id` integer PRIMARY KEY NOT NULL, + `user_id` integer NOT NULL, + `status` text DEFAULT 'queued' NOT NULL, + `mask_policy` text DEFAULT 'masked' NOT NULL, + `export_cutoff_at` integer, + `output_dir` text, + `output_name` text, + `total_bytes` integer, + `error_code` text, + `error_message` text, + `expires_at` integer, + `created_at` integer DEFAULT (unixepoch('subsec') * 1000) NOT NULL, + `updated_at` integer DEFAULT (unixepoch('subsec') * 1000) NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE INDEX `user_export_tasks_user_id_idx` ON `user_export_tasks` (`user_id`); +--> statement-breakpoint +CREATE INDEX `user_export_tasks_status_idx` ON `user_export_tasks` (`status`); diff --git a/packages/drizzle-pkg/migrations/meta/0010_snapshot.json b/packages/drizzle-pkg/migrations/meta/0010_snapshot.json new file mode 100644 index 0000000..467c2ba --- /dev/null +++ b/packages/drizzle-pkg/migrations/meta/0010_snapshot.json @@ -0,0 +1,567 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "f4c03fe9-c5a2-41bd-8864-ad2b076d320d", + "prevId": "334a6cb9-9261-4db7-b74b-0ee659a5798f", + "tables": { + "sessions": { + "name": "sessions", + "columns": { + "id": { "name": "id", "type": "text", "primaryKey": true, "notNull": true, "autoincrement": false }, + "user_id": { "name": "user_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "expires_at": { "name": "expires_at", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + } + }, + "indexes": { "sessions_user_id_idx": { "name": "sessions_user_id_idx", "columns": ["user_id"], "isUnique": false } }, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { "name": "id", "type": "integer", "primaryKey": true, "notNull": true, "autoincrement": false }, + "username": { "name": "username", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "email": { "name": "email", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "nickname": { "name": "nickname", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "password": { "name": "password", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "avatar": { "name": "avatar", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "role": { "name": "role", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false, "default": "'user'" }, + "status": { "name": "status", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false, "default": "'active'" }, + "public_slug": { "name": "public_slug", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "bio_markdown": { "name": "bio_markdown", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "bio_visibility": { + "name": "bio_visibility", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'private'" + }, + "social_links_json": { + "name": "social_links_json", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'[]'" + }, + "avatar_visibility": { + "name": "avatar_visibility", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'private'" + }, + "discover_visible": { + "name": "discover_visible", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "discover_location": { "name": "discover_location", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "discover_show_location": { + "name": "discover_show_location", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + } + }, + "indexes": { + "users_username_unique": { "name": "users_username_unique", "columns": ["username"], "isUnique": true }, + "users_public_slug_unique": { "name": "users_public_slug_unique", "columns": ["public_slug"], "isUnique": true } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "app_configs": { + "name": "app_configs", + "columns": { + "key": { "name": "key", "type": "text", "primaryKey": true, "notNull": true, "autoincrement": false }, + "value": { "name": "value", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "value_type": { "name": "value_type", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_configs": { + "name": "user_configs", + "columns": { + "user_id": { "name": "user_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "key": { "name": "key", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "value": { "name": "value", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "value_type": { "name": "value_type", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + } + }, + "indexes": { "user_configs_user_id_idx": { "name": "user_configs_user_id_idx", "columns": ["user_id"], "isUnique": false } }, + "foreignKeys": { + "user_configs_user_id_users_id_fk": { + "name": "user_configs_user_id_users_id_fk", + "tableFrom": "user_configs", + "tableTo": "users", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "user_configs_user_id_key_pk": { "columns": ["user_id", "key"], "name": "user_configs_user_id_key_pk" } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "media_assets": { + "name": "media_assets", + "columns": { + "id": { "name": "id", "type": "integer", "primaryKey": true, "notNull": true, "autoincrement": false }, + "user_id": { "name": "user_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "storage_key": { "name": "storage_key", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "mime": { "name": "mime", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "size_bytes": { "name": "size_bytes", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "sha256": { "name": "sha256", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "variants_json": { "name": "variants_json", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "status": { "name": "status", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false, "default": "'ready'" }, + "first_referenced_at": { "name": "first_referenced_at", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "dereferenced_at": { "name": "dereferenced_at", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "user_note": { "name": "user_note", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + } + }, + "indexes": { + "media_assets_storage_key_unique": { "name": "media_assets_storage_key_unique", "columns": ["storage_key"], "isUnique": true }, + "media_assets_user_id_idx": { "name": "media_assets_user_id_idx", "columns": ["user_id"], "isUnique": false } + }, + "foreignKeys": { + "media_assets_user_id_users_id_fk": { + "name": "media_assets_user_id_users_id_fk", + "tableFrom": "media_assets", + "tableTo": "users", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "media_refs": { + "name": "media_refs", + "columns": { + "owner_type": { "name": "owner_type", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "owner_id": { "name": "owner_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "asset_id": { "name": "asset_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false } + }, + "indexes": { "media_refs_asset_id_idx": { "name": "media_refs_asset_id_idx", "columns": ["asset_id"], "isUnique": false } }, + "foreignKeys": { + "media_refs_asset_id_media_assets_id_fk": { + "name": "media_refs_asset_id_media_assets_id_fk", + "tableFrom": "media_refs", + "tableTo": "media_assets", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "media_refs_owner_type_owner_id_asset_id_pk": { + "columns": ["owner_type", "owner_id", "asset_id"], + "name": "media_refs_owner_type_owner_id_asset_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "post_comments": { + "name": "post_comments", + "columns": { + "id": { "name": "id", "type": "integer", "primaryKey": true, "notNull": true, "autoincrement": false }, + "post_id": { "name": "post_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "parent_id": { "name": "parent_id", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "author_user_id": { "name": "author_user_id", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "guest_display_name": { "name": "guest_display_name", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "guest_email": { "name": "guest_email", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "guest_is_anonymous": { + "name": "guest_is_anonymous", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "body": { "name": "body", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "kind": { "name": "kind", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "deleted_at": { "name": "deleted_at", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "deleted_by_user_id": { "name": "deleted_by_user_id", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + } + }, + "indexes": { + "post_comments_post_id_idx": { "name": "post_comments_post_id_idx", "columns": ["post_id"], "isUnique": false }, + "post_comments_parent_id_idx": { "name": "post_comments_parent_id_idx", "columns": ["parent_id"], "isUnique": false } + }, + "foreignKeys": { + "post_comments_post_id_posts_id_fk": { + "name": "post_comments_post_id_posts_id_fk", + "tableFrom": "post_comments", + "tableTo": "posts", + "columnsFrom": ["post_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "post_comments_parent_id_post_comments_id_fk": { + "name": "post_comments_parent_id_post_comments_id_fk", + "tableFrom": "post_comments", + "tableTo": "post_comments", + "columnsFrom": ["parent_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_comments_author_user_id_users_id_fk": { + "name": "post_comments_author_user_id_users_id_fk", + "tableFrom": "post_comments", + "tableTo": "users", + "columnsFrom": ["author_user_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "post_comments_deleted_by_user_id_users_id_fk": { + "name": "post_comments_deleted_by_user_id_users_id_fk", + "tableFrom": "post_comments", + "tableTo": "users", + "columnsFrom": ["deleted_by_user_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "posts": { + "name": "posts", + "columns": { + "id": { "name": "id", "type": "integer", "primaryKey": true, "notNull": true, "autoincrement": false }, + "user_id": { "name": "user_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "title": { "name": "title", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "slug": { "name": "slug", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "body_markdown": { "name": "body_markdown", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "excerpt": { "name": "excerpt", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "cover_url": { "name": "cover_url", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "tags_json": { "name": "tags_json", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false, "default": "'[]'" }, + "published_at": { "name": "published_at", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "visibility": { "name": "visibility", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false, "default": "'private'" }, + "share_token": { "name": "share_token", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + } + }, + "indexes": { "posts_user_id_slug_unique": { "name": "posts_user_id_slug_unique", "columns": ["user_id", "slug"], "isUnique": true } }, + "foreignKeys": { + "posts_user_id_users_id_fk": { + "name": "posts_user_id_users_id_fk", + "tableFrom": "posts", + "tableTo": "users", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "timeline_events": { + "name": "timeline_events", + "columns": { + "id": { "name": "id", "type": "integer", "primaryKey": true, "notNull": true, "autoincrement": false }, + "user_id": { "name": "user_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "occurred_on": { "name": "occurred_on", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "title": { "name": "title", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "body_markdown": { "name": "body_markdown", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "link_url": { "name": "link_url", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "visibility": { "name": "visibility", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false, "default": "'private'" }, + "share_token": { "name": "share_token", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + } + }, + "indexes": {}, + "foreignKeys": { + "timeline_events_user_id_users_id_fk": { + "name": "timeline_events_user_id_users_id_fk", + "tableFrom": "timeline_events", + "tableTo": "users", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_export_tasks": { + "name": "user_export_tasks", + "columns": { + "id": { "name": "id", "type": "integer", "primaryKey": true, "notNull": true, "autoincrement": false }, + "user_id": { "name": "user_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "status": { "name": "status", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false, "default": "'queued'" }, + "mask_policy": { "name": "mask_policy", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false, "default": "'masked'" }, + "export_cutoff_at": { "name": "export_cutoff_at", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "output_dir": { "name": "output_dir", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "output_name": { "name": "output_name", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "total_bytes": { "name": "total_bytes", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "error_code": { "name": "error_code", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "error_message": { "name": "error_message", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "expires_at": { "name": "expires_at", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + } + }, + "indexes": { + "user_export_tasks_user_id_idx": { "name": "user_export_tasks_user_id_idx", "columns": ["user_id"], "isUnique": false }, + "user_export_tasks_status_idx": { "name": "user_export_tasks_status_idx", "columns": ["status"], "isUnique": false } + }, + "foreignKeys": { + "user_export_tasks_user_id_users_id_fk": { + "name": "user_export_tasks_user_id_users_id_fk", + "tableFrom": "user_export_tasks", + "tableTo": "users", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "rss_feeds": { + "name": "rss_feeds", + "columns": { + "id": { "name": "id", "type": "integer", "primaryKey": true, "notNull": true, "autoincrement": false }, + "user_id": { "name": "user_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "feed_url": { "name": "feed_url", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "title": { "name": "title", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "site_url": { "name": "site_url", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "last_fetched_at": { "name": "last_fetched_at", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "last_error": { "name": "last_error", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "poll_interval_minutes": { "name": "poll_interval_minutes", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + } + }, + "indexes": { + "rss_feeds_user_id_feed_url_unique": { "name": "rss_feeds_user_id_feed_url_unique", "columns": ["user_id", "feed_url"], "isUnique": true } + }, + "foreignKeys": { + "rss_feeds_user_id_users_id_fk": { + "name": "rss_feeds_user_id_users_id_fk", + "tableFrom": "rss_feeds", + "tableTo": "users", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "rss_items": { + "name": "rss_items", + "columns": { + "id": { "name": "id", "type": "integer", "primaryKey": true, "notNull": true, "autoincrement": false }, + "user_id": { "name": "user_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "feed_id": { "name": "feed_id", "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, + "guid": { "name": "guid", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "canonical_url": { "name": "canonical_url", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, + "title": { "name": "title", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "summary": { "name": "summary", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "content_snippet": { "name": "content_snippet", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "author": { "name": "author", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "published_at": { "name": "published_at", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, + "visibility": { "name": "visibility", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false, "default": "'private'" }, + "share_token": { "name": "share_token", "type": "text", "primaryKey": false, "notNull": false, "autoincrement": false }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" + } + }, + "indexes": { + "rss_items_feed_id_guid_unique": { + "name": "rss_items_feed_id_guid_unique", + "columns": ["feed_id", "guid"], + "isUnique": true, + "where": "\"rss_items\".\"guid\" IS NOT NULL" + } + }, + "foreignKeys": { + "rss_items_user_id_users_id_fk": { + "name": "rss_items_user_id_users_id_fk", + "tableFrom": "rss_items", + "tableTo": "users", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "rss_items_feed_id_rss_feeds_id_fk": { + "name": "rss_items_feed_id_rss_feeds_id_fk", + "tableFrom": "rss_items", + "tableTo": "rss_feeds", + "columnsFrom": ["feed_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { "schemas": {}, "tables": {}, "columns": {} }, + "internal": { "indexes": {} } +} diff --git a/packages/drizzle-pkg/migrations/meta/_journal.json b/packages/drizzle-pkg/migrations/meta/_journal.json index 875960b..4fc68d6 100644 --- a/packages/drizzle-pkg/migrations/meta/_journal.json +++ b/packages/drizzle-pkg/migrations/meta/_journal.json @@ -71,6 +71,13 @@ "when": 1776688086862, "tag": "0009_curly_jack_murdock", "breakpoints": true + }, + { + "idx": 10, + "version": "6", + "when": 1777100000000, + "tag": "0010_user_export_tasks", + "breakpoints": true } ] } \ No newline at end of file