Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
27.78% covered (danger)
27.78%
5 / 18
CRAP
38.83% covered (warning)
38.83%
73 / 188
CampaignController
0.00% covered (danger)
0.00%
0 / 1
27.78% covered (danger)
27.78%
5 / 18
622.22
38.83% covered (warning)
38.83%
73 / 188
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 index
0.00% covered (danger)
0.00%
0 / 1
8.71
47.06% covered (warning)
47.06%
8 / 17
 store
0.00% covered (danger)
0.00%
0 / 1
4.73
64.29% covered (warning)
64.29%
9 / 14
 show
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 update
0.00% covered (danger)
0.00%
0 / 1
5.63
53.33% covered (warning)
53.33%
8 / 15
 destroy
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 5
 updateUserListForOperation
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
7 / 7
 moveOperationToOtherCampaign
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
100.00%
15 / 15
 copyOperationToOtherCampaign
0.00% covered (danger)
0.00%
0 / 1
30
0.00% covered (danger)
0.00%
0 / 18
 createOperation
0.00% covered (danger)
0.00%
0 / 1
3.00
92.86% covered (success)
92.86%
13 / 14
 manageEntities
0.00% covered (danger)
0.00%
0 / 1
30
0.00% covered (danger)
0.00%
0 / 17
 getEntityCampaigns
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 8
 validateData
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
6 / 6
 getUserOperations
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 11
 getCampaignBySessionId
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 8
 getOperationsByEntity
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 11
 setNameOperation
