diff --git a/client/components/modals/authors/EditModal.vue b/client/components/modals/authors/EditModal.vue
index 40292dca..3af64249 100644
--- a/client/components/modals/authors/EditModal.vue
+++ b/client/components/modals/authors/EditModal.vue
@@ -33,8 +33,10 @@
-
{{ $strings.ButtonQuickMatch }}
+
{{ $strings.ButtonRemove }}
+
{{ $strings.ButtonQuickMatch }}
+
{{ $strings.ButtonSave }}
@@ -91,6 +93,9 @@ export default {
},
libraryProvider() {
return this.$store.getters['libraries/getLibraryProvider'](this.currentLibraryId) || 'google'
+ },
+ userCanDelete() {
+ return this.$store.getters['user/getUserCanDelete']
}
},
methods: {
@@ -100,6 +105,31 @@ export default {
this.authorCopy.description = this.author.description
this.authorCopy.imagePath = this.author.imagePath
},
+ removeClick() {
+ const payload = {
+ message: this.$getString('MessageConfirmRemoveAuthor', [this.author.name]),
+ callback: (confirmed) => {
+ if (confirmed) {
+ this.processing = true
+ this.$axios
+ .$delete(`/api/authors/${this.authorId}`)
+ .then(() => {
+ this.$toast.success('Author removed')
+ this.show = false
+ })
+ .catch((error) => {
+ console.error('Failed to remove author', error)
+ this.$toast.error('Failed to remove author')
+ })
+ .finally(() => {
+ this.processing = false
+ })
+ }
+ },
+ type: 'yesNo'
+ }
+ this.$store.commit('globals/setConfirmPrompt', payload)
+ },
async submitForm() {
var keysToCheck = ['name', 'asin', 'description', 'imagePath']
var updatePayload = {}
diff --git a/client/strings/de.json b/client/strings/de.json
index 29842ee9..e7484df6 100644
--- a/client/strings/de.json
+++ b/client/strings/de.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Sind Sie sicher, dass Sie alle Medien dieser Reihe als abgeschlossen markieren wollen?",
"MessageConfirmMarkSeriesNotFinished": "Sind Sie sicher, dass Sie alle Medien dieser Reihe als nicht abgeschlossen markieren wollen?",
"MessageConfirmRemoveAllChapters": "Sind Sie sicher, dass Sie alle Kapitel entfernen möchten?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Sind Sie sicher, dass Sie die Sammlung \"{0}\" löschen wollen?",
"MessageConfirmRemoveEpisode": "Sind Sie sicher, dass Sie die Episode \"{0}\" löschen möchten?",
"MessageConfirmRemoveEpisodes": "Sind Sie sicher, dass Sie {0} Episoden löschen wollen?",
diff --git a/client/strings/en-us.json b/client/strings/en-us.json
index c2cd3c85..ae018d4b 100644
--- a/client/strings/en-us.json
+++ b/client/strings/en-us.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Are you sure you want to mark all books in this series as finished?",
"MessageConfirmMarkSeriesNotFinished": "Are you sure you want to mark all books in this series as not finished?",
"MessageConfirmRemoveAllChapters": "Are you sure you want to remove all chapters?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?",
"MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?",
diff --git a/client/strings/es.json b/client/strings/es.json
index 05272ce7..b872ca4e 100644
--- a/client/strings/es.json
+++ b/client/strings/es.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Esta seguro que desea marcar todos los libros en esta serie como terminados?",
"MessageConfirmMarkSeriesNotFinished": "Esta seguro que desea marcar todos los libros en esta serie como no terminados?",
"MessageConfirmRemoveAllChapters": "Esta seguro que desea remover todos los capitulos?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Esta seguro que desea remover la colección \"{0}\"?",
"MessageConfirmRemoveEpisode": "Esta seguro que desea remover el episodio \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Esta seguro que desea remover {0} episodios?",
diff --git a/client/strings/fr.json b/client/strings/fr.json
index 5bb654af..bcc4efd7 100644
--- a/client/strings/fr.json
+++ b/client/strings/fr.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Êtes-vous sûr de vouloir marquer tous les livres de cette série comme terminées ?",
"MessageConfirmMarkSeriesNotFinished": "Êtes-vous sûr de vouloir marquer tous les livres de cette série comme comme non terminés ?",
"MessageConfirmRemoveAllChapters": "Êtes-vous sûr de vouloir supprimer tous les chapitres ?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Êtes-vous sûr de vouloir supprimer la collection « {0} » ?",
"MessageConfirmRemoveEpisode": "Êtes-vous sûr de vouloir supprimer l’épisode « {0} » ?",
"MessageConfirmRemoveEpisodes": "Êtes-vous sûr de vouloir supprimer {0} épisodes ?",
diff --git a/client/strings/gu.json b/client/strings/gu.json
index 8ab74889..6b63c96a 100644
--- a/client/strings/gu.json
+++ b/client/strings/gu.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Are you sure you want to mark all books in this series as finished?",
"MessageConfirmMarkSeriesNotFinished": "Are you sure you want to mark all books in this series as not finished?",
"MessageConfirmRemoveAllChapters": "Are you sure you want to remove all chapters?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?",
"MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?",
diff --git a/client/strings/hi.json b/client/strings/hi.json
index bbf2d4ee..20120e9a 100644
--- a/client/strings/hi.json
+++ b/client/strings/hi.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Are you sure you want to mark all books in this series as finished?",
"MessageConfirmMarkSeriesNotFinished": "Are you sure you want to mark all books in this series as not finished?",
"MessageConfirmRemoveAllChapters": "Are you sure you want to remove all chapters?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?",
"MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?",
diff --git a/client/strings/hr.json b/client/strings/hr.json
index feee0627..3d217a2c 100644
--- a/client/strings/hr.json
+++ b/client/strings/hr.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Are you sure you want to mark all books in this series as finished?",
"MessageConfirmMarkSeriesNotFinished": "Are you sure you want to mark all books in this series as not finished?",
"MessageConfirmRemoveAllChapters": "Are you sure you want to remove all chapters?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "AJeste li sigurni da želite obrisati kolekciju \"{0}\"?",
"MessageConfirmRemoveEpisode": "Jeste li sigurni da želite obrisati epizodu \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Jeste li sigurni da želite obrisati {0} epizoda/-u?",
diff --git a/client/strings/it.json b/client/strings/it.json
index 671f2167..cb418bfb 100644
--- a/client/strings/it.json
+++ b/client/strings/it.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Sei sicuro di voler contrassegnare tutti i libri di questa serie come completati?",
"MessageConfirmMarkSeriesNotFinished": "Sei sicuro di voler contrassegnare tutti i libri di questa serie come non completati?",
"MessageConfirmRemoveAllChapters": "Sei sicuro di voler rimuovere tutti i capitoli?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Sei sicuro di voler rimuovere la Raccolta \"{0}\"?",
"MessageConfirmRemoveEpisode": "Sei sicuro di voler rimuovere l'episodio \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Sei sicuro di voler rimuovere {0} episodi?",
diff --git a/client/strings/lt.json b/client/strings/lt.json
index e788083a..625ca66b 100644
--- a/client/strings/lt.json
+++ b/client/strings/lt.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Ar tikrai norite pažymėti visas knygas šioje serijoje kaip užbaigtas?",
"MessageConfirmMarkSeriesNotFinished": "Ar tikrai norite pažymėti visas knygas šioje serijoje kaip nebaigtas?",
"MessageConfirmRemoveAllChapters": "Ar tikrai norite pašalinti visus skyrius?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Ar tikrai norite pašalinti kolekciją \"{0}\"?",
"MessageConfirmRemoveEpisode": "Ar tikrai norite pašalinti epizodą \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Ar tikrai norite pašalinti {0} epizodus?",
diff --git a/client/strings/nl.json b/client/strings/nl.json
index 77c53f18..9bd34635 100644
--- a/client/strings/nl.json
+++ b/client/strings/nl.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Weet je zeker dat je alle boeken in deze serie wil markeren als voltooid?",
"MessageConfirmMarkSeriesNotFinished": "Weet je zeker dat je alle boeken in deze serie wil markeren als niet voltooid?",
"MessageConfirmRemoveAllChapters": "Weet je zeker dat je alle hoofdstukken wil verwijderen?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Weet je zeker dat je de collectie \"{0}\" wil verwijderen?",
"MessageConfirmRemoveEpisode": "Weet je zeker dat je de aflevering \"{0}\" wil verwijderen?",
"MessageConfirmRemoveEpisodes": "Weet je zeker dat je {0} afleveringen wil verwijderen?",
diff --git a/client/strings/no.json b/client/strings/no.json
index c5cd6ea8..a2ba3d90 100644
--- a/client/strings/no.json
+++ b/client/strings/no.json
@@ -186,6 +186,7 @@
"LabelAuthors": "Forfattere",
"LabelAutoDownloadEpisodes": "Last ned episoder automatisk",
"LabelBackToUser": "Tilbake til bruker",
+ "LabelBackupLocation": "Backup Location",
"LabelBackupsEnableAutomaticBackups": "Aktiver automatisk sikkerhetskopi",
"LabelBackupsEnableAutomaticBackupsHelp": "Sikkerhetskopier lagret under /metadata/backups",
"LabelBackupsMaxBackupSize": "Maks sikkerhetskopi størrelse (i GB)",
@@ -533,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Er du sikker på at du vil markere alle bøkene i serien som fullført?",
"MessageConfirmMarkSeriesNotFinished": "Er du sikker på at du vil markere alle bøkene i serien som ikke fullført?",
"MessageConfirmRemoveAllChapters": "Er du sikker på at du vil fjerne alle kapitler?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Er du sikker på at du vil fjerne samling\"{0}\"?",
"MessageConfirmRemoveEpisode": "Er du sikker på at du vil fjerne episode \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Er du sikker på at du vil fjerne {0} episoder?",
@@ -711,4 +713,4 @@
"ToastSocketFailedToConnect": "Misslykkes å koble til Socket",
"ToastUserDeleteFailed": "Misslykkes å slette bruker",
"ToastUserDeleteSuccess": "Bruker slettet"
-}
+}
\ No newline at end of file
diff --git a/client/strings/pl.json b/client/strings/pl.json
index 84d19667..5804dd8a 100644
--- a/client/strings/pl.json
+++ b/client/strings/pl.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Are you sure you want to mark all books in this series as finished?",
"MessageConfirmMarkSeriesNotFinished": "Are you sure you want to mark all books in this series as not finished?",
"MessageConfirmRemoveAllChapters": "Are you sure you want to remove all chapters?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Czy na pewno chcesz usunąć kolekcję \"{0}\"?",
"MessageConfirmRemoveEpisode": "Czy na pewno chcesz usunąć odcinek \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Czy na pewno chcesz usunąć {0} odcinki?",
diff --git a/client/strings/ru.json b/client/strings/ru.json
index 1ce7f322..50b93cc9 100644
--- a/client/strings/ru.json
+++ b/client/strings/ru.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "Вы уверены, что хотите отметить все книги этой серии как завершенные?",
"MessageConfirmMarkSeriesNotFinished": "Вы уверены, что хотите отметить все книги этой серии как не завершенные?",
"MessageConfirmRemoveAllChapters": "Вы уверены, что хотите удалить все главы?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Вы уверены, что хотите удалить коллекцию \"{0}\"?",
"MessageConfirmRemoveEpisode": "Вы уверены, что хотите удалить эпизод \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Вы уверены, что хотите удалить {0} эпизодов?",
diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json
index feb6ee09..3d408590 100644
--- a/client/strings/zh-cn.json
+++ b/client/strings/zh-cn.json
@@ -534,6 +534,7 @@
"MessageConfirmMarkSeriesFinished": "你确定要将此系列中的所有书籍都标记为已听完吗?",
"MessageConfirmMarkSeriesNotFinished": "你确定要将此系列中的所有书籍都标记为未听完吗?",
"MessageConfirmRemoveAllChapters": "你确定要移除所有章节吗?",
+ "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "您确定要移除收藏 \"{0}\"?",
"MessageConfirmRemoveEpisode": "您确定要移除剧集 \"{0}\"?",
"MessageConfirmRemoveEpisodes": "你确定要移除 {0} 剧集?",
diff --git a/server/controllers/AuthorController.js b/server/controllers/AuthorController.js
index 531d2b42..0cd243fd 100644
--- a/server/controllers/AuthorController.js
+++ b/server/controllers/AuthorController.js
@@ -167,6 +167,30 @@ class AuthorController {
}
}
+ /**
+ * DELETE: /api/authors/:id
+ * Remove author from all books and delete
+ *
+ * @param {import('express').Request} req
+ * @param {import('express').Response} res
+ */
+ async delete(req, res) {
+ Logger.info(`[AuthorController] Removing author "${req.author.name}"`)
+
+ await Database.authorModel.removeById(req.author.id)
+
+ if (req.author.imagePath) {
+ await CacheManager.purgeImageCache(req.author.id) // Purge cache
+ }
+
+ SocketAuthority.emitter('author_removed', req.author.toJSON())
+
+ // Update filter data
+ Database.removeAuthorFromFilterData(req.author.libraryId, req.author.id)
+
+ res.sendStatus(200)
+ }
+
async match(req, res) {
let authorData = null
const region = req.body.region || 'us'
diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js
index 19e4dbdc..f768bb93 100644
--- a/server/controllers/LibraryController.js
+++ b/server/controllers/LibraryController.js
@@ -620,7 +620,7 @@ class LibraryController {
model: Database.bookModel,
attributes: ['id', 'tags', 'explicit'],
where: bookWhere,
- required: true,
+ required: false,
through: {
attributes: []
}
diff --git a/server/models/BookAuthor.js b/server/models/BookAuthor.js
index 9f8860ee..671e9470 100644
--- a/server/models/BookAuthor.js
+++ b/server/models/BookAuthor.js
@@ -47,10 +47,14 @@ class BookAuthor extends Model {
book.belongsToMany(author, { through: BookAuthor })
author.belongsToMany(book, { through: BookAuthor })
- book.hasMany(BookAuthor)
+ book.hasMany(BookAuthor, {
+ onDelete: 'CASCADE'
+ })
BookAuthor.belongsTo(book)
- author.hasMany(BookAuthor)
+ author.hasMany(BookAuthor, {
+ onDelete: 'CASCADE'
+ })
BookAuthor.belongsTo(author)
}
}
diff --git a/server/routers/ApiRouter.js b/server/routers/ApiRouter.js
index 74d8aa56..dc816b44 100644
--- a/server/routers/ApiRouter.js
+++ b/server/routers/ApiRouter.js
@@ -199,6 +199,7 @@ class ApiRouter {
//
this.router.get('/authors/:id', AuthorController.middleware.bind(this), AuthorController.findOne.bind(this))
this.router.patch('/authors/:id', AuthorController.middleware.bind(this), AuthorController.update.bind(this))
+ this.router.delete('/authors/:id', AuthorController.middleware.bind(this), AuthorController.delete.bind(this))
this.router.post('/authors/:id/match', AuthorController.middleware.bind(this), AuthorController.match.bind(this))
this.router.get('/authors/:id/image', AuthorController.middleware.bind(this), AuthorController.getImage.bind(this))