3 namespace BookStack\Http\Controllers;
5 use BookStack\Entities\Models\Entity;
6 use BookStack\Interfaces\Favouritable;
8 use Illuminate\Http\Request;
10 class FavouriteController extends Controller
13 * Add a new item as a favourite.
15 public function add(Request $request)
17 $favouritable = $this->getValidatedModelFromRequest($request);
18 $favouritable->favourites()->firstOrCreate([
19 'user_id' => user()->id,
22 $this->showSuccessNotification(trans('activities.favourite_add_notification', [
23 'name' => $favouritable->name,
25 return redirect()->back();
29 * Remove an item as a favourite.
31 public function remove(Request $request)
33 $favouritable = $this->getValidatedModelFromRequest($request);
34 $favouritable->favourites()->where([
35 'user_id' => user()->id,
38 $this->showSuccessNotification(trans('activities.favourite_remove_notification', [
39 'name' => $favouritable->name,
41 return redirect()->back();
45 * @throws \Illuminate\Validation\ValidationException
48 protected function getValidatedModelFromRequest(Request $request): Favouritable
50 $modelInfo = $this->validate($request, [
51 'type' => 'required|string',
52 'id' => 'required|integer',
55 if (!class_exists($modelInfo['type'])) {
56 throw new \Exception('Model not found');
59 /** @var Model $model */
60 $model = new $modelInfo['type'];
61 if (! $model instanceof Favouritable) {
62 throw new \Exception('Model not favouritable');
65 $modelInstance = $model->newQuery()
66 ->where('id', '=', $modelInfo['id'])
67 ->first(['id', 'name']);
69 $inaccessibleEntity = ($modelInstance instanceof Entity && !userCan('view', $modelInstance));
70 if (is_null($modelInstance) || $inaccessibleEntity) {
71 throw new \Exception('Model instance not found');
74 return $modelInstance;