AdminCuratedRegisterController.php 7.7 KB

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