From d4db477f0e524a087ac835536d6248fda102e482 Mon Sep 17 00:00:00 2001 From: Matt Inamdar Date: Thu, 29 Aug 2019 11:49:07 +0100 Subject: [PATCH] feature/new-organisation-sign-up-form (#251) * Updated database ERD * Updated dependencies * Added migration to make update_requests.updateable_id nullable * Update request updateable_type values refactored They now use string constants on the UpdateRequest class. * Test log cleared when tests first ran * Update request observer no longer removes fields for new requests * Update request updateable_id nullable in API docs * Fixed typo * Used scope instead of where clause * Updated API docs with new endpoint * Made update_requests.user_id nullable * Endpoint created with no data * Added request validation * Added store update request logic to controller * Linted code * Added failing test for approving update request * Working test for organisation sign up form approval * Fixed permissions not being set for service * Linted code --- app/Docs/OpenApi.php | 2 + .../Locations/UpdateLocationOperation.php | 8 +- .../StoreOrganisationSignUpFormOperation.php | 41 +++ .../StoreOrganisationOperation.php | 8 +- .../Referrals/StoreReferralOperation.php | 8 +- .../UpdateReportScheduleOperation.php | 8 +- .../Search/StoreSearchOperation.php | 8 +- .../Services/RefreshServiceOperation.php | 8 +- .../IndexUpdateRequestOperation.php | 1 + .../OrganisationSignUpFormsRootPath.php | 23 ++ .../StoreOrganisationSignUpFormSchema.php | 94 +++++ .../UpdateRequest/UpdateRequestSchema.php | 20 +- app/Docs/Tags/OrganisationSignUpFormsTag.php | 19 ++ .../V1/OrganisationSignUpFormController.php | 122 +++++++ .../Controllers/Core/V1/ServiceController.php | 2 +- .../Core/V1/UpdateRequestController.php | 2 +- .../Middleware/RedirectIfAuthenticated.php | 5 + .../OrganisationSignUpForm/StoreRequest.php | 160 +++++++++ .../Notifications/UpdateRequestApproved.php | 7 +- .../Notifications/UpdateRequestRejected.php | 7 +- app/Models/Scopes/UpdateRequestScopes.php | 46 ++- app/Models/UpdateRequest.php | 88 ++++- app/Observers/UpdateRequestObserver.php | 16 +- app/Providers/ModelServiceProvider.php | 12 +- app/Rules/Password.php | 2 +- app/UpdateRequest/OrganisationSignUpForm.php | 132 +++++++ composer.lock | 323 +++++++++--------- database/diagrams/ERD.mwb | Bin 67858 -> 68141 bytes ...lumn_nullable_on_update_requests_table.php | 23 ++ ...lumn_nullable_on_update_requests_table.php | 23 ++ routes/api.php | 296 +++++++++------- tests/Feature/LocationsTest.php | 10 +- tests/Feature/OrganisationSignUpFormTest.php | 242 +++++++++++++ tests/Feature/OrganisationsTest.php | 8 +- tests/Feature/UpdateRequestsTest.php | 141 +++++++- tests/TestCase.php | 18 + 36 files changed, 1570 insertions(+), 363 deletions(-) create mode 100644 app/Docs/Operations/OrganisationSignUpForms/StoreOrganisationSignUpFormOperation.php create mode 100644 app/Docs/Paths/OrganisationSignUpForms/OrganisationSignUpFormsRootPath.php create mode 100644 app/Docs/Schemas/OrganisationSignUpForm/StoreOrganisationSignUpFormSchema.php create mode 100644 app/Docs/Tags/OrganisationSignUpFormsTag.php create mode 100644 app/Http/Controllers/Core/V1/OrganisationSignUpFormController.php create mode 100644 app/Http/Requests/OrganisationSignUpForm/StoreRequest.php create mode 100644 app/UpdateRequest/OrganisationSignUpForm.php create mode 100644 database/migrations/2019_08_20_150238_make_updateable_id_column_nullable_on_update_requests_table.php create mode 100644 database/migrations/2019_08_21_104201_make_user_id_column_nullable_on_update_requests_table.php create mode 100644 tests/Feature/OrganisationSignUpFormTest.php diff --git a/app/Docs/OpenApi.php b/app/Docs/OpenApi.php index de06a9a2..41b14a5f 100644 --- a/app/Docs/OpenApi.php +++ b/app/Docs/OpenApi.php @@ -44,6 +44,7 @@ public static function create(string $objectId = null): BaseObject Paths\Organisations\OrganisationsIndexPath::create(), Paths\Organisations\OrganisationsNestedPath::create(), Paths\Organisations\OrganisationsLogoPath::create(), + Paths\OrganisationSignUpForms\OrganisationSignUpFormsRootPath::create(), Paths\PageFeedbacks\PageFeedbacksRootPath::create(), Paths\PageFeedbacks\PageFeedbacksIndexPath::create(), Paths\PageFeedbacks\PageFeedbacksNestedPath::create(), @@ -99,6 +100,7 @@ public static function create(string $objectId = null): BaseObject Tags\FilesTag::create(), Tags\LocationsTag::create(), Tags\NotificationsTag::create(), + Tags\OrganisationSignUpFormsTag::create(), Tags\OrganisationsTag::create(), Tags\PageFeedbacksTag::create(), Tags\ReferralsTag::create(), diff --git a/app/Docs/Operations/Locations/UpdateLocationOperation.php b/app/Docs/Operations/Locations/UpdateLocationOperation.php index 08aece9d..0b402740 100644 --- a/app/Docs/Operations/Locations/UpdateLocationOperation.php +++ b/app/Docs/Operations/Locations/UpdateLocationOperation.php @@ -25,9 +25,11 @@ public static function create(string $objectId = null): BaseObject ->summary('Update a specific location') ->description('**Permission:** `Service Admin`') ->requestBody( - RequestBody::create()->content( - MediaType::json()->schema(UpdateLocationSchema::create()) - ) + RequestBody::create() + ->required() + ->content( + MediaType::json()->schema(UpdateLocationSchema::create()) + ) ) ->responses( UpdateRequestReceivedResponse::create(null, UpdateLocationSchema::create()) diff --git a/app/Docs/Operations/OrganisationSignUpForms/StoreOrganisationSignUpFormOperation.php b/app/Docs/Operations/OrganisationSignUpForms/StoreOrganisationSignUpFormOperation.php new file mode 100644 index 00000000..a33a9739 --- /dev/null +++ b/app/Docs/Operations/OrganisationSignUpForms/StoreOrganisationSignUpFormOperation.php @@ -0,0 +1,41 @@ +action(static::ACTION_POST) + ->tags(OrganisationSignUpFormsTag::create()) + ->summary('Submit an organisation sign up form') + ->description('**Permission:** `Open`') + ->noSecurity() + ->requestBody( + RequestBody::create() + ->required() + ->content( + MediaType::json()->schema( + StoreOrganisationSignUpFormSchema::create() + ) + ) + ) + ->responses( + UpdateRequestReceivedResponse::create(null, StoreOrganisationSignUpFormSchema::create()) + ); + } +} diff --git a/app/Docs/Operations/Organisations/StoreOrganisationOperation.php b/app/Docs/Operations/Organisations/StoreOrganisationOperation.php index 89dc0656..165061e8 100644 --- a/app/Docs/Operations/Organisations/StoreOrganisationOperation.php +++ b/app/Docs/Operations/Organisations/StoreOrganisationOperation.php @@ -27,9 +27,11 @@ public static function create(string $objectId = null): BaseObject ->summary('Create an organisation') ->description('**Permission:** `Global Admin`') ->requestBody( - RequestBody::create()->content( - MediaType::json()->schema(StoreOrganisationSchema::create()) - ) + RequestBody::create() + ->required() + ->content( + MediaType::json()->schema(StoreOrganisationSchema::create()) + ) ) ->responses( Response::created()->content( diff --git a/app/Docs/Operations/Referrals/StoreReferralOperation.php b/app/Docs/Operations/Referrals/StoreReferralOperation.php index 62aec628..a26a74ca 100644 --- a/app/Docs/Operations/Referrals/StoreReferralOperation.php +++ b/app/Docs/Operations/Referrals/StoreReferralOperation.php @@ -28,9 +28,11 @@ public static function create(string $objectId = null): BaseObject ->description('**Permission:** `Open`') ->noSecurity() ->requestBody( - RequestBody::create()->content( - MediaType::json()->schema(StoreReferralSchema::create()) - ) + RequestBody::create() + ->required() + ->content( + MediaType::json()->schema(StoreReferralSchema::create()) + ) ) ->responses( Response::created()->content( diff --git a/app/Docs/Operations/ReportSchedules/UpdateReportScheduleOperation.php b/app/Docs/Operations/ReportSchedules/UpdateReportScheduleOperation.php index 4b506122..fed20acb 100644 --- a/app/Docs/Operations/ReportSchedules/UpdateReportScheduleOperation.php +++ b/app/Docs/Operations/ReportSchedules/UpdateReportScheduleOperation.php @@ -27,9 +27,11 @@ public static function create(string $objectId = null): BaseObject ->summary('Update a specific report schedule') ->description('**Permission:** `Global Admin`') ->requestBody( - RequestBody::create()->content( - MediaType::json()->schema(UpdateReportScheduleSchema::create()) - ) + RequestBody::create() + ->required() + ->content( + MediaType::json()->schema(UpdateReportScheduleSchema::create()) + ) ) ->responses( Response::ok()->content( diff --git a/app/Docs/Operations/Search/StoreSearchOperation.php b/app/Docs/Operations/Search/StoreSearchOperation.php index eef972c9..f7e6c957 100644 --- a/app/Docs/Operations/Search/StoreSearchOperation.php +++ b/app/Docs/Operations/Search/StoreSearchOperation.php @@ -49,9 +49,11 @@ public static function create(string $objectId = null): BaseObject PerPageParameter::create() ) ->requestBody( - RequestBody::create()->content( - MediaType::json()->schema(StoreSearchSchema::create()) - ) + RequestBody::create() + ->required() + ->content( + MediaType::json()->schema(StoreSearchSchema::create()) + ) ) ->responses( Response::ok()->content( diff --git a/app/Docs/Operations/Services/RefreshServiceOperation.php b/app/Docs/Operations/Services/RefreshServiceOperation.php index 6b6aa44f..e22eea4a 100644 --- a/app/Docs/Operations/Services/RefreshServiceOperation.php +++ b/app/Docs/Operations/Services/RefreshServiceOperation.php @@ -28,9 +28,11 @@ public static function create(string $objectId = null): BaseObject ->description('**Permission:** `Open`') ->noSecurity() ->requestBody( - RequestBody::create()->content( - MediaType::json()->schema(RefreshServiceSchema::create()) - ) + RequestBody::create() + ->required() + ->content( + MediaType::json()->schema(RefreshServiceSchema::create()) + ) ) ->responses( Response::ok()->content( diff --git a/app/Docs/Operations/UpdateRequests/IndexUpdateRequestOperation.php b/app/Docs/Operations/UpdateRequests/IndexUpdateRequestOperation.php index 76b458a5..91c617c8 100644 --- a/app/Docs/Operations/UpdateRequests/IndexUpdateRequestOperation.php +++ b/app/Docs/Operations/UpdateRequests/IndexUpdateRequestOperation.php @@ -83,6 +83,7 @@ public static function create(string $objectId = null): BaseObject * Location: `address_line_1` * Service location: `name` or `address_line_1` for associated location * Organisation: `name` +* Organisation sign up form: `name` for organisation EOT ) ->schema(Schema::string()), diff --git a/app/Docs/Paths/OrganisationSignUpForms/OrganisationSignUpFormsRootPath.php b/app/Docs/Paths/OrganisationSignUpForms/OrganisationSignUpFormsRootPath.php new file mode 100644 index 00000000..19e587d9 --- /dev/null +++ b/app/Docs/Paths/OrganisationSignUpForms/OrganisationSignUpFormsRootPath.php @@ -0,0 +1,23 @@ +route('/organisation-sign-up-forms') + ->operations( + StoreOrganisationSignUpFormOperation::create() + ); + } +} diff --git a/app/Docs/Schemas/OrganisationSignUpForm/StoreOrganisationSignUpFormSchema.php b/app/Docs/Schemas/OrganisationSignUpForm/StoreOrganisationSignUpFormSchema.php new file mode 100644 index 00000000..2a409b2c --- /dev/null +++ b/app/Docs/Schemas/OrganisationSignUpForm/StoreOrganisationSignUpFormSchema.php @@ -0,0 +1,94 @@ +type(static::TYPE_OBJECT) + ->required( + 'user', + 'organisation', + 'service' + ) + ->properties( + StoreUserSchema::create('user') + ->required( + ...array_filter( + StoreUserSchema::create()->required, + function (string $required): bool { + return !in_array($required, ['roles']); + } + ) + ) + ->properties( + ...array_filter( + StoreUserSchema::create()->properties, + function (Schema $property): bool { + return !in_array($property->objectId, ['roles']); + } + ) + ), + StoreOrganisationSchema::create('organisation') + ->properties( + ...array_filter( + StoreOrganisationSchema::create()->properties, + function (Schema $property): bool { + return !in_array($property->objectId, ['logo_file_id']); + } + ) + ), + StoreServiceSchema::create('service') + ->required( + ...array_filter( + StoreServiceSchema::create()->required, + function (string $required): bool { + return !in_array($required, [ + 'organisation_id', + 'status', + 'show_referral_disclaimer', + 'referral_method', + 'referral_button_text', + 'referral_email', + 'referral_url', + 'gallery_items', + 'category_taxonomies', + ]); + } + ) + ) + ->properties( + ...array_filter( + StoreServiceSchema::create()->properties, + function (Schema $property): bool { + return !in_array($property->objectId, [ + 'organisation_id', + 'status', + 'show_referral_disclaimer', + 'referral_method', + 'referral_button_text', + 'referral_email', + 'referral_url', + 'logo_file_id', + 'gallery_items', + 'category_taxonomies', + ]); + } + ) + ) + ); + } +} diff --git a/app/Docs/Schemas/UpdateRequest/UpdateRequestSchema.php b/app/Docs/Schemas/UpdateRequest/UpdateRequestSchema.php index 013e83e0..ac1da10d 100644 --- a/app/Docs/Schemas/UpdateRequest/UpdateRequestSchema.php +++ b/app/Docs/Schemas/UpdateRequest/UpdateRequestSchema.php @@ -2,6 +2,7 @@ namespace App\Docs\Schemas\UpdateRequest; +use App\Models\UpdateRequest; use GoldSpecDigital\ObjectOrientedOAS\Objects\BaseObject; use GoldSpecDigital\ObjectOrientedOAS\Objects\Schema; @@ -19,18 +20,21 @@ public static function create(string $objectId = null): BaseObject Schema::string('id') ->format(Schema::FORMAT_UUID), Schema::string('user_id') - ->format(Schema::FORMAT_UUID), + ->format(Schema::FORMAT_UUID) + ->nullable(), Schema::string('updateable_type') ->enum( - 'locations', - 'referrals', - 'services', - 'service_locations', - 'organisations', - 'users' + UpdateRequest::EXISTING_TYPE_LOCATION, + UpdateRequest::EXISTING_TYPE_REFERRAL, + UpdateRequest::EXISTING_TYPE_SERVICE, + UpdateRequest::EXISTING_TYPE_SERVICE_LOCATION, + UpdateRequest::EXISTING_TYPE_ORGANISATION, + UpdateRequest::EXISTING_TYPE_USER, + UpdateRequest::NEW_TYPE_ORGANISATION_SIGN_UP_FORM ), Schema::string('updateable_id') - ->format(Schema::FORMAT_UUID), + ->format(Schema::FORMAT_UUID) + ->nullable(), Schema::string('entry'), Schema::object('data'), Schema::string('created_at') diff --git a/app/Docs/Tags/OrganisationSignUpFormsTag.php b/app/Docs/Tags/OrganisationSignUpFormsTag.php new file mode 100644 index 00000000..36764a5f --- /dev/null +++ b/app/Docs/Tags/OrganisationSignUpFormsTag.php @@ -0,0 +1,19 @@ +name('Organisation Sign Up Forms'); + } +} diff --git a/app/Http/Controllers/Core/V1/OrganisationSignUpFormController.php b/app/Http/Controllers/Core/V1/OrganisationSignUpFormController.php new file mode 100644 index 00000000..74d9aa68 --- /dev/null +++ b/app/Http/Controllers/Core/V1/OrganisationSignUpFormController.php @@ -0,0 +1,122 @@ +middleware('guest'); + } + + /** + * @param \App\Http\Requests\OrganisationSignUpForm\StoreRequest $request + * @return \Illuminate\Http\Response + */ + public function store(StoreRequest $request) + { + return DB::transaction(function () use ($request) { + /** @var \App\Models\UpdateRequest $updateRequest */ + $updateRequest = UpdateRequest::create([ + 'updateable_type' => UpdateRequest::NEW_TYPE_ORGANISATION_SIGN_UP_FORM, + 'data' => [ + 'user' => [ + 'first_name' => $request->input('user.first_name'), + 'last_name' => $request->input('user.last_name'), + 'email' => $request->input('user.email'), + 'phone' => $request->input('user.phone'), + ], + 'organisation' => [ + 'slug' => $request->input('organisation.slug'), + 'name' => $request->input('organisation.name'), + 'description' => sanitize_markdown( + $request->input('organisation.description') + ), + 'url' => $request->input('organisation.url'), + 'email' => $request->input('organisation.email'), + 'phone' => $request->input('organisation.phone'), + ], + 'service' => [ + 'slug' => $request->input('service.slug'), + 'name' => $request->input('service.name'), + 'type' => $request->input('service.type'), + 'intro' => $request->input('service.intro'), + 'description' => sanitize_markdown( + $request->input('service.description') + ), + 'wait_time' => $request->input('service.wait_time'), + 'is_free' => $request->input('service.is_free'), + 'fees_text' => $request->input('service.fees_text'), + 'fees_url' => $request->input('service.fees_url'), + 'testimonial' => $request->input('service.testimonial'), + 'video_embed' => $request->input('service.video_embed'), + 'url' => $request->input('service.url'), + 'contact_name' => $request->input('service.contact_name'), + 'contact_phone' => $request->input('service.contact_phone'), + 'contact_email' => $request->input('service.contact_email'), + 'criteria' => [ + 'age_group' => $request->input('service.criteria.age_group'), + 'disability' => $request->input('service.criteria.disability'), + 'employment' => $request->input('service.criteria.employment'), + 'gender' => $request->input('service.criteria.gender'), + 'housing' => $request->input('service.criteria.housing'), + 'income' => $request->input('service.criteria.income'), + 'language' => $request->input('service.criteria.language'), + 'other' => $request->input('service.criteria.other'), + ], + 'useful_infos' => array_map( + function (array $usefulInfo) { + return Arr::only($usefulInfo, [ + 'title', + 'description', + 'order', + ]); + }, + $request->input('service.useful_infos') + ), + 'offerings' => array_map( + function (array $offering) { + return Arr::only($offering, [ + 'offering', + 'order', + ]); + }, + $request->input('service.offerings') + ), + 'social_medias' => array_map( + function (array $socialMedia) { + return Arr::only($socialMedia, [ + 'type', + 'url', + ]); + }, + $request->input('service.social_medias') + ), + ], + ], + ]); + + event( + EndpointHit::onCreate( + $request, + "Submitted organisation sign up form [{$updateRequest->id}]", + $updateRequest + ) + ); + + return new UpdateRequestReceived($updateRequest, Response::HTTP_CREATED); + }); + } +} diff --git a/app/Http/Controllers/Core/V1/ServiceController.php b/app/Http/Controllers/Core/V1/ServiceController.php index 90051b53..ffcc9497 100644 --- a/app/Http/Controllers/Core/V1/ServiceController.php +++ b/app/Http/Controllers/Core/V1/ServiceController.php @@ -344,7 +344,7 @@ public function update(UpdateRequest $request, Service $service) } $updateRequest = new UpdateRequestModel([ - 'updateable_type' => 'services', + 'updateable_type' => UpdateRequestModel::EXISTING_TYPE_SERVICE, 'updateable_id' => $service->id, 'user_id' => $request->user()->id, 'data' => $data, diff --git a/app/Http/Controllers/Core/V1/UpdateRequestController.php b/app/Http/Controllers/Core/V1/UpdateRequestController.php index 646d7f5d..8da25238 100644 --- a/app/Http/Controllers/Core/V1/UpdateRequestController.php +++ b/app/Http/Controllers/Core/V1/UpdateRequestController.php @@ -37,7 +37,7 @@ public function index(IndexRequest $request) $baseQuery = UpdateRequest::query() ->select('*') ->withEntry() - ->whereNull('approved_at'); + ->pending(); $updateRequests = QueryBuilder::for($baseQuery) ->allowedFilters([ diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 826b0448..84a0d0eb 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -3,6 +3,7 @@ namespace App\Http\Middleware; use Closure; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; class RedirectIfAuthenticated @@ -18,6 +19,10 @@ class RedirectIfAuthenticated public function handle($request, Closure $next, $guard = null) { if (Auth::guard($guard)->check()) { + if ($request->expectsJson()) { + abort(Response::HTTP_FORBIDDEN, 'Only guests can access this endpoint.'); + } + return redirect('/'); } diff --git a/app/Http/Requests/OrganisationSignUpForm/StoreRequest.php b/app/Http/Requests/OrganisationSignUpForm/StoreRequest.php new file mode 100644 index 00000000..166ec8c2 --- /dev/null +++ b/app/Http/Requests/OrganisationSignUpForm/StoreRequest.php @@ -0,0 +1,160 @@ + ['required', 'array'], + 'user.first_name' => ['required', 'string', 'min:1', 'max:255'], + 'user.last_name' => ['required', 'string', 'min:1', 'max:255'], + 'user.email' => ['required', 'email', 'max:255', new UserEmailNotTaken()], + 'user.phone' => ['required', 'string', 'min:1', 'max:255', new UkPhoneNumber()], + + 'organisation' => ['required', 'array'], + 'organisation.slug' => [ + 'required', + 'string', + 'min:1', + 'max:255', + 'unique:' . table(Organisation::class) . ',slug', + new Slug(), + ], + 'organisation.name' => ['required', 'string', 'min:1', 'max:255'], + 'organisation.description' => ['required', 'string', 'min:1', 'max:10000'], + 'organisation.url' => ['required', 'url', 'max:255'], + 'organisation.email' => ['required', 'email', 'max:255'], + 'organisation.phone' => ['required', 'string', 'min:1', 'max:255'], + + 'service' => ['required', 'array'], + 'service.slug' => [ + 'required', + 'string', + 'min:1', + 'max:255', + 'unique:' . table(Service::class) . ',slug', + new Slug(), + ], + 'service.name' => ['required', 'string', 'min:1', 'max:255'], + 'service.type' => [ + 'required', + Rule::in([ + Service::TYPE_SERVICE, + Service::TYPE_ACTIVITY, + Service::TYPE_CLUB, + Service::TYPE_GROUP, + ]), + ], + 'service.intro' => ['required', 'string', 'min:1', 'max:300'], + 'service.description' => [ + 'required', + 'string', + new MarkdownMinLength(1), + new MarkdownMaxLength(1600), + ], + 'service.wait_time' => ['present', 'nullable', Rule::in([ + Service::WAIT_TIME_ONE_WEEK, + Service::WAIT_TIME_TWO_WEEKS, + Service::WAIT_TIME_THREE_WEEKS, + Service::WAIT_TIME_MONTH, + Service::WAIT_TIME_LONGER, + ])], + 'service.is_free' => ['required', 'boolean'], + 'service.fees_text' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.fees_url' => ['present', 'nullable', 'url', 'max:255'], + 'service.testimonial' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.video_embed' => ['present', 'nullable', 'url', 'max:255', new VideoEmbed()], + 'service.url' => ['required', 'url', 'max:255'], + 'service.contact_name' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.contact_phone' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.contact_email' => ['present', 'nullable', 'email', 'max:255'], + 'service.criteria' => ['required', 'array'], + 'service.criteria.age_group' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.criteria.disability' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.criteria.employment' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.criteria.gender' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.criteria.housing' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.criteria.income' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.criteria.language' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.criteria.other' => ['present', 'nullable', 'string', 'min:1', 'max:255'], + 'service.useful_infos' => ['present', 'array'], + 'service.useful_infos.*' => ['array'], + 'service.useful_infos.*.title' => [ + 'required_with:service.useful_infos.*', + 'string', + 'min:1', + 'max:255', + ], + 'service.useful_infos.*.description' => [ + 'required_with:service.useful_infos.*', + 'string', + new MarkdownMinLength(1), + new MarkdownMaxLength(10000), + ], + 'service.useful_infos.*.order' => [ + 'required_with:service.useful_infos.*', + 'integer', + 'min:1', + new InOrder(array_pluck_multi($this->input('service.useful_infos'), 'order')), + ], + 'service.offerings' => ['present', 'array'], + 'service.offerings.*' => ['array'], + 'service.offerings.*.offering' => [ + 'required_with:service.offerings.*', + 'string', + 'min:1', + 'max:255', + ], + 'service.offerings.*.order' => [ + 'required_with:service.offerings.*', + 'integer', + 'min:1', + new InOrder(array_pluck_multi($this->input('service.offerings'), 'order')), + ], + 'service.social_medias' => ['present', 'array'], + 'service.social_medias.*' => ['array'], + 'service.social_medias.*.type' => ['required_with:service.social_medias.*', Rule::in([ + SocialMedia::TYPE_TWITTER, + SocialMedia::TYPE_FACEBOOK, + SocialMedia::TYPE_INSTAGRAM, + SocialMedia::TYPE_YOUTUBE, + SocialMedia::TYPE_OTHER, + ])], + 'service.social_medias.*.url' => [ + 'required_with:service.social_medias.*', + 'url', + 'max:255', + ], + ]; + } +} diff --git a/app/Listeners/Notifications/UpdateRequestApproved.php b/app/Listeners/Notifications/UpdateRequestApproved.php index a32d6d58..d186a6f6 100644 --- a/app/Listeners/Notifications/UpdateRequestApproved.php +++ b/app/Listeners/Notifications/UpdateRequestApproved.php @@ -25,7 +25,12 @@ public function handle(EndpointHit $event) return; } - $this->notifySubmitter($event->getModel()); + /** @var \App\Models\UpdateRequest $updateRequest */ + $updateRequest = $event->getModel(); + + if ($updateRequest->isExisting()) { + $this->notifySubmitter($updateRequest); + } } /** diff --git a/app/Listeners/Notifications/UpdateRequestRejected.php b/app/Listeners/Notifications/UpdateRequestRejected.php index 515601f5..678ecf64 100644 --- a/app/Listeners/Notifications/UpdateRequestRejected.php +++ b/app/Listeners/Notifications/UpdateRequestRejected.php @@ -25,7 +25,12 @@ public function handle(EndpointHit $event) return; } - $this->notifySubmitter($event->getModel()); + /** @var \App\Models\UpdateRequest $updateRequest */ + $updateRequest = $event->getModel(); + + if ($updateRequest->isExisting()) { + $this->notifySubmitter($updateRequest); + } } /** diff --git a/app/Models/Scopes/UpdateRequestScopes.php b/app/Models/Scopes/UpdateRequestScopes.php index 2079e039..bb84961c 100644 --- a/app/Models/Scopes/UpdateRequestScopes.php +++ b/app/Models/Scopes/UpdateRequestScopes.php @@ -2,11 +2,30 @@ namespace App\Models\Scopes; +use App\Models\UpdateRequest; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\DB; trait UpdateRequestScopes { + /** + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeNew(Builder $query): Builder + { + return $query->whereNull('updateable_id'); + } + + /** + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeExisting(Builder $query): Builder + { + return $query->whereNotNull('updateable_id'); + } + /** * @param \Illuminate\Database\Eloquent\Builder $query * @param int $id @@ -17,7 +36,7 @@ public function scopeServiceId(Builder $query, $id): Builder $ids = explode(',', $id); return $query - ->where('updateable_type', 'services') + ->where('updateable_type', UpdateRequest::EXISTING_TYPE_SERVICE) ->whereIn('updateable_id', $ids); } @@ -31,7 +50,7 @@ public function scopeServiceLocationId(Builder $query, $id): Builder $ids = explode(',', $id); return $query - ->where('updateable_type', 'service_locations') + ->where('updateable_type', UpdateRequest::EXISTING_TYPE_SERVICE_LOCATION) ->whereIn('updateable_id', $ids); } @@ -45,7 +64,7 @@ public function scopeLocationId(Builder $query, $id): Builder $ids = explode(',', $id); return $query - ->where('updateable_type', 'locations') + ->where('updateable_type', UpdateRequest::EXISTING_TYPE_LOCATION) ->whereIn('updateable_id', $ids); } @@ -59,7 +78,7 @@ public function scopeOrganisationId(Builder $query, $id): Builder $ids = explode(',', $id); return $query - ->where('updateable_type', 'organisations') + ->where('updateable_type', UpdateRequest::EXISTING_TYPE_ORGANISATION) ->whereIn('updateable_id', $ids); } @@ -81,33 +100,42 @@ public function scopeWithEntry(Builder $query, string $alias = 'entry'): Builder */ public function getEntrySql(): string { - return <<<'EOT' + $services = UpdateRequest::EXISTING_TYPE_SERVICE; + $locations = UpdateRequest::EXISTING_TYPE_LOCATION; + $serviceLocations = UpdateRequest::EXISTING_TYPE_SERVICE_LOCATION; + $organisations = UpdateRequest::EXISTING_TYPE_ORGANISATION; + $organisationSignUpForm = UpdateRequest::NEW_TYPE_ORGANISATION_SIGN_UP_FORM; + + return <<>"$.organisation.name" + ) END EOT; } diff --git a/app/Models/UpdateRequest.php b/app/Models/UpdateRequest.php index 9e32139f..4c2a7834 100644 --- a/app/Models/UpdateRequest.php +++ b/app/Models/UpdateRequest.php @@ -8,8 +8,10 @@ use App\UpdateRequest\AppliesUpdateRequests; use Exception; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\Date; use Illuminate\Support\MessageBag; +use Illuminate\Support\Str; class UpdateRequest extends Model { @@ -18,6 +20,15 @@ class UpdateRequest extends Model use UpdateRequestRelationships; use UpdateRequestScopes; + const EXISTING_TYPE_LOCATION = 'locations'; + const EXISTING_TYPE_REFERRAL = 'referrals'; + const EXISTING_TYPE_SERVICE = 'services'; + const EXISTING_TYPE_SERVICE_LOCATION = 'service_locations'; + const EXISTING_TYPE_ORGANISATION = 'organisations'; + const EXISTING_TYPE_USER = 'users'; + + const NEW_TYPE_ORGANISATION_SIGN_UP_FORM = 'organisation_sign_up_form'; + /** * The attributes that should be cast to native types. * @@ -30,6 +41,22 @@ class UpdateRequest extends Model 'deleted_at' => 'datetime', ]; + /** + * @return bool + */ + public function isNew(): bool + { + return $this->updateable_id === null; + } + + /** + * @return bool + */ + public function isExisting(): bool + { + return !$this->isNew(); + } + /** * @throws \Exception * @return \Illuminate\Support\MessageBag @@ -37,7 +64,13 @@ class UpdateRequest extends Model public function getValidationErrors(): MessageBag { if (!$this->updateable instanceof AppliesUpdateRequests) { - throw new Exception(sprintf('[%s] must be an instance of %s', get_class($this->updateable), AppliesUpdateRequests::class)); + throw new Exception( + sprintf( + '[%s] must be an instance of %s', + get_class($this->updateable), + AppliesUpdateRequests::class + ) + ); } return $this->updateable->validateUpdateRequest($this)->errors(); @@ -49,11 +82,21 @@ public function getValidationErrors(): MessageBag */ public function validate(): bool { - if (!$this->updateable instanceof AppliesUpdateRequests) { - throw new Exception(sprintf('[%s] must be an instance of %s', get_class($this->updateable), AppliesUpdateRequests::class)); + $updateable = $this->isExisting() + ? $this->updateable + : $this->createUpdateableInstance($this->updateable_type); + + if (!$updateable instanceof AppliesUpdateRequests) { + throw new Exception( + sprintf( + '[%s] must be an instance of %s', + get_class($updateable), + AppliesUpdateRequests::class + ) + ); } - return $this->updateable->validateUpdateRequest($this)->fails() === false; + return $updateable->validateUpdateRequest($this)->fails() === false; } /** @@ -62,13 +105,44 @@ public function validate(): bool */ public function apply(): self { - if (!$this->updateable instanceof AppliesUpdateRequests) { - throw new Exception(sprintf('[%s] must be an instance of %s', get_class($this->updateable), AppliesUpdateRequests::class)); + $updateable = $this->isExisting() + ? $this->updateable + : $this->createUpdateableInstance($this->updateable_type); + + if (!$updateable instanceof AppliesUpdateRequests) { + throw new Exception( + sprintf( + '[%s] must be an instance of %s', + get_class($updateable), + AppliesUpdateRequests::class + ) + ); } - $this->updateable->applyUpdateRequest($this); + $updateable->applyUpdateRequest($this); $this->update(['approved_at' => Date::now()]); return $this; } + + /** + * @param string $updateableType + * @return \App\UpdateRequest\AppliesUpdateRequests + */ + protected function createUpdateableInstance(string $updateableType): AppliesUpdateRequests + { + $className = '\\App\\UpdateRequest\\' . Str::studly($updateableType); + + return resolve($className); + } + + /** + * @param string $key + * @param mixed|null $default + * @return mixed + */ + public function getFromData(string $key, $default = null) + { + return Arr::get($this->data, $key, $default); + } } diff --git a/app/Observers/UpdateRequestObserver.php b/app/Observers/UpdateRequestObserver.php index 4eec4f23..d6e78017 100644 --- a/app/Observers/UpdateRequestObserver.php +++ b/app/Observers/UpdateRequestObserver.php @@ -22,9 +22,11 @@ class UpdateRequestObserver */ public function created(UpdateRequest $updateRequest) { - $this->sendCreatedNotifications($updateRequest); - $this->removeSameFieldsForPending($updateRequest); - $this->deleteEmptyPending($updateRequest); + if ($updateRequest->isExisting()) { + $this->sendCreatedNotificationsForExisting($updateRequest); + $this->removeSameFieldsForPendingAndExisting($updateRequest); + $this->deleteEmptyPendingForExisting($updateRequest); + } } /** @@ -33,7 +35,7 @@ public function created(UpdateRequest $updateRequest) * * @param \App\Models\UpdateRequest $updateRequest */ - protected function removeSameFieldsForPending(UpdateRequest $updateRequest) + protected function removeSameFieldsForPendingAndExisting(UpdateRequest $updateRequest) { // Skip if there is no data in the update request. if (count($updateRequest->data) === 0) { @@ -56,6 +58,7 @@ protected function removeSameFieldsForPending(UpdateRequest $updateRequest) ->where('updateable_type', '=', $updateRequest->updateable_type) ->where('updateable_id', '=', $updateRequest->updateable_id) ->where('id', '!=', $updateRequest->id) + ->existing() ->pending() ->update(['data' => DB::raw("JSON_REMOVE(`update_requests`.`data`, {$implodedDataKeys})")]); } @@ -67,13 +70,14 @@ protected function removeSameFieldsForPending(UpdateRequest $updateRequest) * * @param \App\Models\UpdateRequest $updateRequest */ - protected function deleteEmptyPending(UpdateRequest $updateRequest) + protected function deleteEmptyPendingForExisting(UpdateRequest $updateRequest) { // Uses JSON_DEPTH to determine if the data object is empty (depth of 1). UpdateRequest::query() ->where('updateable_type', '=', $updateRequest->updateable_type) ->where('updateable_id', '=', $updateRequest->updateable_id) ->whereRaw('JSON_DEPTH(`update_requests`.`data`) = ?', [1]) + ->existing() ->pending() ->delete(); } @@ -81,7 +85,7 @@ protected function deleteEmptyPending(UpdateRequest $updateRequest) /** * @param \App\Models\UpdateRequest $updateRequest */ - protected function sendCreatedNotifications(UpdateRequest $updateRequest) + protected function sendCreatedNotificationsForExisting(UpdateRequest $updateRequest) { $resourceName = null; $resourceType = null; diff --git a/app/Providers/ModelServiceProvider.php b/app/Providers/ModelServiceProvider.php index 96510c2f..7a469af2 100644 --- a/app/Providers/ModelServiceProvider.php +++ b/app/Providers/ModelServiceProvider.php @@ -51,12 +51,12 @@ public function boot() UpdateRequest::observe(UpdateRequestObserver::class); Relation::morphMap([ - 'locations' => Location::class, - 'referrals' => Referral::class, - 'services' => Service::class, - 'service_locations' => ServiceLocation::class, - 'organisations' => Organisation::class, - 'users' => User::class, + UpdateRequest::EXISTING_TYPE_LOCATION => Location::class, + UpdateRequest::EXISTING_TYPE_REFERRAL => Referral::class, + UpdateRequest::EXISTING_TYPE_SERVICE => Service::class, + UpdateRequest::EXISTING_TYPE_SERVICE_LOCATION => ServiceLocation::class, + UpdateRequest::EXISTING_TYPE_ORGANISATION => Organisation::class, + UpdateRequest::EXISTING_TYPE_USER => User::class, ]); } diff --git a/app/Rules/Password.php b/app/Rules/Password.php index 2a83226d..0cd01521 100644 --- a/app/Rules/Password.php +++ b/app/Rules/Password.php @@ -57,7 +57,7 @@ protected function regex(): string */ protected function escapedSpecialCharacters(): string { - $characters = str_split(static::ALLOWED_SPECIAL_CHARACTERS); + $characters = mb_str_split(static::ALLOWED_SPECIAL_CHARACTERS); return collect($characters) ->map(function (string $character) { diff --git a/app/UpdateRequest/OrganisationSignUpForm.php b/app/UpdateRequest/OrganisationSignUpForm.php new file mode 100644 index 00000000..b0e94b52 --- /dev/null +++ b/app/UpdateRequest/OrganisationSignUpForm.php @@ -0,0 +1,132 @@ +merge($updateRequest->data) + ->rules(); + + return ValidatorFacade::make($updateRequest->data, $rules); + } + + /** + * Apply the update request. + * + * @param \App\Models\UpdateRequest $updateRequest + * @return \App\Models\UpdateRequest + */ + public function applyUpdateRequest(UpdateRequest $updateRequest): UpdateRequest + { + /** @var \App\Models\User $user */ + $user = User::create([ + 'first_name' => $updateRequest->getFromData('user.first_name'), + 'last_name' => $updateRequest->getFromData('user.last_name'), + 'email' => $updateRequest->getFromData('user.email'), + 'phone' => $updateRequest->getFromData('user.phone'), + 'password' => bcrypt(Str::random()), + ]); + + /** @var \App\Models\Organisation $organisation */ + $organisation = Organisation::create([ + 'slug' => $updateRequest->getFromData('organisation.slug'), + 'name' => $updateRequest->getFromData('organisation.name'), + 'description' => sanitize_markdown( + $updateRequest->getFromData('organisation.description') + ), + 'url' => $updateRequest->getFromData('organisation.url'), + 'email' => $updateRequest->getFromData('organisation.email'), + 'phone' => $updateRequest->getFromData('organisation.phone'), + ]); + + /** @var \App\Models\Service $service */ + $service = Service::create([ + 'organisation_id' => $organisation->id, + 'slug' => $updateRequest->getFromData('service.slug'), + 'name' => $updateRequest->getFromData('service.name'), + 'type' => $updateRequest->getFromData('service.type'), + 'status' => Service::STATUS_INACTIVE, + 'intro' => $updateRequest->getFromData('service.intro'), + 'description' => sanitize_markdown( + $updateRequest->getFromData('service.description') + ), + 'wait_time' => $updateRequest->getFromData('service.wait_time'), + 'is_free' => $updateRequest->getFromData('service.is_free'), + 'fees_text' => $updateRequest->getFromData('service.fees_text'), + 'fees_url' => $updateRequest->getFromData('service.fees_url'), + 'testimonial' => $updateRequest->getFromData('service.testimonial'), + 'video_embed' => $updateRequest->getFromData('service.video_embed'), + 'url' => $updateRequest->getFromData('service.url'), + 'contact_name' => $updateRequest->getFromData('service.contact_name'), + 'contact_phone' => $updateRequest->getFromData('service.contact_phone'), + 'contact_email' => $updateRequest->getFromData('service.contact_email'), + 'show_referral_disclaimer' => false, + 'referral_method' => Service::REFERRAL_METHOD_NONE, + 'referral_button_text' => null, + 'referral_email' => null, + 'referral_url' => null, + 'logo_file_id' => null, + 'last_modified_at' => Date::now(), + ]); + + // Create the service criterion record. + $service->serviceCriterion()->create([ + 'age_group' => $updateRequest->getFromData('service.criteria.age_group'), + 'disability' => $updateRequest->getFromData('service.criteria.disability'), + 'employment' => $updateRequest->getFromData('service.criteria.employment'), + 'gender' => $updateRequest->getFromData('service.criteria.gender'), + 'housing' => $updateRequest->getFromData('service.criteria.housing'), + 'income' => $updateRequest->getFromData('service.criteria.income'), + 'language' => $updateRequest->getFromData('service.criteria.language'), + 'other' => $updateRequest->getFromData('service.criteria.other'), + ]); + + // Create the useful info records. + foreach ($updateRequest->getFromData('service.useful_infos') as $usefulInfo) { + $service->usefulInfos()->create([ + 'title' => $usefulInfo['title'], + 'description' => sanitize_markdown($usefulInfo['description']), + 'order' => $usefulInfo['order'], + ]); + } + + // Create the offering records. + foreach ($updateRequest->getFromData('service.offerings') as $offering) { + $service->offerings()->create([ + 'offering' => $offering['offering'], + 'order' => $offering['order'], + ]); + } + + // Create the social media records. + foreach ($updateRequest->getFromData('service.social_medias') as $socialMedia) { + $service->socialMedias()->create([ + 'type' => $socialMedia['type'], + 'url' => $socialMedia['url'], + ]); + } + + $user->makeOrganisationAdmin($organisation->load('services')); + + return $updateRequest; + } +} diff --git a/composer.lock b/composer.lock index 49dcd79f..c836cf61 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5d8f6614b6380523108570fe30e4f603", + "content-hash": "b4b3139fdda2083a6e0a9cc8bcb51050", "packages": [ { "name": "alphagov/notifications-php-client", @@ -116,16 +116,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.108.4", + "version": "3.109.7", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "8ac2bc5d36ed0e3fe9b0ecdd2f407b91273b86e8" + "reference": "e8d3416f9b1e21029fc0eb63df075e325c690187" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8ac2bc5d36ed0e3fe9b0ecdd2f407b91273b86e8", - "reference": "8ac2bc5d36ed0e3fe9b0ecdd2f407b91273b86e8", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/e8d3416f9b1e21029fc0eb63df075e325c690187", + "reference": "e8d3416f9b1e21029fc0eb63df075e325c690187", "shasum": "" }, "require": { @@ -195,7 +195,7 @@ "s3", "sdk" ], - "time": "2019-08-05T18:08:07+00:00" + "time": "2019-08-19T18:08:45+00:00" }, { "name": "babenkoivan/scout-elasticsearch-driver", @@ -1065,16 +1065,16 @@ }, { "name": "egulias/email-validator", - "version": "2.1.10", + "version": "2.1.11", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec" + "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec", - "reference": "a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/92dd169c32f6f55ba570c309d83f5209cefb5e23", + "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23", "shasum": "" }, "require": { @@ -1093,7 +1093,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.1.x-dev" } }, "autoload": { @@ -1119,7 +1119,7 @@ "validation", "validator" ], - "time": "2019-07-19T20:52:08+00:00" + "time": "2019-08-13T17:33:27+00:00" }, { "name": "elasticsearch/elasticsearch", @@ -1750,16 +1750,16 @@ }, { "name": "laravel/framework", - "version": "v5.8.30", + "version": "v5.8.32", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "7ccf0cf63931a8d8391aed90e6fc011381ea6838" + "reference": "ee16d719516dfd77ed6c9538000bca49ded284e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/7ccf0cf63931a8d8391aed90e6fc011381ea6838", - "reference": "7ccf0cf63931a8d8391aed90e6fc011381ea6838", + "url": "https://api.github.com/repos/laravel/framework/zipball/ee16d719516dfd77ed6c9538000bca49ded284e2", + "reference": "ee16d719516dfd77ed6c9538000bca49ded284e2", "shasum": "" }, "require": { @@ -1893,7 +1893,7 @@ "framework", "laravel" ], - "time": "2019-07-30T14:08:47+00:00" + "time": "2019-08-13T14:11:52+00:00" }, { "name": "laravel/passport", @@ -2031,16 +2031,16 @@ }, { "name": "laravel/tinker", - "version": "v1.0.9", + "version": "v1.0.10", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "eb0075527fdeeb1cc1d68bd4ca7d50256b30a827" + "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/eb0075527fdeeb1cc1d68bd4ca7d50256b30a827", - "reference": "eb0075527fdeeb1cc1d68bd4ca7d50256b30a827", + "url": "https://api.github.com/repos/laravel/tinker/zipball/ad571aacbac1539c30d480908f9d0c9614eaf1a7", + "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7", "shasum": "" }, "require": { @@ -2090,7 +2090,7 @@ "laravel", "psysh" ], - "time": "2019-07-29T18:09:25+00:00" + "time": "2019-08-07T15:10:45+00:00" }, { "name": "lcobucci/jwt", @@ -2705,16 +2705,16 @@ }, { "name": "nesbot/carbon", - "version": "2.22.0", + "version": "2.23.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "1a0e48b5f656065ba3c265b058b25d36c2162a5e" + "reference": "767617a047e5b8b8b3b0b6023a2650847ed7df02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/1a0e48b5f656065ba3c265b058b25d36c2162a5e", - "reference": "1a0e48b5f656065ba3c265b058b25d36c2162a5e", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/767617a047e5b8b8b3b0b6023a2650847ed7df02", + "reference": "767617a047e5b8b8b3b0b6023a2650847ed7df02", "shasum": "" }, "require": { @@ -2761,27 +2761,27 @@ "homepage": "http://github.com/kylekatarnls" } ], - "description": "A simple API extension for DateTime.", + "description": "A API extension for DateTime that supports 281 different languages.", "homepage": "http://carbon.nesbot.com", "keywords": [ "date", "datetime", "time" ], - "time": "2019-07-28T09:02:12+00:00" + "time": "2019-08-17T13:57:34+00:00" }, { "name": "nikic/php-parser", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bd73cc04c3843ad8d6b0bfc0956026a151fc420" + "reference": "e612609022e935f3d0337c1295176505b41188c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bd73cc04c3843ad8d6b0bfc0956026a151fc420", - "reference": "1bd73cc04c3843ad8d6b0bfc0956026a151fc420", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/e612609022e935f3d0337c1295176505b41188c8", + "reference": "e612609022e935f3d0337c1295176505b41188c8", "shasum": "" }, "require": { @@ -2789,7 +2789,7 @@ "php": ">=7.0" }, "require-dev": { - "phpunit/phpunit": "^6.5 || ^7.0" + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" }, "bin": [ "bin/php-parse" @@ -2819,7 +2819,7 @@ "parser", "php" ], - "time": "2019-05-25T20:07:01+00:00" + "time": "2019-08-12T20:17:41+00:00" }, { "name": "opis/closure", @@ -3095,16 +3095,16 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "1.8.2", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "0c1346a1956347590b7db09533966307d20cb7cc" + "reference": "8dea03eaf60a349b6097e4bcad11f894668280df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/0c1346a1956347590b7db09533966307d20cb7cc", - "reference": "0c1346a1956347590b7db09533966307d20cb7cc", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/8dea03eaf60a349b6097e4bcad11f894668280df", + "reference": "8dea03eaf60a349b6097e4bcad11f894668280df", "shasum": "" }, "require": { @@ -3123,17 +3123,16 @@ "ext-zlib": "*", "markbaker/complex": "^1.4", "markbaker/matrix": "^1.1", - "php": "^5.6|^7.0", + "php": "^7.1", "psr/simple-cache": "^1.0" }, "require-dev": { - "doctrine/instantiator": "^1.0.0", "dompdf/dompdf": "^0.8.0", "friendsofphp/php-cs-fixer": "@stable", "jpgraph/jpgraph": "^4.0", "mpdf/mpdf": "^7.0.0", "phpcompatibility/php-compatibility": "^8.0", - "phpunit/phpunit": "^5.7", + "phpunit/phpunit": "^7.5", "squizlabs/php_codesniffer": "^3.3", "tecnickcom/tcpdf": "^6.2" }, @@ -3154,12 +3153,6 @@ "LGPL-2.1-or-later" ], "authors": [ - { - "name": "Erik Tilt" - }, - { - "name": "Adrien Crivelli" - }, { "name": "Maarten Balliauw", "homepage": "https://blog.maartenballiauw.be" @@ -3171,6 +3164,12 @@ { "name": "Franck Lefevre", "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" } ], "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", @@ -3185,7 +3184,7 @@ "xls", "xlsx" ], - "time": "2019-07-08T21:21:25+00:00" + "time": "2019-08-17T22:24:35+00:00" }, { "name": "phpoption/phpoption", @@ -4504,16 +4503,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "82ebae02209c21113908c229e9883c419720738a" + "reference": "550ebaac289296ce228a706d0867afc34687e3f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", - "reference": "82ebae02209c21113908c229e9883c419720738a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4", + "reference": "550ebaac289296ce228a706d0867afc34687e3f4", "shasum": "" }, "require": { @@ -4525,7 +4524,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -4541,13 +4540,13 @@ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", @@ -4558,20 +4557,20 @@ "polyfill", "portable" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "f037ea22acfaee983e271dd9c3b8bb4150bd8ad7" + "reference": "685968b11e61a347c18bf25db32effa478be610f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/f037ea22acfaee983e271dd9c3b8bb4150bd8ad7", - "reference": "f037ea22acfaee983e271dd9c3b8bb4150bd8ad7", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/685968b11e61a347c18bf25db32effa478be610f", + "reference": "685968b11e61a347c18bf25db32effa478be610f", "shasum": "" }, "require": { @@ -4583,7 +4582,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -4617,20 +4616,20 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af" + "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c766e95bec706cdd89903b1eda8afab7d7a6b7af", - "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", + "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", "shasum": "" }, "require": { @@ -4644,7 +4643,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -4660,13 +4659,13 @@ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, { "name": "Laurent Bassin", "email": "laurent@bassin.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", @@ -4679,20 +4678,20 @@ "portable", "shim" ], - "time": "2019-03-04T13:44:35+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" + "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17", + "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17", "shasum": "" }, "require": { @@ -4704,7 +4703,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -4738,20 +4737,20 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c" + "reference": "04ce3335667451138df4307d6a9b61565560199e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/ab50dcf166d5f577978419edd37aa2bb8eabce0c", - "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/04ce3335667451138df4307d6a9b61565560199e", + "reference": "04ce3335667451138df4307d6a9b61565560199e", "shasum": "" }, "require": { @@ -4760,7 +4759,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -4793,20 +4792,20 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "d1fb4abcc0c47be136208ad9d68bf59f1ee17abd" + "reference": "2ceb49eaccb9352bff54d22570276bb75ba4a188" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/d1fb4abcc0c47be136208ad9d68bf59f1ee17abd", - "reference": "d1fb4abcc0c47be136208ad9d68bf59f1ee17abd", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/2ceb49eaccb9352bff54d22570276bb75ba4a188", + "reference": "2ceb49eaccb9352bff54d22570276bb75ba4a188", "shasum": "" }, "require": { @@ -4815,7 +4814,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -4851,7 +4850,7 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/process", @@ -5470,16 +5469,16 @@ }, { "name": "zendframework/zend-diactoros", - "version": "1.8.6", + "version": "1.8.7", "source": { "type": "git", "url": "https://github.com/zendframework/zend-diactoros.git", - "reference": "20da13beba0dde8fb648be3cc19765732790f46e" + "reference": "a85e67b86e9b8520d07e6415fcbcb8391b44a75b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/20da13beba0dde8fb648be3cc19765732790f46e", - "reference": "20da13beba0dde8fb648be3cc19765732790f46e", + "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/a85e67b86e9b8520d07e6415fcbcb8391b44a75b", + "reference": "a85e67b86e9b8520d07e6415fcbcb8391b44a75b", "shasum": "" }, "require": { @@ -5499,9 +5498,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8.x-dev", - "dev-develop": "1.9.x-dev", - "dev-release-2.0": "2.0.x-dev" + "dev-release-1.8": "1.8.x-dev" } }, "autoload": { @@ -5530,28 +5527,28 @@ "psr", "psr-7" ], - "time": "2018-09-05T19:29:37+00:00" + "time": "2019-08-06T17:53:53+00:00" } ], "packages-dev": [ { "name": "beyondcode/laravel-dump-server", - "version": "1.2.2", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/beyondcode/laravel-dump-server.git", - "reference": "8864b9efcb48e0a79e83014dd7f0a5481f5c808f" + "reference": "fcc88fa66895f8c1ff83f6145a5eff5fa2a0739a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/beyondcode/laravel-dump-server/zipball/8864b9efcb48e0a79e83014dd7f0a5481f5c808f", - "reference": "8864b9efcb48e0a79e83014dd7f0a5481f5c808f", + "url": "https://api.github.com/repos/beyondcode/laravel-dump-server/zipball/fcc88fa66895f8c1ff83f6145a5eff5fa2a0739a", + "reference": "fcc88fa66895f8c1ff83f6145a5eff5fa2a0739a", "shasum": "" }, "require": { - "illuminate/console": "5.6.*|5.7.*|5.8.*", - "illuminate/http": "5.6.*|5.7.*|5.8.*", - "illuminate/support": "5.6.*|5.7.*|5.8.*", + "illuminate/console": "5.6.*|5.7.*|5.8.*|^6.0", + "illuminate/http": "5.6.*|5.7.*|5.8.*|^6.0", + "illuminate/support": "5.6.*|5.7.*|5.8.*|^6.0", "php": "^7.1", "symfony/var-dumper": "^4.1.1" }, @@ -5582,9 +5579,9 @@ "authors": [ { "name": "Marcel Pociot", + "role": "Developer", "email": "marcel@beyondco.de", - "homepage": "https://beyondcode.de", - "role": "Developer" + "homepage": "https://beyondco.de" } ], "description": "Symfony Var-Dump Server for Laravel", @@ -5593,7 +5590,7 @@ "beyondcode", "laravel-dump-server" ], - "time": "2018-10-04T07:22:24+00:00" + "time": "2019-08-11T13:17:40+00:00" }, { "name": "composer/semver", @@ -5703,16 +5700,16 @@ }, { "name": "doctrine/annotations", - "version": "v1.6.1", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "53120e0eb10355388d6ccbe462f1fea34ddadb24" + "reference": "fa4c4e861e809d6a1103bd620cce63ed91aedfeb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/53120e0eb10355388d6ccbe462f1fea34ddadb24", - "reference": "53120e0eb10355388d6ccbe462f1fea34ddadb24", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/fa4c4e861e809d6a1103bd620cce63ed91aedfeb", + "reference": "fa4c4e861e809d6a1103bd620cce63ed91aedfeb", "shasum": "" }, "require": { @@ -5721,12 +5718,12 @@ }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "^6.4" + "phpunit/phpunit": "^7.5@dev" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "1.7.x-dev" } }, "autoload": { @@ -5739,6 +5736,10 @@ "MIT" ], "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, { "name": "Roman Borschel", "email": "roman@code-factory.org" @@ -5747,10 +5748,6 @@ "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, { "name": "Jonathan Wage", "email": "jonwage@gmail.com" @@ -5767,7 +5764,7 @@ "docblock", "parser" ], - "time": "2019-03-25T19:12:02+00:00" + "time": "2019-08-08T18:11:40+00:00" }, { "name": "doctrine/instantiator", @@ -5827,16 +5824,16 @@ }, { "name": "filp/whoops", - "version": "2.4.1", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "6fb502c23885701a991b0bba974b1a8eb6673577" + "reference": "cde50e6720a39fdacb240159d3eea6865d51fd96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/6fb502c23885701a991b0bba974b1a8eb6673577", - "reference": "6fb502c23885701a991b0bba974b1a8eb6673577", + "url": "https://api.github.com/repos/filp/whoops/zipball/cde50e6720a39fdacb240159d3eea6865d51fd96", + "reference": "cde50e6720a39fdacb240159d3eea6865d51fd96", "shasum": "" }, "require": { @@ -5870,8 +5867,8 @@ "authors": [ { "name": "Filipe Dobreira", - "homepage": "https://github.com/filp", - "role": "Developer" + "role": "Developer", + "homepage": "https://github.com/filp" } ], "description": "php error handling for cool kids", @@ -5884,7 +5881,7 @@ "throwable", "whoops" ], - "time": "2019-07-04T09:00:00+00:00" + "time": "2019-08-07T09:00:00+00:00" }, { "name": "friendsofphp/php-cs-fixer", @@ -6074,16 +6071,16 @@ }, { "name": "mockery/mockery", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2" + "reference": "4eff936d83eb809bde2c57a3cea0ee9643769031" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2", - "reference": "0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2", + "url": "https://api.github.com/repos/mockery/mockery/zipball/4eff936d83eb809bde2c57a3cea0ee9643769031", + "reference": "4eff936d83eb809bde2c57a3cea0ee9643769031", "shasum": "" }, "require": { @@ -6135,20 +6132,20 @@ "test double", "testing" ], - "time": "2019-02-13T09:37:52+00:00" + "time": "2019-08-07T15:01:07+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.9.1", + "version": "1.9.3", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72" + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", - "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/007c053ae6f31bba39dfa19a7726f56e9763bbea", + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea", "shasum": "" }, "require": { @@ -6183,7 +6180,7 @@ "object", "object graph" ], - "time": "2019-04-07T13:18:21+00:00" + "time": "2019-08-09T12:45:53+00:00" }, { "name": "nunomaduro/collision", @@ -6921,16 +6918,16 @@ }, { "name": "phpunit/phpunit", - "version": "8.3.3", + "version": "8.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c319d08ebd31e137034c84ad7339054709491485" + "reference": "e31cce0cf4499c0ccdbbb211a3280d36ab341e36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c319d08ebd31e137034c84ad7339054709491485", - "reference": "c319d08ebd31e137034c84ad7339054709491485", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e31cce0cf4499c0ccdbbb211a3280d36ab341e36", + "reference": "e31cce0cf4499c0ccdbbb211a3280d36ab341e36", "shasum": "" }, "require": { @@ -7000,7 +6997,7 @@ "testing", "xunit" ], - "time": "2019-08-03T15:41:47+00:00" + "time": "2019-08-11T06:56:55+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -7222,16 +7219,16 @@ }, { "name": "sebastian/exporter", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" + "reference": "06a9a5947f47b3029d76118eb5c22802e5869687" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/06a9a5947f47b3029d76118eb5c22802e5869687", + "reference": "06a9a5947f47b3029d76118eb5c22802e5869687", "shasum": "" }, "require": { @@ -7258,6 +7255,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -7266,17 +7267,13 @@ "name": "Volker Dusch", "email": "github@wallbash.com" }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, { "name": "Adam Harvey", "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], "description": "Provides the functionality to export PHP variables for visualization", @@ -7285,7 +7282,7 @@ "export", "exporter" ], - "time": "2017-04-03T13:19:02+00:00" + "time": "2019-08-11T12:43:14+00:00" }, { "name": "sebastian/global-state", @@ -7723,16 +7720,16 @@ }, { "name": "symfony/polyfill-php70", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "bc4858fb611bda58719124ca079baff854149c89" + "reference": "54b4c428a0054e254223797d2713c31e08610831" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/bc4858fb611bda58719124ca079baff854149c89", - "reference": "bc4858fb611bda58719124ca079baff854149c89", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/54b4c428a0054e254223797d2713c31e08610831", + "reference": "54b4c428a0054e254223797d2713c31e08610831", "shasum": "" }, "require": { @@ -7742,7 +7739,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -7778,7 +7775,7 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/stopwatch", @@ -7928,7 +7925,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^7.2.0", + "php": "~7.2.0", "ext-gd": "*", "ext-json": "*", "ext-pdo": "*" diff --git a/database/diagrams/ERD.mwb b/database/diagrams/ERD.mwb index bf82eb0949645afcb1dcde2dcb843249a9453aff..70d487a2f6d6748ac00df0077c7de321d3995e73 100644 GIT binary patch literal 68141 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

`MUelz|zx&SV;3 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 P^{gyx&77R=Y~lVNaxPs1 literal 67858 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

vRddn}l0r2S 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 diff --git a/database/migrations/2019_08_20_150238_make_updateable_id_column_nullable_on_update_requests_table.php b/database/migrations/2019_08_20_150238_make_updateable_id_column_nullable_on_update_requests_table.php new file mode 100644 index 00000000..11953dd5 --- /dev/null +++ b/database/migrations/2019_08_20_150238_make_updateable_id_column_nullable_on_update_requests_table.php @@ -0,0 +1,23 @@ +namespace('Core\\V1')->name('core.v1.')->group(function () { - // Audits. - Route::match(['GET', 'POST'], '/audits/index', 'AuditController@index'); - Route::apiResource('/audits', 'AuditController')->only('index', 'show'); - - // Collection Categories. - Route::match(['GET', 'POST'], '/collections/categories/index', 'CollectionCategoryController@index'); - Route::apiResource('/collections/categories', 'CollectionCategoryController') - ->parameter('categories', 'collection') - ->names([ - 'index' => 'collection-categories.index', - 'store' => 'collection-categories.store', - 'show' => 'collection-categories.show', - 'update' => 'collection-categories.update', - 'destroy' => 'collection-categories.destroy', - ]); - - // Collection Personas. - Route::match(['GET', 'POST'], '/collections/personas/index', 'CollectionPersonaController@index'); - Route::apiResource('/collections/personas', 'CollectionPersonaController') - ->parameter('personas', 'collection') - ->names([ - 'index' => 'collection-personas.index', - 'store' => 'collection-personas.store', - 'show' => 'collection-personas.show', - 'update' => 'collection-personas.update', - 'destroy' => 'collection-personas.destroy', - ]); - Route::get('/collections/personas/{collection}/image.png', 'CollectionPersona\\ImageController')->name('collection-personas.image'); - - // Files. - Route::apiResource('/files', 'FileController')->only('store'); - - // Locations. - Route::match(['GET', 'POST'], '/locations/index', 'LocationController@index'); - Route::apiResource('/locations', 'LocationController'); - Route::get('/locations/{location}/image.png', 'Location\\ImageController')->name('locations.image'); - - // Notifications. - Route::match(['GET', 'POST'], '/notifications/index', 'NotificationController@index'); - Route::apiResource('/notifications', 'NotificationController')->only('index', 'show'); - - // Organisations. - Route::match(['GET', 'POST'], '/organisations/index', 'OrganisationController@index'); - Route::apiResource('/organisations', 'OrganisationController'); - Route::get('/organisations/{organisation}/logo.png', 'Organisation\\LogoController')->name('organisations.logo'); - - // Page Feedbacks. - Route::match(['GET', 'POST'], '/page-feedbacks/index', 'PageFeedbackController@index'); - Route::apiResource('/page-feedbacks', 'PageFeedbackController')->only('index', 'store', 'show'); - - // Referrals. - Route::match(['GET', 'POST'], '/referrals/index', 'ReferralController@index'); - Route::apiResource('/referrals', 'ReferralController'); - - // Report Schedules. - Route::match(['GET', 'POST'], '/report-schedules/index', 'ReportScheduleController@index'); - Route::apiResource('/report-schedules', 'ReportScheduleController'); - - // Reports. - Route::match(['GET', 'POST'], '/reports/index', 'ReportController@index'); - Route::apiResource('/reports', 'ReportController')->only('index', 'store', 'show', 'destroy'); - Route::get('/reports/{report}/download', 'Report\\DownloadController@show')->name('reports.download'); - - // Search. - Route::post('/search', 'SearchController')->name('search'); - - // Service Locations. - Route::match(['GET', 'POST'], '/service-locations/index', 'ServiceLocationController@index'); - Route::apiResource('/service-locations', 'ServiceLocationController'); - Route::get('/service-locations/{service_location}/image.png', 'ServiceLocation\\ImageController')->name('service-locations.image'); - - // Services. - Route::match(['GET', 'POST'], '/services/index', 'ServiceController@index'); - Route::apiResource('/services', 'ServiceController'); - Route::put('/services/{service}/refresh', 'Service\\RefreshController')->name('services.refresh'); - Route::get('/services/{service}/related', 'Service\\RelatedController')->name('services.related'); - Route::get('/services/{service}/logo.png', 'Service\\LogoController')->name('services.logo'); - Route::get('/services/{service}/gallery-items/{file}', 'Service\\GalleryItemController')->name('services.gallery-items'); - - // Settings. - Route::get('/settings', 'SettingController@index')->name('settings.index'); - Route::put('/settings', 'SettingController@update')->name('settings.update'); - - // Status Updates. - Route::match(['GET', 'POST'], '/status-updates/index', 'StatusUpdateController@index'); - Route::apiResource('/status-updates', 'StatusUpdateController'); - - // Stop words. - Route::get('/stop-words', 'StopWordsController@index')->name('stop-words.index'); - Route::put('/stop-words', 'StopWordsController@update')->name('stop-words.update'); - - // Taxonomy Categories. - Route::match(['GET', 'POST'], '/taxonomies/categories/index', 'TaxonomyCategoryController@index'); - Route::apiResource('/taxonomies/categories', 'TaxonomyCategoryController') - ->parameter('categories', 'taxonomy') - ->names([ - 'index' => 'taxonomy-categories.index', - 'store' => 'taxonomy-categories.store', - 'show' => 'taxonomy-categories.show', - 'update' => 'taxonomy-categories.update', - 'destroy' => 'taxonomy-categories.destroy', - ]); - - // Taxonomy Organisations. - Route::match(['GET', 'POST'], '/taxonomies/organisations/index', 'TaxonomyOrganisationController@index'); - Route::apiResource('/taxonomies/organisations', 'TaxonomyOrganisationController') - ->parameter('organisations', 'taxonomy') - ->names([ - 'index' => 'taxonomy-organisations.index', - 'store' => 'taxonomy-organisations.store', - 'show' => 'taxonomy-organisations.show', - 'update' => 'taxonomy-organisations.update', - 'destroy' => 'taxonomy-organisations.destroy', - ]); - - // Thesaurus. - Route::get('/thesaurus', 'ThesaurusController@index')->name('thesaurus.index'); - Route::put('/thesaurus', 'ThesaurusController@update')->name('thesaurus.update'); - - // Update Requests. - Route::match(['GET', 'POST'], '/update-requests/index', 'UpdateRequestController@index'); - Route::apiResource('/update-requests', 'UpdateRequestController')->only('index', 'show', 'destroy'); - Route::put('/update-requests/{update_request}/approve', 'UpdateRequest\\ApproveController@update')->name('update-requests.approve'); - - // Users. - Route::match(['GET', 'POST'], '/users/index', 'UserController@index'); - Route::get('/users/user', 'UserController@user')->name('users.user'); - Route::delete('/users/user/sessions', 'User\\SessionController@destroy')->name('users.user.sessions.destroy'); - Route::apiResource('/users', 'UserController'); -}); +Route::prefix('core/v1') + ->namespace('Core\\V1') + ->name('core.v1.') + ->group( + function () { + // Audits. + Route::match(['GET', 'POST'], '/audits/index', 'AuditController@index'); + Route::apiResource('/audits', 'AuditController') + ->only('index', 'show'); + + // Collection Categories. + Route::match(['GET', 'POST'], '/collections/categories/index', 'CollectionCategoryController@index'); + Route::apiResource('/collections/categories', 'CollectionCategoryController') + ->parameter('categories', 'collection') + ->names([ + 'index' => 'collection-categories.index', + 'store' => 'collection-categories.store', + 'show' => 'collection-categories.show', + 'update' => 'collection-categories.update', + 'destroy' => 'collection-categories.destroy', + ]); + + // Collection Personas. + Route::match(['GET', 'POST'], '/collections/personas/index', 'CollectionPersonaController@index'); + Route::apiResource('/collections/personas', 'CollectionPersonaController') + ->parameter('personas', 'collection') + ->names([ + 'index' => 'collection-personas.index', + 'store' => 'collection-personas.store', + 'show' => 'collection-personas.show', + 'update' => 'collection-personas.update', + 'destroy' => 'collection-personas.destroy', + ]); + Route::get('/collections/personas/{collection}/image.png', 'CollectionPersona\\ImageController') + ->name('collection-personas.image'); + + // Files. + Route::apiResource('/files', 'FileController') + ->only('store'); + + // Locations. + Route::match(['GET', 'POST'], '/locations/index', 'LocationController@index'); + Route::apiResource('/locations', 'LocationController'); + Route::get('/locations/{location}/image.png', 'Location\\ImageController') + ->name('locations.image'); + + // Notifications. + Route::match(['GET', 'POST'], '/notifications/index', 'NotificationController@index'); + Route::apiResource('/notifications', 'NotificationController') + ->only('index', 'show'); + + // Organisations. + Route::match(['GET', 'POST'], '/organisations/index', 'OrganisationController@index'); + Route::apiResource('/organisations', 'OrganisationController'); + Route::get('/organisations/{organisation}/logo.png', 'Organisation\\LogoController') + ->name('organisations.logo'); + + // Organisation Sign Up Forms. + Route::apiResource('/organisation-sign-up-forms', 'OrganisationSignUpFormController') + ->only('store'); + + // Page Feedbacks. + Route::match(['GET', 'POST'], '/page-feedbacks/index', 'PageFeedbackController@index'); + Route::apiResource('/page-feedbacks', 'PageFeedbackController') + ->only('index', 'store', 'show'); + + // Referrals. + Route::match(['GET', 'POST'], '/referrals/index', 'ReferralController@index'); + Route::apiResource('/referrals', 'ReferralController'); + + // Report Schedules. + Route::match(['GET', 'POST'], '/report-schedules/index', 'ReportScheduleController@index'); + Route::apiResource('/report-schedules', 'ReportScheduleController'); + + // Reports. + Route::match(['GET', 'POST'], '/reports/index', 'ReportController@index'); + Route::apiResource('/reports', 'ReportController') + ->only('index', 'store', 'show', 'destroy'); + Route::get('/reports/{report}/download', 'Report\\DownloadController@show') + ->name('reports.download'); + + // Search. + Route::post('/search', 'SearchController') + ->name('search'); + + // Service Locations. + Route::match(['GET', 'POST'], '/service-locations/index', 'ServiceLocationController@index'); + Route::apiResource('/service-locations', 'ServiceLocationController'); + Route::get('/service-locations/{service_location}/image.png', 'ServiceLocation\\ImageController') + ->name('service-locations.image'); + + // Services. + Route::match(['GET', 'POST'], '/services/index', 'ServiceController@index'); + Route::apiResource('/services', 'ServiceController'); + Route::put('/services/{service}/refresh', 'Service\\RefreshController') + ->name('services.refresh'); + Route::get('/services/{service}/related', 'Service\\RelatedController') + ->name('services.related'); + Route::get('/services/{service}/logo.png', 'Service\\LogoController') + ->name('services.logo'); + Route::get('/services/{service}/gallery-items/{file}', 'Service\\GalleryItemController') + ->name('services.gallery-items'); + + // Settings. + Route::get('/settings', 'SettingController@index') + ->name('settings.index'); + Route::put('/settings', 'SettingController@update') + ->name('settings.update'); + + // Status Updates. + Route::match(['GET', 'POST'], '/status-updates/index', 'StatusUpdateController@index'); + Route::apiResource('/status-updates', 'StatusUpdateController'); + + // Stop words. + Route::get('/stop-words', 'StopWordsController@index') + ->name('stop-words.index'); + Route::put('/stop-words', 'StopWordsController@update') + ->name('stop-words.update'); + + // Taxonomy Categories. + Route::match(['GET', 'POST'], '/taxonomies/categories/index', 'TaxonomyCategoryController@index'); + Route::apiResource('/taxonomies/categories', 'TaxonomyCategoryController') + ->parameter('categories', 'taxonomy') + ->names([ + 'index' => 'taxonomy-categories.index', + 'store' => 'taxonomy-categories.store', + 'show' => 'taxonomy-categories.show', + 'update' => 'taxonomy-categories.update', + 'destroy' => 'taxonomy-categories.destroy', + ]); + + // Taxonomy Organisations. + Route::match(['GET', 'POST'], '/taxonomies/organisations/index', 'TaxonomyOrganisationController@index'); + Route::apiResource('/taxonomies/organisations', 'TaxonomyOrganisationController') + ->parameter('organisations', 'taxonomy') + ->names([ + 'index' => 'taxonomy-organisations.index', + 'store' => 'taxonomy-organisations.store', + 'show' => 'taxonomy-organisations.show', + 'update' => 'taxonomy-organisations.update', + 'destroy' => 'taxonomy-organisations.destroy', + ]); + + // Thesaurus. + Route::get('/thesaurus', 'ThesaurusController@index') + ->name('thesaurus.index'); + Route::put('/thesaurus', 'ThesaurusController@update') + ->name('thesaurus.update'); + + // Update Requests. + Route::match(['GET', 'POST'], '/update-requests/index', 'UpdateRequestController@index'); + Route::apiResource('/update-requests', 'UpdateRequestController') + ->only('index', 'show', 'destroy'); + Route::put('/update-requests/{update_request}/approve', 'UpdateRequest\\ApproveController@update') + ->name('update-requests.approve'); + + // Users. + Route::match(['GET', 'POST'], '/users/index', 'UserController@index'); + Route::get('/users/user', 'UserController@user') + ->name('users.user'); + Route::delete('/users/user/sessions', 'User\\SessionController@destroy') + ->name('users.user.sessions.destroy'); + Route::apiResource('/users', 'UserController'); + } + ); diff --git a/tests/Feature/LocationsTest.php b/tests/Feature/LocationsTest.php index ae917e98..ce25591a 100644 --- a/tests/Feature/LocationsTest.php +++ b/tests/Feature/LocationsTest.php @@ -289,10 +289,11 @@ public function test_service_admin_can_request_to_update_one() $response->assertJsonFragment(['data' => $payload]); $this->assertDatabaseHas((new UpdateRequest())->getTable(), [ 'user_id' => $user->id, - 'updateable_type' => 'locations', + 'updateable_type' => UpdateRequest::EXISTING_TYPE_LOCATION, 'updateable_id' => $location->id, ]); - $data = UpdateRequest::where('updateable_type', 'locations') + $data = UpdateRequest::query() + ->where('updateable_type', UpdateRequest::EXISTING_TYPE_LOCATION) ->where('updateable_id', $location->id) ->firstOrFail() ->data; @@ -356,10 +357,11 @@ public function test_only_partial_fields_can_be_updated() $response->assertJsonFragment(['data' => $payload]); $this->assertDatabaseHas((new UpdateRequest())->getTable(), [ 'user_id' => $user->id, - 'updateable_type' => 'locations', + 'updateable_type' => UpdateRequest::EXISTING_TYPE_LOCATION, 'updateable_id' => $location->id, ]); - $data = UpdateRequest::where('updateable_type', 'locations') + $data = UpdateRequest::query() + ->where('updateable_type', UpdateRequest::EXISTING_TYPE_LOCATION) ->where('updateable_id', $location->id) ->firstOrFail() ->data; diff --git a/tests/Feature/OrganisationSignUpFormTest.php b/tests/Feature/OrganisationSignUpFormTest.php new file mode 100644 index 00000000..d7782ec7 --- /dev/null +++ b/tests/Feature/OrganisationSignUpFormTest.php @@ -0,0 +1,242 @@ +json('POST', '/core/v1/organisation-sign-up-forms', [ + 'user' => [ + 'first_name' => $this->faker->firstName, + 'last_name' => $this->faker->lastName, + 'email' => $this->faker->safeEmail, + 'phone' => random_uk_phone(), + ], + 'organisation' => [ + 'slug' => 'test-org', + 'name' => 'Test Org', + 'description' => 'Test description', + 'url' => 'http://test-org.example.com', + 'email' => 'info@test-org.example.com', + 'phone' => '07700000000', + ], + 'service' => [ + 'slug' => 'test-service', + 'name' => 'Test Service', + 'type' => Service::TYPE_SERVICE, + 'intro' => 'This is a test intro', + 'description' => 'Lorem ipsum', + 'wait_time' => null, + 'is_free' => true, + 'fees_text' => null, + 'fees_url' => null, + 'testimonial' => null, + 'video_embed' => null, + 'url' => $this->faker->url, + 'contact_name' => $this->faker->name, + 'contact_phone' => random_uk_phone(), + 'contact_email' => $this->faker->safeEmail, + 'criteria' => [ + 'age_group' => '18+', + 'disability' => null, + 'employment' => null, + 'gender' => null, + 'housing' => null, + 'income' => null, + 'language' => null, + 'other' => null, + ], + 'useful_infos' => [ + [ + 'title' => 'Did you know?', + 'description' => 'Lorem ipsum', + 'order' => 1, + ], + ], + 'offerings' => [ + [ + 'offering' => 'Weekly club', + 'order' => 1, + ], + ], + 'social_medias' => [ + [ + 'type' => SocialMedia::TYPE_INSTAGRAM, + 'url' => 'https://www.instagram.com/ayupdigital', + ], + ], + ], + ]); + + $response->assertStatus(Response::HTTP_CREATED); + } + + public function test_service_worker_cannot_create_one() + { + /** @var \App\Models\Service $service */ + $service = factory(Service::class)->create(); + /** @var \App\Models\User $user */ + $user = factory(User::class)->create(); + $user->makeServiceWorker($service); + + Passport::actingAs($user); + + $response = $this->json('POST', '/core/v1/organisation-sign-up-forms'); + + $response->assertStatus(Response::HTTP_FORBIDDEN); + } + + public function test_service_admin_cannot_create_one() + { + /** @var \App\Models\Service $service */ + $service = factory(Service::class)->create(); + /** @var \App\Models\User $user */ + $user = factory(User::class)->create(); + $user->makeServiceAdmin($service); + + Passport::actingAs($user); + + $response = $this->json('POST', '/core/v1/organisation-sign-up-forms'); + + $response->assertStatus(Response::HTTP_FORBIDDEN); + } + + public function test_organisation_admin_cannot_create_one() + { + /** @var \App\Models\Organisation $organisation */ + $organisation = factory(Organisation::class)->create(); + /** @var \App\Models\User $user */ + $user = factory(User::class)->create(); + $user->makeOrganisationAdmin($organisation); + + Passport::actingAs($user); + + $response = $this->json('POST', '/core/v1/organisation-sign-up-forms'); + + $response->assertStatus(Response::HTTP_FORBIDDEN); + } + + public function test_global_admin_cannot_create_one() + { + /** + * @var \App\Models\User $user + */ + $user = factory(User::class)->create(); + $user->makeGlobalAdmin(); + + Passport::actingAs($user); + + $response = $this->json('POST', '/core/v1/organisation-sign-up-forms'); + + $response->assertStatus(Response::HTTP_FORBIDDEN); + } + + public function test_super_admin_cannot_create_one() + { + /** + * @var \App\Models\User $user + */ + $user = factory(User::class)->create(); + $user->makeSuperAdmin(); + + Passport::actingAs($user); + + $response = $this->json('POST', '/core/v1/organisation-sign-up-forms'); + + $response->assertStatus(Response::HTTP_FORBIDDEN); + } + + public function test_audit_created_when_created() + { + $this->fakeEvents(); + + $response = $this->json('POST', '/core/v1/organisation-sign-up-forms', [ + 'user' => [ + 'first_name' => $this->faker->firstName, + 'last_name' => $this->faker->lastName, + 'email' => $this->faker->safeEmail, + 'phone' => random_uk_phone(), + ], + 'organisation' => [ + 'slug' => 'test-org', + 'name' => 'Test Org', + 'description' => 'Test description', + 'url' => 'http://test-org.example.com', + 'email' => 'info@test-org.example.com', + 'phone' => '07700000000', + ], + 'service' => [ + 'slug' => 'test-service', + 'name' => 'Test Service', + 'type' => Service::TYPE_SERVICE, + 'intro' => 'This is a test intro', + 'description' => 'Lorem ipsum', + 'wait_time' => null, + 'is_free' => true, + 'fees_text' => null, + 'fees_url' => null, + 'testimonial' => null, + 'video_embed' => null, + 'url' => $this->faker->url, + 'contact_name' => $this->faker->name, + 'contact_phone' => random_uk_phone(), + 'contact_email' => $this->faker->safeEmail, + 'criteria' => [ + 'age_group' => '18+', + 'disability' => null, + 'employment' => null, + 'gender' => null, + 'housing' => null, + 'income' => null, + 'language' => null, + 'other' => null, + ], + 'useful_infos' => [ + [ + 'title' => 'Did you know?', + 'description' => 'Lorem ipsum', + 'order' => 1, + ], + ], + 'offerings' => [ + [ + 'offering' => 'Weekly club', + 'order' => 1, + ], + ], + 'social_medias' => [ + [ + 'type' => SocialMedia::TYPE_INSTAGRAM, + 'url' => 'https://www.instagram.com/ayupdigital', + ], + ], + ], + ]); + + Event::assertDispatched(EndpointHit::class, function (EndpointHit $event) use ($response) { + /** @var \App\Models\UpdateRequest $updateRequest */ + $updateRequest = UpdateRequest::findOrFail( + $this->getResponseContent($response, 'id') + ); + + return ($event->getAction() === Audit::ACTION_CREATE) && + ($event->getUser() === null) && + ($event->getModel()->is($updateRequest)); + }); + } +} diff --git a/tests/Feature/OrganisationsTest.php b/tests/Feature/OrganisationsTest.php index b14bf81f..072d5f2d 100644 --- a/tests/Feature/OrganisationsTest.php +++ b/tests/Feature/OrganisationsTest.php @@ -311,11 +311,11 @@ public function test_organisation_admin_can_update_one() $response->assertJsonFragment(['data' => $payload]); $this->assertDatabaseHas((new UpdateRequest())->getTable(), [ 'user_id' => $user->id, - 'updateable_type' => 'organisations', + 'updateable_type' => UpdateRequest::EXISTING_TYPE_ORGANISATION, 'updateable_id' => $organisation->id, ]); $data = UpdateRequest::query() - ->where('updateable_type', 'organisations') + ->where('updateable_type', UpdateRequest::EXISTING_TYPE_ORGANISATION) ->where('updateable_id', $organisation->id) ->firstOrFail()->data; $this->assertEquals($data, $payload); @@ -337,11 +337,11 @@ public function test_only_partial_fields_can_be_updated() $response->assertJsonFragment(['data' => $payload]); $this->assertDatabaseHas((new UpdateRequest())->getTable(), [ 'user_id' => $user->id, - 'updateable_type' => 'organisations', + 'updateable_type' => UpdateRequest::EXISTING_TYPE_ORGANISATION, 'updateable_id' => $organisation->id, ]); $data = UpdateRequest::query() - ->where('updateable_type', 'organisations') + ->where('updateable_type', UpdateRequest::EXISTING_TYPE_ORGANISATION) ->where('updateable_id', $organisation->id) ->firstOrFail()->data; $this->assertEquals($data, $payload); diff --git a/tests/Feature/UpdateRequestsTest.php b/tests/Feature/UpdateRequestsTest.php index cd0bbef3..7964421f 100644 --- a/tests/Feature/UpdateRequestsTest.php +++ b/tests/Feature/UpdateRequestsTest.php @@ -5,12 +5,16 @@ use App\Events\EndpointHit; use App\Models\Audit; use App\Models\Location; +use App\Models\Offering; use App\Models\Organisation; use App\Models\Role; use App\Models\Service; +use App\Models\ServiceCriterion; use App\Models\ServiceLocation; +use App\Models\SocialMedia; use App\Models\Taxonomy; use App\Models\UpdateRequest; +use App\Models\UsefulInfo; use App\Models\User; use App\Models\UserRole; use Carbon\CarbonImmutable; @@ -93,7 +97,7 @@ public function test_global_admin_can_list_them() $response->assertJsonFragment([ 'id' => $updateRequest->id, 'user_id' => $user->id, - 'updateable_type' => 'locations', + 'updateable_type' => UpdateRequest::EXISTING_TYPE_LOCATION, 'updateable_id' => $location->id, 'data' => [ 'address_line_1' => $updateRequest->data['address_line_1'], @@ -326,7 +330,7 @@ public function test_global_admin_can_view_one() $response->assertJsonFragment([ 'id' => $updateRequest->id, 'user_id' => $updateRequest->user_id, - 'updateable_type' => 'service_locations', + 'updateable_type' => UpdateRequest::EXISTING_TYPE_SERVICE_LOCATION, 'updateable_id' => $serviceLocation->id, 'data' => ['name' => 'Test Name'], ]); @@ -689,6 +693,139 @@ public function test_global_admin_can_approve_one_for_service() ]); } + public function test_global_admin_can_approve_one_for_organisation_sign_up_form() + { + $user = factory(User::class)->create()->makeGlobalAdmin(); + Passport::actingAs($user); + + /** @var \App\Models\UpdateRequest $updateRequest */ + $updateRequest = UpdateRequest::create([ + 'updateable_type' => UpdateRequest::NEW_TYPE_ORGANISATION_SIGN_UP_FORM, + 'data' => [ + 'user' => [ + 'first_name' => 'John', + 'last_name' => 'Doe', + 'email' => 'john.doe@example.com', + 'phone' => '07700000000', + ], + 'organisation' => [ + 'slug' => 'test-org', + 'name' => 'Test Org', + 'description' => 'Test description', + 'url' => 'http://test-org.example.com', + 'email' => 'info@test-org.example.com', + 'phone' => '07700000000', + ], + 'service' => [ + 'slug' => 'test-service', + 'name' => 'Test Service', + 'type' => Service::TYPE_SERVICE, + 'intro' => 'This is a test intro', + 'description' => 'Lorem ipsum', + 'wait_time' => null, + 'is_free' => true, + 'fees_text' => null, + 'fees_url' => null, + 'testimonial' => null, + 'video_embed' => null, + 'url' => 'https://example.com', + 'contact_name' => 'Foo Bar', + 'contact_phone' => '01130000000', + 'contact_email' => 'foo.bar@example.com', + 'criteria' => [ + 'age_group' => '18+', + 'disability' => null, + 'employment' => null, + 'gender' => null, + 'housing' => null, + 'income' => null, + 'language' => null, + 'other' => null, + ], + 'useful_infos' => [ + [ + 'title' => 'Did you know?', + 'description' => 'Lorem ipsum', + 'order' => 1, + ], + ], + 'offerings' => [ + [ + 'offering' => 'Weekly club', + 'order' => 1, + ], + ], + 'social_medias' => [ + [ + 'type' => SocialMedia::TYPE_INSTAGRAM, + 'url' => 'https://www.instagram.com/ayupdigital', + ], + ], + ], + ], + ]); + + $response = $this->json('PUT', "/core/v1/update-requests/{$updateRequest->id}/approve"); + + $response->assertStatus(Response::HTTP_OK); + $this->assertDatabaseMissing((new UpdateRequest())->getTable(), + ['id' => $updateRequest->id, 'approved_at' => null]); + $this->assertDatabaseHas((new User())->getTable(), [ + 'first_name' => 'John', + 'last_name' => 'Doe', + 'email' => 'john.doe@example.com', + 'phone' => '07700000000', + ]); + $this->assertDatabaseHas((new Organisation())->getTable(), [ + 'slug' => 'test-org', + 'name' => 'Test Org', + 'description' => 'Test description', + 'url' => 'http://test-org.example.com', + 'email' => 'info@test-org.example.com', + 'phone' => '07700000000', + ]); + $this->assertDatabaseHas((new Service())->getTable(), [ + 'slug' => 'test-service', + 'name' => 'Test Service', + 'type' => Service::TYPE_SERVICE, + 'intro' => 'This is a test intro', + 'description' => 'Lorem ipsum', + 'wait_time' => null, + 'is_free' => true, + 'fees_text' => null, + 'fees_url' => null, + 'testimonial' => null, + 'video_embed' => null, + 'url' => 'https://example.com', + 'contact_name' => 'Foo Bar', + 'contact_phone' => '01130000000', + 'contact_email' => 'foo.bar@example.com', + ]); + $this->assertDatabaseHas((new ServiceCriterion())->getTable(), [ + 'age_group' => '18+', + 'disability' => null, + 'employment' => null, + 'gender' => null, + 'housing' => null, + 'income' => null, + 'language' => null, + 'other' => null, + ]); + $this->assertDatabaseHas((new UsefulInfo())->getTable(), [ + 'title' => 'Did you know?', + 'description' => 'Lorem ipsum', + 'order' => 1, + ]); + $this->assertDatabaseHas((new Offering())->getTable(), [ + 'offering' => 'Weekly club', + 'order' => 1, + ]); + $this->assertDatabaseHas((new SocialMedia())->getTable(), [ + 'type' => SocialMedia::TYPE_INSTAGRAM, + 'url' => 'https://www.instagram.com/ayupdigital', + ]); + } + public function test_audit_created_when_approved() { $this->fakeEvents(); diff --git a/tests/TestCase.php b/tests/TestCase.php index afaf3934..f0b1b9b2 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -21,6 +21,11 @@ abstract class TestCase extends BaseTestCase use RefreshDatabase; use WithFaker; + /** + * @var bool + */ + protected static $testLogCleared = false; + /** * @var bool */ @@ -46,6 +51,7 @@ protected function setUp(): void // Disable the API throttle middleware. $this->withoutMiddleware('throttle'); + $this->clearLog(); $this->setUpElasticsearch(); $this->now = Date::now(); @@ -54,6 +60,7 @@ protected function setUp(): void /** * Clean up the testing environment before the next test. * + * @throws \Throwable * @return void */ protected function tearDown(): void @@ -105,6 +112,17 @@ protected function truncateTaxonomies() Taxonomy::category()->children->each->delete(); } + /** + * Clears the testing log file. + */ + protected function clearLog() + { + if (!static::$testLogCleared) { + file_put_contents(config('logging.channels.testing.path'), ''); + static::$testLogCleared = true; + } + } + /** * Sets up the Elasticsearch indices. */