Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
93 / 93
Entities
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
3 / 3
22
100.00% covered (success)
100.00%
93 / 93
 store
100.00% covered (success)
100.00%
1 / 1
6
100.00% covered (success)
100.00%
32 / 32
 update
100.00% covered (success)
100.00%
1 / 1
12
100.00% covered (success)
100.00%
51 / 51
 saveLogoTemplating
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
10 / 10
1<?php
2
3namespace Qmp\Laravel\Entities\Services\Entities;
4
5use App\User;
6use Illuminate\Support\Facades\Storage;
7use Illuminate\Support\Str;
8use Qmp\Laravel\Entities\Models\Entity;
9use Qmp\Laravel\Entities\Services\Campaigns\Campaigns;
10use Qmp\Laravel\Entities\Services\ExternalUsers\ExternalUsers;
11use Qmp\Laravel\Entities\Services\Ovh\Ovh;
12
13class Entities
14{
15    /**
16     * @param array $validatedData
17     * @return Entity
18     * @throws \Exception
19     */
20    public function store(array $validatedData): Entity
21    {
22        $validatedData = array_merge(['id' => uniqid()], $validatedData);
23
24        // Save image templating
25        $validatedData = $this->saveLogoTemplating($validatedData);
26
27        $entity = Entity::create(collect($validatedData)->except('config', 'campaigns')->toArray());
28
29        //Manage internal users
30        foreach ($entity->users as $id) {
31            $user = User::findOrFail($id);
32            $user->entities = array_merge($user->entities, [$entity->id]);
33            $user->save();
34        }
35
36        //Manage Campaigns
37        if(!empty($validatedData['campaigns'])) {
38            Campaigns::manageEntityCampaigns([
39                'id' => $entity->id,
40                'add' => $validatedData['campaigns'],
41                'delete' => []
42            ]);
43        }
44
45        $configs = collect($validatedData['config']);
46        // Manage classic config
47        $entity->config = array_values($configs->filter(function ($config){
48            return $config['id'] !== 4;
49        })->toArray());
50
51        $entity->oldConfig = $validatedData['oldConfig'];
52
53        //Manage external front
54        $externalFrontConfig = $configs->filter(function ($config){
55            return $config['id'] === 4;
56        })->first();
57
58        if($externalFrontConfig) {
59            if($externalFrontConfig['url']) {
60                Ovh::manageOvhRecord($externalFrontConfig['url']);
61            }
62
63            $externalUsers = $externalFrontConfig['external-users'] ? ExternalUsers::handleExternalUsers($externalFrontConfig['external-users']) : collect();
64
65            ExternalUsers::manageExternalUsersEntities([
66                'id' => $entity->id,
67                'add' => $externalUsers->pluck('id')->toArray(),
68                'delete' => []
69            ]);
70
71            $externalFrontConfig['external-users'] = $externalUsers->toArray();
72
73            /* $entity->config = array_values($configs->filter(function ($config){
74                return $config['id'] !== 4;
75            })->push($externalFrontConfig)->toArray()); */
76
77            $entityConfig = $entity->config;
78            $entityConfig[] = $externalFrontConfig;
79
80            $entity->config = $entityConfig;
81        }
82
83        $entity->save();
84
85        return $entity;
86    }
87
88    /**
89     * @param array $validatedData
90     * @param $id
91     * @return \Qmp\Laravel\Entities\Models\Entity
92     * @throws \Exception
93     */
94    public function update(array $validatedData, $id): Entity
95    {
96
97        // Save image templating
98        $validatedData = $this->saveLogoTemplating($validatedData);
99
100        $entity = Entity::findOrFail($id);
101
102        //Manage internal users
103        $deletedUsers = array_diff($entity->users, $validatedData['users']);
104        $addedUsers = array_diff($validatedData['users'], $entity->users);
105
106        foreach ($addedUsers as $id) {
107            $user = User::findOrFail($id);
108            $user->entities = array_merge($user->entities, [$entity->id]);
109            $user->save();
110        }
111
112        foreach ($deletedUsers as $id) {
113            $user = User::findOrFail($id);
114            $entities = $user->entities;
115            if (($key = array_search($entity->id, $entities)) !== false) {
116                unset($entities[$key]);
117            }
118            $user->entities = $entities;
119            $user->save();
120        }
121
122        //Manage Campaigns
123        $campaigns = Campaigns::getEntityCampaigns($entity);
124
125        $add = array_diff($validatedData['campaigns'], $campaigns);
126        $delete = array_diff($campaigns,  $validatedData['campaigns']);
127
128        if(!empty($add) || !empty($delete)) {
129            Campaigns::manageEntityCampaigns([
130                'id' => $entity->id,
131                'add' => $add,
132                'delete' => $delete
133            ]);
134        }
135
136        //Manage external front config
137        $configs = collect($validatedData['config']);
138        $externalFrontConfig = $configs->filter(function ($config){
139            return $config['id'] === 4;
140        })->first();
141
142        if($externalFrontConfig) {
143            if (Str::startsWith($externalFrontConfig['url'], 'http')) {
144                $externalFrontConfig['url'] = parse_url($externalFrontConfig['url'], PHP_URL_HOST);
145            }
146
147            if($externalFrontConfig['url'] != $entity->externalfronturl) {
148                Ovh::manageOvhRecord($externalFrontConfig['url']);
149            }
150
151            $externalUsers = $externalFrontConfig['external-users'] ? ExternalUsers::handleExternalUsers($externalFrontConfig['external-users']) : collect();
152
153            $externalUsersDb = collect($entity->externalusers)->pluck('id')->toArray();
154            $externalUsersRequest = $externalUsers->pluck('id')->toArray();
155
156            $add = array_diff($externalUsersRequest, $externalUsersDb);
157            $delete = array_diff($externalUsersDb,  $externalUsersRequest);
158
159            if(!empty($add) || !empty($delete)) {
160                ExternalUsers::manageExternalUsersEntities([
161                    'id' => $entity->id,
162                    'add' => $add,
163                    'delete' => $delete
164                ]);
165            }
166
167            $externalFrontConfig['external-users'] = $externalUsers->toArray();
168
169            $validatedData['config'] = array_values($configs->filter(function ($config){
170                return $config['id'] !== 4;
171            })->push($externalFrontConfig)->toArray());
172        } else {
173            ExternalUsers::manageExternalUsersEntities([
174                'id' => $entity->id,
175                'add' =>[],
176                'delete' => collect($entity->externalusers)->pluck('id')->toArray()
177            ]);
178        }
179
180        $entity->update(collect($validatedData)->except('campaigns')->toArray());
181
182        return $entity->refresh();
183
184    }
185
186    /**
187     * @param array $data
188     * @return array
189     */
190    protected function saveLogoTemplating(array $data): array
191    {
192        if (isset($data['templating']['logoImgToSave']) && strlen($data['templating']['logoImgToSave']) > 0) {
193            $ext = explode('/', mime_content_type($data['templating']['logoImgToSave']))[1];
194
195            $filename = '/logo/' . Str::random(32) . '.' . $ext;
196
197            $explode = explode(',', $data['templating']['logoImgToSave']);
198            $document = str_replace(' ', '+', $explode[1]);
199
200            Storage::disk('public_images')->put($filename, base64_decode($document));
201
202            $data['templating']['logo'] = Storage::disk('public_images')->url($filename);
203        }
204
205        if (isset($data['templating'])) {
206            unset($data['templating']['logoImgToSave']);
207        }
208
209        return $data;
210    }
211}