Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
26.32% covered (danger)
26.32%
20 / 76
41.67% covered (danger)
41.67%
5 / 12
CRAP
0.00% covered (danger)
0.00%
0 / 1
GoogleController
26.32% covered (danger)
26.32%
20 / 76
41.67% covered (danger)
41.67%
5 / 12
180.02
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getAuthUrl
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 postLogin
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
12
 getMeGoogle
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 getCustomers
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 getConversionActionCategories
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getConversionActionTypes
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getConversionActionStatuses
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getCampaigns
85.71% covered (warning)
85.71%
6 / 7
0.00% covered (danger)
0.00%
0 / 1
2.01
 getConversionActions
28.57% covered (danger)
28.57%
2 / 7
0.00% covered (danger)
0.00%
0 / 1
3.46
 postConversionAction
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
12
 __validateConversionActionRequest
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2namespace App\Http\Controllers\api;
3
4use Illuminate\Http\Request;
5use Illuminate\Http\JsonResponse;
6use App\Http\Controllers\api\BaseController as BaseController;
7use App\Models\User;
8use Illuminate\Support\Facades\Auth;
9use Validator;
10
11use App\Traits\GoogleTrait;
12
13class GoogleController extends BaseController
14{
15    use GoogleTrait;
16
17    protected $googleAds;
18
19    public function __construct(\App\Libs\GoogleAds $ga) {
20        $this->googleAds = $ga;
21        
22    }
23
24    /**
25     * Return the url of the google auth.
26     * FE should call this and then direct to this url.
27     *
28     * @return JsonResponse
29     */
30    public function getAuthUrl(Request $request):JsonResponse
31    {
32        $client = $this->getClient();
33        return $this->sendResponse(200, ['url' => stripslashes($client->createAuthUrl())]);
34    } // getAuthUrl
35
36
37    /**
38     * Login and register
39     * Gets registration data by calling google Oauth2 service
40     *
41     * @return JsonResponse
42     */
43    public function postLogin(Request $request):JsonResponse
44    {
45        $normalUserRoleId = 2;
46
47        /**
48         * Get authcode from the query string
49         */
50        $authCode = urldecode($request->input('auth_code'));
51
52        /**
53         * Google client
54         */
55        $client = $this->getClient();
56
57        /**
58         * Exchange auth code for access token
59         * Note: if we set 'access type' to 'force' and our access is 'offline', we get a refresh token. we want that.
60         */
61        $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
62
63        /**
64         * Set the access token with google. nb json
65         */
66        $client->setAccessToken(json_encode($accessToken));
67
68        /**
69         * Get user's data from google
70         */
71        $service = new \Google\Service\Oauth2($client);
72        $userFromGoogle = $service->userinfo->get();
73
74        /**
75         * Select user if already exists
76         */
77        $user = User::where('provider_name', '=', 'google')
78            ->where('provider_id', '=', $userFromGoogle->id)
79            ->first();
80
81        /**
82         * Create user if not already exists
83         * Save google access token
84         * HTTP 403
85         */
86        if (!$user) {
87            try {
88                $user = User::create([
89                    'provider_id' => $userFromGoogle->id,
90                    'provider_name' => 'google',
91                    'google_access_token_json' => json_encode($accessToken),
92                    'name' => $userFromGoogle->name,
93                    'email' => $userFromGoogle->email,
94                    'role_id' => $normalUserRoleId,
95                    //'avatar' => $providerUser->picture, // in case you have an avatar and want to use google's
96                ]);
97            } catch (\Illuminate\Database\QueryException $e) {
98                return $this->sendError(403, "Error logging in");
99            }
100        }
101        /**
102         * Save new access token for existing user
103         */
104        else {
105            $user->google_access_token_json = json_encode($accessToken);
106            $user->save();
107        }
108
109        /**
110         * Log in and return token
111         * HTTP 201
112         */
113        $success['token'] =  $user->createToken("Google")->accessToken;
114        $success['name'] =  $user->name;
115        $success['email'] =  $user->email;
116        $success['user_id'] =  $user->id;
117        return $this->sendResponse(201, $success);
118    } // postLogin
119
120
121    /**
122     * Gets session user's google oauth data
123     *
124     * @return JsonResponse
125     */
126    public function getMeGoogle(Request $retreiving):JsonResponse
127    {
128        $client = $this->getUserClient();
129        $service = new \Google\Service\Oauth2($client);
130        $userFromGoogle = $service->userinfo->get();
131        return $this->sendResponse(200, $userFromGoogle);
132    } // getMeGoogle
133
134
135    /**
136     * Gets all the customers for a google ads account
137     *
138     * @return  JsonResponse
139     */
140    public function getCustomers(Request $request):JsonResponse
141    {
142        /**
143         * Get customers
144         * @see  app.Traits.GoogleTrait
145         */
146        $customers = $this->googleAds->getGoogleAdsCustomers();
147
148        /**
149         * No customers
150         * HTTP 404
151         */
152        if (count($customers) == 0) {
153            return $this->sendError(404, "No accessible customers");
154        }
155
156        /**
157         * HTTP 200
158         */
159        return $this->sendResponse(200, $customers);
160    } // getCustomers
161
162
163    /**
164     * Returns an array of conversion action categories suitable for menus
165     *
166     * @return  JsonResponse
167     * @see http://swagger-humanverify.fruitbat.systems/#post-/api/conversions/actions/categories
168     */
169    public function getConversionActionCategories(Request $request):JsonResponse
170    {
171        $returnArray = $this->googleAds->getGoogleAdsConversionActionCategories();
172
173        /**
174         * HTTP 200
175         */
176        return $this->sendResponse(200, $returnArray);
177    } // getConversionActionCategories
178
179
180    /**
181     * Returns an array of conversion action types suitable for menus
182     *
183     * @return  JsonResponse
184     * @see http://swagger-humanverify.fruitbat.systems/#post-/api/conversions/actions/types
185     */
186    public function getConversionActionTypes(Request $request):JsonResponse
187    {
188        $returnArray = $this->googleAds->getGoogleAdsConversionActionTypes();
189
190        /**
191         * HTTP 200
192         */
193        return $this->sendResponse(200, $returnArray);
194    } // getConversionActionTypes
195
196
197    /**
198     * Returns an array of conversion action statuses suitable for menus
199     *
200     * @return  JsonResponse
201     * @see  http://swagger-humanverify.fruitbat.systems/#post-/api/conversions/actions/statuses
202     */
203    public function getConversionActionStatuses(Request $request):JsonResponse
204    {
205        $returnArray = $this->googleAds->getGoogleAdsConversionActionStatuses();
206
207        /**
208         * HTTP 200
209         */
210        return $this->sendResponse(200, $returnArray);
211    } // getConversionActionTypes
212
213
214    /**
215     * Get all campaigns for a given customer
216     *
217     * @param  String  $id The id of the customer
218     * @return JsonResponse
219     * @see
220     */
221    public function getCampaigns(Request $request, String $id):JsonResponse
222    {
223        try {
224            $campaigns = $this->googleAds->getGoogleAdsCampaigns($id);
225        } catch (\Exception $e) {
226            $googleMessage = $e->getMessage();
227            $googleMessage = json_decode($googleMessage);
228            $googleMessage = $googleMessage->details[0]->errors[0]->message;
229            return $this->sendError(500, "Could not select campaigns", $googleMessage);
230        }
231        return $this->sendResponse(200, $campaigns);
232    } // getCampaigns
233
234
235    /**
236     * Gets all the conversion actions for the customer
237     *
238     * @param  String $customerId  The id of the customer
239     * @return JsonResponse
240     * @see    
241     */
242    public function getConversionActions(Request $request, String $customerId):JsonResponse
243    {
244        try {
245            $conversionActions = $this->googleAds->getGoogleAdsConversionActions($customerId);
246        } catch (\Exception $e) {
247            $googleMessage = $e->getMessage();
248            $googleMessage = json_decode($googleMessage);
249            $googleMessage = $googleMessage->details[0]->errors[0]->message;
250            return $this->sendError(500, "Could not get conversion actions", $googleMessage);
251        }
252        return $this->sendResponse(200, $conversionActions);
253    } // getConversionActions
254
255
256    /**
257     * Creates a conversion action for the customer
258     *
259     * @param  String $customerId  The id of the customer
260     * @return JsonResponse
261     * @see    
262     */
263    public function postConversionAction(Request $request, String $customerId):JsonResponse
264    {
265
266        /**
267         * Validate company invite request body
268         * HTTP 400
269         */
270        $validationResult = $this->__validateConversionActionRequest($request);
271        if (!is_bool($validationResult)) {
272            return $validationResult;
273        }
274
275        $name = $request->name;
276        $category = $request->category;
277        $type = $request->type;
278        $status = $request->status;
279        $defaultValue = $request->default_value;
280        $viewThroughLookbackWindowDays = $request->view_through_lookback_window_days;
281
282        /**
283         * Create the conversion action
284         */
285        try {
286            $this->createGoogleAdsConversionAction($customerId, $name, $category, $type, $status, $defaultValue, $viewThroughLookbackWindowDays);
287        } catch (\Exception $e) {
288            $googleMessage = $e->getMessage();
289            $googleMessage = json_decode($googleMessage);
290            $googleMessage = $googleMessage->details[0]->errors[0]->message;
291            return $this->sendError(500, "Could not create conversion action", $googleMessage);
292        }
293
294        /**
295         * HTTP 201
296         */
297        return $this->sendResponse(201, 'created');
298
299    } // postConversionAction
300
301
302    protected function __validateConversionActionRequest(Request $request) // @phpstan-ignore-line
303    {
304        $validationRules = [
305            'name' => 'required|string|max:255',
306            'category' => 'integer|min:1',
307            'type' => 'integer|min:1',
308            'status' => 'integer|min:1',
309            'view_through_lookback_window_days' => 'integer|min:1',
310            'default_value' => 'required|numeric|between:0,99999.99',
311        ];
312        $validationResult = $this->__validateJson($validationRules, $request);
313        if (is_array($validationResult)) {
314            return $this->sendError(400, $validationResult, "Conversion action data is not valid");
315        } else {
316            return true;
317        }
318    } // __validateConversionActionRequest
319
320
321
322}