Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
12 / 12 |
CRAP | |
100.00% |
90 / 90 |
EntityController | |
100.00% |
1 / 1 |
|
100.00% |
12 / 12 |
28 | |
100.00% |
90 / 90 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
index | |
100.00% |
1 / 1 |
2 | |
100.00% |
5 / 5 |
|||
users | |
100.00% |
1 / 1 |
2 | |
100.00% |
8 / 8 |
|||
entities | |
100.00% |
1 / 1 |
2 | |
100.00% |
7 / 7 |
|||
store | |
100.00% |
1 / 1 |
2 | |
100.00% |
7 / 7 |
|||
show | |
100.00% |
1 / 1 |
2 | |
100.00% |
6 / 6 |
|||
update | |
100.00% |
1 / 1 |
2 | |
100.00% |
7 / 7 |
|||
updateState | |
100.00% |
1 / 1 |
2 | |
100.00% |
11 / 11 |
|||
externalFrontConfig | |
100.00% |
1 / 1 |
3 | |
100.00% |
7 / 7 |
|||
validateData | |
100.00% |
1 / 1 |
2 | |
100.00% |
6 / 6 |
|||
getEntityFromUrlOrigin | |
100.00% |
1 / 1 |
1 | |
100.00% |
9 / 9 |
|||
updateUserOnEachEntity | |
100.00% |
1 / 1 |
7 | |
100.00% |
14 / 14 |
1 | <?php |
2 | |
3 | namespace Qmp\Laravel\Entities\Controllers; |
4 | |
5 | use App\User; |
6 | use Illuminate\Http\Response; |
7 | use Illuminate\Http\jsonResponse; |
8 | use Illuminate\Http\Request; |
9 | use Illuminate\Support\Facades\Log; |
10 | use Illuminate\Support\Facades\Redis; |
11 | use Illuminate\Support\Facades\Storage; |
12 | use Illuminate\Support\Str; |
13 | use Illuminate\Validation\Rule; |
14 | use Qmp\Laravel\Entities\Models\Entity; |
15 | use Qmp\Laravel\Entities\Services\Campaigns\Campaigns; |
16 | use Qmp\Laravel\Entities\Services\Entities\Entities; |
17 | use Qmp\Laravel\Entities\Services\ExternalUsers\ExternalUsers; |
18 | use Qmp\Laravel\Entities\Services\Ovh\Ovh; |
19 | use Qmp\Laravel\MicroService\Controllers\AbstractMicroServiceController; |
20 | |
21 | |
22 | class 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 | } |