diff --git a/app/Console/Commands/CopyShelfPermissions.php b/app/Console/Commands/CopyShelfPermissions.php index 32adf0683..18719ae2e 100644 --- a/app/Console/Commands/CopyShelfPermissions.php +++ b/app/Console/Commands/CopyShelfPermissions.php @@ -3,7 +3,7 @@ namespace BookStack\Console\Commands; use BookStack\Entities\Models\Bookshelf; -use BookStack\Entities\Repos\BookshelfRepo; +use BookStack\Entities\Tools\PermissionsUpdater; use Illuminate\Console\Command; class CopyShelfPermissions extends Command @@ -25,19 +25,16 @@ class CopyShelfPermissions extends Command */ protected $description = 'Copy shelf permissions to all child books'; - /** - * @var BookshelfRepo - */ - protected $bookshelfRepo; + protected PermissionsUpdater $permissionsUpdater; /** * Create a new command instance. * * @return void */ - public function __construct(BookshelfRepo $repo) + public function __construct(PermissionsUpdater $permissionsUpdater) { - $this->bookshelfRepo = $repo; + $this->permissionsUpdater = $permissionsUpdater; parent::__construct(); } @@ -80,7 +77,7 @@ class CopyShelfPermissions extends Command } foreach ($shelves as $shelf) { - $this->bookshelfRepo->copyDownPermissions($shelf, false); + $this->permissionsUpdater->updateBookPermissionsFromShelf($shelf, false); $this->info('Copied permissions for shelf [' . $shelf->id . ']'); } diff --git a/app/Entities/Models/Book.php b/app/Entities/Models/Book.php index bf42f2008..4ced9248e 100644 --- a/app/Entities/Models/Book.php +++ b/app/Entities/Models/Book.php @@ -120,4 +120,13 @@ class Book extends Entity implements HasCoverImage return $pages->concat($chapters)->sortBy('priority')->sortByDesc('draft'); } + + /** + * Get a visible book by its slug. + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + */ + public static function getBySlug(string $slug): self + { + return static::visible()->where('slug', '=', $slug)->firstOrFail(); + } } diff --git a/app/Entities/Models/Bookshelf.php b/app/Entities/Models/Bookshelf.php index cdc6648f9..6310e616f 100644 --- a/app/Entities/Models/Bookshelf.php +++ b/app/Entities/Models/Bookshelf.php @@ -109,4 +109,13 @@ class Bookshelf extends Entity implements HasCoverImage $maxOrder = $this->books()->max('order'); $this->books()->attach($book->id, ['order' => $maxOrder + 1]); } + + /** + * Get a visible shelf by its slug. + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + */ + public static function getBySlug(string $slug): self + { + return static::visible()->where('slug', '=', $slug)->firstOrFail(); + } } diff --git a/app/Entities/Models/Chapter.php b/app/Entities/Models/Chapter.php index af4bbd8e3..53eb5091f 100644 --- a/app/Entities/Models/Chapter.php +++ b/app/Entities/Models/Chapter.php @@ -58,4 +58,13 @@ class Chapter extends BookChild ->orderBy('priority', 'asc') ->get(); } + + /** + * Get a visible chapter by its book and page slugs. + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + */ + public static function getBySlugs(string $bookSlug, string $chapterSlug): self + { + return static::visible()->whereSlugs($bookSlug, $chapterSlug)->firstOrFail(); + } } diff --git a/app/Entities/Models/Page.php b/app/Entities/Models/Page.php index 93729d7f2..8dd769e1c 100644 --- a/app/Entities/Models/Page.php +++ b/app/Entities/Models/Page.php @@ -145,4 +145,13 @@ class Page extends BookChild return $refreshed; } + + /** + * Get a visible page by its book and page slugs. + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + */ + public static function getBySlugs(string $bookSlug, string $pageSlug): self + { + return static::visible()->whereSlugs($bookSlug, $pageSlug)->firstOrFail(); + } } diff --git a/app/Entities/Repos/BookshelfRepo.php b/app/Entities/Repos/BookshelfRepo.php index 556ded017..d7759deb4 100644 --- a/app/Entities/Repos/BookshelfRepo.php +++ b/app/Entities/Repos/BookshelfRepo.php @@ -134,31 +134,6 @@ class BookshelfRepo $shelf->books()->sync($syncData); } - /** - * Copy down the permissions of the given shelf to all child books. - */ - public function copyDownPermissions(Bookshelf $shelf, $checkUserPermissions = true): int - { - $shelfPermissions = $shelf->permissions()->get(['role_id', 'view', 'create', 'update', 'delete'])->toArray(); - $shelfBooks = $shelf->books()->get(['id', 'restricted', 'owned_by']); - $updatedBookCount = 0; - - /** @var Book $book */ - foreach ($shelfBooks as $book) { - if ($checkUserPermissions && !userCan('restrictions-manage', $book)) { - continue; - } - $book->permissions()->delete(); - $book->restricted = $shelf->restricted; - $book->permissions()->createMany($shelfPermissions); - $book->save(); - $book->rebuildPermissions(); - $updatedBookCount++; - } - - return $updatedBookCount; - } - /** * Remove a bookshelf from the system. * diff --git a/app/Entities/Tools/PermissionsUpdater.php b/app/Entities/Tools/PermissionsUpdater.php index a547cd0a8..2747def18 100644 --- a/app/Entities/Tools/PermissionsUpdater.php +++ b/app/Entities/Tools/PermissionsUpdater.php @@ -5,6 +5,8 @@ namespace BookStack\Entities\Tools; use BookStack\Actions\ActivityType; use BookStack\Auth\Permissions\EntityPermission; use BookStack\Auth\User; +use BookStack\Entities\Models\Book; +use BookStack\Entities\Models\Bookshelf; use BookStack\Entities\Models\Entity; use BookStack\Facades\Activity; use Illuminate\Http\Request; @@ -67,4 +69,30 @@ class PermissionsUpdater return $formatted; } + + /** + * Copy down the permissions of the given shelf to all child books. + */ + public function updateBookPermissionsFromShelf(Bookshelf $shelf, $checkUserPermissions = true): int + { + // TODO - Fix for new format + $shelfPermissions = $shelf->permissions()->get(['role_id', 'view', 'create', 'update', 'delete'])->toArray(); + $shelfBooks = $shelf->books()->get(['id', 'restricted', 'owned_by']); + $updatedBookCount = 0; + + /** @var Book $book */ + foreach ($shelfBooks as $book) { + if ($checkUserPermissions && !userCan('restrictions-manage', $book)) { + continue; + } + $book->permissions()->delete(); + $book->restricted = $shelf->restricted; + $book->permissions()->createMany($shelfPermissions); + $book->save(); + $book->rebuildPermissions(); + $updatedBookCount++; + } + + return $updatedBookCount; + } } diff --git a/app/Http/Controllers/BookController.php b/app/Http/Controllers/BookController.php index cc2f6f534..b323ae496 100644 --- a/app/Http/Controllers/BookController.php +++ b/app/Http/Controllers/BookController.php @@ -10,7 +10,6 @@ use BookStack\Entities\Repos\BookRepo; use BookStack\Entities\Tools\BookContents; use BookStack\Entities\Tools\Cloner; use BookStack\Entities\Tools\HierarchyTransformer; -use BookStack\Entities\Tools\PermissionsUpdater; use BookStack\Entities\Tools\ShelfContext; use BookStack\Exceptions\ImageUploadException; use BookStack\Exceptions\NotFoundException; @@ -209,36 +208,6 @@ class BookController extends Controller return redirect('/books'); } - /** - * Show the permissions view. - */ - public function showPermissions(string $bookSlug) - { - $book = $this->bookRepo->getBySlug($bookSlug); - $this->checkOwnablePermission('restrictions-manage', $book); - - return view('books.permissions', [ - 'book' => $book, - ]); - } - - /** - * Set the restrictions for this book. - * - * @throws Throwable - */ - public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $bookSlug) - { - $book = $this->bookRepo->getBySlug($bookSlug); - $this->checkOwnablePermission('restrictions-manage', $book); - - $permissionsUpdater->updateFromPermissionsForm($book, $request); - - $this->showSuccessNotification(trans('entities.books_permissions_updated')); - - return redirect($book->getUrl()); - } - /** * Show the view to copy a book. * diff --git a/app/Http/Controllers/BookshelfController.php b/app/Http/Controllers/BookshelfController.php index 2143b876a..3c63be631 100644 --- a/app/Http/Controllers/BookshelfController.php +++ b/app/Http/Controllers/BookshelfController.php @@ -6,7 +6,6 @@ use BookStack\Actions\ActivityQueries; use BookStack\Actions\View; use BookStack\Entities\Models\Book; use BookStack\Entities\Repos\BookshelfRepo; -use BookStack\Entities\Tools\PermissionsUpdater; use BookStack\Entities\Tools\ShelfContext; use BookStack\Exceptions\ImageUploadException; use BookStack\Exceptions\NotFoundException; @@ -207,46 +206,4 @@ class BookshelfController extends Controller return redirect('/shelves'); } - - /** - * Show the permissions view. - */ - public function showPermissions(string $slug) - { - $shelf = $this->shelfRepo->getBySlug($slug); - $this->checkOwnablePermission('restrictions-manage', $shelf); - - return view('shelves.permissions', [ - 'shelf' => $shelf, - ]); - } - - /** - * Set the permissions for this bookshelf. - */ - public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $slug) - { - $shelf = $this->shelfRepo->getBySlug($slug); - $this->checkOwnablePermission('restrictions-manage', $shelf); - - $permissionsUpdater->updateFromPermissionsForm($shelf, $request); - - $this->showSuccessNotification(trans('entities.shelves_permissions_updated')); - - return redirect($shelf->getUrl()); - } - - /** - * Copy the permissions of a bookshelf to the child books. - */ - public function copyPermissions(string $slug) - { - $shelf = $this->shelfRepo->getBySlug($slug); - $this->checkOwnablePermission('restrictions-manage', $shelf); - - $updateCount = $this->shelfRepo->copyDownPermissions($shelf); - $this->showSuccessNotification(trans('entities.shelves_copy_permission_success', ['count' => $updateCount])); - - return redirect($shelf->getUrl()); - } } diff --git a/app/Http/Controllers/ChapterController.php b/app/Http/Controllers/ChapterController.php index 6695c2868..4d2bcb2f1 100644 --- a/app/Http/Controllers/ChapterController.php +++ b/app/Http/Controllers/ChapterController.php @@ -9,7 +9,6 @@ use BookStack\Entities\Tools\BookContents; use BookStack\Entities\Tools\Cloner; use BookStack\Entities\Tools\HierarchyTransformer; use BookStack\Entities\Tools\NextPreviousContentLocator; -use BookStack\Entities\Tools\PermissionsUpdater; use BookStack\Exceptions\MoveOperationException; use BookStack\Exceptions\NotFoundException; use BookStack\Exceptions\PermissionsException; @@ -243,38 +242,6 @@ class ChapterController extends Controller return redirect($chapterCopy->getUrl()); } - /** - * Show the Restrictions view. - * - * @throws NotFoundException - */ - public function showPermissions(string $bookSlug, string $chapterSlug) - { - $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); - $this->checkOwnablePermission('restrictions-manage', $chapter); - - return view('chapters.permissions', [ - 'chapter' => $chapter, - ]); - } - - /** - * Set the restrictions for this chapter. - * - * @throws NotFoundException - */ - public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $bookSlug, string $chapterSlug) - { - $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); - $this->checkOwnablePermission('restrictions-manage', $chapter); - - $permissionsUpdater->updateFromPermissionsForm($chapter, $request); - - $this->showSuccessNotification(trans('entities.chapters_permissions_success')); - - return redirect($chapter->getUrl()); - } - /** * Convert the chapter to a book. */ diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 748468b21..9e09aed16 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -11,7 +11,6 @@ use BookStack\Entities\Tools\NextPreviousContentLocator; use BookStack\Entities\Tools\PageContent; use BookStack\Entities\Tools\PageEditActivity; use BookStack\Entities\Tools\PageEditorData; -use BookStack\Entities\Tools\PermissionsUpdater; use BookStack\Exceptions\NotFoundException; use BookStack\Exceptions\PermissionsException; use BookStack\References\ReferenceFetcher; @@ -452,37 +451,4 @@ class PageController extends Controller return redirect($pageCopy->getUrl()); } - - /** - * Show the Permissions view. - * - * @throws NotFoundException - */ - public function showPermissions(string $bookSlug, string $pageSlug) - { - $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); - $this->checkOwnablePermission('restrictions-manage', $page); - - return view('pages.permissions', [ - 'page' => $page, - ]); - } - - /** - * Set the permissions for this page. - * - * @throws NotFoundException - * @throws Throwable - */ - public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $bookSlug, string $pageSlug) - { - $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); - $this->checkOwnablePermission('restrictions-manage', $page); - - $permissionsUpdater->updateFromPermissionsForm($page, $request); - - $this->showSuccessNotification(trans('entities.pages_permissions_success')); - - return redirect($page->getUrl()); - } } diff --git a/app/Http/Controllers/PermissionsController.php b/app/Http/Controllers/PermissionsController.php new file mode 100644 index 000000000..92f994b00 --- /dev/null +++ b/app/Http/Controllers/PermissionsController.php @@ -0,0 +1,146 @@ +permissionsUpdater = $permissionsUpdater; + } + + /** + * Show the Permissions view for a page. + */ + public function showForPage(string $bookSlug, string $pageSlug) + { + $page = Page::getBySlugs($bookSlug, $pageSlug); + $this->checkOwnablePermission('restrictions-manage', $page); + + return view('pages.permissions', [ + 'page' => $page, + ]); + } + + /** + * Set the permissions for a page. + */ + public function updateForPage(Request $request, string $bookSlug, string $pageSlug) + { + $page = Page::getBySlugs($bookSlug, $pageSlug); + $this->checkOwnablePermission('restrictions-manage', $page); + + $this->permissionsUpdater->updateFromPermissionsForm($page, $request); + + $this->showSuccessNotification(trans('entities.pages_permissions_success')); + + return redirect($page->getUrl()); + } + + /** + * Show the Restrictions view for a chapter. + */ + public function showForChapter(string $bookSlug, string $chapterSlug) + { + $chapter = Chapter::getBySlugs($bookSlug, $chapterSlug); + $this->checkOwnablePermission('restrictions-manage', $chapter); + + return view('chapters.permissions', [ + 'chapter' => $chapter, + ]); + } + + /** + * Set the restrictions for a chapter. + */ + public function updateForChapter(Request $request, string $bookSlug, string $chapterSlug) + { + $chapter = Chapter::getBySlugs($bookSlug, $chapterSlug); + $this->checkOwnablePermission('restrictions-manage', $chapter); + + $this->permissionsUpdater->updateFromPermissionsForm($chapter, $request); + + $this->showSuccessNotification(trans('entities.chapters_permissions_success')); + + return redirect($chapter->getUrl()); + } + + /** + * Show the permissions view for a book. + */ + public function showForBook(string $slug) + { + $book = Book::getBySlug($slug); + $this->checkOwnablePermission('restrictions-manage', $book); + + return view('books.permissions', [ + 'book' => $book, + ]); + } + + /** + * Set the restrictions for a book. + */ + public function updateForBook(Request $request, string $slug) + { + $book = Book::getBySlug($slug); + $this->checkOwnablePermission('restrictions-manage', $book); + + $this->permissionsUpdater->updateFromPermissionsForm($book, $request); + + $this->showSuccessNotification(trans('entities.books_permissions_updated')); + + return redirect($book->getUrl()); + } + + /** + * Show the permissions view for a shelf. + */ + public function showForShelf(string $slug) + { + $shelf = Bookshelf::getBySlug($slug); + $this->checkOwnablePermission('restrictions-manage', $shelf); + + return view('shelves.permissions', [ + 'shelf' => $shelf, + ]); + } + + /** + * Set the permissions for a shelf. + */ + public function updateForShelf(Request $request, string $slug) + { + $shelf = Bookshelf::getBySlug($slug); + $this->checkOwnablePermission('restrictions-manage', $shelf); + + $this->permissionsUpdater->updateFromPermissionsForm($shelf, $request); + + $this->showSuccessNotification(trans('entities.shelves_permissions_updated')); + + return redirect($shelf->getUrl()); + } + + /** + * Copy the permissions of a bookshelf to the child books. + */ + public function copyShelfPermissionsToBooks(string $slug) + { + $shelf = Bookshelf::getBySlug($slug); + $this->checkOwnablePermission('restrictions-manage', $shelf); + + $updateCount = $this->permissionsUpdater->updateBookPermissionsFromShelf($shelf); + $this->showSuccessNotification(trans('entities.shelves_copy_permission_success', ['count' => $updateCount])); + + return redirect($shelf->getUrl()); + } +} diff --git a/app/Http/Controllers/ReferenceController.php b/app/Http/Controllers/ReferenceController.php index 1daf1818c..b9b3e0eab 100644 --- a/app/Http/Controllers/ReferenceController.php +++ b/app/Http/Controllers/ReferenceController.php @@ -22,8 +22,7 @@ class ReferenceController extends Controller */ public function page(string $bookSlug, string $pageSlug) { - /** @var Page $page */ - $page = Page::visible()->whereSlugs($bookSlug, $pageSlug)->firstOrFail(); + $page = Page::getBySlugs($bookSlug, $pageSlug); $references = $this->referenceFetcher->getPageReferencesToEntity($page); return view('pages.references', [ @@ -37,8 +36,7 @@ class ReferenceController extends Controller */ public function chapter(string $bookSlug, string $chapterSlug) { - /** @var Chapter $chapter */ - $chapter = Chapter::visible()->whereSlugs($bookSlug, $chapterSlug)->firstOrFail(); + $chapter = Chapter::getBySlugs($bookSlug, $chapterSlug); $references = $this->referenceFetcher->getPageReferencesToEntity($chapter); return view('chapters.references', [ @@ -52,7 +50,7 @@ class ReferenceController extends Controller */ public function book(string $slug) { - $book = Book::visible()->where('slug', '=', $slug)->firstOrFail(); + $book = Book::getBySlug($slug); $references = $this->referenceFetcher->getPageReferencesToEntity($book); return view('books.references', [ @@ -66,7 +64,7 @@ class ReferenceController extends Controller */ public function shelf(string $slug) { - $shelf = Bookshelf::visible()->where('slug', '=', $slug)->firstOrFail(); + $shelf = Bookshelf::getBySlug($slug); $references = $this->referenceFetcher->getPageReferencesToEntity($shelf); return view('shelves.references', [ diff --git a/routes/web.php b/routes/web.php index 26d4b6f13..8ee5d0739 100644 --- a/routes/web.php +++ b/routes/web.php @@ -19,6 +19,7 @@ use BookStack\Http\Controllers\PageController; use BookStack\Http\Controllers\PageExportController; use BookStack\Http\Controllers\PageRevisionController; use BookStack\Http\Controllers\PageTemplateController; +use BookStack\Http\Controllers\PermissionsController; use BookStack\Http\Controllers\RecycleBinController; use BookStack\Http\Controllers\ReferenceController; use BookStack\Http\Controllers\RoleController; @@ -61,9 +62,9 @@ Route::middleware('auth')->group(function () { Route::get('/shelves/{slug}', [BookshelfController::class, 'show']); Route::put('/shelves/{slug}', [BookshelfController::class, 'update']); Route::delete('/shelves/{slug}', [BookshelfController::class, 'destroy']); - Route::get('/shelves/{slug}/permissions', [BookshelfController::class, 'showPermissions']); - Route::put('/shelves/{slug}/permissions', [BookshelfController::class, 'permissions']); - Route::post('/shelves/{slug}/copy-permissions', [BookshelfController::class, 'copyPermissions']); + Route::get('/shelves/{slug}/permissions', [PermissionsController::class, 'showForShelf']); + Route::put('/shelves/{slug}/permissions', [PermissionsController::class, 'updateForShelf']); + Route::post('/shelves/{slug}/copy-permissions', [PermissionsController::class, 'copyShelfPermissionsToBooks']); Route::get('/shelves/{slug}/references', [ReferenceController::class, 'shelf']); // Book Creation @@ -79,8 +80,8 @@ Route::middleware('auth')->group(function () { Route::delete('/books/{id}', [BookController::class, 'destroy']); Route::get('/books/{slug}/sort-item', [BookSortController::class, 'showItem']); Route::get('/books/{slug}', [BookController::class, 'show']); - Route::get('/books/{bookSlug}/permissions', [BookController::class, 'showPermissions']); - Route::put('/books/{bookSlug}/permissions', [BookController::class, 'permissions']); + Route::get('/books/{bookSlug}/permissions', [PermissionsController::class, 'showForBook']); + Route::put('/books/{bookSlug}/permissions', [PermissionsController::class, 'updateForBook']); Route::get('/books/{slug}/delete', [BookController::class, 'showDelete']); Route::get('/books/{bookSlug}/copy', [BookController::class, 'showCopy']); Route::post('/books/{bookSlug}/copy', [BookController::class, 'copy']); @@ -111,8 +112,8 @@ Route::middleware('auth')->group(function () { Route::post('/books/{bookSlug}/page/{pageSlug}/copy', [PageController::class, 'copy']); Route::get('/books/{bookSlug}/page/{pageSlug}/delete', [PageController::class, 'showDelete']); Route::get('/books/{bookSlug}/draft/{pageId}/delete', [PageController::class, 'showDeleteDraft']); - Route::get('/books/{bookSlug}/page/{pageSlug}/permissions', [PageController::class, 'showPermissions']); - Route::put('/books/{bookSlug}/page/{pageSlug}/permissions', [PageController::class, 'permissions']); + Route::get('/books/{bookSlug}/page/{pageSlug}/permissions', [PermissionsController::class, 'showForPage']); + Route::put('/books/{bookSlug}/page/{pageSlug}/permissions', [PermissionsController::class, 'updateForPage']); Route::get('/books/{bookSlug}/page/{pageSlug}/references', [ReferenceController::class, 'page']); Route::put('/books/{bookSlug}/page/{pageSlug}', [PageController::class, 'update']); Route::delete('/books/{bookSlug}/page/{pageSlug}', [PageController::class, 'destroy']); @@ -138,12 +139,12 @@ Route::middleware('auth')->group(function () { Route::post('/books/{bookSlug}/chapter/{chapterSlug}/copy', [ChapterController::class, 'copy']); Route::get('/books/{bookSlug}/chapter/{chapterSlug}/edit', [ChapterController::class, 'edit']); Route::post('/books/{bookSlug}/chapter/{chapterSlug}/convert-to-book', [ChapterController::class, 'convertToBook']); - Route::get('/books/{bookSlug}/chapter/{chapterSlug}/permissions', [ChapterController::class, 'showPermissions']); + Route::get('/books/{bookSlug}/chapter/{chapterSlug}/permissions', [PermissionsController::class, 'showForPage']); Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/pdf', [ChapterExportController::class, 'pdf']); Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/html', [ChapterExportController::class, 'html']); Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/markdown', [ChapterExportController::class, 'markdown']); Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/plaintext', [ChapterExportController::class, 'plainText']); - Route::put('/books/{bookSlug}/chapter/{chapterSlug}/permissions', [ChapterController::class, 'permissions']); + Route::put('/books/{bookSlug}/chapter/{chapterSlug}/permissions', [PermissionsController::class, 'updateForPage']); Route::get('/books/{bookSlug}/chapter/{chapterSlug}/references', [ReferenceController::class, 'chapter']); Route::get('/books/{bookSlug}/chapter/{chapterSlug}/delete', [ChapterController::class, 'showDelete']); Route::delete('/books/{bookSlug}/chapter/{chapterSlug}', [ChapterController::class, 'destroy']);