diff --git a/app/Http/Controllers/API/Charity/CharityController.php b/app/Http/Controllers/API/Charity/CharityController.php index e4c3d53..30df61b 100644 --- a/app/Http/Controllers/API/Charity/CharityController.php +++ b/app/Http/Controllers/API/Charity/CharityController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\API\Charity; use App\Http\Controllers\Controller; +use App\Models\Charity; use App\Services\Charity\CharityService; use App\Http\Requests\API\Charity\UpdateRequest; use App\Http\Requests\API\Charity\AuthenticatedRequest; @@ -19,6 +20,15 @@ public function index(AuthenticatedRequest $request, CharityService $charityServ ]); } + public function show($id, AuthenticatedRequest $request, CharityService $charityPointService) { + return response()->json([ + 'status' => 'success', + 'data' => [ + 'charity' => $charityPointService->show($id) + ] + ]); + } + public function update(UpdateRequest $request, CharityService $charityService) { $charity = auth()->user()->charity(); diff --git a/app/Http/Controllers/API/CollectionPoint/CollectionPointController.php b/app/Http/Controllers/API/CollectionPoint/CollectionPointController.php index 831e4f7..e5b84cd 100644 --- a/app/Http/Controllers/API/CollectionPoint/CollectionPointController.php +++ b/app/Http/Controllers/API/CollectionPoint/CollectionPointController.php @@ -6,6 +6,7 @@ use App\Http\Requests\API\CollectionPoint\UpdateRequest; use App\Services\CollectionPoint\CollectionPointService; use App\Http\Requests\API\CollectionPoint\AuthenticatedRequest; +use App\Models\CollectionPoint; class CollectionPointController extends Controller { @@ -19,6 +20,27 @@ public function index(AuthenticatedRequest $request, CollectionPointService $col ]); } + public function getMealDetails(CollectionPoint $collectionPoint, AuthenticatedRequest $request, CollectionPointService $collectionPointService) { + + return response()->json([ + 'status' => 'success', + 'data' => [ + 'collection_point' => $collectionPointService->getMealDetails($collectionPoint) + ] + ]); + } + + public function updateMealDetails (CollectionPoint $collection_point_id, CollectionPointService $collectionPointService) { + + + return response()->json([ + 'status' => 'success', + 'data' => [ + 'collection_point' => $collectionPointService->get($id) + ] + ]); + } + public function update(UpdateRequest $request, CollectionPointService $collectionPointService) { $collectionPoint = auth()->user()->collectionPoint(); diff --git a/app/Http/Controllers/API/CollectionPointController.php b/app/Http/Controllers/API/CollectionPointController.php index 4417523..2ce79ac 100644 --- a/app/Http/Controllers/API/CollectionPointController.php +++ b/app/Http/Controllers/API/CollectionPointController.php @@ -4,8 +4,13 @@ use App\Http\Controllers\Controller; use App\Services\User\CollectionPointService; +use App\Services\CollectionPoint\CollectionPointService as MainCollectionPointService; use App\Http\Requests\API\User\AuthenticatedRequest; +use App\Http\Requests\API\Charity\AuthenticatedRequest as CharityAuthenticatedRequest; use App\Services\All\PostcodeService; +use App\Models\CollectionPoint; +use App\Models\MealDetails; +use Illuminate\Http\Response; class CollectionPointController extends Controller { @@ -61,6 +66,37 @@ public function show($id, AuthenticatedRequest $request, CollectionPointService ]); } + public function getMealDetails($id, AuthenticatedRequest $request, MainCollectionPointService $collectionPointService) { + + return response()->json([ + 'status' => 'success', + 'data' => [ + 'collection_point' => $collectionPointService->getMealDetails($id) + ] + ]); + } + + public function updateMealDetails ($id, AuthenticatedRequest $request, MainCollectionPointService $collectionPointService) { + + foreach ($request->all() as $value) { + if($value["type_of_meal"] !== MealDetails::HOT_FOOD && $value["type_of_meal"] !== MealDetails::HOME_ESSENTIALS && $value["type_of_meal"] !== MealDetails::SCHOOL_MEAL ) { + return response()->json([ + 'status' => 'error', + 'data' => [], + "message" => "Provide valid type_of_meal, valid type_of_meal are: " . MealDetails::HOT_FOOD . ", " . MealDetails::SCHOOL_MEAL . ", " . MealDetails::HOME_ESSENTIALS + ], Response::HTTP_BAD_REQUEST ); + } + } + + + return response()->json([ + 'status' => 'success', + 'data' => [ + 'collection_point' => $collectionPointService->updateMealDetails($id, $request->all()) + ] + ]); + } + public function canDeliverToLocation($collectionPointId, AuthenticatedRequest $request, CollectionPointService $collectionPointService, PostcodeService $postcodeService) { $postCode = $request->input('postcode'); @@ -94,4 +130,23 @@ public function canDeliverToLocation($collectionPointId, AuthenticatedRequest $r ] ]); } + + public function update($id, CharityAuthenticatedRequest $request, MainCollectionPointService $collectionPointService) { + $collection_points = auth()->user()->charities->map->collectionPoints->flatten(); + if(!$collection_points->contains("id", $id)) { + return response()->json([ + 'status' => 'error', + 'data' => [], + "message" => "You are not part of this charity so you are not authorized to update this collection point. " + ], Response::HTTP_UNAUTHORIZED ); + } + + $collection_point = $collection_points->firstWhere('id', $id); + $result = $collectionPointService->update($collection_point, $request->all()); + + return response()->json([ + 'status' => 'success', + 'data' => $result, + ], Response::HTTP_OK ); + } } diff --git a/app/Models/Charity.php b/app/Models/Charity.php index f7c1872..2fb9bf3 100644 --- a/app/Models/Charity.php +++ b/app/Models/Charity.php @@ -14,6 +14,12 @@ class Charity extends Model 'name', 'registration_number', 'max_delivery_capacity', + 'company_website', + 'contact_telephone', + 'personal_email', + 'personal_number', + 'has_food_hygiene_cert', + 'logo' ]; protected $casts = [ diff --git a/app/Models/CollectionPoint.php b/app/Models/CollectionPoint.php index 9f4576c..9895025 100644 --- a/app/Models/CollectionPoint.php +++ b/app/Models/CollectionPoint.php @@ -93,7 +93,10 @@ public function notifyAllUsers($notification) { foreach ($this->collectionPointUsers as $collectionPointUser) { $collectionPointUser->user->notify($notification); - } + }; + } + public function mealDetails() { + return $this->hasMany(MealDetails::class, "collection_point_id"); } public function smsAllUsers(SmsMessage $smsMessage) diff --git a/app/Models/CollectionPointDaysOpen.php b/app/Models/CollectionPointDaysOpen.php new file mode 100644 index 0000000..775be31 --- /dev/null +++ b/app/Models/CollectionPointDaysOpen.php @@ -0,0 +1,18 @@ +belongsTo(CollectionPoint::class); + } + + public function days_open() + { + return $this->hasMany(DaysOpen::class); + } +} diff --git a/app/Models/DaysOpen.php b/app/Models/DaysOpen.php new file mode 100644 index 0000000..589f9f8 --- /dev/null +++ b/app/Models/DaysOpen.php @@ -0,0 +1,10 @@ +charities->first(); } + public function show($id) + { + return Charity::findorFail($id); + } + public function create($data = []) { $charity = Charity::create([ @@ -34,6 +39,12 @@ public function update(Charity $charity, $data) 'name' => $data['name'] ?? $charity->name, 'registration_number' => $data['registration_number'] ?? $charity->registration_number, 'max_delivery_capacity' => $data['max_delivery_capacity'] ?? $charity->max_delivery_capacity, + 'company_website' => $data['company_website'] ?? $charity->company_website, + 'contact_telephone' => $data['contact_telephone'] ?? $charity->contact_telephone, + 'personal_email' => $data['personal_email'] ?? $charity->personal_email, + 'personal_number' => $data['personal_number'] ?? $charity->personal_number, + 'has_food_hygiene_cert' => $data['has_food_hygiene_cert'] ?? $charity->has_food_hygiene_cert, + 'logo' => $data['logo'] ?? $charity->logo, ]); event(new Updated($charity)); diff --git a/app/Services/CollectionPoint/CollectionPointService.php b/app/Services/CollectionPoint/CollectionPointService.php index ce5a6a1..20559d4 100644 --- a/app/Services/CollectionPoint/CollectionPointService.php +++ b/app/Services/CollectionPoint/CollectionPointService.php @@ -15,6 +15,12 @@ public function get() return $user->collectionPoints->first(); } + public function getMealDetails($id) { + $collectionPoint = CollectionPoint::findorFail((int) $id); + return $collectionPoint->mealDetails; + } + + public function create($data) { $collectionPoint = CollectionPoint::create([ @@ -41,6 +47,9 @@ public function update(CollectionPoint $collectionPoint, $data) 'city' => $data['city'] ?? $collectionPoint->city, 'county' => $data['county'] ?? $collectionPoint->county, 'post_code' => $data['post_code'] ?? $collectionPoint->post_code, + "start_pick_up_time" => $data['start_pick_up_time'] ?? $collectionPoint->start_pick_up_time, + "end_pick_up_time" => $data['end_pick_up_time'] ?? $collectionPoint->end_pick_up_time, + "cut_off_point" => $data['cut_off_point'] ?? $collectionPoint->cut_off_point, 'max_daily_capacity' => $data['max_daily_capacity'] ?? $collectionPoint->max_daily_capacity, ]); diff --git a/database/factories/CollectionPointFactory.php b/database/factories/CollectionPointFactory.php index 3a6eead..230f8ec 100644 --- a/database/factories/CollectionPointFactory.php +++ b/database/factories/CollectionPointFactory.php @@ -16,6 +16,9 @@ 'city' => $faker->city, 'county' => $faker->county, 'post_code' => $faker->postcode, + "start_pick_up_time" => $faker->dateTime("+10 hours"), + "end_pick_up_time" => $faker->dateTime("+15 hours"), + "cut_off_point" => $faker->dateTime("+10 hours"), 'max_daily_capacity' => rand(50, 100), ]; }); diff --git a/database/factories/DietaryRequirementsFactory.php b/database/factories/DietaryRequirementsFactory.php new file mode 100644 index 0000000..7ee920e --- /dev/null +++ b/database/factories/DietaryRequirementsFactory.php @@ -0,0 +1,12 @@ +define(DietaryRequirements::class, function (Faker $faker) { + return [ + "name" => "halal" + ]; +}); diff --git a/database/migrations/2020_11_22_115513_create_days_opens_table.php b/database/migrations/2020_11_22_115513_create_days_opens_table.php new file mode 100644 index 0000000..ad44681 --- /dev/null +++ b/database/migrations/2020_11_22_115513_create_days_opens_table.php @@ -0,0 +1,32 @@ +id(); + $table->string("name"); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('days_opens'); + } +} diff --git a/database/migrations/2020_11_22_115539_create_meal_types_table.php b/database/migrations/2020_11_22_115539_create_meal_types_table.php new file mode 100644 index 0000000..de34df0 --- /dev/null +++ b/database/migrations/2020_11_22_115539_create_meal_types_table.php @@ -0,0 +1,33 @@ +id(); + $table->string("name"); + $table->text("image_url"); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('meal_types'); + } +} diff --git a/database/migrations/2020_11_22_115608_create_dietary_requirements_table.php b/database/migrations/2020_11_22_115608_create_dietary_requirements_table.php new file mode 100644 index 0000000..8363c68 --- /dev/null +++ b/database/migrations/2020_11_22_115608_create_dietary_requirements_table.php @@ -0,0 +1,33 @@ +id(); + $table->string("name"); + $table->text("image_url"); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('dietary_requirements'); + } +} diff --git a/database/migrations/2020_11_22_120405_add_quanities_and_timings_to_collection_points.php b/database/migrations/2020_11_22_120405_add_quanities_and_timings_to_collection_points.php new file mode 100644 index 0000000..6c557d5 --- /dev/null +++ b/database/migrations/2020_11_22_120405_add_quanities_and_timings_to_collection_points.php @@ -0,0 +1,38 @@ +integer('quantity_of_meals')->default(1); + $table->dateTime('start_pick_up_time'); + $table->dateTime('end_pick_up_time'); + $table->dateTime("cut_off_point"); + $table->integer("set_quantity_per_person")->default(1); + $table->string("logo")->nullable(); + $table->string("unique_url")->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('collection_points', function (Blueprint $table) { + $table->dropColumn(['quantity_of_meals', 'pick_up_time', "cut_off_point", "set_quantity_per_person", "logo", "unique_url"]); + }); + } +} diff --git a/database/migrations/2020_11_22_120614_add_contact_info_to_charities.php b/database/migrations/2020_11_22_120614_add_contact_info_to_charities.php new file mode 100644 index 0000000..f2348ee --- /dev/null +++ b/database/migrations/2020_11_22_120614_add_contact_info_to_charities.php @@ -0,0 +1,37 @@ +string("company_website")->nullable(); + $table->string("contact_telephone")->nullable(); + $table->string("logo")->nullable(); + $table->string("personal_email")->nullable(); + $table->string("personal_number")->nullable(); + $table->boolean("has_food_hygiene_cert")->default(false); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('charities', function (Blueprint $table) { + $table->dropColumns(["company_website", "contact_telephone", "logo" ,"personal_email", "personal_number", "has_food_hygiene_cert"]); + }); + } +} diff --git a/database/migrations/2020_11_22_121705_create_collection_point_days_opens_table.php b/database/migrations/2020_11_22_121705_create_collection_point_days_opens_table.php new file mode 100644 index 0000000..5d23f3c --- /dev/null +++ b/database/migrations/2020_11_22_121705_create_collection_point_days_opens_table.php @@ -0,0 +1,33 @@ +id(); + $table->unsignedBigInteger("collection_point_id"); + $table->unsignedBigInteger("days_open_id"); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('collection_point_days_opens'); + } +} diff --git a/routes/api.php b/routes/api.php index 3914447..145a199 100644 --- a/routes/api.php +++ b/routes/api.php @@ -40,7 +40,7 @@ Route::group(['prefix' => 'charity', 'name' => 'charity.', 'namespace' => 'Charity'], function () { Route::get('/', 'CharityController@index'); Route::post('/', 'CharityController@update'); - + Route::get('/{id}', 'CharityController@show'); Route::get('/orders', 'OrderController@index'); }); @@ -62,6 +62,9 @@ Route::post('/collection-points/near-me', 'CollectionPointController@indexNearMe'); Route::get('/collection-points/{id}', 'CollectionPointController@show'); Route::get('/collection-points', 'CollectionPointController@index'); + Route::get('/collection-point/{collection_point_id}/meal-details', 'CollectionPointController@getMealDetails'); + Route::post('/collection-point/{collection_point_id}/meal-details', 'CollectionPointController@updateMealDetails'); + Route::post('/collection-points/{id}', 'CollectionPointController@update'); Route::post('logout', 'AuthController@logout'); });