PageRenderTime 45ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/app/Repositories/Backend/Auth/UserRepository.php

https://bitbucket.org/ghanu/chope
PHP | 362 lines | 204 code | 54 blank | 104 comment | 38 complexity | 84dc67b209cbb507bcd61aa4c10b3702 MD5 | raw file
  1. <?php
  2. namespace App\Repositories\Backend\Auth;
  3. use App\Models\Auth\User;
  4. use Illuminate\Support\Facades\DB;
  5. use App\Exceptions\GeneralException;
  6. use App\Repositories\BaseRepository;
  7. use Illuminate\Support\Facades\Hash;
  8. use App\Events\Backend\Auth\User\UserCreated;
  9. use App\Events\Backend\Auth\User\UserUpdated;
  10. use App\Events\Backend\Auth\User\UserRestored;
  11. use App\Events\Backend\Auth\User\UserConfirmed;
  12. use Illuminate\Pagination\LengthAwarePaginator;
  13. use App\Events\Backend\Auth\User\UserDeactivated;
  14. use App\Events\Backend\Auth\User\UserReactivated;
  15. use App\Events\Backend\Auth\User\UserUnconfirmed;
  16. use App\Events\Backend\Auth\User\UserPasswordChanged;
  17. use App\Notifications\Backend\Auth\UserAccountActive;
  18. use App\Events\Backend\Auth\User\UserPermanentlyDeleted;
  19. use App\Notifications\Frontend\Auth\UserNeedsConfirmation;
  20. /**
  21. * Class UserRepository.
  22. */
  23. class UserRepository extends BaseRepository
  24. {
  25. /**
  26. * @return string
  27. */
  28. public function model()
  29. {
  30. return User::class;
  31. }
  32. /**
  33. * @return mixed
  34. */
  35. public function getUnconfirmedCount() : int
  36. {
  37. return $this->model
  38. ->where('confirmed', 0)
  39. ->count();
  40. }
  41. /**
  42. * @param int $paged
  43. * @param string $orderBy
  44. * @param string $sort
  45. *
  46. * @return mixed
  47. */
  48. public function getActivePaginated($paged = 25, $orderBy = 'created_at', $sort = 'desc') : LengthAwarePaginator
  49. {
  50. return $this->model
  51. ->with('roles', 'permissions', 'providers')
  52. ->active()
  53. ->orderBy($orderBy, $sort)
  54. ->paginate($paged);
  55. }
  56. /**
  57. * @param int $paged
  58. * @param string $orderBy
  59. * @param string $sort
  60. *
  61. * @return LengthAwarePaginator
  62. */
  63. public function getInactivePaginated($paged = 25, $orderBy = 'created_at', $sort = 'desc') : LengthAwarePaginator
  64. {
  65. return $this->model
  66. ->with('roles', 'permissions', 'providers')
  67. ->active(false)
  68. ->orderBy($orderBy, $sort)
  69. ->paginate($paged);
  70. }
  71. /**
  72. * @param int $paged
  73. * @param string $orderBy
  74. * @param string $sort
  75. *
  76. * @return LengthAwarePaginator
  77. */
  78. public function getDeletedPaginated($paged = 25, $orderBy = 'created_at', $sort = 'desc') : LengthAwarePaginator
  79. {
  80. return $this->model
  81. ->with('roles', 'permissions', 'providers')
  82. ->onlyTrashed()
  83. ->orderBy($orderBy, $sort)
  84. ->paginate($paged);
  85. }
  86. /**
  87. * @param array $data
  88. *
  89. * @return User
  90. * @throws \Exception
  91. * @throws \Throwable
  92. */
  93. public function create(array $data) : User
  94. {
  95. return DB::transaction(function () use ($data) {
  96. $user = parent::create([
  97. 'first_name' => $data['first_name'],
  98. 'last_name' => $data['last_name'],
  99. 'email' => $data['email'],
  100. 'timezone' => $data['timezone'],
  101. 'password' => Hash::make($data['password']),
  102. 'active' => isset($data['active']) && $data['active'] == '1' ? 1 : 0,
  103. 'confirmation_code' => md5(uniqid(mt_rand(), true)),
  104. 'confirmed' => isset($data['confirmed']) && $data['confirmed'] == '1' ? 1 : 0,
  105. ]);
  106. // See if adding any additional permissions
  107. if (! isset($data['permissions']) || ! count($data['permissions'])) {
  108. $data['permissions'] = [];
  109. }
  110. if ($user) {
  111. // User must have at least one role
  112. if (! count($data['roles'])) {
  113. throw new GeneralException(__('exceptions.backend.access.users.role_needed_create'));
  114. }
  115. // Add selected roles/permissions
  116. $user->syncRoles($data['roles']);
  117. $user->syncPermissions($data['permissions']);
  118. //Send confirmation email if requested and account approval is off
  119. if (isset($data['confirmation_email']) && $user->confirmed == 0 && ! config('access.users.requires_approval')) {
  120. $user->notify(new UserNeedsConfirmation($user->confirmation_code));
  121. }
  122. event(new UserCreated($user));
  123. return $user;
  124. }
  125. throw new GeneralException(__('exceptions.backend.access.users.create_error'));
  126. });
  127. }
  128. /**
  129. * @param User $user
  130. * @param array $data
  131. *
  132. * @return User
  133. * @throws GeneralException
  134. * @throws \Exception
  135. * @throws \Throwable
  136. */
  137. public function update(User $user, array $data) : User
  138. {
  139. $this->checkUserByEmail($user, $data['email']);
  140. // See if adding any additional permissions
  141. if (! isset($data['permissions']) || ! count($data['permissions'])) {
  142. $data['permissions'] = [];
  143. }
  144. return DB::transaction(function () use ($user, $data) {
  145. if ($user->update([
  146. 'first_name' => $data['first_name'],
  147. 'last_name' => $data['last_name'],
  148. 'email' => $data['email'],
  149. 'timezone' => $data['timezone'],
  150. ])) {
  151. // Add selected roles/permissions
  152. $user->syncRoles($data['roles']);
  153. $user->syncPermissions($data['permissions']);
  154. event(new UserUpdated($user));
  155. return $user;
  156. }
  157. throw new GeneralException(__('exceptions.backend.access.users.update_error'));
  158. });
  159. }
  160. /**
  161. * @param User $user
  162. * @param $input
  163. *
  164. * @return User
  165. * @throws GeneralException
  166. */
  167. public function updatePassword(User $user, $input) : User
  168. {
  169. $user->password = Hash::make($input['password']);
  170. if ($user->save()) {
  171. event(new UserPasswordChanged($user));
  172. return $user;
  173. }
  174. throw new GeneralException(__('exceptions.backend.access.users.update_password_error'));
  175. }
  176. /**
  177. * @param User $user
  178. * @param $status
  179. *
  180. * @return User
  181. * @throws GeneralException
  182. */
  183. public function mark(User $user, $status) : User
  184. {
  185. if (auth()->id() == $user->id && $status == 0) {
  186. throw new GeneralException(__('exceptions.backend.access.users.cant_deactivate_self'));
  187. }
  188. $user->active = $status;
  189. switch ($status) {
  190. case 0:
  191. event(new UserDeactivated($user));
  192. break;
  193. case 1:
  194. event(new UserReactivated($user));
  195. break;
  196. }
  197. if ($user->save()) {
  198. return $user;
  199. }
  200. throw new GeneralException(__('exceptions.backend.access.users.mark_error'));
  201. }
  202. /**
  203. * @param User $user
  204. *
  205. * @return User
  206. * @throws GeneralException
  207. */
  208. public function confirm(User $user) : User
  209. {
  210. if ($user->confirmed) {
  211. throw new GeneralException(__('exceptions.backend.access.users.already_confirmed'));
  212. }
  213. $user->confirmed = 1;
  214. $confirmed = $user->save();
  215. if ($confirmed) {
  216. event(new UserConfirmed($user));
  217. // Let user know their account was approved
  218. if (config('access.users.requires_approval')) {
  219. $user->notify(new UserAccountActive);
  220. }
  221. return $user;
  222. }
  223. throw new GeneralException(__('exceptions.backend.access.users.cant_confirm'));
  224. }
  225. /**
  226. * @param User $user
  227. *
  228. * @return User
  229. * @throws GeneralException
  230. */
  231. public function unconfirm(User $user) : User
  232. {
  233. if (! $user->confirmed) {
  234. throw new GeneralException(__('exceptions.backend.access.users.not_confirmed'));
  235. }
  236. if ($user->id == 1) {
  237. // Cant un-confirm admin
  238. throw new GeneralException(__('exceptions.backend.access.users.cant_unconfirm_admin'));
  239. }
  240. if ($user->id == auth()->id()) {
  241. // Cant un-confirm self
  242. throw new GeneralException(__('exceptions.backend.access.users.cant_unconfirm_self'));
  243. }
  244. $user->confirmed = 0;
  245. $unconfirmed = $user->save();
  246. if ($unconfirmed) {
  247. event(new UserUnconfirmed($user));
  248. return $user;
  249. }
  250. throw new GeneralException(__('exceptions.backend.access.users.cant_unconfirm'));
  251. }
  252. /**
  253. * @param User $user
  254. *
  255. * @return User
  256. * @throws GeneralException
  257. * @throws \Exception
  258. * @throws \Throwable
  259. */
  260. public function forceDelete(User $user) : User
  261. {
  262. if (is_null($user->deleted_at)) {
  263. throw new GeneralException(__('exceptions.backend.access.users.delete_first'));
  264. }
  265. return DB::transaction(function () use ($user) {
  266. // Delete associated relationships
  267. $user->providers()->delete();
  268. if ($user->forceDelete()) {
  269. event(new UserPermanentlyDeleted($user));
  270. return $user;
  271. }
  272. throw new GeneralException(__('exceptions.backend.access.users.delete_error'));
  273. });
  274. }
  275. /**
  276. * @param User $user
  277. *
  278. * @return User
  279. * @throws GeneralException
  280. */
  281. public function restore(User $user) : User
  282. {
  283. if (is_null($user->deleted_at)) {
  284. throw new GeneralException(__('exceptions.backend.access.users.cant_restore'));
  285. }
  286. if ($user->restore()) {
  287. event(new UserRestored($user));
  288. return $user;
  289. }
  290. throw new GeneralException(__('exceptions.backend.access.users.restore_error'));
  291. }
  292. /**
  293. * @param User $user
  294. * @param $email
  295. *
  296. * @throws GeneralException
  297. */
  298. protected function checkUserByEmail(User $user, $email)
  299. {
  300. //Figure out if email is not the same
  301. if ($user->email != $email) {
  302. //Check to see if email exists
  303. if ($this->model->where('email', '=', $email)->first()) {
  304. throw new GeneralException(trans('exceptions.backend.access.users.email_error'));
  305. }
  306. }
  307. }
  308. }