mastertasks, subtasks - GET, POST, DELETE

This commit is contained in:
StudioTem committed 2023-01-31 17:19:45 +01:00
1 parent 96954845a1
commit a79add193c
12 files changed
+284 -2

No files matched your search

@@ -0,0 +1,77 @@
<?php
namespace App\Http\Controllers;
use App\Models\MasterTask;
use App\Models\Team;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class MasterTaskController extends Controller
{
public function store(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'];
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
]);
}
}
@@ -0,0 +1,71 @@
<?php
namespace App\Http\Controllers;
use App\Models\MasterTask;
use App\Models\SubTask;
use App\Models\Team;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class SubTaskController extends Controller
{
public function store($mastertask_id, Request $request)
{
$validator = Validator::make($request->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
]);
}
}
+1 -1
View File
@@ -65,7 +65,7 @@ class TeamController extends Controller
return response()->json([ return response()->json([
'message' => 'Team deleted successfully', 'message' => 'Team deleted successfully',
'team' => $team 'team' => $team
], 201); ]);
} }
/** /**
@@ -0,0 +1,25 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class SubTaskCollection extends ResourceCollection
{
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'data' => $this->collection,
'status' => 200,
];
}
}
@@ -27,6 +27,7 @@ class SubTaskResource extends JsonResource
'spent_time' => $this->tracked_time, 'spent_time' => $this->tracked_time,
'is_finished' => $this->is_finished, 'is_finished' => $this->is_finished,
'timeblocks' => TimeblockResource::collection($this->timeblocks), 'timeblocks' => TimeblockResource::collection($this->timeblocks),
'timesheets' => TimesheetResource::collection($this->timesheets),
]; ];
} }
@@ -0,0 +1,24 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class TimesheetResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $this->id,
'employee_id' => $this->user_id,
'time' => $this->time,
];
}
}
+8
View File
@@ -10,6 +10,7 @@ class MasterTask extends Model
use HasFactory; use HasFactory;
public $timestamps = true; public $timestamps = true;
public $guarded = ['id'];
public function subtasks() public function subtasks()
{ {
@@ -40,4 +41,11 @@ class MasterTask extends Model
return !in_array($this->team->id, $user->teams->pluck('id')->unique()->toArray()); 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();
}
} }
+1
View File
@@ -10,6 +10,7 @@ class SubTask extends Model
use HasFactory; use HasFactory;
public $timestamps = true; public $timestamps = true;
public $guarded = ['id'];
public function mastertask() public function mastertask()
{ {
+13
View File
@@ -0,0 +1,13 @@
<?php
namespace App\Observers;
use App\Models\MasterTask;
class MasterTaskObserver
{
public function creating(MasterTask $mastertask)
{
$mastertask->color = MasterTask::generateMasterTaskColor();
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Providers;
use App\Models\MasterTask;
use App\Observers\MasterTaskObserver;
use Illuminate\Support\ServiceProvider;
class MasterTaskServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
MasterTask::observe( MasterTaskObserver::class);
}
}
+1
View File
@@ -194,6 +194,7 @@ return [
// App\Providers\BroadcastServiceProvider::class, // App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class, App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class, App\Providers\RouteServiceProvider::class,
App\Providers\MasterTaskServiceProvider::class,
], ],
+32 -1
View File
@@ -1,17 +1,21 @@
<?php <?php
use App\Http\Controllers\MasterTaskController; use App\Http\Controllers\MasterTaskController;
use App\Http\Controllers\SubTaskController;
use App\Http\Controllers\TeamController; use App\Http\Controllers\TeamController;
use App\Http\Controllers\UserController; use App\Http\Controllers\UserController;
use App\Http\Resources\MasterTaskCollection; use App\Http\Resources\MasterTaskCollection;
use App\Http\Resources\MasterTaskResource; use App\Http\Resources\MasterTaskResource;
use App\Http\Resources\ProjectCollection; use App\Http\Resources\ProjectCollection;
use App\Http\Resources\SubTaskCollection;
use App\Http\Resources\SubTaskResource;
use App\Http\Resources\TeamCollection; use App\Http\Resources\TeamCollection;
use App\Http\Resources\TeamResource; use App\Http\Resources\TeamResource;
use App\Http\Resources\UserCollection; use App\Http\Resources\UserCollection;
use App\Http\Resources\UserResource; use App\Http\Resources\UserResource;
use App\Models\MasterTask; use App\Models\MasterTask;
use App\Models\Project; use App\Models\Project;
use App\Models\SubTask;
use App\Models\Team; use App\Models\Team;
use App\Models\User; use App\Models\User;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
@@ -55,10 +59,37 @@ Route::get('/v1/projects', function () {
Route::get('/v1/mastertasks', function () { Route::get('/v1/mastertasks', function () {
return new MasterTaskCollection( MasterTask::all()); return new MasterTaskCollection( MasterTask::all());
}); });
Route::post('/v1/mastertasks', MasterTaskController::class . '@store');
Route::get('/v1/mastertasks/{id}', function ($id) { Route::get('/v1/mastertasks/{id}', function ($id) {
return new MasterTaskResource( MasterTask::find($id)); return new MasterTaskResource( MasterTask::find($id));
}); });
Route::post('/v1/mastertasks', MasterTaskController::class . '@store');
Route::delete('/v1/mastertasks/{id}', MasterTaskController::class . '@delete');
Route::get('/v1/mastertasks/{id}/subtasks', function ($id) {
return new SubTaskCollection( SubTask::whereHas('mastertask', function ($query) use ($id) {
$query->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');
//});