From 9fb852d1eaa2e5c15751ac5b4a7b5dfb8d125a58 Mon Sep 17 00:00:00 2001 From: weichien Date: Sat, 5 Jun 2021 13:40:04 +0800 Subject: [PATCH 01/25] feat: add CLUD controller for announcement. --- .../CreateAnnouncementController.php | 20 +++++++++++++++++++ .../DeleteAnnouncementController.php | 20 +++++++++++++++++++ .../ListAnnouncementController.php | 20 +++++++++++++++++++ .../UpdateAnnouncementController.php | 20 +++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 app/Http/Controllers/Announcements/CreateAnnouncementController.php create mode 100644 app/Http/Controllers/Announcements/DeleteAnnouncementController.php create mode 100644 app/Http/Controllers/Announcements/ListAnnouncementController.php create mode 100644 app/Http/Controllers/Announcements/UpdateAnnouncementController.php diff --git a/app/Http/Controllers/Announcements/CreateAnnouncementController.php b/app/Http/Controllers/Announcements/CreateAnnouncementController.php new file mode 100644 index 00000000..84da07cf --- /dev/null +++ b/app/Http/Controllers/Announcements/CreateAnnouncementController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Announcements/DeleteAnnouncementController.php b/app/Http/Controllers/Announcements/DeleteAnnouncementController.php new file mode 100644 index 00000000..257640d3 --- /dev/null +++ b/app/Http/Controllers/Announcements/DeleteAnnouncementController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Announcements/ListAnnouncementController.php b/app/Http/Controllers/Announcements/ListAnnouncementController.php new file mode 100644 index 00000000..2dcee4d7 --- /dev/null +++ b/app/Http/Controllers/Announcements/ListAnnouncementController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Announcements/UpdateAnnouncementController.php b/app/Http/Controllers/Announcements/UpdateAnnouncementController.php new file mode 100644 index 00000000..25e024c1 --- /dev/null +++ b/app/Http/Controllers/Announcements/UpdateAnnouncementController.php @@ -0,0 +1,20 @@ +execute($request); + } +} From fe065f4f2f3af1e83b43229151a4a53b58b1ffbe Mon Sep 17 00:00:00 2001 From: weichien Date: Sat, 5 Jun 2021 15:56:56 +0800 Subject: [PATCH 02/25] add eloquent filter. --- .../General/Eloquent/Filters/HasSegments.php | 21 +++++++++++++++++++ .../General/Eloquent/Filters/IsPublished.php | 21 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 app/Classes/General/Eloquent/Filters/HasSegments.php create mode 100644 app/Classes/General/Eloquent/Filters/IsPublished.php diff --git a/app/Classes/General/Eloquent/Filters/HasSegments.php b/app/Classes/General/Eloquent/Filters/HasSegments.php new file mode 100644 index 00000000..b73f7e95 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/HasSegments.php @@ -0,0 +1,21 @@ +whereHas('segments', function ($q) use ($value) { + $q->where('id', $value); + }); + } +} diff --git a/app/Classes/General/Eloquent/Filters/IsPublished.php b/app/Classes/General/Eloquent/Filters/IsPublished.php new file mode 100644 index 00000000..9b5b23c1 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/IsPublished.php @@ -0,0 +1,21 @@ +whereDate('starting_on', '<=', Carbon::now()) + ->whereDate('ending_on', '>=', Carbon::now()); + } +} From 839c7d8e7dff4bb7ac4d32f39efc1c9302caf4ba Mon Sep 17 00:00:00 2001 From: weichien Date: Sat, 5 Jun 2021 16:28:16 +0800 Subject: [PATCH 03/25] feat: add list announcement controller logic,service,rule, resources. --- .../ListAnnouncementsLogic.php | 60 +++++++++++++++++++ .../Services/ListsAnnouncements.php | 32 ++++++++++ .../Standards/Rules/CanListAnnouncements.php | 36 +++++++++++ app/Http/Resources/AnnouncementResource.php | 29 +++++++++ 4 files changed, 157 insertions(+) create mode 100644 app/Classes/Modules/Announcements/ControllersLogic/ListAnnouncementsLogic.php create mode 100644 app/Classes/Modules/Announcements/Services/ListsAnnouncements.php create mode 100644 app/Classes/Modules/Announcements/Standards/Rules/CanListAnnouncements.php create mode 100644 app/Http/Resources/AnnouncementResource.php diff --git a/app/Classes/Modules/Announcements/ControllersLogic/ListAnnouncementsLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/ListAnnouncementsLogic.php new file mode 100644 index 00000000..0055ebeb --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/ListAnnouncementsLogic.php @@ -0,0 +1,60 @@ + 'Retrieve Announcements', + 'message' => 'You have successfully retrieved a list of Announcements' + ]; + } + + /** @var CanListAnnouncements */ + private $canListAnnouncements; + + /** @var ListsAnnouncements */ + private $listsAnnouncements; + + /** + * ListAnnouncementsLogic constructor. + * @param CanListAnnouncements $canListAnnouncements + * @param ListsAnnouncements $listsAnnouncements + */ + public function __construct(CanListAnnouncements $canListAnnouncements, ListsAnnouncements $listsAnnouncements) + { + $this->canListAnnouncements = $canListAnnouncements; + $this->listsAnnouncements = $listsAnnouncements; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request): JsonResponse + { + + $this->canListAnnouncements->passes(); + + $annoucements = $this->listsAnnouncements->execute($this->listsAnnouncements->deserializeFilters($request->input('filters'))); + + return $this->collectionResponse(AnnouncementResource::collection($annoucements)); + } +} diff --git a/app/Classes/Modules/Announcements/Services/ListsAnnouncements.php b/app/Classes/Modules/Announcements/Services/ListsAnnouncements.php new file mode 100644 index 00000000..b821819a --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/ListsAnnouncements.php @@ -0,0 +1,32 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanListAnnouncements.php b/app/Classes/Modules/Announcements/Standards/Rules/CanListAnnouncements.php new file mode 100644 index 00000000..a4c02847 --- /dev/null +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanListAnnouncements.php @@ -0,0 +1,36 @@ + $this->id, + 'title' => $this->title, + 'description' => $this->description, + 'segment' => $this->segments, + 'ending_on' => $this->ending_on, + 'starting_on' => $this->starting_on, + 'starting_on_date' => Carbon::parse($this->starting_on)->format('Y-m-d'), + 'ending_on_date' => Carbon::parse($this->ending_on)->format('Y-m-d'), + ]; + } +} From 7da9afcbf1168585c06467f7d36cfb3a1130173c Mon Sep 17 00:00:00 2001 From: weichien Date: Mon, 7 Jun 2021 17:52:26 +0800 Subject: [PATCH 04/25] feat: add create announcement controller logic,service,rule --- .../CreateAnnouncementLogic.php | 76 +++++++++++++++++++ .../AnnouncementObject.php | 70 +++++++++++++++++ .../Services/CreatesAnnouncement.php | 26 +++++++ .../Standards/Rules/CanCreateAnnouncement.php | 50 ++++++++++++ 4 files changed, 222 insertions(+) create mode 100644 app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php create mode 100644 app/Classes/Modules/Announcements/DataTransferObjects/AnnouncementObject.php create mode 100644 app/Classes/Modules/Announcements/Services/CreatesAnnouncement.php create mode 100644 app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php diff --git a/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php new file mode 100644 index 00000000..26ef7f8f --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php @@ -0,0 +1,76 @@ + 'Created Annoucement', + 'message' => 'You have successfully created a new Annoucements' + ]; + } + + /** @var CanCreateAnnouncement */ + private $canCreateAnnouncement; + + /** @var CreatesAnnoucement */ + private $createsAnnoucement; + + + /** + * CreateAnnouncementLogic constructor. + * @param CanCreateAnnoucement $canCreateAnnoucement + * @param CreatesAnnoucement $createsAnnoucement + */ + public function __construct( + CanCreateAnnouncement $canCreateAnnouncement, + CreatesAnnouncement $createsAnnoucement + ) { + $this->canCreateAnnoucement = $canCreateAnnouncement; + $this->createsAnnoucement = $createsAnnoucement; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request): JsonResponse + { + $annoucement_object = new AnnouncementObject( + $request->input('title'), + $request->input('description'), + $request->input('starting_on'), + $request->input('ending_on') + ); + + $this->canCreateAnnouncement->passes($annoucement_object); + + $announcement = $this->createsAnnoucement->execute($annoucement_object); + + $announcement->segments()->attach($request->input('segment_id')); + + + return $this->resourceResponse(new AnnouncementResource($announcement)); + } +} diff --git a/app/Classes/Modules/Announcements/DataTransferObjects/AnnouncementObject.php b/app/Classes/Modules/Announcements/DataTransferObjects/AnnouncementObject.php new file mode 100644 index 00000000..98d75e8b --- /dev/null +++ b/app/Classes/Modules/Announcements/DataTransferObjects/AnnouncementObject.php @@ -0,0 +1,70 @@ +title = $title; + $this->description = $description; + $this->starting_on = $starting_on; + $this->ending_on = $ending_on; + } + + /** + * @return string + */ + public function getTitle(): string + { + return $this->title; + } + + /** + * @return string + */ + public function getDescription(): string + { + return $this->description; + } + + /** + * @return string + */ + public function getStartingOn(): string + { + return $this->starting_on; + } + + /** + * @return string + */ + public function getEndingOn(): string + { + return $this->ending_on; + } +} diff --git a/app/Classes/Modules/Announcements/Services/CreatesAnnouncement.php b/app/Classes/Modules/Announcements/Services/CreatesAnnouncement.php new file mode 100644 index 00000000..4a43bac8 --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/CreatesAnnouncement.php @@ -0,0 +1,26 @@ +title = $object->getTitle(); + $model->description = $object->getDescription(); + $model->starting_on = $object->getStartingOn(); + $model->ending_on = $object->getEndingOn(); + + return $this->handler($model); + } +} diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php b/app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php new file mode 100644 index 00000000..e480ba78 --- /dev/null +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php @@ -0,0 +1,50 @@ +AnnouncementValidation = $AnnouncementValidation; + } + + /** + * @return bool + */ + protected function authorized(): bool + { + return true; + } + + /** + * @param CompanyObject $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return $this->AnnouncementValidation->validate($object); + } + + /** + * @param CompanyObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } +} \ No newline at end of file From b0c0046b2afdd330d096b686de79e03a43e2172e Mon Sep 17 00:00:00 2001 From: weichien Date: Mon, 7 Jun 2021 17:57:48 +0800 Subject: [PATCH 05/25] feat: add update announcement controller logic,service,rule, resources. --- .../UpdateAnnouncementLogic.php | 84 +++++++++++++++++++ .../Services/FetchesAnnouncement.php | 34 ++++++++ .../Services/UpdatesAnnouncement.php | 28 +++++++ .../Standards/Rules/CanUpdateAnnouncement.php | 54 ++++++++++++ .../UpdateAnnouncementController.php | 8 +- 5 files changed, 204 insertions(+), 4 deletions(-) create mode 100644 app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php create mode 100644 app/Classes/Modules/Announcements/Services/FetchesAnnouncement.php create mode 100644 app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php create mode 100644 app/Classes/Modules/Announcements/Standards/Rules/CanUpdateAnnouncement.php diff --git a/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php new file mode 100644 index 00000000..f23c9d73 --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php @@ -0,0 +1,84 @@ + 'Update Announcement', + 'message' => 'You have successfully updated the Annoucement' + ]; + } + + /** @var CanUpdateAnnouncement */ + private $canUpdateAnnouncement; + + /** @var UpdatesAnnouncement */ + private $updatesAnnouncement; + + /** @var FetchesAnnouncement */ + private $fetchesAnnouncement; + + + /** + * UpdateAnnouncementLogic constructor. + * @param CanUpdateAnnouncement $canUpdateAnnouncement + * @param UpdatesAnnouncement $updatesAnnouncement + * @param FetchesAnnouncement $fetchesAnnouncement + */ + public function __construct( + CanUpdateAnnouncement $canUpdateAnnouncement, + UpdatesAnnouncement $updatesAnnouncement, + FetchesAnnouncement $fetchesAnnouncement + ) { + $this->canUpdateAnnouncement = $canUpdateAnnouncement; + $this->updatesAnnouncement = $updatesAnnouncement; + $this->fetchesAnnouncement = $fetchesAnnouncement; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request): JsonResponse + { + $annoucement_object = new AnnouncementObject( + $request->input('title'), + $request->input('description'), + $request->input('starting_on'), + $request->input('ending_on') + ); + + $annoucement = $this->fetchesAnnouncement->execute(['id' => $request->route('id')]); + + $this->canUpdateAnnouncement->passes($annoucement_object); + + $announcement_query = $this->updatesAnnouncement->execute($annoucement, $annoucement_object); + + $announcement_query->segments()->sync($request->input('segment_id')); + + return $this->resourceResponse(new AnnouncementResource($announcement_query)); + } +} diff --git a/app/Classes/Modules/Announcements/Services/FetchesAnnouncement.php b/app/Classes/Modules/Announcements/Services/FetchesAnnouncement.php new file mode 100644 index 00000000..f43b9e46 --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/FetchesAnnouncement.php @@ -0,0 +1,34 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php b/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php new file mode 100644 index 00000000..319691d7 --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php @@ -0,0 +1,28 @@ +title = $object->getTitle(); + $model->description = $object->getDescription(); + $model->starting_on = $object->getStartingOn(); + $model->ending_on = $object->getEndingOn(); + + return $this->handler($model); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanUpdateAnnouncement.php b/app/Classes/Modules/Announcements/Standards/Rules/CanUpdateAnnouncement.php new file mode 100644 index 00000000..d861d255 --- /dev/null +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanUpdateAnnouncement.php @@ -0,0 +1,54 @@ +AnnouncementValidation = $AnnouncementValidation; + } + + /** + * @return bool + */ + protected function authorized(): bool + { + // TODO Set Authorization rules + return true; + } + + /** + * @param AnnouncementObject $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return $this->AnnouncementValidation->validate($object); + } + + /** + * @param AnnouncementObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Announcements/UpdateAnnouncementController.php b/app/Http/Controllers/Announcements/UpdateAnnouncementController.php index 25e024c1..8d406632 100644 --- a/app/Http/Controllers/Announcements/UpdateAnnouncementController.php +++ b/app/Http/Controllers/Announcements/UpdateAnnouncementController.php @@ -2,18 +2,18 @@ namespace App\Http\Controllers\Announcements; -use App\Classes\Modules\Announcements\ControllersLogic\UpdateAnnouncementsLogic; +use App\Classes\Modules\Announcements\ControllersLogic\UpdateAnnouncementLogic; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -class UpdateAnnoucementController +class UpdateAnnouncementController { /** * @param Request $request - * @param UpdateAnnouncementsLogic $logic + * @param UpdateAnnouncementLogic $logic * @return JsonResponse */ - public function update(Request $request, UpdateAnnouncementsLogic $logic): JsonResponse + public function update(Request $request, UpdateAnnouncementLogic $logic): JsonResponse { return $logic->execute($request); } From 43804fbcd4b62e96241e48b9689b5be30da25be0 Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 00:00:40 +0800 Subject: [PATCH 06/25] FE - add announcement setting component. --- .../elements/AnnouncementListComponent.vue | 115 +++++++++++++ .../forms/ViewAnnouncementFormComponent.vue | 33 ++++ .../forms/AnnouncementFormComponent.vue | 153 ++++++++++++++++++ .../forms/DeleteAnnouncementFormComponent.vue | 33 ++++ 4 files changed, 334 insertions(+) create mode 100644 resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue create mode 100644 resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue create mode 100644 resources/assets/vue/components/settings/forms/AnnouncementFormComponent.vue create mode 100644 resources/assets/vue/components/settings/forms/DeleteAnnouncementFormComponent.vue diff --git a/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue b/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue new file mode 100644 index 00000000..27a47a78 --- /dev/null +++ b/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue @@ -0,0 +1,115 @@ + + + \ No newline at end of file diff --git a/resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue b/resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue new file mode 100644 index 00000000..137a6bd9 --- /dev/null +++ b/resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue @@ -0,0 +1,33 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/settings/forms/AnnouncementFormComponent.vue b/resources/assets/vue/components/settings/forms/AnnouncementFormComponent.vue new file mode 100644 index 00000000..683c24ad --- /dev/null +++ b/resources/assets/vue/components/settings/forms/AnnouncementFormComponent.vue @@ -0,0 +1,153 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/settings/forms/DeleteAnnouncementFormComponent.vue b/resources/assets/vue/components/settings/forms/DeleteAnnouncementFormComponent.vue new file mode 100644 index 00000000..14a43c80 --- /dev/null +++ b/resources/assets/vue/components/settings/forms/DeleteAnnouncementFormComponent.vue @@ -0,0 +1,33 @@ + + \ No newline at end of file From b741ae1f3cd15eaa4a8282a3264e25a3542ec9ec Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 12:53:51 +0800 Subject: [PATCH 07/25] fix: query announcement with segment wherein. --- app/Classes/General/Eloquent/Filters/HasSegments.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Classes/General/Eloquent/Filters/HasSegments.php b/app/Classes/General/Eloquent/Filters/HasSegments.php index b73f7e95..26d94dd8 100644 --- a/app/Classes/General/Eloquent/Filters/HasSegments.php +++ b/app/Classes/General/Eloquent/Filters/HasSegments.php @@ -15,7 +15,7 @@ class HasSegments implements Filter public static function apply(Builder $builder, $value) { return $builder->whereHas('segments', function ($q) use ($value) { - $q->where('id', $value); + $q->whereIn('id', $value); }); } } From 7ed4f9a33f5c874f725b351ce4fc4109618d2775 Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 13:29:58 +0800 Subject: [PATCH 08/25] feat: add attach/detach segment to annoucement controller and related modules. --- .../AssignAnnouncementToSegmentLogic.php | 61 +++++++++++++++++ .../RemoveSegmentFromAnnouncementLogic.php | 68 +++++++++++++++++++ .../AssignAnnouncementToSegmentProcessor.php | 56 +++++++++++++++ .../Services/AssignsAnnouncementToSegment.php | 33 +++++++++ .../RemovesAnnouncementFromSegment.php | 33 +++++++++ .../Standards/Rules/CanAssignSegment.php | 40 +++++++++++ .../AssignAnnouncementToSegmentController.php | 20 ++++++ ...emoveSegmentFromAnnouncementController.php | 20 ++++++ 8 files changed, 331 insertions(+) create mode 100644 app/Classes/Modules/Announcements/ControllersLogic/AssignAnnouncementToSegmentLogic.php create mode 100644 app/Classes/Modules/Announcements/ControllersLogic/RemoveSegmentFromAnnouncementLogic.php create mode 100644 app/Classes/Modules/Announcements/Processors/AssignAnnouncementToSegmentProcessor.php create mode 100644 app/Classes/Modules/Announcements/Services/AssignsAnnouncementToSegment.php create mode 100644 app/Classes/Modules/Announcements/Services/RemovesAnnouncementFromSegment.php create mode 100644 app/Classes/Modules/Announcements/Standards/Rules/CanAssignSegment.php create mode 100644 app/Http/Controllers/Announcements/AssignAnnouncementToSegmentController.php create mode 100644 app/Http/Controllers/Announcements/RemoveSegmentFromAnnouncementController.php diff --git a/app/Classes/Modules/Announcements/ControllersLogic/AssignAnnouncementToSegmentLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/AssignAnnouncementToSegmentLogic.php new file mode 100644 index 00000000..18552989 --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/AssignAnnouncementToSegmentLogic.php @@ -0,0 +1,61 @@ + 'Assign Announcement To Segment', + 'message' => 'You have successfully assigned Announcement to segment' + ]; + } + + /** @var FetchesAnnouncement */ + private $fetchesAnnouncement; + + /** @var AssignAnnouncementToSegmentProcessor */ + private $assignAnnouncementToSegmentProcessor; + + /** + * AssignAnnouncementToSegmentLogic constructor. + * @param FetchesAnnouncement $fetchesAnnouncement + * @param AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor + */ + public function __construct(FetchesAnnouncement $fetchesAnnouncement, AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor) + { + $this->fetchesAnnouncement = $fetchesAnnouncement; + $this->assignAnnouncementToSegmentProcessor = $assignAnnouncementToSegmentProcessor; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request): JsonResponse + { + $announcement = $this->fetchesAnnouncement->execute(['id' => $request->route('id')]); + + $this->assignAnnouncementToSegmentProcessor->execute($announcement, $request->input('segment_id')); + + return $this->resourceResponse(new AnnouncementResource($announcement)); + } +} diff --git a/app/Classes/Modules/Announcements/ControllersLogic/RemoveSegmentFromAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/RemoveSegmentFromAnnouncementLogic.php new file mode 100644 index 00000000..284d20b9 --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/RemoveSegmentFromAnnouncementLogic.php @@ -0,0 +1,68 @@ + 'Detach Announcement From Segment', + 'message' => 'You have successfully detached Announcement from segment' + ]; + } + + /** @var FetchesAnnouncement */ + private $fetchesAnnnouncement; + + /** @var FetchesSegment */ + private $fetchesSegment; + + /** @var RemovesAnnouncementFromSegment */ + private $removesAnnouncementFromSegment; + + /** + * RemoveSegmentFromAnnouncementLogic constructor. + * @param FetchesAnnouncement $fetchesAnnnouncement + * @param FetchesSegment $fetchesSegment + * @param RemovesAnnouncementFromSegment $removesAnnouncementFromSegment + */ + public function __construct(FetchesAnnouncement $fetchesAnnnouncement, FetchesSegment $fetchesSegment, RemovesAnnouncementFromSegment $removesAnnouncementFromSegment) + { + $this->fetchesAnnnouncement = $fetchesAnnnouncement; + $this->fetchesSegment = $fetchesSegment; + $this->removesAnnouncementFromSegment = $removesAnnouncementFromSegment; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request): JsonResponse + { + + $announcement = $this->fetchesAnnnouncement->execute(['id' => $request->route('id')]); + + $segment = $this->fetchesSegment->execute(['id' => $request->route('segment_id')]); + + $this->removesAnnouncementFromSegment->execute($announcement, $segment); + + return $this->resourceResponse(new AnnouncementResource($announcement)); + } +} diff --git a/app/Classes/Modules/Announcements/Processors/AssignAnnouncementToSegmentProcessor.php b/app/Classes/Modules/Announcements/Processors/AssignAnnouncementToSegmentProcessor.php new file mode 100644 index 00000000..f5468a80 --- /dev/null +++ b/app/Classes/Modules/Announcements/Processors/AssignAnnouncementToSegmentProcessor.php @@ -0,0 +1,56 @@ +canAssignSegment = $canAssignSegment; + $this->assignsAnnouncementToSegment = $assignsAnnouncementToSegment; + $this->fetchesSegment = $fetchesSegment; + } + + + /** + * @param Announcement $announcement + * @param int|null $segmentId + * @return Model + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function execute(Announcement $announcement, ?int $segmentId = SegmentConstants::STANDARD_SEGMENT): Model + { + $this->canAssignSegment->passes(); + + $segment = $this->fetchesSegment->execute(['id' => $segmentId]); + + return $this->assignsAnnouncementToSegment->execute($announcement, $segment); + } +} diff --git a/app/Classes/Modules/Announcements/Services/AssignsAnnouncementToSegment.php b/app/Classes/Modules/Announcements/Services/AssignsAnnouncementToSegment.php new file mode 100644 index 00000000..5cc459b1 --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/AssignsAnnouncementToSegment.php @@ -0,0 +1,33 @@ +segments()->attach($segment); + + return $announcement; + + } catch (QueryException $exception){ + throw new MalformedRequestException($exception); + } + + + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Services/RemovesAnnouncementFromSegment.php b/app/Classes/Modules/Announcements/Services/RemovesAnnouncementFromSegment.php new file mode 100644 index 00000000..bd34d52f --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/RemovesAnnouncementFromSegment.php @@ -0,0 +1,33 @@ +segments()->detach($segment); + + return $announcement; + + } catch (QueryException $exception){ + throw new MalformedRequestException($exception); + } + + + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanAssignSegment.php b/app/Classes/Modules/Announcements/Standards/Rules/CanAssignSegment.php new file mode 100644 index 00000000..625a07a1 --- /dev/null +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanAssignSegment.php @@ -0,0 +1,40 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Announcements/RemoveSegmentFromAnnouncementController.php b/app/Http/Controllers/Announcements/RemoveSegmentFromAnnouncementController.php new file mode 100644 index 00000000..2b65ad98 --- /dev/null +++ b/app/Http/Controllers/Announcements/RemoveSegmentFromAnnouncementController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file From ec8172f7a74b0d6f50bd52692433848765fdf4b1 Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 13:31:29 +0800 Subject: [PATCH 09/25] fix: update issue on announcement --- .../UpdateAnnouncementLogic.php | 31 +++++++++---------- .../Services/UpdatesAnnouncement.php | 1 - 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php index f23c9d73..4fac4144 100644 --- a/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php +++ b/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php @@ -2,14 +2,14 @@ namespace App\Classes\Modules\Announcements\ControllersLogic; -use App\Http\Resources\AnnouncementResource; - use App\Classes\General\Abstracts\AbstractControllerLogic; -use App\Classes\Modules\Announcements\Services\FetchesAnnouncement; -use App\Classes\Modules\Announcements\Standards\Rules\CanUpdateAnnouncement; -use App\Classes\Modules\Announcements\Services\UpdatesAnnouncement; use App\Classes\Modules\Announcements\DataTransferObjects\AnnouncementObject; +use App\Classes\Modules\Announcements\Standards\Rules\CanUpdateAnnouncement; +use App\Classes\Modules\Announcements\Services\FetchesAnnouncement; +use App\Classes\Modules\Announcements\Services\UpdatesAnnouncement; + +use App\Http\Resources\AnnouncementResource; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -25,34 +25,33 @@ class UpdateAnnouncementLogic extends AbstractControllerLogic { return [ 'title' => 'Update Announcement', - 'message' => 'You have successfully updated the Annoucement' + 'message' => 'You have successfully updated the Announcement' ]; } /** @var CanUpdateAnnouncement */ private $canUpdateAnnouncement; - /** @var UpdatesAnnouncement */ - private $updatesAnnouncement; - /** @var FetchesAnnouncement */ private $fetchesAnnouncement; + /** @var UpdatesAnnouncement */ + private $updatesAnnouncement; /** * UpdateAnnouncementLogic constructor. * @param CanUpdateAnnouncement $canUpdateAnnouncement - * @param UpdatesAnnouncement $updatesAnnouncement * @param FetchesAnnouncement $fetchesAnnouncement + * @param UpdatesAnnouncement $updatesAnnouncement */ public function __construct( CanUpdateAnnouncement $canUpdateAnnouncement, - UpdatesAnnouncement $updatesAnnouncement, - FetchesAnnouncement $fetchesAnnouncement + FetchesAnnouncement $fetchesAnnouncement, + UpdatesAnnouncement $updatesAnnouncement ) { $this->canUpdateAnnouncement = $canUpdateAnnouncement; - $this->updatesAnnouncement = $updatesAnnouncement; $this->fetchesAnnouncement = $fetchesAnnouncement; + $this->updatesAnnouncement = $updatesAnnouncement; } /** @@ -71,13 +70,13 @@ class UpdateAnnouncementLogic extends AbstractControllerLogic $request->input('ending_on') ); - $annoucement = $this->fetchesAnnouncement->execute(['id' => $request->route('id')]); - $this->canUpdateAnnouncement->passes($annoucement_object); + $annoucement = $this->fetchesAnnouncement->execute(['id' => $request->route('id')]); + $announcement_query = $this->updatesAnnouncement->execute($annoucement, $annoucement_object); - $announcement_query->segments()->sync($request->input('segment_id')); + //$announcement_query->segments()->sync($request->input('segment_id')); return $this->resourceResponse(new AnnouncementResource($announcement_query)); } diff --git a/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php b/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php index 319691d7..98d5da7a 100644 --- a/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php +++ b/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php @@ -17,7 +17,6 @@ class UpdatesAnnouncement extends AbstractUpdateRecord */ public function execute(Announcement $model, AnnouncementObject $object) { - $model = new Announcement(); $model->title = $object->getTitle(); $model->description = $object->getDescription(); $model->starting_on = $object->getStartingOn(); From 1fe554bceee30b4ee196aa93010a7d6b7f857460 Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 13:33:05 +0800 Subject: [PATCH 10/25] fix: create new announcement with attached standard segment. --- .../ControllersLogic/CreateAnnouncementLogic.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php index 26ef7f8f..9c740601 100644 --- a/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php +++ b/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php @@ -5,10 +5,11 @@ namespace App\Classes\Modules\Announcements\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; +use App\Classes\Modules\Announcements\DataTransferObjects\AnnouncementObject; use App\Classes\Modules\Announcements\Standards\Rules\CanCreateAnnouncement; use App\Classes\Modules\Announcements\Services\CreatesAnnouncement; +use App\Classes\Modules\Announcements\Processors\AssignAnnouncementToSegmentProcessor; -use App\Classes\Modules\Announcements\DataTransferObjects\AnnouncementObject; use App\Http\Resources\AnnouncementResource; use ErrorException; @@ -34,18 +35,24 @@ class CreateAnnouncementLogic extends AbstractControllerLogic /** @var CreatesAnnoucement */ private $createsAnnoucement; + /** @var AssignAnnouncementToSegmentProcessor */ + private $assignAnnouncementToSegmentProcessor; + /** * CreateAnnouncementLogic constructor. * @param CanCreateAnnoucement $canCreateAnnoucement * @param CreatesAnnoucement $createsAnnoucement + * @param AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor */ public function __construct( CanCreateAnnouncement $canCreateAnnouncement, - CreatesAnnouncement $createsAnnoucement + CreatesAnnouncement $createsAnnoucement, + AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor ) { - $this->canCreateAnnoucement = $canCreateAnnouncement; + $this->canCreateAnnouncement = $canCreateAnnouncement; $this->createsAnnoucement = $createsAnnoucement; + $this->assignAnnouncementToSegmentProcessor = $assignAnnouncementToSegmentProcessor; } /** @@ -68,8 +75,7 @@ class CreateAnnouncementLogic extends AbstractControllerLogic $announcement = $this->createsAnnoucement->execute($annoucement_object); - $announcement->segments()->attach($request->input('segment_id')); - + $this->assignAnnouncementToSegmentProcessor->execute($announcement); return $this->resourceResponse(new AnnouncementResource($announcement)); } From 995ec4678465b4f8fa4dba918ec7e1fe787886e9 Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 13:34:45 +0800 Subject: [PATCH 11/25] feat: add delete announcement modules. --- .../DeleteAnnouncementLogic.php | 71 +++++++++++++++++++ .../Services/DeletesAnnouncement.php | 19 +++++ .../Standards/Rules/CanDeleteAnnouncement.php | 40 +++++++++++ 3 files changed, 130 insertions(+) create mode 100644 app/Classes/Modules/Announcements/ControllersLogic/DeleteAnnouncementLogic.php create mode 100644 app/Classes/Modules/Announcements/Services/DeletesAnnouncement.php create mode 100644 app/Classes/Modules/Announcements/Standards/Rules/CanDeleteAnnouncement.php diff --git a/app/Classes/Modules/Announcements/ControllersLogic/DeleteAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/DeleteAnnouncementLogic.php new file mode 100644 index 00000000..55dc710c --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/DeleteAnnouncementLogic.php @@ -0,0 +1,71 @@ + 'Delete Announcement', + 'message' => 'You have successfully deleted the Announcement' + ]; + } + + /** @var CanDeleteAnnouncement */ + private $canDeleteAnnouncement; + + /** @var FetchesAnnouncement */ + private $fetchesAnnouncement; + + /** @var DeletesAnnouncement */ + private $deletesAnnouncement; + + /** + * DeleteAnnouncementLogic constructor. + * @param CanDeleteAnnouncement $canDeleteAnnouncement + * @param FetchesAnnouncement $fetchesAnnouncement + * @param DeletesAnnouncement $deletesAnnouncement + */ + public function __construct( + CanDeleteAnnouncement $canDeleteAnnoucement, + FetchesAnnouncement $fetchesAnnoucement, + DeletesAnnouncement $deletesAnnoucement + ) { + $this->canDeleteAnnoucement = $canDeleteAnnoucement; + $this->fetchesAnnoucement = $fetchesAnnoucement; + $this->deletesAnnoucement = $deletesAnnoucement; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request): JsonResponse + { + + $this->canDeleteAnnoucement->passes(); + + $annoucement = $this->fetchesAnnoucement->execute(['id' => $request->route('id')]); + + $this->deletesAnnoucement->execute($annoucement); + + return $this->response([]); + } +} diff --git a/app/Classes/Modules/Announcements/Services/DeletesAnnouncement.php b/app/Classes/Modules/Announcements/Services/DeletesAnnouncement.php new file mode 100644 index 00000000..82e312cc --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/DeletesAnnouncement.php @@ -0,0 +1,19 @@ +handler($model); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanDeleteAnnouncement.php b/app/Classes/Modules/Announcements/Standards/Rules/CanDeleteAnnouncement.php new file mode 100644 index 00000000..8a41deab --- /dev/null +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanDeleteAnnouncement.php @@ -0,0 +1,40 @@ + Date: Tue, 8 Jun 2021 13:35:40 +0800 Subject: [PATCH 12/25] update: announcement resource - rename param. --- app/Http/Resources/AnnouncementResource.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/Http/Resources/AnnouncementResource.php b/app/Http/Resources/AnnouncementResource.php index 8a62a857..26e1c2f9 100644 --- a/app/Http/Resources/AnnouncementResource.php +++ b/app/Http/Resources/AnnouncementResource.php @@ -19,11 +19,10 @@ class AnnouncementResource extends JsonResource 'id' => $this->id, 'title' => $this->title, 'description' => $this->description, - 'segment' => $this->segments, - 'ending_on' => $this->ending_on, - 'starting_on' => $this->starting_on, - 'starting_on_date' => Carbon::parse($this->starting_on)->format('Y-m-d'), - 'ending_on_date' => Carbon::parse($this->ending_on)->format('Y-m-d'), + 'segments' => $this->segments, + 'starting_on' => Carbon::parse($this->starting_on)->format('Y-m-d'), + 'ending_on' => Carbon::parse($this->ending_on)->format('Y-m-d'), + 'created_at' => Carbon::parse($this->created_at)->format('d-m-Y'), ]; } } From 40c7c6bfeb194f24d2c80de816445722bb258d30 Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 13:36:26 +0800 Subject: [PATCH 13/25] feat: add announcement route. --- routes/announcement.php | 15 +++++++++++++++ routes/api.php | 2 ++ 2 files changed, 17 insertions(+) create mode 100644 routes/announcement.php diff --git a/routes/announcement.php b/routes/announcement.php new file mode 100644 index 00000000..b6016706 --- /dev/null +++ b/routes/announcement.php @@ -0,0 +1,15 @@ + 'announcement', 'as' => 'announcement.', 'namespace' => 'Announcements'], function () { + Route::get('/list', 'ListAnnouncementsController@list')->name('list'); + Route::post('/create', 'CreateAnnouncementController@create')->name('create'); + Route::put('/update/{id}', 'UpdateAnnouncementController@update')->name('update'); + Route::delete('/delete/{id}', 'DeleteAnnouncementController@delete')->name('delete'); + + Route::group(['prefix' => '{id}/segment', 'as' => 'segment.'], function () { + Route::post('/assign', 'AssignAnnouncementToSegmentController@assign')->name('assign'); + Route::delete('/detach/{segment_id}', 'RemoveSegmentFromAnnouncementController@detach')->name('detach'); + }); +}); \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index 7318ce13..146d519a 100644 --- a/routes/api.php +++ b/routes/api.php @@ -45,6 +45,8 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function require __DIR__ . '/crud.php'; + require __DIR__ . '/announcement.php'; + // require __DIR__ . '/wallet.php'; // require __DIR__ . '/rate.php'; // require __DIR__ . '/receipt.php'; From 0b20934fe13c8372995ca10f363384a604c16684 Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 13:37:11 +0800 Subject: [PATCH 14/25] update: announcement rule and validator. --- .../Standards/Rules/CanCreateAnnouncement.php | 6 +-- .../Validators/AnnouncementValidation.php | 44 +++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 app/Classes/Modules/Announcements/Standards/Validators/AnnouncementValidation.php diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php b/app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php index e480ba78..a01e0de1 100644 --- a/app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php @@ -4,7 +4,7 @@ namespace App\Classes\Modules\Announcements\Standards\Rules; use App\Classes\General\Abstracts\AbstractRule; use App\Classes\Modules\Announcements\Standards\Validators\AnnouncementValidation; -use App\Classes\Modules\Companies\DataTransferObjects\CompanyObject; +use App\Classes\Modules\Companies\DataTransferObjects\AnnouncementObject; class CanCreateAnnouncement extends AbstractRule { @@ -30,7 +30,7 @@ class CanCreateAnnouncement extends AbstractRule } /** - * @param CompanyObject $object + * @param AnnouncementObject $object * @return bool * @throws \App\Classes\Exceptions\RequestValidationException */ @@ -40,7 +40,7 @@ class CanCreateAnnouncement extends AbstractRule } /** - * @param CompanyObject $object + * @param AnnouncementObject $object * @return bool */ protected function criteria($object): bool diff --git a/app/Classes/Modules/Announcements/Standards/Validators/AnnouncementValidation.php b/app/Classes/Modules/Announcements/Standards/Validators/AnnouncementValidation.php new file mode 100644 index 00000000..f094b8aa --- /dev/null +++ b/app/Classes/Modules/Announcements/Standards/Validators/AnnouncementValidation.php @@ -0,0 +1,44 @@ + $object->getTitle(), + 'description' => $object->getDescription(), + 'starting_on' => $object->getStartingOn(), + 'ending_on' => $object->getEndingOn() + ]; + } + + /** + * @return array + */ + protected function rules(): array + { + return [ + 'title' => 'required', + 'description' => 'required', + 'starting_on' => 'required', + 'ending_on' => 'required' + ]; + } + + /** + * @return array + */ + protected function messages(): array + { + return []; + } +} \ No newline at end of file From aaf3385a139ab158e90b19ee11556b32f2fd5865 Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 13:38:34 +0800 Subject: [PATCH 15/25] feat: add announcement model with segments relationship. --- app/Models/Announcement.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 app/Models/Announcement.php diff --git a/app/Models/Announcement.php b/app/Models/Announcement.php new file mode 100644 index 00000000..b0094a6c --- /dev/null +++ b/app/Models/Announcement.php @@ -0,0 +1,26 @@ +BelongsToMany(Segment::class); + } +} From d82f198199df9ef3120cfc826f4a17bfe11a7d7e Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 13:40:10 +0800 Subject: [PATCH 16/25] feat: add announcement and pivot table with segment. --- ...5_26_094333_create_announcements_table.php | 40 +++++++++++++++++++ ...3501_create_announcement_segment_table.php | 40 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 database/migrations/2021_05_26_094333_create_announcements_table.php create mode 100644 database/migrations/2021_06_02_233501_create_announcement_segment_table.php diff --git a/database/migrations/2021_05_26_094333_create_announcements_table.php b/database/migrations/2021_05_26_094333_create_announcements_table.php new file mode 100644 index 00000000..35508479 --- /dev/null +++ b/database/migrations/2021_05_26_094333_create_announcements_table.php @@ -0,0 +1,40 @@ +id(); + $table->string('title', 50); + $table->longText('description'); + $table->timestamp('starting_on')->nullable(); + $table->timestamp('ending_on')->nullable(); + $table->boolean('is_all_day')->default(false); + $table->integer('duration')->default(0); + $table->boolean('is_recurring')->default(false); + $table->string('recurrence_pattern')->nullable(); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('announcements'); + } +} diff --git a/database/migrations/2021_06_02_233501_create_announcement_segment_table.php b/database/migrations/2021_06_02_233501_create_announcement_segment_table.php new file mode 100644 index 00000000..c2777abf --- /dev/null +++ b/database/migrations/2021_06_02_233501_create_announcement_segment_table.php @@ -0,0 +1,40 @@ +primary(['announcement_id', 'segment_id']); + $table->bigInteger('announcement_id')->unsigned(); + $table->bigInteger('segment_id')->unsigned(); + $table->timestamps(); + $table->foreign('announcement_id') + ->references('id') + ->on('announcements')->onDelete('cascade'); + $table->foreign('segment_id') + ->references('id') + ->on('segments')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('announcement_segment'); + } +} From a2cd744bb147d8616c9b3f56d079a355eb65e63b Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 15:52:24 +0800 Subject: [PATCH 17/25] update: FE vue announcementlist component. added compoment for attach and detach segment to announcement. --- .../elements/AnnouncementListComponent.vue | 69 +++++++++++-------- ...signAnnouncementToSegmentFormComponent.vue | 67 ++++++++++++++++++ ...chAnnouncementFromSegmentFormComponent.vue | 51 ++++++++++++++ .../forms/AssignSegmentFormComponent.vue | 10 ++- 4 files changed, 167 insertions(+), 30 deletions(-) create mode 100644 resources/assets/vue/components/announcements/forms/AssignAnnouncementToSegmentFormComponent.vue create mode 100644 resources/assets/vue/components/announcements/forms/DetachAnnouncementFromSegmentFormComponent.vue diff --git a/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue b/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue index 27a47a78..226783f9 100644 --- a/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue +++ b/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue @@ -15,7 +15,7 @@
-
{{item.title}}
+
{{item.title | truncate(20)}}
@@ -27,43 +27,45 @@
-
{{item.description}}
+
{{item.description | truncate(15)}}
-
- -
-
- -
- +
- + - + - +
@@ -72,22 +74,31 @@
-
+
-
-
-
-
-
-
-
Assigned Segment
-
-
-
+
Targeted Segment
+
+
+
+
+ +
+
+
+
+
+ {{segment.name}} +
+ + +
+ + +
diff --git a/resources/assets/vue/components/announcements/forms/AssignAnnouncementToSegmentFormComponent.vue b/resources/assets/vue/components/announcements/forms/AssignAnnouncementToSegmentFormComponent.vue new file mode 100644 index 00000000..aadb5a65 --- /dev/null +++ b/resources/assets/vue/components/announcements/forms/AssignAnnouncementToSegmentFormComponent.vue @@ -0,0 +1,67 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/announcements/forms/DetachAnnouncementFromSegmentFormComponent.vue b/resources/assets/vue/components/announcements/forms/DetachAnnouncementFromSegmentFormComponent.vue new file mode 100644 index 00000000..3903dcdc --- /dev/null +++ b/resources/assets/vue/components/announcements/forms/DetachAnnouncementFromSegmentFormComponent.vue @@ -0,0 +1,51 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/companies/forms/AssignSegmentFormComponent.vue b/resources/assets/vue/components/companies/forms/AssignSegmentFormComponent.vue index e77a633d..401a832c 100644 --- a/resources/assets/vue/components/companies/forms/AssignSegmentFormComponent.vue +++ b/resources/assets/vue/components/companies/forms/AssignSegmentFormComponent.vue @@ -19,7 +19,7 @@
- +
@@ -40,6 +40,12 @@ import ModalFormHandler from '../../../general/mixins/modalFormHandler'; import { required } from "vuelidate/lib/validators"; export default { + props: { + multiple: { + default: false, + type: Boolean + } + }, data(){ return { parameters: { @@ -56,6 +62,8 @@ }, computed: { currentSegmentIds(){ + console.log("compute"); + console.log(this.parameters.segments); return this.parameters.segments.map(function (value){ return value.id; }) From 7999a4312bafa067325806712869910b41060476 Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 15:53:22 +0800 Subject: [PATCH 18/25] feat: view annnoucement content. --- .../announcements/forms/ViewAnnouncementFormComponent.vue | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue b/resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue index 137a6bd9..86e536d4 100644 --- a/resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue +++ b/resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue @@ -10,13 +10,10 @@
{{item.description}}
-
-
+
+
OK
-
From 364b3dd102c6b6b8e4041971516331fcbced5b9a Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 16:01:55 +0800 Subject: [PATCH 19/25] feat: add vue filters --- resources/assets/vue/app.js | 4 ++++ resources/assets/vue/general/filters/index.js | 7 +++++++ resources/assets/vue/general/filters/truncate.js | 3 +++ 3 files changed, 14 insertions(+) create mode 100644 resources/assets/vue/general/filters/index.js create mode 100644 resources/assets/vue/general/filters/truncate.js diff --git a/resources/assets/vue/app.js b/resources/assets/vue/app.js index 192f9fb6..1d98d12d 100644 --- a/resources/assets/vue/app.js +++ b/resources/assets/vue/app.js @@ -14,6 +14,8 @@ import vuelidate from 'vuelidate'; /** Input Mask **/ import VueTheMask from 'vue-the-mask'; +/** Vue Filter **/ +import filters from './general/filters'; /** Mixins */ import request from './general/mixins/request'; @@ -27,6 +29,8 @@ import Avatar from 'vue-avatar'; /** Application Injections */ Vue.use(vuelidate); Vue.use(VueTheMask); +Vue.use(filters); + Vue.directive('closable', closable); Vue.mixin({ methods: { diff --git a/resources/assets/vue/general/filters/index.js b/resources/assets/vue/general/filters/index.js new file mode 100644 index 00000000..37be02fa --- /dev/null +++ b/resources/assets/vue/general/filters/index.js @@ -0,0 +1,7 @@ +import truncate from "./truncate"; + +export default { + install(Vue) { + Vue.filter("truncate", truncate); + } +}; diff --git a/resources/assets/vue/general/filters/truncate.js b/resources/assets/vue/general/filters/truncate.js new file mode 100644 index 00000000..db81e9b0 --- /dev/null +++ b/resources/assets/vue/general/filters/truncate.js @@ -0,0 +1,3 @@ +export default function truncate (text, stop, clamp) { + return text.slice(0, stop) + (stop < text.length ? clamp || '...' : '') +} \ No newline at end of file From 8eedb0b59122a14f8ba5af13d4523325b8b8409b Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 16:02:57 +0800 Subject: [PATCH 20/25] update setting blade. --- resources/views/pages/settings.blade.php | 76 +++++++++++++++++++++--- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/resources/views/pages/settings.blade.php b/resources/views/pages/settings.blade.php index 215bffad..9c7c02ea 100644 --- a/resources/views/pages/settings.blade.php +++ b/resources/views/pages/settings.blade.php @@ -147,7 +147,7 @@
-
+
@@ -170,6 +170,29 @@
+
+
+
+
+
+
+
+
+ +
+
+
Announcements
+
+
+
+
+
+
+
+
@@ -449,7 +472,43 @@ - +
+
+ +
+
+
+
+
+ Announcements +
+
+
+ + + + +
+
+
+
+ + + +
+
+
+
+
+
+ @@ -463,7 +522,7 @@
-
+
-
+
-
+
-
+
-
+
+
+ +
From 942b752ade5f07b99958ee7b5fb0473d031c1e59 Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 16:05:33 +0800 Subject: [PATCH 21/25] feat: add user announcement component. --- .../AnnouncementQuickViewSectionComponent.vue | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 resources/assets/vue/components/announcements/sections/AnnouncementQuickViewSectionComponent.vue diff --git a/resources/assets/vue/components/announcements/sections/AnnouncementQuickViewSectionComponent.vue b/resources/assets/vue/components/announcements/sections/AnnouncementQuickViewSectionComponent.vue new file mode 100644 index 00000000..a40ec4c8 --- /dev/null +++ b/resources/assets/vue/components/announcements/sections/AnnouncementQuickViewSectionComponent.vue @@ -0,0 +1,55 @@ + + + \ No newline at end of file From 76e583eb49ed450e6489b7245d95e3a6809f5e93 Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 8 Jun 2021 16:17:52 +0800 Subject: [PATCH 22/25] fix profile full name update failed. --- .../ControllersLogic/UpdateUserLogic.php | 4 +-- .../DataTransferObjects/FullNameObject.php | 33 +++++++++++++++++++ .../Modules/Accounts/Services/UpdatesUser.php | 4 +-- 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 app/Classes/Modules/Accounts/DataTransferObjects/FullNameObject.php diff --git a/app/Classes/Modules/Accounts/ControllersLogic/UpdateUserLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/UpdateUserLogic.php index 7dbfca9e..7837c75e 100644 --- a/app/Classes/Modules/Accounts/ControllersLogic/UpdateUserLogic.php +++ b/app/Classes/Modules/Accounts/ControllersLogic/UpdateUserLogic.php @@ -7,7 +7,7 @@ use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Accounts\Services\UpdatesUser; use App\Classes\Modules\Accounts\Services\FetchesUser; use App\Classes\Modules\Accounts\Standards\Rules\CanUpdateUser; -use App\Classes\Modules\Accounts\DataTransferObjects\UserObject; +use App\Classes\Modules\Accounts\DataTransferObjects\FullNameObject; use App\Http\Resources\UserResource; use ErrorException; use Illuminate\Http\JsonResponse; @@ -58,7 +58,7 @@ class UpdateUserLogic extends AbstractControllerLogic { try { - $object = new UserObject($request->input('name')); + $object = new FullNameObject($request->input('name')); $this->canUpdateUser->passes($object); diff --git a/app/Classes/Modules/Accounts/DataTransferObjects/FullNameObject.php b/app/Classes/Modules/Accounts/DataTransferObjects/FullNameObject.php new file mode 100644 index 00000000..c17a8b72 --- /dev/null +++ b/app/Classes/Modules/Accounts/DataTransferObjects/FullNameObject.php @@ -0,0 +1,33 @@ +name = $name; + } + + /** + * @return string + */ + public function getName(): string + { + return $this->name; + } +} diff --git a/app/Classes/Modules/Accounts/Services/UpdatesUser.php b/app/Classes/Modules/Accounts/Services/UpdatesUser.php index ef2e8d1a..f872b234 100644 --- a/app/Classes/Modules/Accounts/Services/UpdatesUser.php +++ b/app/Classes/Modules/Accounts/Services/UpdatesUser.php @@ -3,7 +3,7 @@ namespace App\Classes\Modules\Accounts\Services; use App\Classes\General\Eloquent\AbstractUpdateRecord; -use App\Classes\Modules\Accounts\DataTransferObjects\UserObject; +use App\Classes\Modules\Accounts\DataTransferObjects\FullNameObject; use App\Models\User; class UpdatesUser extends AbstractUpdateRecord @@ -15,7 +15,7 @@ class UpdatesUser extends AbstractUpdateRecord * @return \Illuminate\Database\Eloquent\Model * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute(User $model, UserObject $object) { + public function execute(User $model, FullNameObject $object) { $model->name = $object->getName(); return $this->handler($model); From c999dced1f84286cd38aa9442470ada101d3fb01 Mon Sep 17 00:00:00 2001 From: weichien Date: Wed, 9 Jun 2021 11:31:35 +0800 Subject: [PATCH 23/25] style: update announcement view and list --- .../elements/AnnouncementListComponent.vue | 13 ++++++++++--- .../forms/ViewAnnouncementFormComponent.vue | 15 +++++++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue b/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue index 226783f9..0626be82 100644 --- a/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue +++ b/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue @@ -2,9 +2,16 @@
-
-
- +
+
+
+
Date
+
+
+
+
+
{{item.created_at}}
+
diff --git a/resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue b/resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue index 86e536d4..6308af30 100644 --- a/resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue +++ b/resources/assets/vue/components/announcements/forms/ViewAnnouncementFormComponent.vue @@ -2,15 +2,22 @@
-
+
+
-

{{item.title}}

-
{{item.description}}
+ + +
-
+
+
+
{{item.description}}
+
+
+
OK
From df62565a6e357e2299e97f2b225bf939bd43bc02 Mon Sep 17 00:00:00 2001 From: weichien Date: Wed, 9 Jun 2021 11:53:44 +0800 Subject: [PATCH 24/25] style: redefine label and css . --- .../forms/AnnouncementFormComponent.vue | 35 +++---------------- .../forms/DeleteAnnouncementFormComponent.vue | 2 +- resources/views/pages/settings.blade.php | 2 +- 3 files changed, 7 insertions(+), 32 deletions(-) diff --git a/resources/assets/vue/components/settings/forms/AnnouncementFormComponent.vue b/resources/assets/vue/components/settings/forms/AnnouncementFormComponent.vue index 683c24ad..1430a078 100644 --- a/resources/assets/vue/components/settings/forms/AnnouncementFormComponent.vue +++ b/resources/assets/vue/components/settings/forms/AnnouncementFormComponent.vue @@ -6,7 +6,7 @@
-
{{this.data?"Update":"Add"}} Announcement
+
{{this.data?"Update":"Create"}} Announcement
@@ -17,44 +17,19 @@
- +
-
+
- - + +
- -
diff --git a/resources/assets/vue/components/settings/forms/DeleteAnnouncementFormComponent.vue b/resources/assets/vue/components/settings/forms/DeleteAnnouncementFormComponent.vue index 14a43c80..5c59b264 100644 --- a/resources/assets/vue/components/settings/forms/DeleteAnnouncementFormComponent.vue +++ b/resources/assets/vue/components/settings/forms/DeleteAnnouncementFormComponent.vue @@ -7,7 +7,7 @@

Are you Sure?

-
Are you sure you want to delete {{item.title}} announcement?
+
Are you sure you want to delete announcement with title {{item.title}} ?
diff --git a/resources/views/pages/settings.blade.php b/resources/views/pages/settings.blade.php index 9c7c02ea..ca07e88a 100644 --- a/resources/views/pages/settings.blade.php +++ b/resources/views/pages/settings.blade.php @@ -486,7 +486,7 @@