added messages list, new client form, logic for client Apps plus others
This commit is contained in:
@@ -5,6 +5,10 @@ namespace App\Http\Controllers;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Utilities\ApiCalls;
|
||||
use Session;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use App\Mail\NewClientMail;
|
||||
use App\Models;
|
||||
|
||||
class AdminController extends Controller
|
||||
{
|
||||
public function index(){
|
||||
@@ -35,10 +39,25 @@ class AdminController extends Controller
|
||||
// 'status' => 'required',
|
||||
]);
|
||||
$client_arr = $request->except('_token');
|
||||
|
||||
|
||||
$create_client_url = "clients";
|
||||
$result = ApiCalls::CurlPost(json_encode($client_arr), $create_client_url);
|
||||
if ($result) {
|
||||
Session::flash('success_message', 'client created successfully!');
|
||||
//send email with link to set password and activate their account
|
||||
$activation_hash = uniqid();
|
||||
$result_arr = json_decode($result, true);
|
||||
|
||||
$clients_arr['client_id'] = $result_arr['id'];
|
||||
$clients_arr['email'] = $request->email;
|
||||
$clients_arr['activation_hash'] = $activation_hash;
|
||||
$clients_arr['activation_start_time'] = date('Y-m-d H:i:s');
|
||||
$local_result = Models\ClientSession::create($clients_arr);
|
||||
\Log::info('Client Session result : ' . json_encode($local_result));
|
||||
|
||||
$recipientEmail = $request->email;
|
||||
Mail::to($recipientEmail)->send(new NewClientMail($recipientEmail, $activation_hash));
|
||||
}
|
||||
else{
|
||||
Session::flash('error_message', 'client could not be created !');
|
||||
|
||||
@@ -25,7 +25,7 @@ class ConfirmPasswordController extends Controller
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = '/home';
|
||||
protected $redirectTo = '/admin/home';
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
|
||||
@@ -25,7 +25,7 @@ class LoginController extends Controller
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = '/home';
|
||||
protected $redirectTo = '/admin/home';
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
|
||||
@@ -28,7 +28,7 @@ class RegisterController extends Controller
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = '/home';
|
||||
protected $redirectTo = '/admin/home';
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
|
||||
@@ -25,5 +25,5 @@ class ResetPasswordController extends Controller
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = '/home';
|
||||
protected $redirectTo = '/admin/home';
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ class VerificationController extends Controller
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = '/home';
|
||||
protected $redirectTo = '/admin/home';
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
|
||||
@@ -6,31 +6,95 @@ use Illuminate\Http\Request;
|
||||
use App\Models;
|
||||
use App\Utilities\ApiCalls;
|
||||
use Session;
|
||||
use Illuminate\Validation\Rules\Password;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class ClientsLoginController extends Controller
|
||||
{
|
||||
public function index(){
|
||||
$data = [
|
||||
'page_title' => 'User Login'
|
||||
];
|
||||
return view('client-auth.login-test', $data);
|
||||
return view('client-auth.login', $data);
|
||||
|
||||
}
|
||||
public function activation_show($hash){
|
||||
#check if activation hash exist and it has not expired
|
||||
$check_activation = Models\ClientSession::where('activation_hash', $hash)->firstOrFail();
|
||||
// dump($check_activation);
|
||||
$elapsedMinutes = now()->diffInMinutes($check_activation->activation_start_time);
|
||||
if ($elapsedMinutes > 30) {
|
||||
// code...
|
||||
// $elapsedDays = Carbon::parse($stringDate)->diffInDays();
|
||||
// OR using the now() helper
|
||||
|
||||
// $isExpired = $check_activation->activation_start_time->diffInMinutes() > 30;
|
||||
$data = [
|
||||
'page_title' => 'Client Activation Expired'
|
||||
];
|
||||
return view('client-auth.activation-notfound', $data);
|
||||
}
|
||||
$data = [
|
||||
'page_title' => 'Client Activation',
|
||||
'hash' => $hash
|
||||
];
|
||||
return view('client-auth.activation-form', $data);
|
||||
|
||||
}
|
||||
public function activation(Request $request){
|
||||
$this->validate($request, [
|
||||
// 'activation_hash' => 'required',
|
||||
'password' => 'required',
|
||||
// 'password' => ['required', 'min:8', 'confirmed']
|
||||
'password' => ['required','confirmed', Password::min(8)->letters()->numbers(),]
|
||||
]);
|
||||
if ($request->filled('activation_hash')) {
|
||||
return redirect()->back()->withErrors(['Your Activation request can not be handled. Try again']);
|
||||
}
|
||||
|
||||
$client = Models\ClientSession::where('activation_hash', $request->hash)->firstOrFail();
|
||||
if ($client->activation_status == 'ACTIVATED') {
|
||||
return redirect()->back()->withErrors(['Your Activation request can not be handled. Try again']);
|
||||
}
|
||||
|
||||
$create_client_url = "clients/$client->client_id/status";
|
||||
$client_arr = ['status' => 'ACTIVE'];
|
||||
$result = ApiCalls::CurlPatch(json_encode($client_arr), $create_client_url);
|
||||
|
||||
|
||||
$name = $client->name;
|
||||
// $client->client_id = $result->id;
|
||||
$client->activation_status = 'ACTIVATED';
|
||||
$client->password = Hash::make($request->password);
|
||||
$client->save();
|
||||
|
||||
|
||||
\Log::info($name . ' Successfully activated their account at : ' . date('Y-m-d H:i:s'));
|
||||
Session::flash('success_message', 'You have successfully activated your account, login to get started');
|
||||
return redirect(url('/'));
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function handleLogin(Request $request){
|
||||
|
||||
$this->validate($request, ['email' => 'required', 'password' => 'required']);
|
||||
$logged_in = '';
|
||||
|
||||
$client_url = "clients/1";
|
||||
$client = Models\ClientSession::where('email', $request->email)->first();
|
||||
|
||||
if ($client == false) {
|
||||
return redirect()->back()->withErrors(['Invalid credentials']);
|
||||
}
|
||||
$client_url = "clients/" . $client->client_id;
|
||||
$result = ApiCalls::CurlGet($client_url);
|
||||
$result_arr = json_decode($result, true);
|
||||
|
||||
// dd($result_arr);
|
||||
|
||||
$result_arr = json_decode($result, true);
|
||||
$logged_in = $result_arr;
|
||||
|
||||
$request->session()->regenerate(true);
|
||||
$request->session()->put('current_user.user_id', $logged_in['id']);
|
||||
$request->session()->put('current_user.org_id', $logged_in['id']);
|
||||
$request->session()->put('current_user.name', $logged_in['name']);
|
||||
$request->session()->put('current_user.email', $logged_in['email']);
|
||||
$request->session()->put('current_user.phoneNumber', $logged_in['phoneNumber']);
|
||||
@@ -42,7 +106,7 @@ class ClientsLoginController extends Controller
|
||||
\Log::info($logged_in['name']. ' Successfully logged in at : ' . date('Y-m-d H:i:s'));
|
||||
return redirect(url('/'));
|
||||
}
|
||||
public function handle_logout(Request $request) {
|
||||
public function handle_logout(Request $request) {
|
||||
$user_id = session('current_user.id');
|
||||
$name = session('current_user.name');
|
||||
|
||||
|
||||
@@ -6,27 +6,101 @@ use Illuminate\Http\Request;
|
||||
use App\Models;
|
||||
use App\Utilities\ApiCalls;
|
||||
use Session;
|
||||
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
use GuzzleHttp\Client;
|
||||
|
||||
class ClientsTrafficController extends Controller
|
||||
{
|
||||
//
|
||||
public function indexNew(){
|
||||
$search = $request->input('search');
|
||||
$client_id = session('current_user.org_id');
|
||||
$clients_url = "messages/client/$client_id?page=0&size=20&sort=createdAt,desc";
|
||||
$result = ApiCalls::CurlGet($clients_url);
|
||||
$result_arr = json_decode($result);
|
||||
|
||||
$items = collect($result_arr->content); // Convert API array to Collection
|
||||
|
||||
if ($search) {
|
||||
$items = $items->filter(function ($item) use ($search) {
|
||||
return stripos($item['name'], $search) !== false;
|
||||
});
|
||||
}
|
||||
$currentPage = Paginator::resolveCurrentPage() ?: 1;
|
||||
$perPage = $result_arr->size;
|
||||
$currentPageItems = $items->slice(($currentPage - 1) * $perPage, $perPage)->all();
|
||||
|
||||
$paginatedItems = new LengthAwarePaginator(
|
||||
$currentPageItems,
|
||||
$items->count(),
|
||||
$perPage,
|
||||
$currentPage,
|
||||
['path' => $request->url(), 'query' => $request->query()]
|
||||
);
|
||||
}
|
||||
public function index(){
|
||||
$clients_url = "messages/client/1?page=0&size=20&sort=createdAt,desc";
|
||||
//dump(session('current_user'));
|
||||
$client_id = session('current_user.org_id');
|
||||
$clients_url = "messages/client/$client_id?page=0&size=20&sort=createdAt,desc";
|
||||
$result = ApiCalls::CurlGet($clients_url);
|
||||
$result_arr = json_decode($result);
|
||||
// dump($result_arr);
|
||||
|
||||
$data = [
|
||||
'page_title' => 'Traffic Dashboard',
|
||||
'page_title' => 'SMS Traffic',
|
||||
'traffic_arr' => $result_arr
|
||||
];
|
||||
return view('client-traffic.index', $data);
|
||||
return view('client-traffic.index-test', $data);
|
||||
}
|
||||
public function indexTabulator(Request $request){
|
||||
$client = new Client();
|
||||
|
||||
// Construct the URL with pagination parameters from the request
|
||||
$page = $request->input('page', 0); // Note: This API seems 0-indexed
|
||||
$size = $request->input('size', 20);
|
||||
/*
|
||||
$response = $client->request('GET', 'http://62.171.149.214:9990/api/messages/client/1?page=0&size=20&sort=createdAt,desc', [
|
||||
'query' => [
|
||||
'page' => $page,
|
||||
'size' => $size,
|
||||
],
|
||||
'headers' => [
|
||||
'Accept' => 'application/json',
|
||||
]
|
||||
]);
|
||||
|
||||
$data = json_decode($response->getBody(), true);
|
||||
|
||||
*/
|
||||
$client_id = session('current_user.org_id');
|
||||
$clients_url = "messages/client/1?page=0&size=20&sort=createdAt,desc";
|
||||
$result = ApiCalls::CurlGet($clients_url);
|
||||
// $content_only = collect($result['content'])->toArray();
|
||||
$data = json_decode($result, true);
|
||||
|
||||
// dd($data['content']);
|
||||
|
||||
return response()->json($data);
|
||||
// return response()->json([
|
||||
// 'last_page' => $data['totalPages'],
|
||||
// 'data' => $data['content'],
|
||||
// 'total' => $data['totalElements']
|
||||
// ]);
|
||||
}
|
||||
public function getClientApps(){
|
||||
//dump(session('current_user'));
|
||||
$client_id = session('current_user.org_id');
|
||||
$apps_url = "applications/client/$client_id?page=0&size=20&sort=createdAt,desc";
|
||||
$result = ApiCalls::CurlGet($apps_url);
|
||||
$result_arr = json_decode($result);
|
||||
$data = [
|
||||
'page_title' => 'Applications',
|
||||
'apps_arr' => $result_arr
|
||||
];
|
||||
return view('client-traffic.client-apps', $data);
|
||||
}
|
||||
|
||||
|
||||
public function smsForm(){
|
||||
//check if client has an app
|
||||
|
||||
$data = [
|
||||
'page_title' => 'Send SMS',
|
||||
@@ -34,4 +108,83 @@ class ClientsTrafficController extends Controller
|
||||
return view('client-traffic.send-sms', $data);
|
||||
|
||||
}
|
||||
public function store(Request $request){
|
||||
|
||||
$this->validate($request, [
|
||||
'message' => 'required',
|
||||
'sender_id' => 'required|max:11',
|
||||
'recipients_file'=> 'mimes:csv,txt|max:4096',
|
||||
'pasted' => 'sometimes',
|
||||
// 'status' => 'required',
|
||||
]);
|
||||
$recipients_arr = [];
|
||||
// $create_client_url = "clients";
|
||||
// $result = ApiCalls::CurlPost(json_encode($client_arr), $create_client_url);
|
||||
|
||||
if ($request->recipient_file && $request->pasted) {
|
||||
// code...
|
||||
}
|
||||
if ($request->filled('pasted')) {
|
||||
// code...
|
||||
$pasted_arr = explode(", ", $request->pasted);
|
||||
foreach ($pasted_arr as $value) {
|
||||
// code...
|
||||
if (ctype_digit($value) && (strlen($value) == 11 || strlen($value) == 12)) {
|
||||
// Valid
|
||||
$recipients_arr[] = trim($value);
|
||||
}
|
||||
else{
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if ($request->hasFile('recipients_file')) {
|
||||
$file = fopen($request->file('recipients_file'), 'r');
|
||||
$data = fgetcsv($file, 1000, ',');
|
||||
foreach ($data as $value) {
|
||||
$recipients_arr[] = trim($value);
|
||||
}
|
||||
fclose($file);
|
||||
}
|
||||
$recipients_arr = array_unique($recipients_arr);
|
||||
foreach ($recipients_arr as $phone) {
|
||||
$payload = [
|
||||
'from' => $request->sender_id,
|
||||
'to' => $phone,
|
||||
'refId' => uniqid(),
|
||||
'message' => $request->message
|
||||
];
|
||||
\Log::info('Payload details ' . json_encode($payload));
|
||||
$send_sms_url = "sms/send";
|
||||
#$result = ApiCalls::CurlPost($send_sms_url, $payload);
|
||||
#\Log::info('Message Successfully submitted ' . $result);
|
||||
}
|
||||
// $result_arr = json_decode($result);
|
||||
|
||||
|
||||
Session::flash('success_message', 'Message successfully submitted for delivery!');
|
||||
return redirect("send-sms");
|
||||
}
|
||||
public function newAppStore(Request $request){
|
||||
|
||||
$this->validate($request, [
|
||||
'application_name' => 'required',
|
||||
'orgId' => 'required',
|
||||
'application_type'=> 'required',
|
||||
]);
|
||||
$payload['name'] = $request->application_name;
|
||||
$payload['type'] = $request->application_type;
|
||||
$payload['orgId'] = $request->orgId;
|
||||
|
||||
$create_application_url = "applications";
|
||||
$result = ApiCalls::CurlPost(json_encode($payload), $create_application_url);
|
||||
\Log::info('Application creation request ' . json_encode($payload));
|
||||
\Log::info('Application Successfully created ' . $result);
|
||||
$result_arr = json_decode($result, true);
|
||||
//save application in a db
|
||||
|
||||
$retval = Models\ClientApplication::create($result_arr);
|
||||
return response()->json(json_decode($result, true));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,4 +9,15 @@ use Illuminate\Routing\Controller as BaseController;
|
||||
class Controller extends BaseController
|
||||
{
|
||||
use AuthorizesRequests, ValidatesRequests;
|
||||
function validate_11_or_12_digits($string) {
|
||||
// Check if the string contains only digits
|
||||
if (ctype_digit($string)) {
|
||||
// Check if the length is 11 or 12
|
||||
$length = strlen($string);
|
||||
if ($length === 11 || $length === 12) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
55
app/Mail/NewClientMail.php
Normal file
55
app/Mail/NewClientMail.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
namespace App\Mail;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Mail\Mailables\Content;
|
||||
use Illuminate\Mail\Mailables\Envelope;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class NewClientMail extends Mailable
|
||||
{
|
||||
use Queueable, SerializesModels;
|
||||
public $email;
|
||||
public $activation_hash;
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*/
|
||||
public function __construct($email, $activation_hash)
|
||||
{
|
||||
$this->email = $email;
|
||||
$this->activation_hash = $activation_hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the message envelope.
|
||||
*/
|
||||
public function envelope(): Envelope
|
||||
{
|
||||
return new Envelope(
|
||||
subject: 'Client Portal Account Activation',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the message content definition.
|
||||
*/
|
||||
public function content(): Content
|
||||
{
|
||||
return new Content(
|
||||
view: 'emails.newclient',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the attachments for the message.
|
||||
*
|
||||
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
|
||||
*/
|
||||
public function attachments(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
12
app/Models/ClientApplication.php
Normal file
12
app/Models/ClientApplication.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class ClientApplication extends Model
|
||||
{
|
||||
protected $guarded = [
|
||||
'id'
|
||||
];
|
||||
}
|
||||
12
app/Models/ClientSession.php
Normal file
12
app/Models/ClientSession.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class ClientSession extends Model
|
||||
{
|
||||
protected $guarded = [
|
||||
'id'
|
||||
];
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
|
||||
class Comment extends Model
|
||||
{
|
||||
protected $guarded = [
|
||||
'id'
|
||||
];
|
||||
public function userInfo(): HasOne
|
||||
{
|
||||
return $this->hasOne(User::class);
|
||||
}
|
||||
public function projectStatus(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(ProjectStatus::class);
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
|
||||
class Project extends Model
|
||||
{
|
||||
protected $guarded = [
|
||||
'id'
|
||||
];
|
||||
|
||||
// public function userInfo()
|
||||
// {
|
||||
// return $this->hasMany('App\Models\User', 'org_id', 'id');
|
||||
// }
|
||||
// public function phone(): HasOne
|
||||
// {
|
||||
// return $this->hasOne(Phone::class);
|
||||
// }
|
||||
public function userInfo(): HasMany
|
||||
{
|
||||
return $this->hasMany(User::class);
|
||||
}
|
||||
public function statusInfo(): HasMany
|
||||
{
|
||||
return $this->hasMany(ProjectStatus::class);
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
class ProjectStatus extends Model
|
||||
{
|
||||
protected $guarded = [
|
||||
'id'
|
||||
];
|
||||
|
||||
public function project(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Project::class);
|
||||
}
|
||||
public function comments(): HasMany
|
||||
{
|
||||
return $this->hasMany(Comment::class);
|
||||
}
|
||||
}
|
||||
@@ -50,7 +50,32 @@ class ApiCalls
|
||||
curl_close($curl);
|
||||
return $response;
|
||||
}
|
||||
|
||||
|
||||
public static function CurlPatch($data, $url){
|
||||
$patch_url = env('APIBASEURL') . $url;
|
||||
$curl = curl_init();
|
||||
|
||||
curl_setopt_array($curl, array(
|
||||
CURLOPT_URL => $patch_url,
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_ENCODING => '',
|
||||
CURLOPT_MAXREDIRS => 10,
|
||||
CURLOPT_TIMEOUT => 0,
|
||||
CURLOPT_FOLLOWLOCATION => true,
|
||||
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
||||
CURLOPT_CUSTOMREQUEST => 'PATCH',
|
||||
CURLOPT_POSTFIELDS => $data,
|
||||
CURLOPT_HTTPHEADER => array(
|
||||
'Content-Type: application/json'
|
||||
),
|
||||
));
|
||||
|
||||
$response = curl_exec($curl);
|
||||
|
||||
curl_close($curl);
|
||||
echo $response;
|
||||
|
||||
}
|
||||
|
||||
public static function generatePassword($length = 10) {
|
||||
return bin2hex(random_bytes($length / 2));
|
||||
|
||||
Reference in New Issue
Block a user