0.00% covered (danger)
0.00%
0 / 1
12.19
20.00% covered (danger)
20.00%
2 / 10
 updateBrandForCampaigns
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 7
1<?php
2
3namespace Qmp\Laravel\Campaigns\Controllers;
4
5use App\User;
6use Illuminate\Http\JsonResponse;
7use Illuminate\Http\Response;
8use Illuminate\Http\Request;
9use Illuminate\Support\Facades\Log;
10use Illuminate\Support\Facades\Redis;
11use Illuminate\Support\Str;
12use Illuminate\Validation\Rule;
13use Qmp\Laravel\Acls\Exceptions\RolePermissionException;
14use Qmp\Laravel\Campaigns\Models\Campaign;
15use Qmp\Laravel\MicroService\Controllers\AbstractMicroServiceController;
16use Qmp\Laravel\MicroService\Client\Tools\Request as ClientRequest;
17use Qmp\Laravel\MicroService\Client\Client;
18use Qmp\Laravel\Acls\Client\Client as AclsClient;
19
20class CampaignController extends AbstractMicroServiceController
21{
22    public function __construct(Request $request)
23    {
24        parent::__construct($request);
25    }
26
27    /**
28     * Display a listing of the resource.
29     *
30     * @return \Illuminate\Http\JsonResponse
31     */
32    public function index()
33    {
34        $user = User::find($this->userId);
35
36        $campaign = Campaign::all();
37
38        try {
39            AclsClient::role($user->id, ['super_admin']);
40        } catch (RolePermissionException $e) {
41            $campaign = $campaign->filter(function ($campaign) use ($user) {
42
43                // Common entity
44                if (count(array_intersect($campaign->entities, $user->entities)) > 0) {
45                    return true;
46                }
47
48                // Affected user
49                foreach ($campaign->operations as $operation) {
50                    if (in_array($user->id, $operation['user_ids'])) {
51                        return true;
52                    }
53                }
54
55                return false;
56            });
57        }
58
59        $campaign = $campaign->map(function($item) {
60            $item->operations = $this->setNameOperation($item->operations);
61
62            return $item;
63        });
64
65        return response()->json($campaign);
66    }
67
68    /**
69     * Store a newly created resource in storage.
70     *
71     * @param  \Illuminate\Http\Request  $request
72     * @return \Illuminate\Http\JsonResponse
73     */
74    public function store(Request $request)
75    {
76        $validatedData = $this->validateData($request);
77
78        try {
79            if (is_null($request->id)) {
80                $validatedData = array_merge(['id' => uniqid()], $validatedData);
81            }
82
83            $campaign = Campaign::create($validatedData);
84
85            if ($campaign->brand_id) {
86                $request = ClientRequest::createObject('service_brand', 'brand/' . $campaign->brand_id . '/add-campaign/' . $campaign->id);
87                $response = Client::systemSend('post', $request);
88            } else {
89                $request = ClientRequest::createObject('service_brand', 'brand/' . $campaign->brand_id . '/del-campaign/' . $campaign->id);
90                $response = Client::systemSend('post', $request);
91            }
92
93            Redis::publish('campaigns', json_encode(['action' => 'save-campaign', 'campaignId' => $campaign->id, 'message' => $campaign->name . " - save-campaign"]));
94            return response()->json(['status' => 'ok', 'datas' => $campaign->ToArray()], Response::HTTP_CREATED);
95        } catch (\Exception $e) {
96            Log::debug('Unable to store entity :' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
97            return response()->json(['status' => 'ko', 'message' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
98        }
99    }
100
101    /**
102     * Display the specified resource.
103     *
104     * @return \Illuminate\Http\JsonResponse
105     */
106    public function show(Campaign $campaign)
107    {
108        $campaign->operations = $this->setNameOperation($campaign->operations);
109        
110        return response()->json([
111            'campaign' => $campaign,
112        ]);
113    }
114
115    /**
116     * Update the specified resource in storage.
117     *
118     * @param \Illuminate\Http\Request $request
119     * @param $id
120     * @return \Illuminate\Http\JsonResponse
121     */
122    public function update(Request $request, $id)
123    {
124        $validatedData = $this->validateData($request, $id);
125
126        try {
127            $model = Campaign::findOrFail($id);
128            $oldBrandId = $model->brand_id;
129
130            $model->update($validatedData);
131
132            if ($model->brand_id) {
133                $request = ClientRequest::createObject('service_brand', 'brand/' . $model->brand_id . '/add-campaign/' . $model->id);
134                $response = Client::systemSend('post', $request);
135            } elseif ($oldBrandId) {
136                $request = ClientRequest::createObject('service_brand', 'brand/' . $oldBrandId . '/del-campaign/' . $model->id);
137                $response = Client::systemSend('post', $request);
138            }
139
140            Redis::publish('campaigns', json_encode(['action' => 'update-campaign', 'campaignId' => $model->id, 'message' => $model->name . " - update-campaign"]));
141            return response()->json(["status" => "ok", "datas" => $model->toArray()], Response::HTTP_OK);
142        } catch (\Exception $e) {
143            Log::debug('Unable to update entity:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
144            return response()->json(["status" => "ko", "message" => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
145        }
146    }
147
148    /**
149     * Remove the specified resource from storage.
150     *
151     * @return \Illuminate\Http\Response
152     */
153    public function destroy($id)
154    {
155        $campaign = Campaign::find($id);
156        $name = $campaign->name;
157        $campaign->delete();
158
159        Redis::publish('campaigns', json_encode(['action' => 'delete-campaign', 'campaignId' => $id, 'message' => $name . " - delete-campaign"]));
160        return response()->json(["status" => "ok"]);
161    }
162
163    public function updateUserListForOperation(Request $request)
164    {
165        $rules = [
166            'campaign_id' => 'required',
167            'operation_id' => 'required',
168            'feature_id' => 'required',
169            'userlist' => 'present|array'
170        ];
171
172        $data = $request->validate($rules);
173
174        $result = Campaign::where('id', $data['campaign_id'])->update(["operations.$[operation].user_ids" => $data['userlist']], ['arrayFilters' => [
175            [
176                '$and' => [
177                    ['operation.id' => $data['operation_id']],
178                    ['operation.feature_id' => $data['feature_id']]
179                ]
180            ]
181        ]]);
182
183        Redis::publish('campaigns', json_encode(['action' => 'update-campaign', 'campaignId' => $data['campaign_id'], 'message' => $data['campaign_id'] . " - update-user-list-operation-" . $data['operation_id']]));
184
185        return response()->json(["status" => $result ? 'ok' : 'ko'], $result ? Response::HTTP_OK : Response::HTTP_UNPROCESSABLE_ENTITY);
186    }
187
188    public function moveOperationToOtherCampaign(Request $request)
189    {
190        $rules = [
191            'old_campaign_id' => 'required',
192            'operation_id' => 'required',
193            'feature_id' => 'required',
194            'new_campaign_id' => 'required'
195        ];
196
197        $data = $request->validate($rules);
198
199        $oldCampaign = Campaign::find($data['old_campaign_id']);
200        $operations = collect($oldCampaign['operations']);
201        $result = $operations->where('id', $data['operation_id'])
202            ->where('feature_id', $data['feature_id'])
203            ->first();
204
205        if ($result) {
206            $result = Campaign::find($data['new_campaign_id'])->push('operations', $result);
207        }
208
209        if ($result) {
210            $result = $oldCampaign->pull('operations', [
211                'id' => $data['operation_id'],
212                'feature_id' => $data['feature_id'],
213            ]);
214        }
215
216        Redis::publish('campaigns', json_encode(['action' => 'update-campaign', 'campaignId' => $data['new_campaign_id'], 'message' => $data['operation_id'] . " - move-operation-" . $data['old_campaign_id'] . '->' . $data['new_campaign_id']]));
217
218        return response()->json(["status" => $result ? 'ok' : 'ko'], $result ? Response::HTTP_OK : Response::HTTP_UNPROCESSABLE_ENTITY);
219    }
220
221    /**
222     * @param \Illuminate\Http\Request $request
223     * @return \Illuminate\Http\JsonResponse
224     */
225    public function copyOperationToOtherCampaign(Request $request): JsonResponse
226    {
227        $rules = [
228            'old_campaign_id' => 'required',
229            'operation_id' => 'required',
230            'feature_id' => 'required',
231            'new_campaign_id' => 'required'
232        ];
233
234        $data = $request->validate($rules);
235
236        $oldCampaign = Campaign::find($data['old_campaign_id']);
237        $operations = collect($oldCampaign['operations']);
238        $operation = $operations->where('id', $data['operation_id'])
239            ->where('feature_id', $data['feature_id'])
240            ->first();
241
242        if ($operation) {
243            $request = ClientRequest::createObject('service_entities', 'feature/copy-operation/' . $data['feature_id'], [
244                'body' => [
245                    'id' => $data['operation_id'],
246                    'campaign_id' => $data['new_campaign_id']
247                ]
248            ]);
249
250            $responseCopyOperation = Client::systemSend('post', $request);
251
252            if (Str::startsWith($responseCopyOperation->code, '2')) {
253
254                $operation['id'] = $responseCopyOperation->content['operation_id'];
255
256                $result = Campaign::findOrFail($data['new_campaign_id'])->push('operations', $operation);
257
258                Redis::publish('campaigns', json_encode(['action' => 'update-campaign', 'campaignId' => $data['new_campaign_id'], 'message' => $data['operation_id'] . " - copy-operation-" . $data['old_campaign_id'] . '->' . $data['new_campaign_id']]));
259
260                return response()->json(["status" => $result ? 'ok' : 'ko'], $result ? Response::HTTP_OK : Response::HTTP_UNPROCESSABLE_ENTITY);
261            }
262        }
263
264        return response()->json(["status" => 'ko'], Response::HTTP_UNPROCESSABLE_ENTITY);
265    }
266
267    /**
268     * @param \Illuminate\Http\Request $request
269     * @param \Qmp\Laravel\Campaigns\Models\Campaign $campaign
270     * @return \Illuminate\Http\JsonResponse
271     */
272    public function createOperation(Request $request, Campaign $campaign)
273    {
274        $rules = [
275            'campaign_id' => 'required',
276            'feature_id' => 'required'
277        ];
278
279        $data = $request->validate($rules);
280        $request = ClientRequest::createObject('service_entities', 'feature/create-operation/' . $data['feature_id']);
281        $responseCreateOperation = Client::systemSend('post', $request);
282
283        Log::debug(var_export([$responseCreateOperation, $data], true));
284
285        if (Str::startsWith($responseCreateOperation->code, '2')) {
286            // Save campaign
287            $operation = [
288                'id' => $responseCreateOperation->content['operation_id'],
289                'feature_id' => $data['feature_id'],
290                'user_ids' => [$this->userId]
291            ];
292
293            $result = $campaign->push('operations', $operation);
294
295            if ($result) {
296                Redis::publish('campaigns', json_encode(['action' => 'update-campaign', 'campaignId' => $data['campaign_id'], 'message' => $campaign->name . " - create-operation-" . $data['feature_id']]));
297
298                return response()->json(['status' => 'ok']);
299            }
300        }
301
302        return response()->json(['status' => 'ko', 422]);
303    }
304
305    /**
306     * @param \Illuminate\Http\Request $request
307     * @return \Illuminate\Http\JsonResponse
308     */
309    public function manageEntities(Request $request)
310    {
311        $request->validate([
312            'id' => 'required|string',
313            'add' => 'present|array',
314            'delete' => 'present|array'
315        ]);
316
317        try{
318
319            foreach ($request->add as $campaign_id)
320            {
321                $campaign = Campaign::findOrFail($campaign_id);
322                $campaign->entities = array_merge($campaign->entities, [$request->id]);
323                $campaign->save();
324            }
325
326            foreach ($request->delete as $campaign_id)
327            {
328                $campaign = Campaign::findOrFail($campaign_id);
329                $entities = $campaign->entities;
330                if (($key = array_search($request->id, $entities)) !== false) {
331                    unset($entities[$key]);
332                }
333                $campaign->entities = $entities;
334                $campaign->save();
335            }
336
337            return response()->json(["status" => "ok"], Response::HTTP_OK);
338
339        } catch (\Exception $e) {
340            Log::debug('Unable to manage entities:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
341            return response()->json(["status" => "ko", "message" => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
342        }
343    }
344
345    /**
346     * @param \Illuminate\Http\Request $request
347     * @param $id
348     * @return \Illuminate\Http\JsonResponse
349     */
350    public function getEntityCampaigns(Request $request, $id)
351    {
352        $result = Campaign::pipeline()
353            ->unwind('entities')
354            ->match('entities', $id)
355            ->group(null, ['campaigns' => ['$addToSet' => '$id']])
356            ->aggregate()
357            ->first();
358
359        $campaigns = empty($result) ? $result : $result->campaigns;
360
361        return response()->json($campaigns, Response::HTTP_OK);
362    }
363
364    /**
365     * @param \Illuminate\Http\Request $request
366     * @param null $id
367     * @return array
368     */
369    protected function validateData(Request $request, $id = null): array
370    {
371        $rules = [
372            'name' => 'required',
373            'entities' => 'present|array',
374            'brand_id' => 'nullable'
375        ];
376
377        if ($id != null) {
378            $rules['id'] = [
379                'required',
380                Rule::in([$id])
381            ];
382        }
383
384        return $request->validate($rules);
385    }
386
387    /**
388     * @param null $type
389     * @param null $userId
390     * @return \Illuminate\Http\JsonResponse
391     */
392    public function getUserOperations($type = null, $userId = null)
393    {
394        $userEntities = User::where('id', $userId)->get('entities');
395
396        $query = [
397            '$or' => [
398                ['entities' => ['$in' => $userEntities->first()->entities]],
399                ['operations.user_ids' => (int) $userId]
400            ]
401        ];
402
403        $operationsIds = Campaign::pipeline()
404            ->match(json_encode($query))
405            ->unwind('operations')
406            ->group('$operations.feature_id', '{ "ids" : { "$push" : "$operations.id" } }')
407            ->match('_id', (int) $type)
408            ->replaceRoot('{ "ids" : "$ids" }')
409            ->aggregate();
410
411        return response()->json(["status" => "ok", "datas" => $operationsIds->first()], Response::HTTP_OK);
412    }
413
414    /**
415     * @param \Illuminate\Http\Request $request
416     * @return \Illuminate\Http\JsonResponse
417     */
418    public function getCampaignBySessionId(Request $request)
419    {
420        $type = $request->type;
421        $sessionId = $request->sessionId;
422
423        $query = [
424            '$and' => [
425                ['operations.id' => $sessionId ],
426                [ 'operations.feature_id' => (int) $type]
427            ]
428        ];
429
430        $campaign = Campaign::pipeline()
431            ->match(json_encode($query))
432            ->aggregate();
433
434        return response()->json(["status" => "ok", "datas" => $campaign->first()], Response::HTTP_OK);
435    }
436
437    /**
438     * @param $type
439     * @param $entityId
440     * @return \Illuminate\Http\JsonResponse
441     */
442    public function getOperationsByEntity($type, $entityId)
443    {
444        $type = (int) $type;
445        $campaigns = Campaign::where('entities', 'all', [$entityId])->get();
446
447        $operationsIds = $campaigns->map(function($campaign) use ($type) {
448            $operations = is_array($campaign->operations) ? $campaign->operations : [];
449            return array_map(function($item) {
450                return $item['id'];
451            }, array_filter($operations, function($operation) use ($type) {
452                return $operation['feature_id'] === $type;
453            }));
454        })->flatten()->all();
455
456        return response()->json(["status" => "ok", "datas" => $operationsIds], Response::HTTP_OK);
457    }
458
459    /**
460     * @param $operations
461     * @return array
462     */
463    protected function setNameOperation($operations): array
464    {
465        if (!is_array($operations)) {
466            return [];
467        }
468        
469        foreach($operations as &$operation) {
470            $featureId = $operation['feature_id'];
471            $id = $operation['id'];
472            $request = ClientRequest::createObject('service_entities', "feature/get-name-operation/$featureId/$id");
473            $responseGetOperation = Client::systemSend('get', $request);
474            if (!empty($responseGetOperation->content['name'])) {
475                $operation['name'] = $responseGetOperation->content['name'];
476            }
477        }
478
479        return $operations;
480    }
481
482    /**
483     * @param \Illuminate\Http\Request $request
484     * @return \Illuminate\Http\JsonResponse
485     */
486    public function updateBrandForCampaigns(Request $request)
487    {
488        $campaignIds = $request->campaign_ids;
489        $brandId = $request->brand_id;
490
491        Campaign::where('brand_id', $brandId)
492            ->update(['brand_id' => null]);
493        
494        Campaign::whereIn('id', $campaignIds)
495            ->update(['brand_id' => $brandId]);
496
497        return response()->json(['status' => 'ok']);
498    }
499}