diff --git a/packages/drizzle-pkg/database/sqlite/schema/content.ts b/packages/drizzle-pkg/database/sqlite/schema/content.ts index d225a15..41db3a3 100644 --- a/packages/drizzle-pkg/database/sqlite/schema/content.ts +++ b/packages/drizzle-pkg/database/sqlite/schema/content.ts @@ -58,8 +58,8 @@ export const mediaAssets = sqliteTable( ], ); -export const postMediaRefs = sqliteTable( - "post_media_refs", +export const mediaRefs = sqliteTable( + "media_refs", { postId: integer("post_id") .notNull() @@ -70,7 +70,7 @@ export const postMediaRefs = sqliteTable( }, (table) => [ primaryKey({ columns: [table.postId, table.assetId] }), - index("post_media_refs_asset_id_idx").on(table.assetId), + index("media_refs_asset_id_idx").on(table.assetId), ], ); diff --git a/packages/drizzle-pkg/db.sqlite b/packages/drizzle-pkg/db.sqlite index ca5e6ac..1ee67bc 100644 Binary files a/packages/drizzle-pkg/db.sqlite and b/packages/drizzle-pkg/db.sqlite differ diff --git a/packages/drizzle-pkg/lib/schema/content.ts b/packages/drizzle-pkg/lib/schema/content.ts index cd5e901..4f5d2b2 100644 --- a/packages/drizzle-pkg/lib/schema/content.ts +++ b/packages/drizzle-pkg/lib/schema/content.ts @@ -1 +1 @@ -export { mediaAssets, postComments, postMediaRefs, posts, timelineEvents } from "../../database/sqlite/schema/content"; +export { mediaAssets, mediaRefs, postComments, posts, timelineEvents } from "../../database/sqlite/schema/content"; diff --git a/packages/drizzle-pkg/migrations/0004_rename_post_media_refs_to_media_refs.sql b/packages/drizzle-pkg/migrations/0004_rename_post_media_refs_to_media_refs.sql new file mode 100644 index 0000000..5abe870 --- /dev/null +++ b/packages/drizzle-pkg/migrations/0004_rename_post_media_refs_to_media_refs.sql @@ -0,0 +1,3 @@ +ALTER TABLE `post_media_refs` RENAME TO `media_refs`;--> statement-breakpoint +DROP INDEX `post_media_refs_asset_id_idx`;--> statement-breakpoint +CREATE INDEX `media_refs_asset_id_idx` ON `media_refs` (`asset_id`); diff --git a/packages/drizzle-pkg/migrations/meta/0004_snapshot.json b/packages/drizzle-pkg/migrations/meta/0004_snapshot.json new file mode 100644 index 0000000..49ec729 --- /dev/null +++ b/packages/drizzle-pkg/migrations/meta/0004_snapshot.json @@ -0,0 +1,1135 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "2b8a9201-fbd7-4993-871d-a351e56f204a", + "prevId": "9faa7fb6-f602-4a33-8817-246caa63f9c9", + "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'" + }, + "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 + }, + "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": {} + }, + "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 + }, + "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": {} + }, + "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": {} + }, + "media_refs": { + "name": "media_refs", + "columns": { + "post_id": { + "name": "post_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_post_id_posts_id_fk": { + "name": "media_refs_post_id_posts_id_fk", + "tableFrom": "media_refs", + "tableTo": "posts", + "columnsFrom": [ + "post_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "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_post_id_asset_id_pk": { + "columns": [ + "post_id", + "asset_id" + ], + "name": "media_refs_post_id_asset_id_pk" + } + }, + "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 02f07b9..daf2816 100644 --- a/packages/drizzle-pkg/migrations/meta/_journal.json +++ b/packages/drizzle-pkg/migrations/meta/_journal.json @@ -29,6 +29,13 @@ "when": 1776516043018, "tag": "0003_media-assets", "breakpoints": true + }, + { + "idx": 4, + "version": "6", + "when": 1776600000000, + "tag": "0004_rename_post_media_refs_to_media_refs", + "breakpoints": true } ] } \ No newline at end of file diff --git a/server/service/media/index.ts b/server/service/media/index.ts index 4e76d25..11387f3 100644 --- a/server/service/media/index.ts +++ b/server/service/media/index.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import { dbGlobal } from "drizzle-pkg/lib/db"; -import { mediaAssets, postMediaRefs } from "drizzle-pkg/lib/schema/content"; +import { mediaAssets, mediaRefs } from "drizzle-pkg/lib/schema/content"; import { and, count, desc, eq, inArray, isNotNull, isNull, lte, not, notExists, or, sql } from "drizzle-orm"; import { MEDIA_ORPHAN_GRACE_HOURS_AFTER_DEREF, @@ -104,7 +104,7 @@ export function computeOrphanGraceExpiresAt(row: { function orphanCondition() { return notExists( - dbGlobal.select({ x: sql`1` }).from(postMediaRefs).where(eq(postMediaRefs.assetId, mediaAssets.id)), + dbGlobal.select({ x: sql`1` }).from(mediaRefs).where(eq(mediaRefs.assetId, mediaAssets.id)), ); } @@ -147,8 +147,8 @@ export async function reconcileAssetTimestampsAfterRefChange(assetIds: number[]) for (const id of unique) { const [{ c }] = await dbGlobal .select({ c: count() }) - .from(postMediaRefs) - .where(eq(postMediaRefs.assetId, id)); + .from(mediaRefs) + .where(eq(mediaRefs.assetId, id)); if (c > 0) { const [row] = await dbGlobal.select().from(mediaAssets).where(eq(mediaAssets.id, id)).limit(1); @@ -189,12 +189,12 @@ export async function syncPostMediaRefs( coverUrl: string | null, ): Promise { const beforeRows = await dbGlobal - .select({ assetId: postMediaRefs.assetId }) - .from(postMediaRefs) - .where(eq(postMediaRefs.postId, postId)); + .select({ assetId: mediaRefs.assetId }) + .from(mediaRefs) + .where(eq(mediaRefs.postId, postId)); const beforeIds = beforeRows.map((r) => r.assetId); - await dbGlobal.delete(postMediaRefs).where(eq(postMediaRefs.postId, postId)); + await dbGlobal.delete(mediaRefs).where(eq(mediaRefs.postId, postId)); const urls = mergePostMediaUrls(bodyMarkdown, coverUrl); const keys = [...new Set(urls.map((u) => publicAssetUrlToStorageKey(u)).filter((k): k is string => k != null))]; @@ -208,7 +208,7 @@ export async function syncPostMediaRefs( afterIds = assetRows.map((r) => r.id); if (afterIds.length > 0) { await dbGlobal - .insert(postMediaRefs) + .insert(mediaRefs) .values(afterIds.map((assetId) => ({ postId, assetId }))) .onConflictDoNothing(); } @@ -285,8 +285,8 @@ export async function listOrphanCandidatesForUser( async function assertAssetDeletableOrThrow(row: typeof mediaAssets.$inferSelect): Promise { const [{ c }] = await dbGlobal .select({ c: count() }) - .from(postMediaRefs) - .where(eq(postMediaRefs.assetId, row.id)); + .from(mediaRefs) + .where(eq(mediaRefs.assetId, row.id)); if (c > 0) { throw createError({ statusCode: 400, statusMessage: "资源仍被文章引用,无法删除" }); } @@ -328,8 +328,8 @@ export async function purgeAllDeletableOrphansGlobally(limit: number): Promise 0) { continue; } diff --git a/server/service/media/storage-audit.ts b/server/service/media/storage-audit.ts index 25adbcc..403eaa9 100644 --- a/server/service/media/storage-audit.ts +++ b/server/service/media/storage-audit.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import { dbGlobal } from "drizzle-pkg/lib/db"; -import { mediaAssets, postMediaRefs } from "drizzle-pkg/lib/schema/content"; +import { mediaAssets, mediaRefs } from "drizzle-pkg/lib/schema/content"; import { count, eq } from "drizzle-orm"; import { RELATIVE_ASSETS_DIR } from "#server/constants/media"; @@ -57,11 +57,11 @@ export async function auditMediaStorageVsDb(): Promise { const refAgg = await dbGlobal .select({ - assetId: postMediaRefs.assetId, + assetId: mediaRefs.assetId, c: count(), }) - .from(postMediaRefs) - .groupBy(postMediaRefs.assetId); + .from(mediaRefs) + .groupBy(mediaRefs.assetId); const refMap = new Map(); for (const r of refAgg) { @@ -167,8 +167,8 @@ export async function removeUnreferencedDbRowsForMissingFiles(): Promise<{ } const [{ n }] = await dbGlobal .select({ n: count() }) - .from(postMediaRefs) - .where(eq(postMediaRefs.assetId, c.id)); + .from(mediaRefs) + .where(eq(mediaRefs.assetId, c.id)); if (n > 0) { continue; } diff --git a/server/service/posts/index.ts b/server/service/posts/index.ts index 2e144b5..ca16b61 100644 --- a/server/service/posts/index.ts +++ b/server/service/posts/index.ts @@ -1,5 +1,5 @@ import { dbGlobal } from "drizzle-pkg/lib/db"; -import { postMediaRefs, posts } from "drizzle-pkg/lib/schema/content"; +import { mediaRefs, posts } from "drizzle-pkg/lib/schema/content"; import { reconcileAssetTimestampsAfterRefChange, syncPostMediaRefs } from "#server/service/media"; import { users } from "drizzle-pkg/lib/schema/auth"; import { and, count, desc, eq } from "drizzle-orm"; @@ -121,9 +121,9 @@ export async function deletePost(userId: number, id: number) { return false; } const refRows = await dbGlobal - .select({ assetId: postMediaRefs.assetId }) - .from(postMediaRefs) - .where(eq(postMediaRefs.postId, id)); + .select({ assetId: mediaRefs.assetId }) + .from(mediaRefs) + .where(eq(mediaRefs.postId, id)); const touched = refRows.map((r) => r.assetId); await dbGlobal.delete(posts).where(and(eq(posts.id, id), eq(posts.userId, userId))); await reconcileAssetTimestampsAfterRefChange(touched);