feat(server): add unified entity manager with duplicate detection

- Remove author insights and duplicate suggestions panels, composables, DTOs, and all backend support
- Add genre and tag duplicate detection, merge, and dismiss with server-side paginated scan results
- Consolidate per-entity-type tools into a single entity-manager module backed by the Strategy pattern
- Support browse, merge, rename, delete, split, and dismiss across all entity types (author, genre, tag, narrator, publisher, language, series)
- Replace old tools module with unified entity-manager controller, service, and repository; add 85+ unit tests
This commit is contained in:
neon
2026-04-20 19:10:47 -06:00
parent 9ee9d14d94
commit ce6a439062
69 changed files with 5721 additions and 1003 deletions
@@ -1,10 +1,10 @@
{
"totalRoutes": 318,
"totalRoutes": 323,
"byPermission": {
"(none)": 161,
"Permission.ManageMetadataConfig": 32,
"Permission.EmailSend": 30,
"Permission.LibraryEditMetadata": 18,
"Permission.LibraryEditMetadata": 23,
"Permission.BookBucketAccess": 17,
"Permission.ManageAppSettings": 14,
"Permission.ManageLibraries": 13,
@@ -226,5 +226,65 @@
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/tools/tools.controller.ts",
"className": "ToolsController",
"methodName": "scanAuthorDuplicates",
"httpMethod": "GET",
"path": "/tools/authors/duplicates/scan",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/tools/tools.controller.ts",
"className": "ToolsController",
"methodName": "merge",
"httpMethod": "POST",
"path": "/tools/authors/duplicates/merge",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/tools/tools.controller.ts",
"className": "ToolsController",
"methodName": "batchMerge",
"httpMethod": "POST",
"path": "/tools/authors/duplicates/batch-merge",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/tools/tools.controller.ts",
"className": "ToolsController",
"methodName": "dismiss",
"httpMethod": "POST",
"path": "/tools/authors/duplicates/dismiss",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/tools/tools.controller.ts",
"className": "ToolsController",
"methodName": "undismiss",
"httpMethod": "DELETE",
"path": "/tools/authors/duplicates/dismiss",
"permissions": ["Permission.LibraryEditMetadata"],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
}
]