| Code Coverage | ||||||||||
| Lines | Functions and Methods | Classes and Traits | ||||||||
| Total |  | 0.00% | 0 / 40 |  | 0.00% | 0 / 4 | CRAP |  | 0.00% | 0 / 1 | 
| UserController |  | 0.00% | 0 / 40 |  | 0.00% | 0 / 4 | 132 |  | 0.00% | 0 / 1 | 
| getUsersDigest |  | 0.00% | 0 / 13 |  | 0.00% | 0 / 1 | 12 | |||
| postUser |  | 0.00% | 0 / 15 |  | 0.00% | 0 / 1 | 20 | |||
| getUserTransactions |  | 0.00% | 0 / 8 |  | 0.00% | 0 / 1 | 6 | |||
| __validateNewUserRequest |  | 0.00% | 0 / 4 |  | 0.00% | 0 / 1 | 6 | |||
| 1 | <?php | 
| 2 | namespace App\Http\Controllers\api\Root; | 
| 3 | |
| 4 | use App\Http\Controllers\api\BaseController as BaseController; | 
| 5 | use App\Http\Controllers\Controller; | 
| 6 | |
| 7 | use Illuminate\Http\Request; | 
| 8 | use Illuminate\Http\JsonResponse; | 
| 9 | |
| 10 | use App\Models\User; | 
| 11 | use App\Models\UserConversionTransaction; | 
| 12 | |
| 13 | class UserController extends BaseController | 
| 14 | { | 
| 15 | |
| 16 | /** | 
| 17 | * Get users digest | 
| 18 | * | 
| 19 | * @author gbh | 
| 20 | * @see http://swagger-humanverify.fruitbat.systems/#get-/api/root/users/digest | 
| 21 | */ | 
| 22 | public function getUsersDigest(Request $request):JsonResponse | 
| 23 | { | 
| 24 | /** | 
| 25 | * Get pagination data from request | 
| 26 | */ | 
| 27 | $paginationDataResult = $this->__validateAndExtractPaginationData($request); | 
| 28 | if (!is_array($paginationDataResult)) { | 
| 29 | return $paginationDataResult; | 
| 30 | } | 
| 31 | $size = $paginationDataResult['size']; | 
| 32 | |
| 33 | /** | 
| 34 | * Get filter, order and sort data from request | 
| 35 | */ | 
| 36 | $order = $request->query('order', 'id'); | 
| 37 | $sort = $request->query('sort', 'desc'); | 
| 38 | $filter = $request->query('filter', null); | 
| 39 | |
| 40 | /** | 
| 41 | * Select page and items with optional filter | 
| 42 | */ | 
| 43 | if (!is_null($filter)) { | 
| 44 | $usersPage = User::where('name', 'like', "%$filter%")->orderBy($order, $sort)->paginate($size); | 
| 45 | } else { | 
| 46 | $usersPage = User::orderBy($order, $sort)->paginate($size); | 
| 47 | } | 
| 48 | $usersItem = $usersPage->items(); | 
| 49 | |
| 50 | /** | 
| 51 | * Build pagination hateoas | 
| 52 | */ | 
| 53 | $paginationHateoas = $this->createPaginationFromOrm($usersPage); | 
| 54 | |
| 55 | /** | 
| 56 | * HTTP 200 | 
| 57 | */ | 
| 58 | return $this->sendResponse(200, $usersItem, $paginationHateoas); | 
| 59 | } // getUsersDigest | 
| 60 | |
| 61 | |
| 62 | |
| 63 | /** | 
| 64 | * Post a new user | 
| 65 | * | 
| 66 | * @author gbh | 
| 67 | * @see http://swagger.humanverify.test/#post-/api/root/users | 
| 68 | */ | 
| 69 | public function postUser(Request $request):JsonResponse | 
| 70 | { | 
| 71 | /** | 
| 72 | * Validate new user | 
| 73 | * HTTP 400 | 
| 74 | */ | 
| 75 | $validationResult = $this->__validateNewUserRequest($request); | 
| 76 | if (!is_bool($validationResult)) { | 
| 77 | return $validationResult; | 
| 78 | } | 
| 79 | |
| 80 | /** | 
| 81 | * Create new user | 
| 82 | */ | 
| 83 | try { | 
| 84 | $user = new User(); | 
| 85 | $user->name = $request->name; | 
| 86 | $user->email = $request->email; | 
| 87 | $user->password = bcrypt($request->password); | 
| 88 | $user->role_id = 2; | 
| 89 | $user->save(); | 
| 90 | } | 
| 91 | /** | 
| 92 | * Catch duplicate email | 
| 93 | * HTTP 400 | 
| 94 | */ | 
| 95 | catch (\Illuminate\Database\QueryException $e) { | 
| 96 | $errorCode = $e->errorInfo[1]; | 
| 97 | if ($errorCode == 1062) { | 
| 98 | return $this->sendError(400, "User with email address ".$request->email." already exists"); | 
| 99 | } | 
| 100 | return $this->sendError(500, $e->getMessage()); | 
| 101 | } | 
| 102 | |
| 103 | /** | 
| 104 | * HTTP 201 | 
| 105 | */ | 
| 106 | return $this->sendResponse(201, $user); | 
| 107 | } // postUser | 
| 108 | |
| 109 | |
| 110 | /** | 
| 111 | * Get transactions of one user, paged | 
| 112 | * | 
| 113 | * @author gbh | 
| 114 | * @see | 
| 115 | */ | 
| 116 | public function getUserTransactions(Int $id, Request $request):JsonResponse | 
| 117 | { | 
| 118 | /** | 
| 119 | * Get pagination data from request | 
| 120 | */ | 
| 121 | $paginationDataResult = $this->__validateAndExtractPaginationData($request); | 
| 122 | if (!is_array($paginationDataResult)) { | 
| 123 | return $paginationDataResult; | 
| 124 | } | 
| 125 | $size = $paginationDataResult['size']; | 
| 126 | |
| 127 | /** | 
| 128 | * Select transactions page | 
| 129 | */ | 
| 130 | $transactionsPage = UserConversionTransaction::where('user_id', '=', $id)->paginate($size); | 
| 131 | $transactionsItems = $transactionsPage->items(); | 
| 132 | |
| 133 | /** | 
| 134 | * Build pagination hateoas | 
| 135 | */ | 
| 136 | $paginationHateoas = $this->createPaginationFromOrm($transactionsPage); | 
| 137 | |
| 138 | /** | 
| 139 | * HTTP 200 | 
| 140 | */ | 
| 141 | return $this->sendResponse(200, $transactionsItems, $paginationHateoas); | 
| 142 | } // getUserTransactions | 
| 143 | |
| 144 | |
| 145 | /** | 
| 146 | * Validates request body of a new User | 
| 147 | * | 
| 148 | */ | 
| 149 | protected function __validateNewUserRequest(Request $request) // @phpstan-ignore-line | 
| 150 | { | 
| 151 | $itemValidationRules = [ | 
| 152 | 'name' => 'required|string', | 
| 153 | 'email' => 'required|email', | 
| 154 | 'password' => 'required|string', | 
| 155 | 'password_again' => 'required|string|same:password', | 
| 156 | ]; | 
| 157 | |
| 158 | $validationResult = $this->__validateJson($itemValidationRules, $request); | 
| 159 | |
| 160 | if (is_array($validationResult)) { | 
| 161 | return $this->sendError(400, $validationResult, "Validation error"); | 
| 162 | } else { | 
| 163 | return true; | 
| 164 | } | 
| 165 | } // __validateNewUserRequest | 
| 166 | } |