From d66976821b62f67216ab1eeffe0a07c27b01c9ed Mon Sep 17 00:00:00 2001 From: hfellerhoff Date: Sun, 31 Aug 2025 01:00:35 -0400 Subject: [PATCH 1/4] update db name, address inbox time window --- src/content/releases/2025-08-28.md | 4 + src/lib/data/views/index.ts | 2 +- .../db/migrations/0020_misty_cannonball.sql | 1 + .../db/migrations/0021_legal_warbird.sql | 1 + .../db/migrations/meta/0020_snapshot.json | 869 +++++++++++++++++ .../db/migrations/meta/0021_snapshot.json | 875 ++++++++++++++++++ src/server/db/migrations/meta/_journal.json | 14 + src/server/db/schema.ts | 2 +- 8 files changed, 1766 insertions(+), 2 deletions(-) create mode 100644 src/server/db/migrations/0020_misty_cannonball.sql create mode 100644 src/server/db/migrations/0021_legal_warbird.sql create mode 100644 src/server/db/migrations/meta/0020_snapshot.json create mode 100644 src/server/db/migrations/meta/0021_snapshot.json diff --git a/src/content/releases/2025-08-28.md b/src/content/releases/2025-08-28.md index f5c6c72..b9cd806 100644 --- a/src/content/releases/2025-08-28.md +++ b/src/content/releases/2025-08-28.md @@ -14,3 +14,7 @@ public: true ## Improvements - Data is persisted locally between sessions, speeding startup times + +## Tweaks + +- The "Inbox" time window is now "One Month" diff --git a/src/lib/data/views/index.ts b/src/lib/data/views/index.ts index 1ada8e0..21563a0 100644 --- a/src/lib/data/views/index.ts +++ b/src/lib/data/views/index.ts @@ -122,7 +122,7 @@ export function useViewsQuery() { const inboxView: ApplicationView = { id: INBOX_VIEW_ID, name: "Inbox", - daysWindow: 7, + daysWindow: 30, orientation: FEED_ITEM_ORIENTATION.HORIZONTAL, readStatus: VIEW_READ_STATUS.UNREAD, placement: INBOX_VIEW_PLACEMENT, diff --git a/src/server/db/migrations/0020_misty_cannonball.sql b/src/server/db/migrations/0020_misty_cannonball.sql new file mode 100644 index 0000000..b5ae9b7 --- /dev/null +++ b/src/server/db/migrations/0020_misty_cannonball.sql @@ -0,0 +1 @@ +ALTER TABLE `serial_views` RENAME COLUMN "read_status" TO "placement"; \ No newline at end of file diff --git a/src/server/db/migrations/0021_legal_warbird.sql b/src/server/db/migrations/0021_legal_warbird.sql new file mode 100644 index 0000000..167632a --- /dev/null +++ b/src/server/db/migrations/0021_legal_warbird.sql @@ -0,0 +1 @@ +ALTER TABLE `serial_views` ADD `read_status` integer DEFAULT 0 NOT NULL; \ No newline at end of file diff --git a/src/server/db/migrations/meta/0020_snapshot.json b/src/server/db/migrations/meta/0020_snapshot.json new file mode 100644 index 0000000..4361d30 --- /dev/null +++ b/src/server/db/migrations/meta/0020_snapshot.json @@ -0,0 +1,869 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "af5cb987-43f9-4112-90aa-dc964999e8a1", + "prevId": "aff89f29-2c5e-4e56-8644-adfb35ea86f0", + "tables": { + "serial_account": { + "name": "serial_account", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "serial_account_user_id_serial_user_id_fk": { + "name": "serial_account_user_id_serial_user_id_fk", + "tableFrom": "serial_account", + "tableTo": "serial_user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_content_categories": { + "name": "serial_content_categories", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "name": { + "name": "name", + "type": "text(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "content_categories_name_idx": { + "name": "content_categories_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_feed_categories": { + "name": "serial_feed_categories", + "columns": { + "feed_id": { + "name": "feed_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "category_id": { + "name": "category_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "serial_feed_categories_feed_id_serial_feed_id_fk": { + "name": "serial_feed_categories_feed_id_serial_feed_id_fk", + "tableFrom": "serial_feed_categories", + "tableTo": "serial_feed", + "columnsFrom": [ + "feed_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "serial_feed_categories_category_id_serial_content_categories_id_fk": { + "name": "serial_feed_categories_category_id_serial_content_categories_id_fk", + "tableFrom": "serial_feed_categories", + "tableTo": "serial_content_categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "serial_feed_categories_feed_id_category_id_pk": { + "columns": [ + "feed_id", + "category_id" + ], + "name": "serial_feed_categories_feed_id_category_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_feed_item": { + "name": "serial_feed_item", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "feed_id": { + "name": "feed_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "content_id": { + "name": "content_id", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "author": { + "name": "author", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "thumbnail": { + "name": "thumbnail", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "is_watched": { + "name": "is_watched", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_watch_later": { + "name": "is_watch_later", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "orientation": { + "name": "orientation", + "type": "text(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "posted_at": { + "name": "posted_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "feed_item_id_idx": { + "name": "feed_item_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "serial_feed_item_url_feed_id_unique": { + "name": "serial_feed_item_url_feed_id_unique", + "columns": [ + "url", + "feed_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "serial_feed_item_feed_id_serial_feed_id_fk": { + "name": "serial_feed_item_feed_id_serial_feed_id_fk", + "tableFrom": "serial_feed_item", + "tableTo": "serial_feed", + "columnsFrom": [ + "feed_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_feed": { + "name": "serial_feed", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "name": { + "name": "name", + "type": "text(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "url": { + "name": "url", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "image_url": { + "name": "image_url", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "platform": { + "name": "platform", + "type": "text(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'youtube'" + }, + "open_location": { + "name": "open_location", + "type": "text(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'serial'" + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "feed_name_idx": { + "name": "feed_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_session": { + "name": "serial_session", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "serial_session_token_unique": { + "name": "serial_session_token_unique", + "columns": [ + "token" + ], + "isUnique": true + } + }, + "foreignKeys": { + "serial_session_user_id_serial_user_id_fk": { + "name": "serial_session_user_id_serial_user_id_fk", + "tableFrom": "serial_session", + "tableTo": "serial_user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_user": { + "name": "serial_user", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "serial_user_email_unique": { + "name": "serial_user_email_unique", + "columns": [ + "email" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_user_config": { + "name": "serial_user_config", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "light_hsl": { + "name": "light_hsl", + "type": "text(16)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "dark_hsl": { + "name": "dark_hsl", + "type": "text(16)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_verification": { + "name": "serial_verification", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "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": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_view_categories": { + "name": "serial_view_categories", + "columns": { + "view_id": { + "name": "view_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "category_id": { + "name": "category_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "serial_view_categories_view_id_serial_views_id_fk": { + "name": "serial_view_categories_view_id_serial_views_id_fk", + "tableFrom": "serial_view_categories", + "tableTo": "serial_views", + "columnsFrom": [ + "view_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "serial_view_categories_category_id_serial_content_categories_id_fk": { + "name": "serial_view_categories_category_id_serial_content_categories_id_fk", + "tableFrom": "serial_view_categories", + "tableTo": "serial_content_categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "serial_view_categories_view_id_category_id_pk": { + "columns": [ + "view_id", + "category_id" + ], + "name": "serial_view_categories_view_id_category_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_views": { + "name": "serial_views", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "name": { + "name": "name", + "type": "text(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "days_window": { + "name": "days_window", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "orientation": { + "name": "orientation", + "type": "text(16)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'horizontal'" + }, + "placement": { + "name": "placement", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": -1 + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "view_name_idx": { + "name": "view_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": { + "\"serial_views\".\"read_status\"": "\"serial_views\".\"placement\"" + } + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/src/server/db/migrations/meta/0021_snapshot.json b/src/server/db/migrations/meta/0021_snapshot.json new file mode 100644 index 0000000..b0ae62b --- /dev/null +++ b/src/server/db/migrations/meta/0021_snapshot.json @@ -0,0 +1,875 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "506c407d-ce10-49e0-996b-6fd1cd792be1", + "prevId": "af5cb987-43f9-4112-90aa-dc964999e8a1", + "tables": { + "serial_account": { + "name": "serial_account", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "serial_account_user_id_serial_user_id_fk": { + "name": "serial_account_user_id_serial_user_id_fk", + "tableFrom": "serial_account", + "tableTo": "serial_user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_content_categories": { + "name": "serial_content_categories", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "name": { + "name": "name", + "type": "text(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "content_categories_name_idx": { + "name": "content_categories_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_feed_categories": { + "name": "serial_feed_categories", + "columns": { + "feed_id": { + "name": "feed_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "category_id": { + "name": "category_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "serial_feed_categories_feed_id_serial_feed_id_fk": { + "name": "serial_feed_categories_feed_id_serial_feed_id_fk", + "tableFrom": "serial_feed_categories", + "tableTo": "serial_feed", + "columnsFrom": [ + "feed_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "serial_feed_categories_category_id_serial_content_categories_id_fk": { + "name": "serial_feed_categories_category_id_serial_content_categories_id_fk", + "tableFrom": "serial_feed_categories", + "tableTo": "serial_content_categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "serial_feed_categories_feed_id_category_id_pk": { + "columns": [ + "feed_id", + "category_id" + ], + "name": "serial_feed_categories_feed_id_category_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_feed_item": { + "name": "serial_feed_item", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "feed_id": { + "name": "feed_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "content_id": { + "name": "content_id", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "author": { + "name": "author", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "thumbnail": { + "name": "thumbnail", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "is_watched": { + "name": "is_watched", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_watch_later": { + "name": "is_watch_later", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "orientation": { + "name": "orientation", + "type": "text(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "posted_at": { + "name": "posted_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "feed_item_id_idx": { + "name": "feed_item_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "serial_feed_item_url_feed_id_unique": { + "name": "serial_feed_item_url_feed_id_unique", + "columns": [ + "url", + "feed_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "serial_feed_item_feed_id_serial_feed_id_fk": { + "name": "serial_feed_item_feed_id_serial_feed_id_fk", + "tableFrom": "serial_feed_item", + "tableTo": "serial_feed", + "columnsFrom": [ + "feed_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_feed": { + "name": "serial_feed", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "name": { + "name": "name", + "type": "text(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "url": { + "name": "url", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "image_url": { + "name": "image_url", + "type": "text(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "platform": { + "name": "platform", + "type": "text(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'youtube'" + }, + "open_location": { + "name": "open_location", + "type": "text(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'serial'" + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "feed_name_idx": { + "name": "feed_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_session": { + "name": "serial_session", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "serial_session_token_unique": { + "name": "serial_session_token_unique", + "columns": [ + "token" + ], + "isUnique": true + } + }, + "foreignKeys": { + "serial_session_user_id_serial_user_id_fk": { + "name": "serial_session_user_id_serial_user_id_fk", + "tableFrom": "serial_session", + "tableTo": "serial_user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_user": { + "name": "serial_user", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "serial_user_email_unique": { + "name": "serial_user_email_unique", + "columns": [ + "email" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_user_config": { + "name": "serial_user_config", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "light_hsl": { + "name": "light_hsl", + "type": "text(16)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "dark_hsl": { + "name": "dark_hsl", + "type": "text(16)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_verification": { + "name": "serial_verification", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "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": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_view_categories": { + "name": "serial_view_categories", + "columns": { + "view_id": { + "name": "view_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "category_id": { + "name": "category_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "serial_view_categories_view_id_serial_views_id_fk": { + "name": "serial_view_categories_view_id_serial_views_id_fk", + "tableFrom": "serial_view_categories", + "tableTo": "serial_views", + "columnsFrom": [ + "view_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "serial_view_categories_category_id_serial_content_categories_id_fk": { + "name": "serial_view_categories_category_id_serial_content_categories_id_fk", + "tableFrom": "serial_view_categories", + "tableTo": "serial_content_categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "serial_view_categories_view_id_category_id_pk": { + "columns": [ + "view_id", + "category_id" + ], + "name": "serial_view_categories_view_id_category_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serial_views": { + "name": "serial_views", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "name": { + "name": "name", + "type": "text(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "days_window": { + "name": "days_window", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "read_status": { + "name": "read_status", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "orientation": { + "name": "orientation", + "type": "text(16)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'horizontal'" + }, + "placement": { + "name": "placement", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": -1 + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "view_name_idx": { + "name": "view_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/src/server/db/migrations/meta/_journal.json b/src/server/db/migrations/meta/_journal.json index 68bef7a..639c1db 100644 --- a/src/server/db/migrations/meta/_journal.json +++ b/src/server/db/migrations/meta/_journal.json @@ -141,6 +141,20 @@ "when": 1756437060753, "tag": "0019_empty_quicksilver", "breakpoints": true + }, + { + "idx": 20, + "version": "6", + "when": 1756616147155, + "tag": "0020_misty_cannonball", + "breakpoints": true + }, + { + "idx": 21, + "version": "6", + "when": 1756616154059, + "tag": "0021_legal_warbird", + "breakpoints": true } ] } \ No newline at end of file diff --git a/src/server/db/schema.ts b/src/server/db/schema.ts index 42c9644..179bf9e 100644 --- a/src/server/db/schema.ts +++ b/src/server/db/schema.ts @@ -223,7 +223,7 @@ export const views = sqliteTable( orientation: text("orientation", { length: 16 }) .notNull() .default(FEED_ITEM_ORIENTATION.HORIZONTAL), - placement: integer("read_status", { mode: "number" }).notNull().default(-1), + placement: integer("placement", { mode: "number" }).notNull().default(-1), createdAt: integer("created_at", { mode: "timestamp" }) .$default(() => new Date()) .notNull(), From af88b58df24b109b861b2ce4543688354f006333 Mon Sep 17 00:00:00 2001 From: hfellerhoff Date: Sun, 31 Aug 2025 01:21:02 -0400 Subject: [PATCH 2/4] update release notes --- src/content/releases/2025-08-28.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content/releases/2025-08-28.md b/src/content/releases/2025-08-28.md index b9cd806..84c8ea3 100644 --- a/src/content/releases/2025-08-28.md +++ b/src/content/releases/2025-08-28.md @@ -15,6 +15,7 @@ public: true - Data is persisted locally between sessions, speeding startup times -## Tweaks +## Tweaks & Improvements (2025-08-31) - The "Inbox" time window is now "One Month" +- Articles now include the `description` field for items (as a fallback for page content) if the RSS feed has it From 962e21f530f2d50cb4ec250b8c8cc2c5e9b05a7d Mon Sep 17 00:00:00 2001 From: hfellerhoff Date: Sun, 31 Aug 2025 01:23:19 -0400 Subject: [PATCH 3/4] better parser --- src/server/rss/parsers/website.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/server/rss/parsers/website.ts b/src/server/rss/parsers/website.ts index bf3869a..c963802 100644 --- a/src/server/rss/parsers/website.ts +++ b/src/server/rss/parsers/website.ts @@ -6,7 +6,7 @@ import type { NewFeedDetails, RSSContent, RSSFeed } from "../types"; const parser = new Parser({ customFields: { - item: [], + item: ["description"], }, }); @@ -16,7 +16,8 @@ export const websiteItemSchema = z.object({ link: z.string(), pubDate: z.string().optional(), "content:encoded": z.string().optional(), - content: z.string(), + description: z.string().optional(), + content: z.string().optional(), contentSnippet: z.string().optional(), guid: z.string(), isoDate: z.string().optional(), @@ -92,7 +93,7 @@ export async function fetchWebsiteFeedData( publishedDate: item?.pubDate || item?.isoDate || item?.updated || "", url: item.link, author: item.creator ?? "", - content: item["content:encoded"], + content: item["content:encoded"] ?? item.des, } satisfies RSSContent; }); From ac306d46f3d05f641f7aff438b677e5ece7fd6e5 Mon Sep 17 00:00:00 2001 From: hfellerhoff Date: Sun, 31 Aug 2025 01:25:13 -0400 Subject: [PATCH 4/4] ACTUALLY better parser --- src/server/rss/parsers/website.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/rss/parsers/website.ts b/src/server/rss/parsers/website.ts index c963802..af7495f 100644 --- a/src/server/rss/parsers/website.ts +++ b/src/server/rss/parsers/website.ts @@ -93,7 +93,7 @@ export async function fetchWebsiteFeedData( publishedDate: item?.pubDate || item?.isoDate || item?.updated || "", url: item.link, author: item.creator ?? "", - content: item["content:encoded"] ?? item.des, + content: item["content:encoded"] || item.description, } satisfies RSSContent; });