|
@@ -3,6 +3,7 @@
|
|
|
namespace App\Http\Controllers\API;
|
|
|
|
|
|
use App\Http\Controllers\Controller;
|
|
|
+use App\Http\Requests\API\Task\AssignRequest;
|
|
|
use App\Http\Requests\API\Task\BatchCreateItemRules;
|
|
|
use App\Http\Requests\API\Task\BatchCreateRequest;
|
|
|
use App\Http\Requests\API\Task\CreateOrUpdateRequest;
|
|
@@ -10,15 +11,18 @@ use App\Http\Resources\API\TaskDetailResource;
|
|
|
use App\Http\Resources\API\TaskResource;
|
|
|
use App\Models\CustomField;
|
|
|
use App\Models\Enums\ActionObjectType;
|
|
|
+use App\Models\Enums\FileObjectType;
|
|
|
use App\Models\Enums\ObjectAction;
|
|
|
use App\Models\NamingRule;
|
|
|
use App\Models\Project;
|
|
|
use App\Models\Requirement;
|
|
|
-use App\Models\RequirementGroup;
|
|
|
+use App\Models\Enums\TaskStatus;
|
|
|
use App\Models\Task;
|
|
|
use App\Repositories\ActionRepository;
|
|
|
use App\Repositories\CustomFieldRepository;
|
|
|
+use App\Services\File\FileAssociationService;
|
|
|
use App\Services\History\ModelChangeDetector;
|
|
|
+use Carbon\Carbon;
|
|
|
use Illuminate\Http\Request;
|
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
use Illuminate\Support\Facades\Validator;
|
|
@@ -30,12 +34,13 @@ class TaskController extends Controller
|
|
|
*/
|
|
|
public function index(Request $request)
|
|
|
{
|
|
|
+ $pageSize=$request->get('page_size') ?? 10;
|
|
|
$tasks = Task::query()
|
|
|
->where("parent_id", 0)
|
|
|
->with(['children', 'assignTo', 'createdBy'])
|
|
|
->filter($request->all())
|
|
|
->allowed()
|
|
|
- ->paginate();
|
|
|
+ ->paginate($pageSize);
|
|
|
|
|
|
return TaskResource::collection($tasks);
|
|
|
}
|
|
@@ -43,7 +48,7 @@ class TaskController extends Controller
|
|
|
/**
|
|
|
* Store a newly created resource in storage.
|
|
|
*/
|
|
|
- public function store(CreateOrUpdateRequest $request, CustomFieldRepository $customFieldRepo)
|
|
|
+ public function store(FileAssociationService $service, CreateOrUpdateRequest $request, CustomFieldRepository $customFieldRepo)
|
|
|
{
|
|
|
$requirement = $request->has('requirement_id')
|
|
|
? Requirement::query()->findOrFail($request->get("requirement_id"))
|
|
@@ -55,6 +60,7 @@ class TaskController extends Controller
|
|
|
'created_by' => Auth::id(),
|
|
|
'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null,
|
|
|
'asset_id' => $requirement?->asset_id,
|
|
|
+ 'description' => $request->description? (new \App\Services\File\ImageUrlService)->interceptImageUrl($request->description) : null,
|
|
|
'requirement_group_id'=> $requirement?->requirement_group_id,
|
|
|
];
|
|
|
|
|
@@ -67,6 +73,12 @@ class TaskController extends Controller
|
|
|
|
|
|
ActionRepository::createByTask($task, ObjectAction::CREATED);
|
|
|
|
|
|
+ $service->association(
|
|
|
+ $request->get("file_ids", []),
|
|
|
+ $task->id,
|
|
|
+ FileObjectType::TASK
|
|
|
+ );
|
|
|
+
|
|
|
return $this->created();
|
|
|
}
|
|
|
|
|
@@ -80,6 +92,137 @@ class TaskController extends Controller
|
|
|
return new TaskDetailResource($task);
|
|
|
}
|
|
|
|
|
|
+ public function start(Request $request, string $id)
|
|
|
+ {
|
|
|
+ $task = Task::query()->allowed($id)->findOrFail($id);
|
|
|
+ $task->status = TaskStatus::DOING->value;
|
|
|
+ $changes = ModelChangeDetector::detector(ActionObjectType::TASK, $task);
|
|
|
+ $task->save();
|
|
|
+
|
|
|
+ ActionRepository::createByTask(
|
|
|
+ $task,
|
|
|
+ ObjectAction::STARTED,
|
|
|
+ $request->comment?(new \App\Services\File\ImageUrlService)->interceptImageUrl($request->comment) : null,
|
|
|
+ objectChanges: $changes
|
|
|
+ );
|
|
|
+
|
|
|
+ return $this->noContent();
|
|
|
+ }
|
|
|
+
|
|
|
+ public function pause(Request $request, string $id)
|
|
|
+ {
|
|
|
+ $task = Task::query()->allowed($id)->findOrFail($id);
|
|
|
+
|
|
|
+ $task->status = TaskStatus::PAUSE->value;
|
|
|
+ $changes = ModelChangeDetector::detector(ActionObjectType::TASK, $task);
|
|
|
+ $task->save();
|
|
|
+
|
|
|
+ ActionRepository::createByTask(
|
|
|
+ $task, ObjectAction::PAUSED,
|
|
|
+ $request->comment?(new \App\Services\File\ImageUrlService)->interceptImageUrl($request->comment) : null,
|
|
|
+ objectChanges: $changes
|
|
|
+ );
|
|
|
+
|
|
|
+ return $this->noContent();
|
|
|
+ }
|
|
|
+
|
|
|
+ public function closed(Request $request, string $id)
|
|
|
+ {
|
|
|
+ $task = Task::query()->allowed($id)->findOrFail($id);
|
|
|
+
|
|
|
+ $task->status = TaskStatus::CLOSED->value;
|
|
|
+ $changes = ModelChangeDetector::detector(ActionObjectType::TASK, $task);
|
|
|
+ $task->save();
|
|
|
+
|
|
|
+ ActionRepository::createByTask(
|
|
|
+ $task, ObjectAction::CLOSED,
|
|
|
+ $request->comment?(new \App\Services\File\ImageUrlService)->interceptImageUrl($request->comment) : null,
|
|
|
+ objectChanges: $changes
|
|
|
+ );
|
|
|
+
|
|
|
+ return $this->noContent();
|
|
|
+ }
|
|
|
+
|
|
|
+ public function done(Request $request, string $id)
|
|
|
+ {
|
|
|
+ $task = Task::query()->allowed($id)->findOrFail($id);
|
|
|
+
|
|
|
+ $task->fill([
|
|
|
+ 'status' => TaskStatus::DONE->value,
|
|
|
+ 'finished_by' => Auth::user()->id,
|
|
|
+ 'finished_at' => Carbon::now(),
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $changes = ModelChangeDetector::detector(ActionObjectType::TASK, $task);
|
|
|
+ $task->save();
|
|
|
+
|
|
|
+ ActionRepository::createByTask(
|
|
|
+ $task, ObjectAction::DONE,
|
|
|
+ $request->comment?(new \App\Services\File\ImageUrlService)->interceptImageUrl($request->comment) : null,
|
|
|
+ objectChanges: $changes
|
|
|
+ );
|
|
|
+
|
|
|
+ return $this->noContent();
|
|
|
+ }
|
|
|
+
|
|
|
+ public function cancel(Request $request, string $id)
|
|
|
+ {
|
|
|
+ $task = Task::query()->allowed($id)->findOrFail($id);
|
|
|
+
|
|
|
+ $task->fill([
|
|
|
+ 'status' => TaskStatus::CANCEL->value,
|
|
|
+ 'canceled_by' => Auth::user()->id,
|
|
|
+ 'canceled_at' => Carbon::now(),
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $changes = ModelChangeDetector::detector(ActionObjectType::TASK, $task);
|
|
|
+ $task->save();
|
|
|
+
|
|
|
+ ActionRepository::createByTask(
|
|
|
+ $task, ObjectAction::CANCELED,
|
|
|
+ $request->comment?(new \App\Services\File\ImageUrlService)->interceptImageUrl($request->comment) : null,
|
|
|
+ objectChanges: $changes
|
|
|
+ );
|
|
|
+
|
|
|
+ return $this->noContent();
|
|
|
+ }
|
|
|
+
|
|
|
+ public function wait(Request $request,string $id){
|
|
|
+ $task = Task::query()->allowed($id)->findOrFail($id);
|
|
|
+ $task->status=TaskStatus::WAIT->value;
|
|
|
+
|
|
|
+ $changes = ModelChangeDetector::detector(ActionObjectType::TASK, $task);
|
|
|
+ $task->save();
|
|
|
+
|
|
|
+ ActionRepository::createByTask(
|
|
|
+ $task, ObjectAction::WAITED,
|
|
|
+ $request->comment?(new \App\Services\File\ImageUrlService)->interceptImageUrl($request->comment) : null,
|
|
|
+ objectChanges: $changes
|
|
|
+ );
|
|
|
+
|
|
|
+ return $this->noContent();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public function assign(AssignRequest $request,string $id){
|
|
|
+ $task = Task::query()->allowed($id)->findOrFail($id);
|
|
|
+ $task->fill([
|
|
|
+ 'assign'=>$request->get('assign'),
|
|
|
+ ...$request->all(),
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $changes = ModelChangeDetector::detector(ActionObjectType::TASK, $task);
|
|
|
+ $task->save();
|
|
|
+
|
|
|
+ ActionRepository::createByTask(
|
|
|
+ $task, ObjectAction::ASSIGNED,
|
|
|
+ $request->comment?(new \App\Services\File\ImageUrlService)->interceptImageUrl($request->comment) : null,
|
|
|
+ objectChanges: $changes
|
|
|
+ );
|
|
|
+
|
|
|
+ return $this->noContent();
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Update the specified resource in storage.
|
|
|
*/
|
|
@@ -93,6 +236,7 @@ class TaskController extends Controller
|
|
|
|
|
|
$formData = [...$request->all(),
|
|
|
'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null,
|
|
|
+ 'description' => $request->description? (new \App\Services\File\ImageUrlService)->interceptImageUrl($request->description) : null,
|
|
|
'asset_id' => $requirement?->asset_id,
|
|
|
];
|
|
|
|
|
@@ -127,7 +271,6 @@ class TaskController extends Controller
|
|
|
public function batchStore(BatchCreateRequest $request, CustomFieldRepository $customFieldRepo)
|
|
|
{
|
|
|
$project = Project::query()->allowed($request->project_id)->find($request->project_id);
|
|
|
-
|
|
|
$parsedItems = [];
|
|
|
$previousItem = [];
|
|
|
foreach ($request->items as $index => $item) {
|
|
@@ -159,6 +302,9 @@ class TaskController extends Controller
|
|
|
}
|
|
|
|
|
|
foreach ($parsedItems as $item) {
|
|
|
+ $requirement=$item['requirement_id']>0 ? Requirement::query()->findOrFail($item['requirement_id']) : null;
|
|
|
+ $item["whitelist"]=!empty($item['whitelist']) ? sprintf(",%s,", implode(',',$item['whitelist'])) : null;
|
|
|
+
|
|
|
$namingRuleId = data_get($item, "naming_rule_id", 0);
|
|
|
if ($namingRuleId > 0) {
|
|
|
$keys = $customFieldRepo->keysByGroup($namingRuleId);
|
|
@@ -168,9 +314,11 @@ class TaskController extends Controller
|
|
|
$task = Task::query()->create([
|
|
|
...$item,
|
|
|
'project_id' => $project->id,
|
|
|
- 'parent_id' => 0,
|
|
|
+ 'parent_id' => $request->parent_id,
|
|
|
'company_id' => Auth::user()->company_id,
|
|
|
'created_by' => Auth::id(),
|
|
|
+ 'asset_id' => $requirement?->asset_id,
|
|
|
+ 'requirement_group_id'=> $requirement?->requirement_group_id,
|
|
|
]);
|
|
|
|
|
|
ActionRepository::createByTask($task, ObjectAction::CREATED);
|