Completed
Push — master ( 4f44f9...ca5c21 )
by
unknown
07:57
created

UpdateController::updateTranslatable()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 9.584
c 0
b 0
f 0
cc 3
nc 3
nop 3
1
<?php
2
3
namespace BBSLab\NovaTranslation\Http\Controllers\TranslatableResource;
4
5
use BBSLab\NovaTranslation\Resources\TranslatableResource;
6
use Illuminate\Database\Eloquent\Model;
7
use Illuminate\Support\Facades\DB;
8
use Laravel\Nova\Actions\ActionEvent;
9
use Laravel\Nova\Http\Controllers\ResourceUpdateController;
10
use Laravel\Nova\Http\Requests\UpdateResourceRequest;
11
12
class UpdateController extends ResourceUpdateController
13
{
14
    use Traits\TranslatableController;
15
16
    /**
17
     * {@inheritdoc}
18
     */
19
    public function handle(UpdateResourceRequest $request)
20
    {
21
        $resource = $request->resource();
22
23
        if (is_subclass_of($resource, TranslatableResource::class)) {
24
            $model = $request->findModelQuery()->lockForUpdate()->firstOrFail();
25
            $resource = $request->newResourceWith($model);
26
27
            $resource->authorizeToUpdate($request);
28
            // @TODO... Ensure updating rules
29
            $resource::validateForUpdate($request);
30
31
            if ($this->modelHasBeenUpdatedSinceRetrieval($request, $model)) {
32
                return response('', 409)->throwResponse();
33
            }
34
35
            DB::transaction(function () use ($request, $model, $resource) {
36
                $this->updateTranslatable($request, $model, $resource);
37
            });
38
39
            return response()->json([
40
                'id' => $model->getKey(),
41
                'resource' => $model->attributesToArray(),
42
                'redirect' => $resource::redirectAfterUpdate($request, $resource),
43
            ]);
44
        } else {
45
            return parent::handle($request);
46
        }
47
    }
48
49
    /**
50
     * Update translatable.
51
     *
52
     * @param  \Laravel\Nova\Http\Requests\UpdateResourceRequest  $request
53
     * @param  \Illuminate\Database\Eloquent\Model  $model
54
     * @param  \BBSLab\NovaTranslation\Resources\TranslatableResource  $resource
55
     * @return array
56
     */
57
    protected function updateTranslatable(UpdateResourceRequest $request, Model $model, TranslatableResource $resource)
58
    {
59
        $updateFields = $resource->updateFields($request);
60
        $translatedData = $this->mapTranslatableData($request, $updateFields);
61
62
        $translatedModels = [];
63
        foreach ($translatedData as $localeId => $fields) {
64
            $translatedModels[$localeId] = $model->newQuery()->find($fields[$model->getKeyName()]);
65
            unset($fields['translation_id'], $fields[$model->getKeyName()]);
66
67
            foreach ($fields as $field => $value) {
68
                $translatedModels[$localeId]->$field = $value;
69
            }
70
71
            ActionEvent::forResourceUpdate($request->user(), $translatedModels[$localeId])->save();
72
73
            $translatedModels[$localeId]->save();
74
        }
75
76
        return $translatedModels;
77
    }
78
}
79