%PDF- %PDF-
Direktori : /var/www/html/klinisol/klinisol-api/app/Http/Controllers/Api/v1/ |
Current File : /var/www/html/klinisol/klinisol-api/app/Http/Controllers/Api/v1/ProtocolController.php |
<?php namespace App\Http\Controllers\Api\v1; use App\Http\Controllers\Api\ApiController; use App\Http\Requests\Api\v1\Protocol\CreateProtocolRequest; use App\Http\Requests\Api\v1\Protocol\UpdateProtocolRequest; use App\Models\Protocol; use App\Models\Question; use App\Transformers\BaseProtocolTransformer; use App\Transformers\MediaTransformer; use App\Transformers\QuestionTransformer; use Doctrine\DBAL\Query\QueryBuilder; use Flow\Config; use Flow\File; use Flow\Request as FlowRequest; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\DB; use Spatie\Fractal\Fractal; class ProtocolController extends ApiController { /** * @param Request $request * @return Fractal */ public function index(Request $request) { $result = $this->filterProtocol($request) ->paginate($request->get('perPage')); /** @var LengthAwarePaginator $result */ return $this->withPaginated($result, new BaseProtocolTransformer()); } /** * @param Request $request * @return Builder */ private function filterProtocol(Request $request) { $result = Protocol::query(); if ($code = $request->get('code')) { $result = $result->where('code', 'like', "$code%"); } if ($name = $request->get('name')) { $result = $result->where('name', 'like', "$name%"); } if ($address = $request->get('address')) { $result = $result->where('address', 'like', "$address%"); } return $result; } /** * @param $id * @return JsonResponse */ public function show($id) { $protocol = Protocol::query() ->findOrFail($id); return $this->item($protocol, new BaseProtocolTransformer()); } /** * @param CreateProtocolRequest $request * @return JsonResponse */ public function store(CreateProtocolRequest $request) { $protocol = Protocol::query() ->create([ 'code' => $request->get('code'), 'name' => $request->get('name'), 'description' => $request->get('description'), 'template_id' => $request->get('template_id'), 'is_enabled' => true, 'irb_number' => $request->get('irb_number'), 'irb_approval_date' => $request->get('irb_approval_date'), 'irb_expiration_date' => $request->get('irb_expiration_date'), ]); return $this->item($protocol, new BaseProtocolTransformer()); } /** * @param UpdateProtocolRequest $request * @param $id * @return JsonResponse */ public function update(UpdateProtocolRequest $request, $id) { $protocol = Protocol::query() ->findOrFail($id); $protocol->update($request->only([ 'name', 'description', 'is_enabled', 'template_id', 'irb_number', 'irb_approval_date', 'irb_expiration_date', ])); return $this->item($protocol, new BaseProtocolTransformer()); } /** * @param $id * @return JsonResponse */ public function enable($id) { /** @var Protocol $protocol */ $protocol = Protocol::query() ->findOrFail($id); $protocol->enable(); return $this->item($protocol, new BaseProtocolTransformer()); } /** * @param $id * @return JsonResponse */ public function disable($id) { /** @var Protocol $protocol */ $protocol = Protocol::query() ->findOrFail($id); $protocol->disable(); return $this->item($protocol, new BaseProtocolTransformer); } /** * @param Request $request * @param $id * @return Fractal */ public function getAllQuestion(Request $request, $id) { /** @var QueryBuilder $items */ $items = Question::query(); $items = $items->where('protocol_id', $id); if ($type = $request->get('type')) { $items = $items->where('type', 'like', "$type%"); } /** @var LengthAwarePaginator $result */ $result = $items->paginate($request->get('perPage')); return $this->withPaginated($result, new QuestionTransformer()); } public function uploadProtocolData($id) { return $this->_upload($id, Protocol::PROTOCOL_DATA, 1); } public function uploadStudyPlan($id) { return $this->_upload($id, Protocol::STUDY_PLAN, 2); } public function uploadContactPersonnel($id) { return $this->_upload($id, Protocol::STUDY_CONTACT_PERSONNEL, 3); } private function _upload($id, $type, $order) { /** @var Protocol $protocol */ $protocol = Protocol::query() ->findOrFail($id); $fileName = md5(time());; $request = new FlowRequest(); $config = new Config([ 'tempDir' => storage_path('app/flow/chunks'), ]); $file = new File($config, $request); $realFileName = $request->getParam('flowFilename'); $ext = last(explode('.', $realFileName)); $destination = storage_path("app/flow/uploads/$fileName.$ext"); if (request()->isMethod('GET')) { if (!$file->checkChunk()) { return response()->make('', 204); } } else { if ($file->validateChunk()) { $file->saveChunk(); } else { return $this->wrongArguments('test'); } } try { DB::beginTransaction(); if ($file->validateFile() && $file->save($destination)) { if ($current = $protocol->getMediaByType($type) ){ $current->delete(); } $media = $protocol->addMedia($destination) ->usingName($fileName) ->usingFileName("$fileName.$ext") ->withCustomProperties(['type' => $type, 'order' => $order]) ->toMediaCollection(Protocol::COLLECTION_NAME, Protocol::DISK); DB::commit(); return $this->item($media, new MediaTransformer()); } return response(['message' => 'ok'], 200); } catch (\Exception $e) { DB::rollBack(); return $this->wrongArguments([ 'message' => $e->getMessage() ]); } } }