This is friend request code, When i request to another user than token(login user or auth user)didn't entry in table. This is my frd table, you can show here..How can i set auth user as user_id_2 and entry in data table
public function request(Request $request) {
$input =$request->all();
$user = User::find($request->user_id_1);
$friend->user_id_2 = Auth::guard('api')->user()->id;
if(empty($user)){
return [
'status' => 'error',
'msg' => 'no user found'
];
}
if($request->approved == "yes"){
$friend = new Friend();
$friend->user_id_1 = $user->id;
$friend->approved = "yes";
// dd($user);
$friend->save();
$data = array("status" => $user);
return $data;
}
else{
$friend->approved = false;
$friend->save();
return [
'user_id' => $user->id,
'true' => true
];
}
}
Please update your code below.
public function request(Request $request) {
$input =$request->all();
$user = User::find($request->user_id_1);
if(empty($user)){
return [
'status' => 'error',
'msg' => 'no user found'
];
}
if($request->approved == "yes"){
$friend = new Friend();
$friend->user_id_1 = $user->id;
$friend->user_id_2 = Auth::guard('api')->user()->id;
$friend->approved = "yes";
$friend->save();
$data = array("status" => $user);
return $data;
}
else{
$friend->approved = false;
$friend->save();
return [
'user_id' => $user->id,
'true' => true
];
}
}
Related
I am using Laravel-8 and Maatwebsite-3.1 package to import Excel into the DB using Laravel API as the endpoint.
Trait:
trait ApiResponse {
public
function coreResponse($message, $data = null, $statusCode, $isSuccess = true) {
if (!$message) return response() - > json(['message' => 'Message is required'], 500);
// Send the response
if ($isSuccess) {
return response() - > json([
'message' => $message,
'error' => false,
'code' => $statusCode,
'results' => $data
], $statusCode);
} else {
return response() - > json([
'message' => $message,
'error' => true,
'code' => $statusCode,
], $statusCode);
}
}
public
function success($message, $data, $statusCode = 200) {
return $this - > coreResponse($message, $data, $statusCode);
}
public
function error($message, $statusCode = 500) {
return $this - > coreResponse($message, null, $statusCode, false);
}
}
Import:
class EmployeeImport extends DefaultValueBinder implements OnEachRow, WithStartRow, SkipsOnError, WithValidation, SkipsOnFailure
{
use Importable, SkipsErrors, SkipsFailures;
public function onRow(Row $row)
{
$rowIndex = $row->getIndex();
if($rowIndex >= 1000)
return; // Not more than 1000 rows at a time
$row = $row->toArray();
$employee = Employee::create([
'first_name' => $row[0],
'other_name' => $row[1] ?? '',
'last_name' => $row[2],
'email' => preg_replace('/\s+/', '', strtolower($row[3])),
'created_at' => date("Y-m-d H:i:s"),
'created_by' => Auth::user()->id,
]);
public function startRow(): int
{
return 2;
}
}
Controller:
public function importEmployee(Request $request)
{
try {
$validator = Validator::make($request->all(), [
'document' => 'file|mimes:xls,xlsx|max:5000',
]);
if ($request->hasFile('document'))
{
if($validator->passes()) {
$import = new EmployeeImport;
$file = $request->file('document');
$file->move(public_path('storage/file_imports/employee_imports'), $file->getClientOriginalName());
Excel::import($import, public_path('storage/file_imports/employee_imports/' . $file->getClientOriginalName() ));
foreach ($import->failures() as $failure) {
$importerror = new ImportError();
$importerror->data_row = $failure->row(); // row that went wrong
$importerror->data_attribute = $failure->attribute(); // either heading key (if using heading row concern) or column index
$importerror->data_errors = $failure->errors()[0]; // Actual error messages from Laravel validator
$importerror->data_values = json_encode($failure->values());
$importerror->created_by = Auth::user()->id;
$importerror->created_at = date("Y-m-d H:i:s");
$importerror->save();
}
return $this->success('Employees Successfully Imported.', [
'file' => $file
]);
}else{
return $this->error($validator->errors(), 422);
}
}
} catch(\Throwable $e) {
Log::error($e);
return $this->error($e->getMessage(), $e->getCode());
}
}
I made it to SkipOnError and SkipOnFailure.
If there's error, it saves the error into the DB. This is working.
However, there is issue, if some rows fail it still display success (Employees Successfully Imported) based on this:
return $this->success('Employees Successfully Imported.
When there is partial upload, or all the rows or some of the rows have issues, I want to display this to the user. So that it will be interactive.
How do I achieve this?
Thanks
I'm building a laravel API. I want when i register , email verify will be sent activation code to user email automatically.
the problem is when i create a new activation code , i create a new record in tokens table too, this record has user_id field , so for store it , i use JWTAuth::user()->id but i have this error:
Trying to get property 'id' of non-object
i know why this happens , because I did not enter any tokens and i don't know how handle it and where to create a new record in tokens table
for more details I have :
AuthController : Login and register
public function register(Request $request) {
$validator = Validator::make($request->all(), [
'name'=>'required|string|min:3|max:30',
'email' => 'required|string|email|max:100|unique:users',
'password' => 'required|string|confirmed|min:6',
]);
if($validator->fails()){
return response()->json($validator->errors()->toJson(), 400);
}
$user = User::create(array_merge(
$validator->validated(),
['password' => bcrypt($request->password)],
));
$token = JWTAuth::fromUser($user);
dd($this->sendNotification());
$user->$this->sendNotification();
return response()->json([
'message' => 'successfully created',
'user' => $user,
'token' => $token,
], 201);
}
EmailVerifyController : for verify user email and validate activation code
public function emailVerify(Request $request){
$data = $request->validate([
'code' => 'required|size:10|numeric',
]);
$interedCode = (int)$data['code'];//convert code from string to integer
$userCode = Token::where('user_id' , JWTAuth::user()->id)->first();//find user from tokens table
$activationCode = $userCode->code; //get activation code of user in tokens table
$expires_in = (int)$userCode->expires_in; //get expire time of code
$now = Carbon::now()->timestamp;
if($interedCode == $activationCode) {
if ($now < $expires_in) {
$user = JWTAuth::user()->id;
$findUser = User::find($user);
$findUser->email_verified_at = Carbon::now()->timestamp;
$findUser->save();
$token = Token::where('user_id', JWTAuth::user()->id)->first();
$token->status = 1;
$token->save();
return response()->json('email verified successfully', 200);
} else {
return response()->json('code expired', 400);
}
}else{
return response()->json('wrong activation code' , 400);
}
}
SendNotificationTrait : for send email and create a new record in token table
trait EmailVerifyTrait
{
public function sendNotification(){
$random = $this->generateVerificationCode(6);
$details = [
'title' => 'Mail from ItSolutionStuff.com',
'body' =>$random,
];
Mail::to('*****#gmail.com')->send(new VerifyMail($details));
return response()->json([
'message'=>'your email verification code sent to your email'
] , 201);
}
public function generateVerificationCode($length = 6) {
$characters = '0123456789';
$charactersLength = strlen($characters);
$code = '';
for ($i = 0; $i < $length; $i++) {
$code .= $characters[rand(0, $charactersLength - 1)];
}
$token = new Token();
$token->user_id = JWTAuth::user()->id;
$token->code = $code;
$token->status = 0;
$token->save();
return $code;
}
tokens tables : has this fields : user_id , code , created_at , expires_in
so how can i handle creating new Token record in tokens table ?
or should i use event listener ?
thank you for your help and sorry for my language.
for handle this email verification , i used laravel Notification : https://laravel.com/docs/8.x/notifications
and i used $user->id for getting id and use it for user_id field in tokens table.
codes:
Register method
use ActivationCode;
public function register(Request $request) {
$validator = Validator::make($request->all(), [
'name'=>'required|string|min:3|max:30',
'email' => 'required|string|email|max:100|unique:users',
'password' => 'required|string|confirmed|min:6',
]);
if($validator->fails()){
return response()->json($validator->errors()->toJson(), 400);
}
//create user
$user = User::create(array_merge(
$validator->validated(),
['password' => bcrypt($request->password)],
));
//create token
$token = JWTAuth::fromUser($user);
//create a new activation code
$activationCode = $this->generateVerificationCode();
//create a new token
$newToken = new Token;
$newToken->code = $activationCode;
$newToken->status = 0;
$newToken->user_id = $user->id;
$newToken->save();
//email details
$details = [
'greeting' => 'Hi'.$request->name,
'body' => 'use this activation code for verify your email address',
'activation_code'=>$newToken->code,
'thanks' => 'thank you',
'order_id' => 101
];
//send email verify to user email
Notification::send($user, new EmailVerification($details));
return response()->json([
'message' => 'use created successfully and activation code sent to email',
'user' => $user,
'token' => $token,
], 201);
}
Activation code trait:
trait ActivationCode
{
public function generateVerificationCode($length = 6) {
$characters = '0123456789';
$charactersLength = strlen($characters);
$code = '';
for ($i = 0; $i < $length; $i++) {
$code .= $characters[rand(0, $charactersLength - 1)];
}
return $code;
}
}
EmailVerify Notification :
class EmailVerification extends Notification
{
use Queueable;
private $details;
public function __construct($details){
$this->details = $details;
}
public function via($notifiable)
{
return ['mail'];
}
public function toMail($notifiable)
{
return (new MailMessage)
->greeting($this->details['greeting'])
->line($this->details['body'])
->line($this->details['thanks'])
->line($this->details['activation_code']);
}
public function toArray($notifiable)
{
return [
'order_id' => $this->details['order_id']
];
}
}
In my Laravel-8, I have this code:
public function add(Request $request){
if( $request->ajax() ){
$rules = array(
'first_name.*' => 'required',
'country.*' => 'required'
);
$error = Validator::make($request->all(),$rules);
if($error->fails()){
return response()->json([
'error' => $error->errors()->all(),
]);
}
$first_name = $request->first_name;
$country = $request->country;
for( $count = 0; $count < count($first_name); $count++ ){
$data = array(
'first_name' => $first_name[$count],
'country' => $country[$count],
);
$insert_data[] = $data;
}
DynamicField::insert($insert_data);
return response()->json([
'success' => 'Data added Successfully',
]);
}
}
This successfully Inserts record.
How do I do the update to this same code?
I mean public function update ...
I am trying to delete the cookie i create when user logs in but somehow delete_cookie() function is not deleting the cookie i made. I checked the documentation and everything but i cannot get it to work
Here is my code
public function __construct()
{
helper('cookie');
}
public function login() {
$data = [];
$session = session();
$model = new AdminModel();
$username = $this->request->getPost('username');
$password = $this->request->getPost('password');
$remember = $this->request->getPost('agree');
$rules = [
'username' => 'required',
'password' => 'required',
];
if(!$this->validate($rules)) {
$data['validation'] = $this->validator;
} else {
$admin = $model->where('username', $username)->where('password', $password)->first();
if($admin) {
$session->set('uid', $admin['id']);
if($remember) {
set_cookie([
'name' => 'id',
'value' => $admin['id'],
'expire' => '3600',
'httponly' => false
]);
}
} else {
$session->setFlashdata('msg', 'Incorrect Username or Password');
return redirect()->to('admin/login');
}
}
return view('admin/login', $data);
}
public function logout() {
$session = session();
$session->destroy();
delete_cookie('id');
return redirect()->to('admin/login')->withCookies();
}
Edit:
I fixed it. I had to redirect with withCookies();
use this Library
use Config\Services;
Services::response()->deleteCookie('id');
refer this link
https://codeigniter.com/user_guide/libraries/cookies.html
I have field status in my users table and O want to check if status is 0 then user should not login and if 1 user should be able to login.
Here is my login code (controller is lengthy, please avoid some irrelevant code):
public function fdLogin(Request $request)
{
$credentials = $request->only('email', 'password');
$rules = [
'email' => 'required|email',
'password' => 'required',
];
$validator = Validator::make($credentials, $rules);
if ($validator->fails()) {
return response()->json([
'status' => false,
'message' => __('messages.validation_errors'),
'errors' => $validator->messages()
]);
}
$token = "";
try {
// if Request has latitude and longitude
$latFrom = $longFrom = $givenSpeciality = "";
$locationTag = false;
if ($request->has('lat') && $request->has('long') && $request->has('specialityKey') && !empty($request->lat) && !empty($request->long) && !empty($request->specialityKey)) {
$latFrom = $request->lat;
$longFrom = $request->long;
$givenSpeciality = $request->specialityKey;
$locationTag = true;
}
if (!Auth::attempt($credentials)) {
return response()->json(array('status' => false, 'message' => 'Invalid username or password', 'errors' => array('Invalid username or password')));
}
$speciality = DB::table('specialities')
->join('user_facility', 'specialities.id', 'user_facility.speciality_id')
->where('user_facility.user_id', Auth::user()->id)
->select('specialities.name', 'specialities.id')->first();
$types = [];
if (!empty($speciality)) {
$types = $speciality;
}
$customClaims = ['exp' => Carbon::now()->addYear()->timestamp, 'specialityType' => $types];
if (!$token = JWTAuth::claims($customClaims)->attempt($credentials)) {
return response()->json([
'status' => false,
'message' => 'We can`t find an account with this credentials.'
], 401);
}
} catch (JWTException $e) {
// Something went wrong with JWT Auth.
return response()->json([
'status' => false,
'message' => 'Failed to login, please try again.'
], 500);
}
$withInFacility['logged_in_facility'] = array();
$currentUser = Auth::user();
$user_id = $currentUser->id;
if ($locationTag) {
$userWithFacilities = $currentUser->load('facilities.facilityLocation', 'facilities.speciality.avaliableSpeciality');
$locations = array();
if (isset($userWithFacilities['facilities']) && count($userWithFacilities['facilities'])) {
foreach ($userWithFacilities['facilities'] as $facility) {
$faci = $facility->toArray();
if (!empty($faci['facility_location']) && $faci['facility_location'] > 0) {
$demo = $faci['facility_location'];
}
if (isset($faci['speciality']) && count($faci['speciality']) > 0) {
$speciality = $faci['speciality'];
if (isset($speciality['avaliable_speciality']) && count($speciality['avaliable_speciality']) > 0) {
$avaliable_speciality = $speciality['avaliable_speciality'];
$demo['avaliable'] = $avaliable_speciality['specialty_key'];
}
}
$locations[] = $demo;
}
if (count($locations)) {
foreach ($locations as $location) {
$distance = self::distance($latFrom, $longFrom, $location['lat'], $location['long']);
// if distance is less than 100 meter ''ll eligible to login else Log him out
if ($distance < config('constants.facility_radius')) {
if ($location['avaliable'] == $givenSpeciality) {
$withInFacility['logged_in_facility'] = $location;
$withInFacility['logged_in_facility']['radius'] = config('constants.facility_radius');
}
}
}
// if distance is less than 100 meter ''ll eligible to login else Log him out
if (empty($withInFacility['logged_in_facility'])) {
JWTAuth::setToken($token)->invalidate();
return response()->json(['status' => false, 'message' => 'Your are not in facility OR Your speciality did not matched with facility', 'errors' => '']);
}
} else {
return response(['status' => false, 'message' => 'Your Facility did not have any location , please ask for administrator', 'data' => null]);
}
} else {
return response(['status' => false, 'message' => 'You did not have any facility , please ask for administrator', 'data' => null]);
}
}
$currentUser->basicInfo = $this->userBasicInfo->where('user_id', $user_id)->first();
$is_super_admin = DB::table('users')->select('users.is_super_admin')->where('id', $user_id)->first();
$specialitiesAndRoles = DB::table('user_facility')
->leftjoin('roles', 'user_facility.role_id', 'roles.id')
->leftjoin('specialities', 'user_facility.speciality_id', '=', 'specialities.id')
->leftjoin('available_specialties', 'specialities.available_specialties_id', '=', 'available_specialties.id')
->where('user_facility.user_id', $user_id)
->select('user_facility.facility_id', 'user_facility.speciality_id', 'user_facility.is_facility_supervisor', 'user_facility.priv_key', 'user_facility.role_id', 'specialities.name', 'available_specialties.id', 'available_specialties.specialty_key')
->get();
$superadmin = $is_super_admin->is_super_admin;
$specialities = (object)$specialitiesAndRoles;
$sp = $specialitiesAndRoles->toArray();
$specialty_key = "";
if (!empty($sp)) {
$specialty_key = $sp[0]->specialty_key;
}
$fac_privs = array();
if (!empty($sp)) {
foreach ($sp as $s) {
$s = (array)$s;
$s['priv_list'] = Helpers::get_checked_privs($s);
$fac_privs[] = $s;
}
}
if (count($withInFacility['logged_in_facility'])) {
$withInFacilityObj = (object)$withInFacility['logged_in_facility'];
} else {
$withInFacilityObj = NULL;
}
$response = ['is_super_admin' => $superadmin, 'facilities' => $fac_privs, 'logged_in_facility' => $withInFacilityObj];
if ($superadmin == 1) {
$response['priv_ist'] = Helpers::get_priv_list();
}
$speciality = $this->speciality;
if ($speciality) {
$user = DB::table('verify_users')->where('user_id', $user_id)->first();
DB::table('verify_users')->insert([
'token' => $token,
'user_id' => $user_id,
]);
if ($specialty_key == 'medical_doctor') {
$md_db = DB::connection('doctorDB');
$user = $md_db->table('auth_token')->where('user_id', $user_id)->first();
if ($user) {
$md_db->table('auth_token')->where('id', $user->id)->update([
'token' => $token,
'isValid' => 1,
]);
} else {
$md_db->table('auth_token')->insert([
'token' => $token,
'isValid' => 1,
'user_id' => $user_id
]);
}
}
}
$user_data = $this->GetUserInfo();
unset($currentUser['facilities']);
return response()->json([
'status' => true,
'message' => 'Login successfully',
'data' => [
'token' => $token,
'userData' => $currentUser,
'userInfo' => $user_data,
'privileges' => $response,
]
]);
}
This is my whole controller of login I am not using Laravel built-in authentication, I have created my own login based on my project requirement, and I want to implement this functionality.
I don't know why you are not checking when you get the user info. I am not sure what is your purpose but may be this code will help you.
$currentUser = Auth::user();
if($currentUser->status == 0){
Auth::logout();
return response()->json([
'status' => false,
'message' => 'Failed to login, Access forbidden.',
], 403);
}