From 5eea82fc5a0b9349c4d55c30dd4080db40cd669e Mon Sep 17 00:00:00 2001 From: Masroor Ehsan Date: Sat, 25 Jan 2025 17:54:53 +0600 Subject: [PATCH] WIP - bookmark module --- .../Controllers/StudyBookmarkController.php | 38 +++++++++++++++++++ app/Http/Requests/BookmarkCrudRequest.php | 21 ++++++++++ app/Models/Study.php | 5 +++ app/Models/StudyBookmark.php | 18 +++++++++ app/Models/User.php | 5 +++ ...25_114600_create_study_bookmarks_table.php | 24 ++++++++++++ 6 files changed, 111 insertions(+) create mode 100644 app/Http/Controllers/StudyBookmarkController.php create mode 100644 app/Http/Requests/BookmarkCrudRequest.php create mode 100644 app/Models/StudyBookmark.php create mode 100644 database/migrations/2025_01_25_114600_create_study_bookmarks_table.php diff --git a/app/Http/Controllers/StudyBookmarkController.php b/app/Http/Controllers/StudyBookmarkController.php new file mode 100644 index 0000000..3f0ea02 --- /dev/null +++ b/app/Http/Controllers/StudyBookmarkController.php @@ -0,0 +1,38 @@ +validated()); + } + + public function show(StudyBookmark $studyBookmark) + { + return $studyBookmark; + } + + public function update(BookmarkCrudRequest $request, StudyBookmark $studyBookmark) + { + $studyBookmark->update($request->validated()); + + return $studyBookmark; + } + + public function destroy(StudyBookmark $studyBookmark) + { + $studyBookmark->delete(); + + return response()->json(); + } +} diff --git a/app/Http/Requests/BookmarkCrudRequest.php b/app/Http/Requests/BookmarkCrudRequest.php new file mode 100644 index 0000000..1369beb --- /dev/null +++ b/app/Http/Requests/BookmarkCrudRequest.php @@ -0,0 +1,21 @@ + ['required', 'exists:studies'], + 'user_id' => ['required', 'exists:users'], + ]; + } + + public function authorize(): bool + { + return true; + } +} diff --git a/app/Models/Study.php b/app/Models/Study.php index c69cd52..f61fb8e 100644 --- a/app/Models/Study.php +++ b/app/Models/Study.php @@ -517,6 +517,11 @@ public function isStudyComplete(): bool return $this->report_status->value >= ReportStatus::Finalized->value; } + public function bookmarkedByUsers() + { + return $this->belongsToMany(User::class, 'study_bookmarks'); + } + protected function casts(): array { return [ diff --git a/app/Models/StudyBookmark.php b/app/Models/StudyBookmark.php new file mode 100644 index 0000000..bc57923 --- /dev/null +++ b/app/Models/StudyBookmark.php @@ -0,0 +1,18 @@ +belongsTo(Study::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index b53ac84..697ee4a 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -179,6 +179,11 @@ public function panels(): HasManyThrough return $this->hasManyThrough(AssignmentPanel::class, AssignmentPanelRadiologist::class); } + public function bookmarkedStudies(): BelongsToMany + { + return $this->belongsToMany(Study::class, 'study_bookmarks'); + } + /** * Get the attributes that should be cast. * diff --git a/database/migrations/2025_01_25_114600_create_study_bookmarks_table.php b/database/migrations/2025_01_25_114600_create_study_bookmarks_table.php new file mode 100644 index 0000000..d79d654 --- /dev/null +++ b/database/migrations/2025_01_25_114600_create_study_bookmarks_table.php @@ -0,0 +1,24 @@ +id(); + $table->foreignIdFor(Study::class)->constrained()->cascadeOnDelete(); + $table->foreignIdFor(User::class)->constrained()->cascadeOnDelete()->index(); + $table->timestamps(); + + $table->unique(['study_id', 'user_id']); + }); + } + + public function down(): void + { + Schema::dropIfExists('study_bookmarks'); + } +};