json(['records' => $workflow->list($area, $request->user()->id)]); } public function show(Request $request, string $area, int $id, ServiceWorkflow $workflow) { return response()->json($workflow->show($area, $id, $request->user()->id)); } public function create(Request $request, string $area, ServiceWorkflow $workflow) { return $this->save($request, $area, null, $workflow); } public function update(Request $request, string $area, int $id, ServiceWorkflow $workflow) { return $this->save($request, $area, $id, $workflow); } private function save(Request $request, string $area, ?int $id, ServiceWorkflow $workflow) { abort_unless(in_array($area, ServicePermissions::AREAS, true), 404); $rules = ['name' => ServicePermissions::unitScoped($area) ? 'sometimes|required|string|max:255' : 'required|string|max:255', 'description' => 'nullable|string|max:2000', 'version' => $id ? 'required|integer|min:1' : 'prohibited']; if ($area === 'clients') { unset($rules['description']); } if (ServicePermissions::unitScoped($area)) { $rules += ['currency' => 'nullable|string|regex:/^[A-Z]{3}$/', 'lines' => $area === 'service_drafts' ? 'required|array|min:1|max:100' : 'sometimes|array|min:1|max:100', 'lines.*' => 'array:service_id,service_name,description,quantity,unit_price', 'lines.*.service_id' => 'required|integer|min:1', 'lines.*.service_name' => 'sometimes|string|max:255', 'lines.*.description' => 'nullable|string|max:2000', 'lines.*.quantity' => 'nullable|string|max:30', 'lines.*.unit_price' => 'nullable|string|max:30']; if ($area === 'service_drafts') { $rules['client_id'] = 'required|integer|min:1'; } else { $rules['source_id'] = $id ? 'prohibited' : 'required|integer|min:1'; $rules['reload_source'] = 'sometimes|boolean'; } } $unknown = array_diff(array_keys($request->all()), array_keys($rules)); abort_if($unknown !== [], 422, 'Campo não suportado ou identificador protegido.'); $data = $request->validate($rules); $key = (string) $request->header('Idempotency-Key', ''); return response()->json($workflow->save($area, $id, $request->user()->id, $data, $key), $id ? 200 : 201); } public function accesses(Request $request, string $area, ServiceAccess $access) { return response()->json($access->listing($area, $request->user()->id)); } public function changeAccess(Request $request, string $area, ServiceAccess $access) { $data = $request->validate(['email' => 'required|email|max:255', 'action' => 'required|string', 'grant' => 'required|boolean', 'reason' => 'required|string|max:500']); abort_if(array_diff(array_keys($request->all()), ['email','action','grant','reason']) !== [], 422); $access->change($area, $request->user()->id, $data); return response()->json(['ok' => true]); } }