diff --git a/app/Classes/General/Eloquent/Filters/HasSegments.php b/app/Classes/General/Eloquent/Filters/HasSegments.php
new file mode 100644
index 00000000..26d94dd8
--- /dev/null
+++ b/app/Classes/General/Eloquent/Filters/HasSegments.php
@@ -0,0 +1,21 @@
+whereHas('segments', function ($q) use ($value) {
+ $q->whereIn('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());
+ }
+}
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);
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/CreateAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php
new file mode 100644
index 00000000..9c740601
--- /dev/null
+++ b/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php
@@ -0,0 +1,82 @@
+ 'Created Annoucement',
+ 'message' => 'You have successfully created a new Annoucements'
+ ];
+ }
+
+ /** @var CanCreateAnnouncement */
+ private $canCreateAnnouncement;
+
+ /** @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,
+ AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor
+ ) {
+ $this->canCreateAnnouncement = $canCreateAnnouncement;
+ $this->createsAnnoucement = $createsAnnoucement;
+ $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
+ {
+ $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);
+
+ $this->assignAnnouncementToSegmentProcessor->execute($announcement);
+
+ return $this->resourceResponse(new AnnouncementResource($announcement));
+ }
+}
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/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/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/ControllersLogic/UpdateAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php
new file mode 100644
index 00000000..4fac4144
--- /dev/null
+++ b/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php
@@ -0,0 +1,83 @@
+ 'Update Announcement',
+ 'message' => 'You have successfully updated the Announcement'
+ ];
+ }
+
+ /** @var CanUpdateAnnouncement */
+ private $canUpdateAnnouncement;
+
+ /** @var FetchesAnnouncement */
+ private $fetchesAnnouncement;
+
+ /** @var UpdatesAnnouncement */
+ private $updatesAnnouncement;
+
+ /**
+ * UpdateAnnouncementLogic constructor.
+ * @param CanUpdateAnnouncement $canUpdateAnnouncement
+ * @param FetchesAnnouncement $fetchesAnnouncement
+ * @param UpdatesAnnouncement $updatesAnnouncement
+ */
+ public function __construct(
+ CanUpdateAnnouncement $canUpdateAnnouncement,
+ FetchesAnnouncement $fetchesAnnouncement,
+ UpdatesAnnouncement $updatesAnnouncement
+ ) {
+ $this->canUpdateAnnouncement = $canUpdateAnnouncement;
+ $this->fetchesAnnouncement = $fetchesAnnouncement;
+ $this->updatesAnnouncement = $updatesAnnouncement;
+ }
+
+ /**
+ * @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->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'));
+
+ return $this->resourceResponse(new AnnouncementResource($announcement_query));
+ }
+}
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/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/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/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/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/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/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/Services/UpdatesAnnouncement.php b/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php
new file mode 100644
index 00000000..98d5da7a
--- /dev/null
+++ b/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php
@@ -0,0 +1,27 @@
+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/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 @@
+AnnouncementValidation = $AnnouncementValidation;
+ }
+
+ /**
+ * @return bool
+ */
+ protected function authorized(): bool
+ {
+ 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/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 @@
+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/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
diff --git a/app/Http/Controllers/Announcements/AssignAnnouncementToSegmentController.php b/app/Http/Controllers/Announcements/AssignAnnouncementToSegmentController.php
new file mode 100644
index 00000000..8f6d7734
--- /dev/null
+++ b/app/Http/Controllers/Announcements/AssignAnnouncementToSegmentController.php
@@ -0,0 +1,20 @@
+execute($request);
+ }
+
+}
\ No newline at end of file
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/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
diff --git a/app/Http/Controllers/Announcements/UpdateAnnouncementController.php b/app/Http/Controllers/Announcements/UpdateAnnouncementController.php
new file mode 100644
index 00000000..8d406632
--- /dev/null
+++ b/app/Http/Controllers/Announcements/UpdateAnnouncementController.php
@@ -0,0 +1,20 @@
+execute($request);
+ }
+}
diff --git a/app/Http/Controllers/Bookings/DeleteBookingController.php b/app/Http/Controllers/Bookings/DeleteBookingController.php
index f0bffeb2..a5629052 100644
--- a/app/Http/Controllers/Bookings/DeleteBookingController.php
+++ b/app/Http/Controllers/Bookings/DeleteBookingController.php
@@ -1,6 +1,6 @@
$this->id,
+ 'title' => $this->title,
+ 'description' => $this->description,
+ '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'),
+ ];
+ }
+}
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);
+ }
+}
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');
+ }
+}
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/components/announcements/elements/AnnouncementListComponent.vue b/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue
new file mode 100644
index 00000000..0626be82
--- /dev/null
+++ b/resources/assets/vue/components/announcements/elements/AnnouncementListComponent.vue
@@ -0,0 +1,133 @@
+
+Assign Segment
+ Are you Sure?
+