Browse Source

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
main
npmrun 2 weeks ago
parent
commit
0686b74fd5
  1. 31
      packages/drizzle-pkg/database/sqlite/schema/export.ts
  2. 5
      packages/drizzle-pkg/database/sqlite/schema/index.ts
  3. 1
      packages/drizzle-pkg/lib/schema/content.ts
  4. 1
      packages/drizzle-pkg/lib/schema/export.ts
  5. 20
      packages/drizzle-pkg/migrations/0010_user_export_tasks.sql
  6. 567
      packages/drizzle-pkg/migrations/meta/0010_snapshot.json
  7. 7
      packages/drizzle-pkg/migrations/meta/_journal.json

31
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),
],
);

5
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";

1
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";

1
packages/drizzle-pkg/lib/schema/export.ts

@ -0,0 +1 @@
export { userExportTasks } from "../../database/sqlite/schema/export";

20
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`);

567
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": {} }
}

7
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
}
]
}
Loading…
Cancel
Save