diff --git a/be/app/Http/Controllers/MasterTaskController.php b/be/app/Http/Controllers/MasterTaskController.php new file mode 100644 index 0000000..b270558 --- /dev/null +++ b/be/app/Http/Controllers/MasterTaskController.php @@ -0,0 +1,77 @@ +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']; + + + foreach ( $data['data']['employees'] as $key => $employee ) { + $data['data']['employees'][$key]['user_id'] = $employee['id']; + $data['data']['employees'][$key]['estimated_time'] = $employee['duration']; + } + + $request->merge($data); + + $mastertask = MasterTask::create($request->all()['data']); + $mastertask->subtasks()->createMany($request->all()['data']['employees']); + + return response()->json([ + 'message' => 'Master Task created successfully', + 'mastertask' => $mastertask + ], 201); + } + + public function delete($id) + { + $mastertask = MasterTask::find($id); + + // nedovolit zmazanie mastertasku, ak existuje aspon jeden subtask s timesheetom + foreach ($mastertask->subtasks as $subtask) { + if ($subtask->timesheets()->exists()) { + return response()->json([ + 'message' => 'Cannot delete subtask with submitted timesheets.', + ], 400); + } + } + + $mastertask->attachments()->delete(); + + foreach ( $mastertask->subtasks as $subtask ) { + $subtask->timeblocks()->delete(); + } + + $mastertask->subtasks()->delete(); + + $mastertask->delete(); + + return response()->json([ + 'message' => 'Master Task deleted successfully.', + 'mastertask' => $mastertask + ]); + } + +} diff --git a/be/app/Http/Controllers/SubTaskController.php b/be/app/Http/Controllers/SubTaskController.php new file mode 100644 index 0000000..df5e701 --- /dev/null +++ b/be/app/Http/Controllers/SubTaskController.php @@ -0,0 +1,71 @@ +all(), [ + 'data.employee_id' => 'required', + 'data.duration' => 'required', + ]); + + // validacia, ci uz subtask pre tohto usera a mastertask neexistuje + $validator->after(function ($validator) use ($mastertask_id, $request) { + if (SubTask::where('master_task_id', $mastertask_id)->where('user_id', $request->all()['data']['employee_id'])->exists()) { + $validator->errors()->add( + 'data.employee_id', 'Sub task already exists for this employee and master task.' + ); + } + }); + + 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); + + $mastertask = MasterTask::find($mastertask_id); + $subtask = $mastertask->subtasks()->create($request->all()['data']); + + return response()->json([ + 'message' => 'Sub Task created successfully', + 'subtask' => $subtask + ], 201); + } + + public function delete($id) + { + $subtask = SubTask::find($id); + + // ak existuje timesheet k subtasku, nemoze sa zmazat + if ($subtask->timesheets()->exists()) { + return response()->json([ + 'message' => 'Cannot delete subtask with submitted timesheets.', + ], 400); + } + + $subtask->timeblocks()->delete(); + + // TODO budu mat attachmenty? + // $subtask->attachments()->delete(); + $subtask->delete(); + + return response()->json([ + 'message' => 'Subtask deleted successfully.', + 'subtask' => $subtask + ]); + } +} diff --git a/be/app/Http/Controllers/TeamController.php b/be/app/Http/Controllers/TeamController.php index e4498d5..1dffff1 100644 --- a/be/app/Http/Controllers/TeamController.php +++ b/be/app/Http/Controllers/TeamController.php @@ -65,7 +65,7 @@ class TeamController extends Controller return response()->json([ 'message' => 'Team deleted successfully', 'team' => $team - ], 201); + ]); } /** diff --git a/be/app/Http/Resources/SubTaskCollection.php b/be/app/Http/Resources/SubTaskCollection.php new file mode 100644 index 0000000..143fd24 --- /dev/null +++ b/be/app/Http/Resources/SubTaskCollection.php @@ -0,0 +1,25 @@ + $this->collection, + 'status' => 200, + ]; + } + +} diff --git a/be/app/Http/Resources/SubTaskResource.php b/be/app/Http/Resources/SubTaskResource.php index 68a7838..62f5b8b 100644 --- a/be/app/Http/Resources/SubTaskResource.php +++ b/be/app/Http/Resources/SubTaskResource.php @@ -27,6 +27,7 @@ class SubTaskResource extends JsonResource 'spent_time' => $this->tracked_time, 'is_finished' => $this->is_finished, 'timeblocks' => TimeblockResource::collection($this->timeblocks), + 'timesheets' => TimesheetResource::collection($this->timesheets), ]; } diff --git a/be/app/Http/Resources/TimesheetResource.php b/be/app/Http/Resources/TimesheetResource.php new file mode 100644 index 0000000..7cd461d --- /dev/null +++ b/be/app/Http/Resources/TimesheetResource.php @@ -0,0 +1,24 @@ + $this->id, + 'employee_id' => $this->user_id, + 'time' => $this->time, + ]; + + } +} diff --git a/be/app/Models/MasterTask.php b/be/app/Models/MasterTask.php index cdd6466..1b496cd 100644 --- a/be/app/Models/MasterTask.php +++ b/be/app/Models/MasterTask.php @@ -10,6 +10,7 @@ class MasterTask extends Model use HasFactory; public $timestamps = true; + public $guarded = ['id']; public function subtasks() { @@ -40,4 +41,11 @@ class MasterTask extends Model return !in_array($this->team->id, $user->teams->pluck('id')->unique()->toArray()); }); } + + // TODO dorobit logiku + public static function generateMasterTaskColor() + { + // return random value from array + return collect(['#E9FFE5', '#F6ECD3', '#FDE1FF', '#FFC9C9', '#DADEF8', '#EDFFFE'])->random(); + } } diff --git a/be/app/Models/SubTask.php b/be/app/Models/SubTask.php index a2ffa16..a5d02be 100644 --- a/be/app/Models/SubTask.php +++ b/be/app/Models/SubTask.php @@ -10,6 +10,7 @@ class SubTask extends Model use HasFactory; public $timestamps = true; + public $guarded = ['id']; public function mastertask() { diff --git a/be/app/Observers/MasterTaskObserver.php b/be/app/Observers/MasterTaskObserver.php new file mode 100644 index 0000000..fd73dc9 --- /dev/null +++ b/be/app/Observers/MasterTaskObserver.php @@ -0,0 +1,13 @@ +color = MasterTask::generateMasterTaskColor(); + } +} diff --git a/be/app/Providers/MasterTaskServiceProvider.php b/be/app/Providers/MasterTaskServiceProvider.php new file mode 100644 index 0000000..765da5b --- /dev/null +++ b/be/app/Providers/MasterTaskServiceProvider.php @@ -0,0 +1,30 @@ +where('id', $id); + })->get()); +}); + +Route::post('/v1/mastertasks/{id}/subtasks', SubTaskController::class . '@store'); + + + +Route::get('/v1/subtasks/{id}', function ($id) { + return new SubTaskResource( SubTask::find($id)); +}); +Route::delete('/v1/subtasks/{id}', SubTaskController::class . '@delete'); + + +//Route::post('/v1/subtasks/{id}/timesheet', function () { +// return new MasterTaskResource( SubTaskController::class . '@storeTimesheet'); +//}); +// +//Route::delete('/v1/subtasks/{id}/timesheet/{}', function () { +// return new MasterTaskResource( SubTaskController::class . '@storeTimesheet'); +//}); + +