Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
12 / 12
CRAP
100.00% covered (success)
100.00%
90 / 90
EntityController
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
12 / 12
28
100.00% covered (success)
100.00%
90 / 90
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 index
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
5 / 5
 users
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
8 / 8
 entities
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
7 / 7
 store
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
7 / 7
 show
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
6 / 6
 update
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
7 / 7
 updateState
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
11 / 11
 externalFrontConfig
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
7 / 7
 validateData
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
6 / 6
 getEntityFromUrlOrigin
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
9 / 9
 updateUserOnEachEntity
100.00% covered (success)
100.00%
1 / 1
7
100.00% covered (success)
100.00%
14 / 14
1<?php
2
3namespace Qmp\Laravel\Entities\Controllers;
4
5use App\User;
6use Illuminate\Http\Response;
7use Illuminate\Http\jsonResponse;
8use Illuminate\Http\Request;
9use Illuminate\Support\Facades\Log;
10use Illuminate\Support\Facades\Redis;
11use Illuminate\Support\Facades\Storage;
12use Illuminate\Support\Str;
13use Illuminate\Validation\Rule;
14use Qmp\Laravel\Entities\Models\Entity;
15use Qmp\Laravel\Entities\Services\Campaigns\Campaigns;
16use Qmp\Laravel\Entities\Services\Entities\Entities;
17use Qmp\Laravel\Entities\Services\ExternalUsers\ExternalUsers;
18use Qmp\Laravel\Entities\Services\Ovh\Ovh;
19use Qmp\Laravel\MicroService\Controllers\AbstractMicroServiceController;
20
21
22class EntityController extends AbstractMicroServiceController
23{
24
25    protected $entityMerge = [
26        'templating' => [
27            'logo' => "/logo/qw-performance.png",
28            'color' => '#f54b55',
29            'purchaseOrder' => [
30                'fr' => [
31                    'deposit' => 'Acompte de {{amount}} à la signature',
32                    'payment' => 'Paiement à {{days}} jours fin de mois',
33                    'billing' => ['Facturation au délivré mensuel validé', 'Facturation en fin de prestation'], 
34                    'additionalInformations' => 'Advertise me s\'engage à respecter l\'image de l\'annonceur, et à ne jamais travailler avec des sites à caractère raciste, violent ou contraire aux bonnes moeurs.<br>\n                Advertise me facturera chaque début de mois les prospects générés le mois précédant en se basant sur le tracking de référence qui est par défaut l\'outil Digital metric<br>\n                L\'annonceur s\'engage à communiquer les résultats rejétés de la facturation avant le 10 du mois courant.<br>\n                Passé ce délai, les chiffres observés par le tracking de référence deviennent définitifs.<br>\n                La campagne peut être stoppée avant la fin de la date déclarée si l\'annonceur en fait la demande par écrit, la coupure sera effective sous 72 heures.\n                L\'annonceur s\'engage à ne pas contacter directement ou indirectement les sites partenaires pour relayer des offres similaires dans un délai de 10 mois à compter de la date du présent bon de commande.<br>\n                En signant le présent Ordre d\'Insertion, vous certifiez avoir lu et approuvé les CGV de Advertise me relatives aux annonceurs, disponible à l\'adresse http://www.advertiseme.net/CGV_Client_Advertiseme_FR.pdf et que vous êtes légalement en mesure de contracter avec Advertise me SAS',
35                    'cgv' => 'La T.V.A est acquittée sur les encaissements.<br>\n                En application du 13° du I de l\'article 242 nonies A de l\'annexe II au CGI, l’ANNONCEUR est informé que s’il est établi sur le territoire d\'un autre État membre de l\'Union européenne que la France, et qu’il commande une prestation de services à ADVERTISE ME le rendant redevable de la taxe, l’ANNONCEUR sera soumis au régime de l’autoliquidation.',
36                    'footer' => 'Advertise me - 1200 Avenue du Docteur Maurice Donat - Natura B2 , 06250 Mougins<br>Tél : 04 86 68 50 88 - Fax : 04 86 68 50 81 Siret n° 503 747 040 00015 TVA intracommunautaire FR47503747040<br>SAS au capital de 6000€',
37                    'contacts' => [
38                        'commercial' => 'commercial',
39                        'technic' => 'technique',
40                        'principal' => 'mandant'
41                    ]
42                        
43                ],
44                'en' => [],
45                'it' => []
46            ],
47        ]
48    ];
49
50    public function __construct(Request $request)
51    {
52        parent::__construct($request);
53        $this->entityMerge['templating']['logo'] = Storage::disk('public_images')->url($this->entityMerge['templating']['logo']);    
54    }
55
56    /**
57     * Display a listing of the resource.
58     *
59     * @return \Illuminate\Http\JsonResponse
60     */
61    public function index()
62    {
63        $entities = Entity::all()->map(function($entity) {
64            $entity = $entity->toArray();
65            return !isset($entity['templating']) ? array_merge($entity, $this->entityMerge) : $entity;
66        });
67
68
69        return response()->json($entities);
70    }
71
72    /**
73     * @param \Illuminate\Http\Request $request
74     * @return \Illuminate\Http\jsonResponse
75     */
76    public function users(Request $request): JsonResponse
77    {
78        $results = Entity::pipeline()
79            ->match('users', $this->userId)
80            ->unwind('users')
81            ->group(null, '{"users": {"$addToSet": "$users"}}')
82            ->aggregate()->first();
83
84        $ids = $results ? iterator_to_array($results->users) : [];
85        $users = User::whereIn('id', $ids)->get(['id', 'email AS name']);
86
87        return response()->json($users);
88    }
89
90    /**
91     * @param \Illuminate\Http\Request $request
92     * @return \Illuminate\Http\jsonResponse
93     */
94    public function entities(Request $request): JsonResponse
95    {
96        $entities = Entity::whereRaw([
97            'users' => (int) $this->userId
98        ])->get(['id', 'name'])->map(function($entity) {
99            $entity = $entity->toArray();
100            return !isset($entity['templating']) ? array_merge($entity, $this->entityMerge) : $entity;
101        }); 
102
103        return response()->json($entities);
104    }
105
106    /**
107     * Store a newly created resource in storage.
108     *
109     * @param \Illuminate\Http\Request $request
110     * @param \Qmp\Laravel\Entities\Services\Entities\Entities $entitiesService
111     * @return \Illuminate\Http\jsonResponse
112     */
113    public function store(Request $request, Entities $entitiesService): jsonResponse
114    {
115        $validatedData = $this->validateData($request);
116
117        try {
118            $entity = $entitiesService->store($validatedData);
119
120            Redis::publish('entities', json_encode(['action' => 'save-entity', 'entityId' => $entity->id, 'message' => $entity->name . " - save-entity"]));
121            return response()->json(['status' => 'ok', 'datas' => $entity->toArray()], Response::HTTP_CREATED);
122
123        } catch (\Exception $e) {
124            Log::debug('Unable to store entity :' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
125            return response()->json(['status' => 'ko', 'message' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
126        }
127
128    }
129
130    /**
131     * Display the specified resource.
132     *
133     * @return \Illuminate\Http\jsonResponse
134     * @throws \Exception
135     */
136    public function show($id)
137    {
138        $entity = Entity::findOrFail($id);
139
140        $campaigns = Campaigns::getEntityCampaigns($entity);
141        $entity->campaigns = $campaigns;
142
143
144        $entity = $entity->toArray();
145        return response()->json([
146            'entity' => !isset($entity['templating']) ? array_merge($entity, $this->entityMerge) : $entity,
147        ]);
148    }
149
150    /**
151     * Update the specified resource in storage.
152     *
153     * @param \Illuminate\Http\Request $request
154     * @param $id
155     * @param \Qmp\Laravel\Entities\Services\Entities\Entities $entitiesService
156     * @return \Illuminate\Http\jsonResponse
157     */
158    public function update(Request $request, $id, Entities $entitiesService): jsonResponse
159    {
160
161        $validatedData = $this->validateData($request, $id);
162
163        try {
164            $entity = $entitiesService->update($validatedData, $id);
165
166            Redis::publish('entities', json_encode(['action' => 'update-entity', 'entityId' => $entity->id, 'message' => $entity->name . " - update-entity"]));
167            return response()->json(["status" => "ok", "datas" => $entity->toArray()], Response::HTTP_OK);
168
169        }  catch (\Exception $e) {
170            Log::debug('Unable to update entity:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
171            return response()->json(["status" => "ko", "message" => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
172        }
173    }
174
175    /**
176     * Update entity State
177     * 
178     * @param Request $request
179     * @param $id
180     * @return \Illuminate\Http\JsonResponse
181     */
182    public function updateState(Request $request, $id)
183    {
184        $request->validate([
185            'id' => 'required|in:'.$id,
186            'active' => 'required|boolean'
187        ]);
188
189        try {
190            $entity = Entity::findOrFail($id);
191            $entity->active = $request->active;
192            $entity->save();
193
194            Redis::publish('entities', json_encode(['action' => 'update-entity', 'entityId' => $entity->id, 'message' => $entity->name . " - update-entity"]));
195            return response()->json(["status" => "ok", "datas" => $entity->toArray()], Response::HTTP_OK);
196
197        } catch (\Exception $e) {
198            Log::debug('Unable to update entity state:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
199            return response()->json(["status" => "ko", "message" => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
200        }
201    }
202
203    /**
204     * Return external front config by url origin
205     *
206     * @param Request $request
207     * @return \Illuminate\Http\JsonResponse
208     */
209    public function externalFrontConfig(Request $request)
210    {
211        try {
212            $request->merge(['url' => $this->httpOrigin]);
213            $entity = $this->getEntityFromUrlOrigin($request);
214            $config = $entity ? collect($entity->externalfrontconfig)->except('external-users') : [];
215
216            return response()->json($config, Response::HTTP_OK);
217        } catch (\Exception $e) {
218            Log::debug('Unable to get external front config: ' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
219            return response()->json(["status" => "ko", "message" => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
220        }
221    }
222
223    /**
224     * Validations
225     *
226     * @param Request $request
227     * @param [type] $id
228     * @return array
229     */
230    protected function validateData(Request $request, $id = null)
231    {
232        $rules =[
233            'name' => 'required|string',
234            'social' => 'present|string',
235            'address' => 'present|string',
236            'zipCode' => 'present|string',
237            'city' => 'present|string',
238            'country' => 'present|string',
239            'tva' => 'present|string',
240            'type' => 'required|string|in:internal,external',
241            'active' => 'required|boolean',
242            'users' => 'present|array',
243            'campaigns' => 'present|array',
244            'config' => 'present|array',
245            'oldConfig' => 'nullable|array',
246            'templating' => 'required|array'
247        ];
248
249        if ($id != null) {
250            $rules['id'] = [
251                'required',
252                Rule::in([$id])
253            ];
254        }
255
256        return $request->validate($rules);
257    }
258
259    public function getEntityFromUrlOrigin(Request $request)
260    {
261        $request->validate([
262            'url' => 'required'
263        ]);
264
265        $url = parse_url($request->url, PHP_URL_HOST);
266
267        $query = [
268            '$and' => [
269                ['config.id' => 4 ],
270                [ 'config.url' => $url]
271            ]
272        ];
273
274        $entities = Entity::pipeline()
275            ->match(json_encode($query))
276            ->aggregate();
277
278        return $entities->first();
279    }
280
281    public function updateUserOnEachEntity(Request $request)
282    {
283        list('user_id' => $userId, 'entity_ids' => $entityIds) = $request->validate([
284            'user_id' => 'required|integer',
285            'entity_ids' => 'present|array'
286        ]);
287
288        $entities = Entity::all();
289
290        $entities->each(function($entity) use($userId, $entityIds) {
291            if (!$entity->users || !is_array($entity->users)) {
292                $entity->users = [];
293            }
294
295            // User is in entity but not in entityIds => remove
296            if (in_array($userId, $entity->users) && !in_array($entity->id, $entityIds)) {
297                $entity->users = array_diff($entity->users, [$userId]);
298                $entity->save();
299            }
300
301            // User is not in entity but in entityIds => add
302            if (!in_array($userId, $entity->users) && in_array($entity->id, $entityIds)) {
303                $entity->users = array_merge($entity->users, [$userId]);
304                $entity->save();
305            }
306        });
307
308        return response()->json(['status' => 'ok']);
309    }
310}