adding draft subtask logic to backend

This commit is contained in:
StudioTem committed 2025-12-03 09:57:12 +01:00
1 parent 570e29e5c4
commit 21ad81cee7
5 files changed
+136 -11

No files matched your search

+81 -8
View File
@@ -30,6 +30,11 @@ class SubTaskController extends Controller
return $this->indexOngoing($request);
}
// draft tasks (koncepty)
if (isset($parameters['type']) && $parameters['type'] == 'draft') {
return $this->indexDrafts($request);
}
$parameters['user_id'] = ($parameters['employee_id'] ?? null);
$validator = Validator::make($request->all(), [
@@ -59,13 +64,15 @@ class SubTaskController extends Controller
$query->where('team_id', $parameters['team_id']);
})->get()->pluck('id')->toArray();
$subtasks = SubTask::whereIn('user_id', $userIdArray)
$subtasks = SubTask::published()
->whereIn('user_id', $userIdArray)
->whereHas('timeblocks', function ($query) use ($start, $end) {
$query->where('start', '>=', $start);
$query->where('end', '<', $end);
})->get();
} elseif (isset($parameters['user_id'])) {
$subtasks = SubTask::where('user_id', $parameters['user_id'])->whereHas('timeblocks',
$subtasks = SubTask::published()
->where('user_id', $parameters['user_id'])->whereHas('timeblocks',
function ($query) use ($start, $end) {
$query->where('start', '>', $start);
$query->where('end', '<', $end);
@@ -102,8 +109,11 @@ class SubTaskController extends Controller
$parameters['user_id'] = $parameters['employee_id'];
$subtasks = SubTask::where('user_id', $parameters['user_id'])->where('is_finished',
0)->whereDoesntHave('timeblocks')->get();
$subtasks = SubTask::published()
->where('user_id', $parameters['user_id'])
->where('is_finished', 0)
->whereDoesntHave('timeblocks')
->get();
return response()->json([
'subtasks' => SubTaskResource::collection($subtasks)
@@ -125,16 +135,42 @@ class SubTaskController extends Controller
$parameters['user_id'] = $parameters['employee_id'];
$subtasks = SubTask::where('user_id', $parameters['user_id'])->where('is_finished', 0)->get();
$subtasks = SubTask::published()
->where('user_id', $parameters['user_id'])
->where('is_finished', 0)
->get();
return response()->json([
'subtasks' => SubTaskResource::collection($subtasks)
], 200);
}
/**
* Zoznam všetkých konceptov (draftov)
*/
private function indexDrafts(Request $request)
{
$parameters = $request->query();
$query = SubTask::draft()
->with(['mastertask', 'user', 'timeblocks', 'attachments'])
->orderBy('created_at', 'desc');
// ak je zadané employee_id, filtrovať podľa neho
if (isset($parameters['employee_id'])) {
$query->where('user_id', $parameters['employee_id']);
}
return response()->json([
'subtasks' => SubTaskResource::collection($query->get())
], 200);
}
public function store($mastertask_id, Request $request)
{
// zistenie, či ide o draft
$isDraft = isset($request->all()['data']['is_draft']) && $request->all()['data']['is_draft'] == true;
$validator = Validator::make($request->all(), [
'data.employees' => 'required',
]);
@@ -173,6 +209,7 @@ class SubTaskController extends Controller
$data['data']['employees'][$key]['created_by'] = User::getUserIdFromBearerToken($request->bearerToken());
$data['data']['employees'][$key]['description'] = $request->all()['data']['description'];
$data['data']['employees'][$key]['deadline'] = $request->all()['data']['deadline'];
$data['data']['employees'][$key]['is_draft'] = $isDraft;
}
$request->merge($data);
@@ -203,9 +240,11 @@ class SubTaskController extends Controller
}
}
$message = $isDraft ? 'Draft created successfully' : 'Sub Task created successfully';
return response()->json([
'message' => 'Sub Task created successfully',
'subtasks' => $subtasks
'message' => $message,
'subtasks' => SubTaskResource::collection($subtasks)
], 201);
}
@@ -214,6 +253,12 @@ class SubTaskController extends Controller
{
$subtask = SubTask::find($id);
if (!$subtask) {
return response()->json([
'message' => 'Subtask not found.'
], 404);
}
// ak je sub task v stave ukončený, nedovolime update. vynimkou je iba znovuotvorenie mastertasku
if ($subtask->is_finished == 1 && isset($request->all()['data']['is_finished']) && $request->all()['data']['is_finished'] == 1) {
return response()->json([
@@ -228,6 +273,27 @@ class SubTaskController extends Controller
], 400);
}
// validácia pri publikovaní draftu (is_draft: false)
$isPublishing = $subtask->is_draft && isset($request->all()['data']['is_draft']) && $request->all()['data']['is_draft'] == false;
if ($isPublishing) {
$publishValidator = Validator::make([
'master_task_id' => $subtask->master_task_id,
'user_id' => $request->all()['data']['employee_id'] ?? $subtask->user_id,
'estimated_time' => $request->all()['data']['duration'] ?? $subtask->estimated_time,
], [
'master_task_id' => 'required',
'user_id' => 'required',
'estimated_time' => 'required|numeric|min:0',
]);
if ($publishValidator->fails()) {
return response()->json([
'message' => 'Draft cannot be published. Missing required fields.',
'errors' => $publishValidator->errors()
], 400);
}
}
$validator = Validator::make($request->all(), [
'data.duration' => 'required',
]);
@@ -254,6 +320,11 @@ class SubTaskController extends Controller
$data['data']['deadline'] = isset($request->all()['data']['deadline']) ? $request->all()['data']['deadline'] : null;
$data['data']['estimated_time'] = $request->all()['data']['duration'];
$data['data']['updated_by'] = User::getUserIdFromBearerToken($request->bearerToken());
// publikovanie draftu
if (isset($request->all()['data']['is_draft'])) {
$data['data']['is_draft'] = $request->all()['data']['is_draft'];
}
$request->merge($data);
@@ -276,8 +347,10 @@ class SubTaskController extends Controller
$subtask->syncTimeblocks($data['data']['timeblocks']);
}
$message = $isPublishing ? 'Draft published successfully' : 'Subtask updated successfully';
return response()->json([
'message' => 'Subtask updated successfully',
'message' => $message,
'subtask' => new SubTaskResource($subtask)
]);
}
@@ -17,6 +17,7 @@ class SubTaskResource extends JsonResource
{
return [
'id' => $this->id,
'is_draft' => $this->is_draft,
'type' => $this->type,
'created_by' => $this->created_by,
'master_task' => $this->mastertask->title,
+16
View File
@@ -13,6 +13,22 @@ class SubTask extends Model
public $timestamps = true;
public $guarded = ['id'];
/**
* Scope pre koncepty (drafty) - nezverejnené subtasky
*/
public function scopeDraft($query)
{
return $query->where('is_draft', true);
}
/**
* Scope pre publikované subtasky (nie drafty)
*/
public function scopePublished($query)
{
return $query->where('is_draft', false);
}
public function mastertask()
{
return $this->belongsTo(MasterTask::class, 'master_task_id');