test(S02/T01): Added default_monitoring_mode column to platform_setti…
- drizzle/0008_add_default_monitoring_mode.sql - src/db/schema/platform-settings.ts - src/db/repositories/platform-settings-repository.ts - src/types/index.ts - src/server/routes/platform-settings.ts - src/frontend/src/components/PlatformSettingsForm.tsx - src/frontend/src/api/hooks/usePlatformSettings.ts - src/__tests__/platform-settings-api.test.ts
This commit is contained in:
parent
8ce85cb2cd
commit
6715c9b6fe
10 changed files with 1054 additions and 2 deletions
1
drizzle/0008_add_default_monitoring_mode.sql
Normal file
1
drizzle/0008_add_default_monitoring_mode.sql
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE `platform_settings` ADD `default_monitoring_mode` text NOT NULL DEFAULT 'all';
|
||||||
969
drizzle/meta/0008_snapshot.json
Normal file
969
drizzle/meta/0008_snapshot.json
Normal file
|
|
@ -0,0 +1,969 @@
|
||||||
|
{
|
||||||
|
"version": "6",
|
||||||
|
"dialect": "sqlite",
|
||||||
|
"id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
|
||||||
|
"prevId": "24769c36-328d-4e54-8ba1-e74a2681bef5",
|
||||||
|
"tables": {
|
||||||
|
"channels": {
|
||||||
|
"name": "channels",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": true
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"platform": {
|
||||||
|
"name": "platform",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"platform_id": {
|
||||||
|
"name": "platform_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"name": "url",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"monitoring_enabled": {
|
||||||
|
"name": "monitoring_enabled",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"check_interval": {
|
||||||
|
"name": "check_interval",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": 360
|
||||||
|
},
|
||||||
|
"image_url": {
|
||||||
|
"name": "image_url",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"name": "metadata",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"format_profile_id": {
|
||||||
|
"name": "format_profile_id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
},
|
||||||
|
"last_checked_at": {
|
||||||
|
"name": "last_checked_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"last_check_status": {
|
||||||
|
"name": "last_check_status",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"monitoring_mode": {
|
||||||
|
"name": "monitoring_mode",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "'all'"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"channels_format_profile_id_format_profiles_id_fk": {
|
||||||
|
"name": "channels_format_profile_id_format_profiles_id_fk",
|
||||||
|
"tableFrom": "channels",
|
||||||
|
"tableTo": "format_profiles",
|
||||||
|
"columnsFrom": [
|
||||||
|
"format_profile_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "set null",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"content_items": {
|
||||||
|
"name": "content_items",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": true
|
||||||
|
},
|
||||||
|
"channel_id": {
|
||||||
|
"name": "channel_id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"name": "title",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"platform_content_id": {
|
||||||
|
"name": "platform_content_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"name": "url",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"content_type": {
|
||||||
|
"name": "content_type",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"duration": {
|
||||||
|
"name": "duration",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"file_path": {
|
||||||
|
"name": "file_path",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"file_size": {
|
||||||
|
"name": "file_size",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"format": {
|
||||||
|
"name": "format",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"quality_metadata": {
|
||||||
|
"name": "quality_metadata",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"name": "status",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "'monitored'"
|
||||||
|
},
|
||||||
|
"thumbnail_url": {
|
||||||
|
"name": "thumbnail_url",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"published_at": {
|
||||||
|
"name": "published_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"downloaded_at": {
|
||||||
|
"name": "downloaded_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"monitored": {
|
||||||
|
"name": "monitored",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"content_items_channel_id_channels_id_fk": {
|
||||||
|
"name": "content_items_channel_id_channels_id_fk",
|
||||||
|
"tableFrom": "content_items",
|
||||||
|
"tableTo": "channels",
|
||||||
|
"columnsFrom": [
|
||||||
|
"channel_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"format_profiles": {
|
||||||
|
"name": "format_profiles",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": true
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"video_resolution": {
|
||||||
|
"name": "video_resolution",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"audio_codec": {
|
||||||
|
"name": "audio_codec",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"audio_bitrate": {
|
||||||
|
"name": "audio_bitrate",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"container_format": {
|
||||||
|
"name": "container_format",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"is_default": {
|
||||||
|
"name": "is_default",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"subtitle_languages": {
|
||||||
|
"name": "subtitle_languages",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"embed_subtitles": {
|
||||||
|
"name": "embed_subtitles",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"download_history": {
|
||||||
|
"name": "download_history",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": true
|
||||||
|
},
|
||||||
|
"content_item_id": {
|
||||||
|
"name": "content_item_id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"channel_id": {
|
||||||
|
"name": "channel_id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"event_type": {
|
||||||
|
"name": "event_type",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"name": "status",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"details": {
|
||||||
|
"name": "details",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"download_history_content_item_id_content_items_id_fk": {
|
||||||
|
"name": "download_history_content_item_id_content_items_id_fk",
|
||||||
|
"tableFrom": "download_history",
|
||||||
|
"tableTo": "content_items",
|
||||||
|
"columnsFrom": [
|
||||||
|
"content_item_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "set null",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
},
|
||||||
|
"download_history_channel_id_channels_id_fk": {
|
||||||
|
"name": "download_history_channel_id_channels_id_fk",
|
||||||
|
"tableFrom": "download_history",
|
||||||
|
"tableTo": "channels",
|
||||||
|
"columnsFrom": [
|
||||||
|
"channel_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "set null",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"content_playlist": {
|
||||||
|
"name": "content_playlist",
|
||||||
|
"columns": {
|
||||||
|
"content_item_id": {
|
||||||
|
"name": "content_item_id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"playlist_id": {
|
||||||
|
"name": "playlist_id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"content_playlist_content_item_id_content_items_id_fk": {
|
||||||
|
"name": "content_playlist_content_item_id_content_items_id_fk",
|
||||||
|
"tableFrom": "content_playlist",
|
||||||
|
"tableTo": "content_items",
|
||||||
|
"columnsFrom": [
|
||||||
|
"content_item_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
},
|
||||||
|
"content_playlist_playlist_id_playlists_id_fk": {
|
||||||
|
"name": "content_playlist_playlist_id_playlists_id_fk",
|
||||||
|
"tableFrom": "content_playlist",
|
||||||
|
"tableTo": "playlists",
|
||||||
|
"columnsFrom": [
|
||||||
|
"playlist_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {
|
||||||
|
"content_playlist_content_item_id_playlist_id_pk": {
|
||||||
|
"columns": [
|
||||||
|
"content_item_id",
|
||||||
|
"playlist_id"
|
||||||
|
],
|
||||||
|
"name": "content_playlist_content_item_id_playlist_id_pk"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"notification_settings": {
|
||||||
|
"name": "notification_settings",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": true
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"name": "type",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"enabled": {
|
||||||
|
"name": "enabled",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"name": "config",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"on_grab": {
|
||||||
|
"name": "on_grab",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"on_download": {
|
||||||
|
"name": "on_download",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"on_failure": {
|
||||||
|
"name": "on_failure",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"platform_settings": {
|
||||||
|
"name": "platform_settings",
|
||||||
|
"columns": {
|
||||||
|
"platform": {
|
||||||
|
"name": "platform",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"default_format_profile_id": {
|
||||||
|
"name": "default_format_profile_id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"check_interval": {
|
||||||
|
"name": "check_interval",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": 360
|
||||||
|
},
|
||||||
|
"concurrency_limit": {
|
||||||
|
"name": "concurrency_limit",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": 2
|
||||||
|
},
|
||||||
|
"subtitle_languages": {
|
||||||
|
"name": "subtitle_languages",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"grab_all_enabled": {
|
||||||
|
"name": "grab_all_enabled",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"grab_all_order": {
|
||||||
|
"name": "grab_all_order",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "'newest'"
|
||||||
|
},
|
||||||
|
"scan_limit": {
|
||||||
|
"name": "scan_limit",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": 100
|
||||||
|
},
|
||||||
|
"rate_limit_delay": {
|
||||||
|
"name": "rate_limit_delay",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": 1000
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
},
|
||||||
|
"default_monitoring_mode": {
|
||||||
|
"name": "default_monitoring_mode",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "'all'"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"platform_settings_default_format_profile_id_format_profiles_id_fk": {
|
||||||
|
"name": "platform_settings_default_format_profile_id_format_profiles_id_fk",
|
||||||
|
"tableFrom": "platform_settings",
|
||||||
|
"tableTo": "format_profiles",
|
||||||
|
"columnsFrom": [
|
||||||
|
"default_format_profile_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "set null",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"playlists": {
|
||||||
|
"name": "playlists",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": true
|
||||||
|
},
|
||||||
|
"channel_id": {
|
||||||
|
"name": "channel_id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"platform_playlist_id": {
|
||||||
|
"name": "platform_playlist_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"name": "title",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"position": {
|
||||||
|
"name": "position",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"playlists_channel_id_channels_id_fk": {
|
||||||
|
"name": "playlists_channel_id_channels_id_fk",
|
||||||
|
"tableFrom": "playlists",
|
||||||
|
"tableTo": "channels",
|
||||||
|
"columnsFrom": [
|
||||||
|
"channel_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"queue_items": {
|
||||||
|
"name": "queue_items",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": true
|
||||||
|
},
|
||||||
|
"content_item_id": {
|
||||||
|
"name": "content_item_id",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"name": "status",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "'pending'"
|
||||||
|
},
|
||||||
|
"priority": {
|
||||||
|
"name": "priority",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"attempts": {
|
||||||
|
"name": "attempts",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"max_attempts": {
|
||||||
|
"name": "max_attempts",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": 3
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"name": "error",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"started_at": {
|
||||||
|
"name": "started_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"completed_at": {
|
||||||
|
"name": "completed_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"queue_items_content_item_id_content_items_id_fk": {
|
||||||
|
"name": "queue_items_content_item_id_content_items_id_fk",
|
||||||
|
"tableFrom": "queue_items",
|
||||||
|
"tableTo": "content_items",
|
||||||
|
"columnsFrom": [
|
||||||
|
"content_item_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"system_config": {
|
||||||
|
"name": "system_config",
|
||||||
|
"columns": {
|
||||||
|
"key": {
|
||||||
|
"name": "key",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"value": {
|
||||||
|
"name": "value",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "(datetime('now'))"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"views": {},
|
||||||
|
"enums": {},
|
||||||
|
"_meta": {
|
||||||
|
"schemas": {},
|
||||||
|
"tables": {},
|
||||||
|
"columns": {}
|
||||||
|
},
|
||||||
|
"internal": {
|
||||||
|
"indexes": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -57,6 +57,13 @@
|
||||||
"when": 1774396066443,
|
"when": 1774396066443,
|
||||||
"tag": "0007_steep_the_watchers",
|
"tag": "0007_steep_the_watchers",
|
||||||
"breakpoints": true
|
"breakpoints": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idx": 8,
|
||||||
|
"version": "6",
|
||||||
|
"when": 1774839000000,
|
||||||
|
"tag": "0008_add_default_monitoring_mode",
|
||||||
|
"breakpoints": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -299,6 +299,53 @@ describe('Platform Settings API', () => {
|
||||||
|
|
||||||
// ── Auth ──
|
// ── Auth ──
|
||||||
|
|
||||||
|
// ── defaultMonitoringMode ──
|
||||||
|
|
||||||
|
describe('defaultMonitoringMode', () => {
|
||||||
|
it('persists defaultMonitoringMode through PUT → GET round-trip', async () => {
|
||||||
|
const putRes = await server.inject({
|
||||||
|
method: 'PUT',
|
||||||
|
url: '/api/v1/platform-settings/youtube',
|
||||||
|
headers: { 'x-api-key': apiKey },
|
||||||
|
payload: {
|
||||||
|
defaultMonitoringMode: 'future',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(putRes.statusCode).toBe(200);
|
||||||
|
expect(putRes.json().defaultMonitoringMode).toBe('future');
|
||||||
|
|
||||||
|
const getRes = await server.inject({
|
||||||
|
method: 'GET',
|
||||||
|
url: '/api/v1/platform-settings/youtube',
|
||||||
|
headers: { 'x-api-key': apiKey },
|
||||||
|
});
|
||||||
|
expect(getRes.statusCode).toBe(200);
|
||||||
|
expect(getRes.json().defaultMonitoringMode).toBe('future');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('defaults defaultMonitoringMode to all when not specified', async () => {
|
||||||
|
// Delete existing and re-create without specifying the field
|
||||||
|
await server.inject({
|
||||||
|
method: 'DELETE',
|
||||||
|
url: '/api/v1/platform-settings/soundcloud',
|
||||||
|
headers: { 'x-api-key': apiKey },
|
||||||
|
});
|
||||||
|
|
||||||
|
const putRes = await server.inject({
|
||||||
|
method: 'PUT',
|
||||||
|
url: '/api/v1/platform-settings/soundcloud',
|
||||||
|
headers: { 'x-api-key': apiKey },
|
||||||
|
payload: {
|
||||||
|
checkInterval: 720,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(putRes.statusCode).toBe(200);
|
||||||
|
expect(putRes.json().defaultMonitoringMode).toBe('all');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// ── Auth ──
|
||||||
|
|
||||||
describe('Authentication', () => {
|
describe('Authentication', () => {
|
||||||
it('returns 401 on GET without API key', async () => {
|
it('returns 401 on GET without API key', async () => {
|
||||||
const res = await server.inject({
|
const res = await server.inject({
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import { eq, sql } from 'drizzle-orm';
|
||||||
import { type LibSQLDatabase } from 'drizzle-orm/libsql';
|
import { type LibSQLDatabase } from 'drizzle-orm/libsql';
|
||||||
import type * as schema from '../schema/index';
|
import type * as schema from '../schema/index';
|
||||||
import { platformSettings } from '../schema/index';
|
import { platformSettings } from '../schema/index';
|
||||||
import type { PlatformSettings, Platform } from '../../types/index';
|
import type { PlatformSettings, Platform, MonitoringMode } from '../../types/index';
|
||||||
|
|
||||||
// ── Types ──
|
// ── Types ──
|
||||||
|
|
||||||
|
|
@ -17,6 +17,7 @@ export interface UpsertPlatformSettingsData {
|
||||||
grabAllOrder?: 'newest' | 'oldest';
|
grabAllOrder?: 'newest' | 'oldest';
|
||||||
scanLimit?: number;
|
scanLimit?: number;
|
||||||
rateLimitDelay?: number;
|
rateLimitDelay?: number;
|
||||||
|
defaultMonitoringMode?: MonitoringMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
type Db = LibSQLDatabase<typeof schema>;
|
type Db = LibSQLDatabase<typeof schema>;
|
||||||
|
|
@ -65,6 +66,7 @@ export async function upsertPlatformSettings(
|
||||||
grabAllOrder: data.grabAllOrder ?? 'newest',
|
grabAllOrder: data.grabAllOrder ?? 'newest',
|
||||||
scanLimit: data.scanLimit ?? 100,
|
scanLimit: data.scanLimit ?? 100,
|
||||||
rateLimitDelay: data.rateLimitDelay ?? 1000,
|
rateLimitDelay: data.rateLimitDelay ?? 1000,
|
||||||
|
defaultMonitoringMode: data.defaultMonitoringMode ?? 'all',
|
||||||
createdAt: now,
|
createdAt: now,
|
||||||
updatedAt: now,
|
updatedAt: now,
|
||||||
})
|
})
|
||||||
|
|
@ -79,6 +81,7 @@ export async function upsertPlatformSettings(
|
||||||
grabAllOrder: data.grabAllOrder ?? 'newest',
|
grabAllOrder: data.grabAllOrder ?? 'newest',
|
||||||
scanLimit: data.scanLimit ?? 100,
|
scanLimit: data.scanLimit ?? 100,
|
||||||
rateLimitDelay: data.rateLimitDelay ?? 1000,
|
rateLimitDelay: data.rateLimitDelay ?? 1000,
|
||||||
|
defaultMonitoringMode: data.defaultMonitoringMode ?? 'all',
|
||||||
updatedAt: now,
|
updatedAt: now,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
@ -113,6 +116,7 @@ function mapRow(row: typeof platformSettings.$inferSelect): PlatformSettings {
|
||||||
grabAllOrder: row.grabAllOrder as 'newest' | 'oldest',
|
grabAllOrder: row.grabAllOrder as 'newest' | 'oldest',
|
||||||
scanLimit: row.scanLimit ?? 100,
|
scanLimit: row.scanLimit ?? 100,
|
||||||
rateLimitDelay: row.rateLimitDelay ?? 1000,
|
rateLimitDelay: row.rateLimitDelay ?? 1000,
|
||||||
|
defaultMonitoringMode: (row.defaultMonitoringMode ?? 'all') as MonitoringMode,
|
||||||
createdAt: row.createdAt,
|
createdAt: row.createdAt,
|
||||||
updatedAt: row.updatedAt,
|
updatedAt: row.updatedAt,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ export const platformSettings = sqliteTable('platform_settings', {
|
||||||
grabAllOrder: text('grab_all_order').notNull().default('newest'),
|
grabAllOrder: text('grab_all_order').notNull().default('newest'),
|
||||||
scanLimit: integer('scan_limit').default(100),
|
scanLimit: integer('scan_limit').default(100),
|
||||||
rateLimitDelay: integer('rate_limit_delay').default(1000),
|
rateLimitDelay: integer('rate_limit_delay').default(1000),
|
||||||
|
defaultMonitoringMode: text('default_monitoring_mode').notNull().default('all'),
|
||||||
createdAt: text('created_at')
|
createdAt: text('created_at')
|
||||||
.notNull()
|
.notNull()
|
||||||
.default(sql`(datetime('now'))`),
|
.default(sql`(datetime('now'))`),
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@ export interface UpdatePlatformSettingsInput {
|
||||||
grabAllOrder?: 'newest' | 'oldest';
|
grabAllOrder?: 'newest' | 'oldest';
|
||||||
scanLimit?: number;
|
scanLimit?: number;
|
||||||
rateLimitDelay?: number;
|
rateLimitDelay?: number;
|
||||||
|
defaultMonitoringMode?: 'all' | 'future' | 'existing' | 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Mutations ──
|
// ── Mutations ──
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ export interface PlatformSettingsFormValues {
|
||||||
grabAllOrder: 'newest' | 'oldest';
|
grabAllOrder: 'newest' | 'oldest';
|
||||||
scanLimit: number;
|
scanLimit: number;
|
||||||
rateLimitDelay: number;
|
rateLimitDelay: number;
|
||||||
|
defaultMonitoringMode: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface PlatformSettingsFormProps {
|
interface PlatformSettingsFormProps {
|
||||||
|
|
@ -87,6 +88,7 @@ export function PlatformSettingsForm({
|
||||||
const [grabAllOrder, setGrabAllOrder] = useState<'newest' | 'oldest'>(settings?.grabAllOrder ?? 'newest');
|
const [grabAllOrder, setGrabAllOrder] = useState<'newest' | 'oldest'>(settings?.grabAllOrder ?? 'newest');
|
||||||
const [scanLimit, setScanLimit] = useState(settings?.scanLimit ?? 100);
|
const [scanLimit, setScanLimit] = useState(settings?.scanLimit ?? 100);
|
||||||
const [rateLimitDelay, setRateLimitDelay] = useState(settings?.rateLimitDelay ?? 1000);
|
const [rateLimitDelay, setRateLimitDelay] = useState(settings?.rateLimitDelay ?? 1000);
|
||||||
|
const [defaultMonitoringMode, setDefaultMonitoringMode] = useState(settings?.defaultMonitoringMode ?? 'all');
|
||||||
|
|
||||||
const handleSubmit = useCallback(
|
const handleSubmit = useCallback(
|
||||||
(e: FormEvent) => {
|
(e: FormEvent) => {
|
||||||
|
|
@ -100,9 +102,10 @@ export function PlatformSettingsForm({
|
||||||
grabAllOrder,
|
grabAllOrder,
|
||||||
scanLimit,
|
scanLimit,
|
||||||
rateLimitDelay,
|
rateLimitDelay,
|
||||||
|
defaultMonitoringMode,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[defaultFormatProfileId, checkInterval, concurrencyLimit, subtitleLanguages, grabAllEnabled, grabAllOrder, scanLimit, rateLimitDelay, onSubmit],
|
[defaultFormatProfileId, checkInterval, concurrencyLimit, subtitleLanguages, grabAllEnabled, grabAllOrder, scanLimit, rateLimitDelay, defaultMonitoringMode, onSubmit],
|
||||||
);
|
);
|
||||||
|
|
||||||
const platformLabel = platform === 'youtube' ? 'YouTube' : platform === 'soundcloud' ? 'SoundCloud' : platform;
|
const platformLabel = platform === 'youtube' ? 'YouTube' : platform === 'soundcloud' ? 'SoundCloud' : platform;
|
||||||
|
|
@ -261,6 +264,22 @@ export function PlatformSettingsForm({
|
||||||
<span style={hintStyle}>Order in which back-catalog items are queued when grabbing all content.</span>
|
<span style={hintStyle}>Order in which back-catalog items are queued when grabbing all content.</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Default Monitoring Mode */}
|
||||||
|
<div style={fieldGroupStyle}>
|
||||||
|
<label htmlFor="ps-default-monitoring-mode" style={labelStyle}>Default Monitoring Mode</label>
|
||||||
|
<select
|
||||||
|
id="ps-default-monitoring-mode"
|
||||||
|
value={defaultMonitoringMode}
|
||||||
|
onChange={(e) => setDefaultMonitoringMode(e.target.value)}
|
||||||
|
style={selectStyle}
|
||||||
|
>
|
||||||
|
<option value="all">Monitor All</option>
|
||||||
|
<option value="future">Future Only</option>
|
||||||
|
<option value="none">None</option>
|
||||||
|
</select>
|
||||||
|
<span style={hintStyle}>Default monitoring mode for new channels from this platform.</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Action buttons */}
|
{/* Action buttons */}
|
||||||
<div style={{ display: 'flex', justifyContent: 'flex-end', gap: 'var(--space-3)', marginTop: 'var(--space-5)' }}>
|
<div style={{ display: 'flex', justifyContent: 'flex-end', gap: 'var(--space-3)', marginTop: 'var(--space-5)' }}>
|
||||||
<button
|
<button
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ const upsertPlatformSettingsBodySchema = {
|
||||||
grabAllOrder: { type: 'string' as const, enum: ['newest', 'oldest'] },
|
grabAllOrder: { type: 'string' as const, enum: ['newest', 'oldest'] },
|
||||||
scanLimit: { type: 'integer' as const, minimum: 10, maximum: 1000 },
|
scanLimit: { type: 'integer' as const, minimum: 10, maximum: 1000 },
|
||||||
rateLimitDelay: { type: 'integer' as const, minimum: 0, maximum: 10000 },
|
rateLimitDelay: { type: 'integer' as const, minimum: 0, maximum: 10000 },
|
||||||
|
defaultMonitoringMode: { type: 'string' as const, enum: ['all', 'future', 'existing', 'none'] },
|
||||||
},
|
},
|
||||||
additionalProperties: false,
|
additionalProperties: false,
|
||||||
};
|
};
|
||||||
|
|
@ -77,6 +78,7 @@ export async function platformSettingsRoutes(fastify: FastifyInstance): Promise<
|
||||||
grabAllOrder?: 'newest' | 'oldest';
|
grabAllOrder?: 'newest' | 'oldest';
|
||||||
scanLimit?: number;
|
scanLimit?: number;
|
||||||
rateLimitDelay?: number;
|
rateLimitDelay?: number;
|
||||||
|
defaultMonitoringMode?: 'all' | 'future' | 'existing' | 'none';
|
||||||
};
|
};
|
||||||
}>(
|
}>(
|
||||||
'/api/v1/platform-settings/:platform',
|
'/api/v1/platform-settings/:platform',
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,7 @@ export interface PlatformSettings {
|
||||||
grabAllOrder: 'newest' | 'oldest';
|
grabAllOrder: 'newest' | 'oldest';
|
||||||
scanLimit: number;
|
scanLimit: number;
|
||||||
rateLimitDelay: number;
|
rateLimitDelay: number;
|
||||||
|
defaultMonitoringMode: MonitoringMode;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
updatedAt: string;
|
updatedAt: string;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue