AdminCuratedRegisterController.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\Models\CuratedRegister;
  5. use App\Models\CuratedRegisterActivity;
  6. use Illuminate\Support\Str;
  7. use Illuminate\Support\Facades\Mail;
  8. use App\Mail\CuratedRegisterRequestDetailsFromUser;
  9. use App\Mail\CuratedRegisterAcceptUser;
  10. use App\Mail\CuratedRegisterRejectUser;
  11. use App\User;
  12. class AdminCuratedRegisterController extends Controller
  13. {
  14. public function __construct()
  15. {
  16. $this->middleware(['auth','admin']);
  17. }
  18. public function index(Request $request)
  19. {
  20. $this->validate($request, [
  21. 'filter' => 'sometimes|in:open,all,awaiting,approved,rejected,responses',
  22. 'sort' => 'sometimes|in:asc,desc'
  23. ]);
  24. $filter = $request->input('filter', 'open');
  25. $sort = $request->input('sort', 'asc');
  26. $records = CuratedRegister::when($filter, function($q, $filter) {
  27. if($filter === 'open') {
  28. return $q->where('is_rejected', false)
  29. ->where(function($query) {
  30. return $query->where('user_has_responded', true)->orWhere('is_awaiting_more_info', false);
  31. })
  32. ->whereNotNull('email_verified_at')
  33. ->whereIsClosed(false);
  34. } else if($filter === 'all') {
  35. return $q;
  36. } else if($filter === 'responses') {
  37. return $q->whereIsClosed(false)
  38. ->whereNotNull('email_verified_at')
  39. ->where('user_has_responded', true)
  40. ->where('is_awaiting_more_info', true);
  41. } elseif ($filter === 'awaiting') {
  42. return $q->whereIsClosed(false)
  43. ->where('is_rejected', false)
  44. ->where('is_approved', false)
  45. ->where('user_has_responded', false)
  46. ->where('is_awaiting_more_info', true);
  47. } elseif ($filter === 'approved') {
  48. return $q->whereIsClosed(true)->whereIsApproved(true);
  49. } elseif ($filter === 'rejected') {
  50. return $q->whereIsClosed(true)->whereIsRejected(true);
  51. }
  52. })
  53. ->when($sort, function($query, $sort) {
  54. return $query->orderBy('id', $sort);
  55. })
  56. ->paginate(10)
  57. ->withQueryString();
  58. return view('admin.curated-register.index', compact('records', 'filter'));
  59. }
  60. public function show(Request $request, $id)
  61. {
  62. $record = CuratedRegister::findOrFail($id);
  63. return view('admin.curated-register.show', compact('record'));
  64. }
  65. public function apiActivityLog(Request $request, $id)
  66. {
  67. $record = CuratedRegister::findOrFail($id);
  68. $res = collect([
  69. [
  70. 'id' => 1,
  71. 'action' => 'created',
  72. 'title' => 'Onboarding application created',
  73. 'message' => null,
  74. 'link' => null,
  75. 'timestamp' => $record->created_at,
  76. ]
  77. ]);
  78. if($record->email_verified_at) {
  79. $res->push([
  80. 'id' => 3,
  81. 'action' => 'email_verified_at',
  82. 'title' => 'Applicant successfully verified email address',
  83. 'message' => null,
  84. 'link' => null,
  85. 'timestamp' => $record->email_verified_at,
  86. ]);
  87. }
  88. $activities = CuratedRegisterActivity::whereRegisterId($record->id)->get();
  89. $idx = 4;
  90. $userResponses = collect([]);
  91. foreach($activities as $activity) {
  92. $idx++;
  93. if($activity->from_user) {
  94. $userResponses->push($activity);
  95. continue;
  96. }
  97. $res->push([
  98. 'id' => $idx,
  99. 'aid' => $activity->id,
  100. 'action' => $activity->type,
  101. 'title' => $activity->from_admin ? 'Admin requested info' : 'User responded',
  102. 'message' => $activity->message,
  103. 'link' => $activity->adminReviewUrl(),
  104. 'timestamp' => $activity->created_at,
  105. ]);
  106. }
  107. foreach($userResponses as $ur) {
  108. $res = $res->map(function($r) use($ur) {
  109. if(!isset($r['aid'])) {
  110. return $r;
  111. }
  112. if($ur->reply_to_id === $r['aid']) {
  113. $r['user_response'] = $ur;
  114. return $r;
  115. }
  116. return $r;
  117. });
  118. }
  119. if($record->is_approved) {
  120. $idx++;
  121. $res->push([
  122. 'id' => $idx,
  123. 'action' => 'approved',
  124. 'title' => 'Application Approved',
  125. 'message' => null,
  126. 'link' => null,
  127. 'timestamp' => $record->action_taken_at,
  128. ]);
  129. } else if ($record->is_rejected) {
  130. $idx++;
  131. $res->push([
  132. 'id' => $idx,
  133. 'action' => 'rejected',
  134. 'title' => 'Application Rejected',
  135. 'message' => null,
  136. 'link' => null,
  137. 'timestamp' => $record->action_taken_at,
  138. ]);
  139. }
  140. return $res->reverse()->values();
  141. }
  142. public function apiMessagePreviewStore(Request $request, $id)
  143. {
  144. $record = CuratedRegister::findOrFail($id);
  145. return $request->all();
  146. }
  147. public function apiMessageSendStore(Request $request, $id)
  148. {
  149. $this->validate($request, [
  150. 'message' => 'required|string|min:5|max:1000'
  151. ]);
  152. $record = CuratedRegister::findOrFail($id);
  153. abort_if($record->email_verified_at === null, 400, 'Cannot message an unverified email');
  154. $activity = new CuratedRegisterActivity;
  155. $activity->register_id = $record->id;
  156. $activity->admin_id = $request->user()->id;
  157. $activity->secret_code = Str::random(32);
  158. $activity->type = 'request_details';
  159. $activity->from_admin = true;
  160. $activity->message = $request->input('message');
  161. $activity->save();
  162. $record->is_awaiting_more_info = true;
  163. $record->user_has_responded = false;
  164. $record->save();
  165. Mail::to($record->email)->send(new CuratedRegisterRequestDetailsFromUser($record, $activity));
  166. return $request->all();
  167. }
  168. public function previewDetailsMessageShow(Request $request, $id)
  169. {
  170. $record = CuratedRegister::findOrFail($id);
  171. abort_if($record->email_verified_at === null, 400, 'Cannot message an unverified email');
  172. $activity = new CuratedRegisterActivity;
  173. $activity->message = $request->input('message');
  174. return new \App\Mail\CuratedRegisterRequestDetailsFromUser($record, $activity);
  175. }
  176. public function previewMessageShow(Request $request, $id)
  177. {
  178. $record = CuratedRegister::findOrFail($id);
  179. abort_if($record->email_verified_at === null, 400, 'Cannot message an unverified email');
  180. $record->message = $request->input('message');
  181. return new \App\Mail\CuratedRegisterSendMessage($record);
  182. }
  183. public function apiHandleReject(Request $request, $id)
  184. {
  185. $this->validate($request, [
  186. 'action' => 'required|in:reject-email,reject-silent'
  187. ]);
  188. $action = $request->input('action');
  189. $record = CuratedRegister::findOrFail($id);
  190. abort_if($record->email_verified_at === null, 400, 'Cannot reject an unverified email');
  191. $record->is_rejected = true;
  192. $record->is_closed = true;
  193. $record->action_taken_at = now();
  194. $record->save();
  195. if($action === 'reject-email') {
  196. Mail::to($record->email)->send(new CuratedRegisterRejectUser($record));
  197. }
  198. return [200];
  199. }
  200. public function apiHandleApprove(Request $request, $id)
  201. {
  202. $record = CuratedRegister::findOrFail($id);
  203. abort_if($record->email_verified_at === null, 400, 'Cannot reject an unverified email');
  204. $record->is_approved = true;
  205. $record->is_closed = true;
  206. $record->action_taken_at = now();
  207. $record->save();
  208. $user = User::create([
  209. 'name' => $record->username,
  210. 'username' => $record->username,
  211. 'email' => $record->email,
  212. 'password' => $record->password,
  213. 'app_register_ip' => $record->ip_address,
  214. 'email_verified_at' => now(),
  215. 'register_source' => 'cur_onboarding'
  216. ]);
  217. Mail::to($record->email)->send(new CuratedRegisterAcceptUser($record));
  218. return [200];
  219. }
  220. }