From 17ed7616eebff9fef9f4106ed5d11b79758bf3bf Mon Sep 17 00:00:00 2001 From: Michal Feher Date: Wed, 8 Feb 2023 13:01:43 +0100 Subject: [PATCH] tasks endpoint update --- .../Http/Controllers/MasterTaskController.php | 60 ++++++++++-- be/app/Http/Controllers/SubTaskController.php | 91 ++++++++++++++++++- be/app/Models/SubTask.php | 31 +++++++ be/app/Models/Timeblock.php | 1 + be/app/Models/Timesheet.php | 1 + be/routes/api.php | 10 +- 6 files changed, 183 insertions(+), 11 deletions(-) diff --git a/be/app/Http/Controllers/MasterTaskController.php b/be/app/Http/Controllers/MasterTaskController.php index a454a82..7b0d16e 100644 --- a/be/app/Http/Controllers/MasterTaskController.php +++ b/be/app/Http/Controllers/MasterTaskController.php @@ -13,13 +13,6 @@ class MasterTaskController extends Controller { public function store(Request $request) { - -//// $image = base64_encode(file_get_contents($request->all()['data']['files'][0])); -// $image = base64_encode(file_get_contents($request->all()['files'])); -// -// echo $image; -// dd(file_get_contents($request->all()['files'])); - $validator = Validator::make($request->all(), [ 'data.name' => 'required', 'data.description' => 'required', @@ -60,6 +53,57 @@ class MasterTaskController extends Controller ], 201); } + public function update($id, Request $request) + { + $validator = Validator::make($request->all(), [ + 'data.name' => 'required', + 'data.description' => 'required', + 'data.duration' => 'required', + 'data.deadline' => 'required', + 'data.project_id' => 'required', + ]); + + if ($validator->fails()){ + return response()->json($validator->errors(), 400); + } + + // upratanie requestu, pretoze frontend pouziva inu nomenklaturu fieldov ako appka + $data['data'] = $request->all()['data']; + $data['data']['title'] = $request->all()['data']['name']; + $data['data']['estimated_time'] = $request->all()['data']['duration']; + + $request->merge($data); + + $mastertask = MasterTask::find($id); + + // ak je Master task v stave ukončený, nedovolime update + if ($mastertask->is_finished == 1) { + return response()->json([ + 'message' => 'Cannot update mastertask with is_finished 1.', + ], 400); + } + $mastertask->update($request->all()['data']); + + // upload attachmentu + + // TODO prerobit na upsert + if ($request->file('data')) { + $attachments = Attachment::uploadAttachmentsToS3($request->file('data')['files'], $mastertask); + $mastertask->attachments()->createMany($attachments); + } + + return response()->json([ + 'message' => 'Master Task updated successfully', + 'mastertask' => $mastertask + ]); + + + // TODO V prípade, že sa menil zodpovedný team - Pre prebiehajúce sub tasky - Ukončia sa sub tasky pôvodného teamu a tie sa následne zarátajú do ERP Karat + + // TODO V prípade, že sa menil zodpovedný team - Pre nové sub tasky (s nenatrackovaným časom) budú tieto tasky zmazané + + } + public function delete($id) { $mastertask = MasterTask::find($id); @@ -68,7 +112,7 @@ class MasterTaskController extends Controller foreach ($mastertask->subtasks as $subtask) { if ($subtask->timesheets()->exists()) { return response()->json([ - 'message' => 'Cannot delete subtask with submitted timesheets.', + 'message' => 'Cannot delete mastertask containing subtasks submitted timesheets.', ], 400); } } diff --git a/be/app/Http/Controllers/SubTaskController.php b/be/app/Http/Controllers/SubTaskController.php index 3d1097e..93a0a93 100644 --- a/be/app/Http/Controllers/SubTaskController.php +++ b/be/app/Http/Controllers/SubTaskController.php @@ -6,11 +6,56 @@ use App\Models\Attachment; use App\Models\MasterTask; use App\Models\SubTask; use App\Models\Team; +use App\Models\Timesheet; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; class SubTaskController extends Controller { + public function index(Request $request) + { + // get query parameter from request + $parameters = $request->query(); + + $parameters['user_id'] = ( $parameters['employee_id'] ?? null ); + + $validator = Validator::make($request->all(), [ + 'start' => 'required', + 'end' => 'required', + ]); + + $validator->after(function ($validator) use ($parameters) { + + if ( !isset($parameters['employee_id']) && !isset($parameters['team_id'])) { + $validator->errors()->add( + 'error', 'You must provide either employee_id or team_id.' + ); + } + }); + + if ($validator->fails()){ + return response()->json($validator->errors(), 400); + } + + if (isset($parameters['team_id'])) { + $subtasks = SubTask::whereHas('mastertask', function ($query) use ($parameters) { + $query->where('team_id', $parameters['team_id']); + })->whereHas('timeblocks', function ($query) use ($parameters) { + $query->where('start', '>=', $parameters['start']); + $query->where('end', '<=', $parameters['end']); + })->get(); + } else if (isset($parameters['user_id'])) { + $subtasks = SubTask::where('user_id', $parameters['user_id'])->whereHas('timeblocks', function ($query) use ($parameters) { + $query->where('start', '>=', $parameters['start']); + $query->where('end', '<=', $parameters['end']); + })->get(); + } + + return response()->json([ + 'subtasks' => $subtasks + ], 200); + } + public function store($mastertask_id, Request $request) { $validator = Validator::make($request->all(), [ @@ -27,7 +72,7 @@ class SubTaskController extends Controller } }); - if($validator->fails()){ + if ($validator->fails()){ return response()->json($validator->errors(), 400); } @@ -41,6 +86,11 @@ class SubTaskController extends Controller $mastertask = MasterTask::find($mastertask_id); $subtask = $mastertask->subtasks()->create($request->all()['data']); + // syncnutie timeblocks + if (!empty($data['data']['timeblocks'])) { + $subtask->syncTimeblocks($data['data']['timeblocks']); + } + // upload attachmentu if ($request->file('data')) { $attachments = Attachment::uploadAttachmentsToS3($request->file('data')['files'], $mastertask); @@ -53,6 +103,45 @@ class SubTaskController extends Controller ], 201); } + // TODO zabezpecit, ze ked sa meni user, tak nech sa dvojmu nevlozia jeho vykazy + public function update($id, Request $request) + { + $subtask = SubTask::find($id); + + $validator = Validator::make($request->all(), [ + 'data.employee_id' => 'required', + 'data.duration' => 'required', + ]); + + if ($validator->fails()){ + return response()->json($validator->errors(), 400); + } + + // upratanie requestu, pretoze frontend pouziva inu nomenklaturu fieldov ako appka + $data['data'] = $request->all()['data']; + $data['data']['user_id'] = $request->all()['data']['employee_id']; + $data['data']['estimated_time'] = $request->all()['data']['duration']; + + $request->merge($data); + + $subtask->update($request->all()['data']); + + // syncnutie vykazu + if (!empty($data['data']['timesheets'])) { + $subtask->syncTimesheets($data['data']['timesheets']); + } + + // syncnutie timeblocks + if (!empty($data['data']['timeblocks'])) { + $subtask->syncTimeblocks($data['data']['timeblocks']); + } + + return response()->json([ + 'message' => 'Subtask updated successfully', + 'subtask' => $subtask + ]); + } + public function delete($id) { $subtask = SubTask::find($id); diff --git a/be/app/Models/SubTask.php b/be/app/Models/SubTask.php index fc0b9db..feb8d26 100644 --- a/be/app/Models/SubTask.php +++ b/be/app/Models/SubTask.php @@ -36,6 +36,37 @@ class SubTask extends Model { return $this->hasMany(Attachment::class); } + + // syncnutie vykazu. ak array obsahuje NULL id, tak ho vytvori, ak obsahuje ID, tak ho upravi. ak sa v array nenachadza, tak ho zmaze z DB + public function syncTimesheets(Array $timesheets) + { + // pripravenie array na upsert + $timesheets = array_map(function($item) { + $item['user_id'] = $item['employee_id']; + unset($item['employee_id']); + $item['sub_task_id'] = $this->id; + return $item; + }, $timesheets); + + $this->timesheets()->upsert($timesheets, ['id']); + + // zmazanie vykazov, ktore boli poslane z frontendu + $this->timesheets()->whereNotIn('id', collect($timesheets)->pluck('id'))->delete(); + } + + public function syncTimeblocks(Array $timeblocks) + { + // pripravenie array na upsert + $timeblocks = array_map(function($item) { + $item['sub_task_id'] = $this->id; + return $item; + }, $timeblocks); + + $this->timeblocks()->upsert($timeblocks, ['id']); + + // zmazanie vykazov, ktore boli poslane z frontendu + $this->timeblocks()->whereNotIn('id', collect($timeblocks)->pluck('id'))->delete(); + } } diff --git a/be/app/Models/Timeblock.php b/be/app/Models/Timeblock.php index 7390e40..8b5ca74 100644 --- a/be/app/Models/Timeblock.php +++ b/be/app/Models/Timeblock.php @@ -10,6 +10,7 @@ class Timeblock extends Model use HasFactory; public $timestamps = true; + public $guarded = ['id']; public function subtask() { diff --git a/be/app/Models/Timesheet.php b/be/app/Models/Timesheet.php index 71ae475..3838437 100644 --- a/be/app/Models/Timesheet.php +++ b/be/app/Models/Timesheet.php @@ -10,6 +10,7 @@ class Timesheet extends Model use HasFactory; public $timestamps = true; + public $guarded = ['id']; public function subtask() { diff --git a/be/routes/api.php b/be/routes/api.php index 0b47b4c..87850cd 100644 --- a/be/routes/api.php +++ b/be/routes/api.php @@ -66,6 +66,7 @@ Route::get('/v1/mastertasks/{id}', function ($id) { Route::post('/v1/mastertasks', MasterTaskController::class . '@store'); +Route::put('/v1/mastertasks/{id}', MasterTaskController::class . '@update'); Route::delete('/v1/mastertasks/{id}', MasterTaskController::class . '@delete'); Route::get('/v1/mastertasks/{id}/subtasks', function ($id) { @@ -75,12 +76,17 @@ Route::get('/v1/mastertasks/{id}/subtasks', function ($id) { }); Route::post('/v1/mastertasks/{id}/subtasks', SubTaskController::class . '@store'); - - +Route::put('/v1/subtasks/{id}', SubTaskController::class . '@update'); Route::get('/v1/subtasks/{id}', function ($id) { return new SubTaskResource( SubTask::find($id)); }); +Route::get('/v1/subtasks/{id}', function ($id) { + return new SubTaskResource( SubTask::find($id)); +}); + +Route::get('/v1/subtasks',SubTaskController::class . '@index'); + Route::delete('/v1/subtasks/{id}', SubTaskController::class . '@delete');