Files
bookorbit/server/test/e2e/authorization-matrix/route-inventory/routes-09.json
T
neon 8810d47658 feat(books): remember a default read-aloud narration language
Resolve book languages stated as names ("English") to a code, so the
dialog and the server's fallback stop calling English unsupported. The
dialog groups the ebook and audiobook in a Sources card, shows
Highlighting without the Advanced disclosure, and saves a per-user
default under /user-preferences/read-aloud for books it cannot match.
2026-10-22 00:42:06 +00:00

843 lines
25 KiB
JSON

[
{
"file": "server/src/modules/library/library.controller.ts",
"className": "LibraryController",
"methodName": "getBookFacets",
"httpMethod": "POST",
"path": "/libraries/:id/books/facets",
"permissions": [],
"libraryAccess": ["'viewer'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/library/library.controller.ts",
"className": "LibraryController",
"methodName": "queryJumpBuckets",
"httpMethod": "POST",
"path": "/libraries/:id/books/jump-buckets",
"permissions": [],
"libraryAccess": ["'viewer'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/library/library.controller.ts",
"className": "LibraryController",
"methodName": "getBulkRenamePreview",
"httpMethod": "GET",
"path": "/libraries/:id/bulk-rename/preview",
"permissions": ["Permission.ManageLibraries"],
"libraryAccess": ["'editor'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/library/library.controller.ts",
"className": "LibraryController",
"methodName": "getBulkRenameStatus",
"httpMethod": "GET",
"path": "/libraries/:id/bulk-rename/status",
"permissions": ["Permission.ManageLibraries"],
"libraryAccess": ["'editor'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/library/library.controller.ts",
"className": "LibraryController",
"methodName": "executeBulkRename",
"httpMethod": "POST",
"path": "/libraries/:id/bulk-rename/execute",
"permissions": ["Permission.ManageLibraries"],
"libraryAccess": ["'editor'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "listPodcasts",
"httpMethod": "GET",
"path": "/podcast-libraries/:libraryId/podcasts",
"permissions": [],
"libraryAccess": ["'viewer'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "listEpisodes",
"httpMethod": "GET",
"path": "/podcast-libraries/:libraryId/episodes",
"permissions": [],
"libraryAccess": ["'viewer'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "queueEpisodes",
"httpMethod": "POST",
"path": "/podcast-libraries/:libraryId/queue-episodes",
"permissions": [],
"libraryAccess": ["'viewer'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "previewFeed",
"httpMethod": "POST",
"path": "/podcast-libraries/:libraryId/feed-preview",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": ["'editor'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "createPodcast",
"httpMethod": "POST",
"path": "/podcast-libraries/:libraryId/podcasts",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": ["'editor'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "importOpml",
"httpMethod": "POST",
"path": "/podcast-libraries/:libraryId/opml/import",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": ["'editor'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "importLocalFiles",
"httpMethod": "POST",
"path": "/podcast-libraries/:libraryId/import-scan",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": ["'editor'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "getLatestImportScan",
"httpMethod": "GET",
"path": "/podcast-libraries/:libraryId/import-scan/latest",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": ["'editor'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "previewBulkDelete",
"httpMethod": "POST",
"path": "/podcast-libraries/:libraryId/shows/bulk-purge-preview",
"permissions": ["Permission.PodcastPurge"],
"libraryAccess": ["'owner'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "bulkDelete",
"httpMethod": "POST",
"path": "/podcast-libraries/:libraryId/shows/bulk-delete",
"permissions": ["Permission.PodcastPurge"],
"libraryAccess": ["'owner'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "exportOpml",
"httpMethod": "GET",
"path": "/podcast-libraries/:libraryId/opml/export",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": ["'owner'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "getSettings",
"httpMethod": "GET",
"path": "/podcast-libraries/:libraryId/settings",
"permissions": [],
"libraryAccess": ["'viewer'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "updateSettings",
"httpMethod": "PATCH",
"path": "/podcast-libraries/:libraryId/settings",
"permissions": ["Permission.PodcastManageRetention"],
"libraryAccess": ["'owner'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "getHealth",
"httpMethod": "GET",
"path": "/podcast-libraries/:libraryId/health",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": ["'editor'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "getActivity",
"httpMethod": "GET",
"path": "/podcast-libraries/:libraryId/activity",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": ["'editor'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastLibraryController",
"methodName": "getJobs",
"httpMethod": "GET",
"path": "/podcast-libraries/:libraryId/jobs",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": ["'editor'"],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastSearchController",
"methodName": "search",
"httpMethod": "GET",
"path": "/podcast-search",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEventsController",
"methodName": "stream",
"httpMethod": "GET",
"path": "/podcast-events/stream",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "getPodcast",
"httpMethod": "GET",
"path": "/podcasts/:podcastId",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "updateConfig",
"httpMethod": "PATCH",
"path": "/podcasts/:podcastId/config",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "updateMetadata",
"httpMethod": "PATCH",
"path": "/podcasts/:podcastId/metadata",
"permissions": ["Permission.PodcastEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "refresh",
"httpMethod": "POST",
"path": "/podcasts/:podcastId/refresh",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "reparse",
"httpMethod": "POST",
"path": "/podcasts/:podcastId/reparse",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "archive",
"httpMethod": "POST",
"path": "/podcasts/:podcastId/archive",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "restore",
"httpMethod": "POST",
"path": "/podcasts/:podcastId/restore",
"permissions": ["Permission.PodcastManageFeeds"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "purgePreview",
"httpMethod": "GET",
"path": "/podcasts/:podcastId/purge-preview",
"permissions": ["Permission.PodcastPurge"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "purge",
"httpMethod": "POST",
"path": "/podcasts/:podcastId/purge",
"permissions": ["Permission.PodcastPurge"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "merge",
"httpMethod": "POST",
"path": "/podcasts/:podcastId/merge",
"permissions": ["Permission.PodcastPurge"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "follow",
"httpMethod": "POST",
"path": "/podcasts/:podcastId/follow",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "unfollow",
"httpMethod": "DELETE",
"path": "/podcasts/:podcastId/follow",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "artwork",
"httpMethod": "GET",
"path": "/podcasts/:podcastId/artwork",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "uploadArtwork",
"httpMethod": "POST",
"path": "/podcasts/:podcastId/artwork",
"permissions": ["Permission.PodcastEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "uploadArtworkFromUrl",
"httpMethod": "POST",
"path": "/podcasts/:podcastId/artwork/from-url",
"permissions": ["Permission.PodcastEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastController",
"methodName": "deleteArtwork",
"httpMethod": "DELETE",
"path": "/podcasts/:podcastId/artwork",
"permissions": ["Permission.PodcastEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "stateBatch",
"httpMethod": "POST",
"path": "/podcast-episodes/state-batch",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "continueListening",
"httpMethod": "GET",
"path": "/podcast-episodes/continue",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "getEpisode",
"httpMethod": "GET",
"path": "/podcast-episodes/:episodeId",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "playbackContext",
"httpMethod": "GET",
"path": "/podcast-episodes/:episodeId/playback-context",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "updateState",
"httpMethod": "PATCH",
"path": "/podcast-episodes/:episodeId/state",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "updateEpisodeMetadata",
"httpMethod": "PATCH",
"path": "/podcast-episodes/:episodeId/metadata",
"permissions": ["Permission.PodcastEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "download",
"httpMethod": "POST",
"path": "/podcast-episodes/:episodeId/download",
"permissions": ["Permission.PodcastDownload"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "removeDownload",
"httpMethod": "DELETE",
"path": "/podcast-episodes/:episodeId/download",
"permissions": ["Permission.PodcastDownload"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "streamTicket",
"httpMethod": "POST",
"path": "/podcast-episodes/:episodeId/stream-ticket",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "stream",
"httpMethod": "GET",
"path": "/podcast-episodes/:episodeId/stream",
"permissions": [],
"libraryAccess": [],
"isPublic": true,
"allowDefault": false,
"useGuards": ["PodcastStreamAuthGuard"]
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "addQueue",
"httpMethod": "POST",
"path": "/podcast-episodes/:episodeId/queue",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "removeQueue",
"httpMethod": "DELETE",
"path": "/podcast-episodes/:episodeId/queue",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "bookmarks",
"httpMethod": "GET",
"path": "/podcast-episodes/:episodeId/bookmarks",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "createBookmark",
"httpMethod": "POST",
"path": "/podcast-episodes/:episodeId/bookmarks",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastEpisodeController",
"methodName": "createSession",
"httpMethod": "POST",
"path": "/podcast-episodes/:episodeId/sessions",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastQueueController",
"methodName": "list",
"httpMethod": "GET",
"path": "/podcast-queue",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastQueueController",
"methodName": "reorder",
"httpMethod": "PATCH",
"path": "/podcast-queue",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastQueueController",
"methodName": "move",
"httpMethod": "PATCH",
"path": "/podcast-queue/move",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastQueueController",
"methodName": "restore",
"httpMethod": "POST",
"path": "/podcast-queue/restore",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastQueueController",
"methodName": "clearFinished",
"httpMethod": "DELETE",
"path": "/podcast-queue/finished",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastQueueController",
"methodName": "clear",
"httpMethod": "DELETE",
"path": "/podcast-queue",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastBookmarkController",
"methodName": "remove",
"httpMethod": "DELETE",
"path": "/podcast-bookmarks/:bookmarkId",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/podcast/podcast.controller.ts",
"className": "PodcastBookmarkController",
"methodName": "update",
"httpMethod": "PATCH",
"path": "/podcast-bookmarks/:bookmarkId",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user-preferences/user-preferences.controller.ts",
"className": "UserPreferencesController",
"methodName": "getPodcastPlaybackPreferences",
"httpMethod": "GET",
"path": "/user-preferences/podcast-playback",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user-preferences/user-preferences.controller.ts",
"className": "UserPreferencesController",
"methodName": "upsertPodcastPlaybackPreferences",
"httpMethod": "PUT",
"path": "/user-preferences/podcast-playback",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user-preferences/user-preferences.controller.ts",
"className": "UserPreferencesController",
"methodName": "getPodcastPlaylistPreferences",
"httpMethod": "GET",
"path": "/user-preferences/podcast-playlists",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user-preferences/user-preferences.controller.ts",
"className": "UserPreferencesController",
"methodName": "upsertPodcastPlaylistPreferences",
"httpMethod": "PUT",
"path": "/user-preferences/podcast-playlists",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user-preferences/user-preferences.controller.ts",
"className": "UserPreferencesController",
"methodName": "getAnnotationColorNamePreferences",
"httpMethod": "GET",
"path": "/user-preferences/annotation-colors",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user-preferences/user-preferences.controller.ts",
"className": "UserPreferencesController",
"methodName": "upsertAnnotationColorNamePreferences",
"httpMethod": "PUT",
"path": "/user-preferences/annotation-colors",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user-preferences/user-preferences.controller.ts",
"className": "UserPreferencesController",
"methodName": "getReadAloudPreferences",
"httpMethod": "GET",
"path": "/user-preferences/read-aloud",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user-preferences/user-preferences.controller.ts",
"className": "UserPreferencesController",
"methodName": "upsertReadAloudPreferences",
"httpMethod": "PUT",
"path": "/user-preferences/read-aloud",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
}
]