%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/html/klinisol/klinisol-api/app/Http/Controllers/Api/v1/
Upload File :
Create Path :
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()
            ]);
        }
    }

}

Zerion Mini Shell 1.0