Files
bookorbit/server/test/e2e/authorization-matrix/route-inventory/routes-06.json
T
neon d29b06c6e8 fix(auth): restore metadata editing lost to the 3.5.0 library roles
Promote Viewer grants to Editor on book libraries for non-superusers who hold Edit metadata but
can edit nowhere, which is how every such account was left after the upgrade. Accounts with any
Editor or Owner role are left alone. The Users drawer now says where Edit metadata takes effect,
read from a new GET /users/:id/library-access route.

Closes #1902
2026-10-24 03:56:25 +00:00

783 lines
22 KiB
JSON

[
{
"file": "server/src/modules/book-duplicates/book-duplicates.controller.ts",
"className": "BookDuplicatesController",
"methodName": "listDismissals",
"httpMethod": "GET",
"path": "/book-duplicates/dismissals",
"permissions": ["Permission.LibraryDeleteBooks"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-duplicates/book-duplicates.controller.ts",
"className": "BookDuplicatesController",
"methodName": "dismissGroup",
"httpMethod": "POST",
"path": "/book-duplicates/dismissals",
"permissions": ["Permission.LibraryDeleteBooks"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-duplicates/book-duplicates.controller.ts",
"className": "BookDuplicatesController",
"methodName": "restoreDismissal",
"httpMethod": "DELETE",
"path": "/book-duplicates/dismissals/:bookIdA/:bookIdB",
"permissions": ["Permission.LibraryDeleteBooks"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/chapter-health/chapter-health.controller.ts",
"className": "ChapterHealthController",
"methodName": "summary",
"httpMethod": "GET",
"path": "/chapter-health/summary",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/chapter-health/chapter-health.controller.ts",
"className": "ChapterHealthController",
"methodName": "list",
"httpMethod": "GET",
"path": "/chapter-health/books",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/chapter-health/chapter-health.controller.ts",
"className": "ChapterHealthController",
"methodName": "enqueue",
"httpMethod": "POST",
"path": "/chapter-health/lookups",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/chapter-health/chapter-health.controller.ts",
"className": "ChapterHealthController",
"methodName": "state",
"httpMethod": "GET",
"path": "/chapter-health/lookups/state",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/chapter-health/chapter-health.controller.ts",
"className": "ChapterHealthController",
"methodName": "cancel",
"httpMethod": "DELETE",
"path": "/chapter-health/lookups/queued",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/chapter-health/chapter-health.controller.ts",
"className": "ChapterHealthController",
"methodName": "clearFinished",
"httpMethod": "DELETE",
"path": "/chapter-health/lookups/finished",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/chapter-health/chapter-health.controller.ts",
"className": "ChapterHealthController",
"methodName": "dismissReview",
"httpMethod": "DELETE",
"path": "/chapter-health/lookups/:bookId",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "getSummary",
"httpMethod": "GET",
"path": "/book-dock/summary",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "getStatistics",
"httpMethod": "GET",
"path": "/book-dock/statistics",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "getSettings",
"httpMethod": "GET",
"path": "/book-dock/settings",
"permissions": ["Permission.ManageBookDock"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "updateSettings",
"httpMethod": "PUT",
"path": "/book-dock/settings",
"permissions": ["Permission.ManageBookDock"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "getFile",
"httpMethod": "GET",
"path": "/book-dock/files/:id",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "getCover",
"httpMethod": "GET",
"path": "/book-dock/files/:id/cover",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "upload",
"httpMethod": "POST",
"path": "/book-dock/upload",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "updateFile",
"httpMethod": "PATCH",
"path": "/book-dock/files/:id",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "discardFile",
"httpMethod": "DELETE",
"path": "/book-dock/files/:id",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "bulkDiscard",
"httpMethod": "POST",
"path": "/book-dock/files/discard",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "applyFetched",
"httpMethod": "POST",
"path": "/book-dock/files/apply-fetched",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "retryFetch",
"httpMethod": "POST",
"path": "/book-dock/files/retry-fetch",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "setTarget",
"httpMethod": "POST",
"path": "/book-dock/files/set-target",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "selectionSummary",
"httpMethod": "POST",
"path": "/book-dock/files/selection-summary",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "bulkEdit",
"httpMethod": "POST",
"path": "/book-dock/files/bulk-edit",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "previewNames",
"httpMethod": "POST",
"path": "/book-dock/files/preview-names",
"permissions": ["Permission.BookDockAccess"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "finalize",
"httpMethod": "POST",
"path": "/book-dock/finalize",
"permissions": ["Permission.BookDockAccess", "Permission.LibraryUpload"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/book-dock/book-dock.controller.ts",
"className": "BookDockController",
"methodName": "rescan",
"httpMethod": "POST",
"path": "/book-dock/rescan",
"permissions": ["Permission.ManageBookDock"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getFormatDistribution",
"httpMethod": "GET",
"path": "/statistics/format-distribution",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getLanguageDistribution",
"httpMethod": "GET",
"path": "/statistics/language-distribution",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getBooksAddedOverTime",
"httpMethod": "GET",
"path": "/statistics/books-added-over-time",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getStorageByFormat",
"httpMethod": "GET",
"path": "/statistics/storage-by-format",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getMetadataScoreDistribution",
"httpMethod": "GET",
"path": "/statistics/metadata-score-distribution",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getLibraryMetadataCompleteness",
"httpMethod": "GET",
"path": "/statistics/library-metadata-completeness",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getFormatShareOverTime",
"httpMethod": "GET",
"path": "/statistics/format-share-over-time",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getPageCountDistribution",
"httpMethod": "GET",
"path": "/statistics/page-count-distribution",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getPublicationDecade",
"httpMethod": "GET",
"path": "/statistics/publication-decade",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getPublicationYearTimeline",
"httpMethod": "GET",
"path": "/statistics/publication-year-timeline",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getTopAuthors",
"httpMethod": "GET",
"path": "/statistics/top-authors",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getMetadataCompleteness",
"httpMethod": "GET",
"path": "/statistics/metadata-completeness",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getGenreDistribution",
"httpMethod": "GET",
"path": "/statistics/genre-distribution",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getSummary",
"httpMethod": "GET",
"path": "/statistics/summary",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getGenreCooccurrence",
"httpMethod": "GET",
"path": "/statistics/genre-cooccurrence",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getMetadataFreshnessGauge",
"httpMethod": "GET",
"path": "/statistics/metadata-freshness-gauge",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getLibraryIntegrityGauge",
"httpMethod": "GET",
"path": "/statistics/library-integrity-gauge",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getAcquisitionLagScatter",
"httpMethod": "GET",
"path": "/statistics/acquisition-lag-scatter",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getLargestBooks",
"httpMethod": "GET",
"path": "/statistics/largest-books",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/statistics/statistics.controller.ts",
"className": "StatisticsController",
"methodName": "getTopSeries",
"httpMethod": "GET",
"path": "/statistics/top-series",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/upload/upload.controller.ts",
"className": "UploadController",
"methodName": "uploadBook",
"httpMethod": "POST",
"path": "/libraries/:id/upload",
"permissions": ["Permission.LibraryUpload"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "findAll",
"httpMethod": "GET",
"path": "/users",
"permissions": ["Permission.ManageUsers"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "summary",
"httpMethod": "GET",
"path": "/users/summary",
"permissions": ["Permission.ManageUsers"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "findNeedingAttention",
"httpMethod": "GET",
"path": "/users/attention",
"permissions": ["Permission.ManageUsers"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "findAssignable",
"httpMethod": "GET",
"path": "/users/assignable",
"permissions": ["Permission.ManageLibraries"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "updateMe",
"httpMethod": "PATCH",
"path": "/users/me",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "uploadMyAvatar",
"httpMethod": "POST",
"path": "/users/me/avatar",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "deleteMyAvatar",
"httpMethod": "DELETE",
"path": "/users/me/avatar",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "findById",
"httpMethod": "GET",
"path": "/users/:id",
"permissions": ["Permission.ManageUsers"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "getAvatar",
"httpMethod": "GET",
"path": "/users/:id/avatar",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "createUser",
"httpMethod": "POST",
"path": "/users",
"permissions": ["Permission.ManageUsers"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "updateUser",
"httpMethod": "PATCH",
"path": "/users/:id",
"permissions": ["Permission.ManageUsers"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "deleteUser",
"httpMethod": "DELETE",
"path": "/users/:id",
"permissions": ["Permission.ManageUsers"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "setPermissions",
"httpMethod": "PUT",
"path": "/users/:id/permissions",
"permissions": ["Permission.ManageUsers"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "setSuperuser",
"httpMethod": "PUT",
"path": "/users/:id/superuser",
"permissions": ["Permission.ManageUsers"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "getLibraries",
"httpMethod": "GET",
"path": "/users/:id/libraries",
"permissions": ["Permission.ManageUsers"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user/user.controller.ts",
"className": "UserController",
"methodName": "getLibraryGrants",
"httpMethod": "GET",
"path": "/users/:id/library-access",
"permissions": ["Permission.ManageUsers"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
}
]