From 03a135305bc7d14f18f482f2d270c1f49205fa2f Mon Sep 17 00:00:00 2001 From: saeid_01 Date: Thu, 18 Apr 2019 20:18:13 +0430 Subject: [PATCH] Come BackEnd --- .../Response/Facades/MessageResponse.php | 10 + .../Common/Response/MessageResponse.php | 25 + app/Appended/Traites/Auth/Verification.php | 121 +++ app/Gallary.php | 21 + .../Api/Auth/ForgotPasswordController.php | 27 + .../Controllers/Api/Auth/LoginController.php | 60 ++ .../Api/Auth/RegisterController.php | 54 + .../Api/Auth/ResetPasswordController.php | 55 + .../Api/ForgotPasswordController.php | 49 + .../Controllers/Api/PassportController.php | 100 ++ .../Api/ResetPasswordController.php | 61 ++ app/Http/Controllers/Auth/LoginController.php | 113 +- .../Controllers/Auth/RegisterController.php | 91 +- app/Http/Controllers/HomeController.php | 28 + .../Controllers/MedicalCenterController.php | 51 + app/Http/Controllers/TestResultController.php | 116 ++ app/Http/Controllers/TestTypeController.php | 126 +++ app/Http/Controllers/UserController.php | 54 + app/Http/Kernel.php | 1 + app/Http/Middleware/Cors.php | 30 + app/Http/Middleware/VerifyCsrfToken.php | 2 +- .../Requests/StoreMedicalCenterRequest.php | 53 + app/Http/Requests/StoreTestTypeRequest.php | 57 + app/Http/Requests/StoreUserRequest.php | 53 + app/Input.php | 26 + app/InputValue.php | 17 + app/MedicalCenter.php | 14 + app/Option.php | 14 + app/Policies/MedicalCenterPolicy.php | 29 + app/Policies/TestTypePolicy.php | 29 + app/Policies/UserPolicy.php | 28 + app/Providers/AuthServiceProvider.php | 7 +- app/Providers/MessageServiceProvider.php | 28 + app/Providers/RouteServiceProvider.php | 22 +- app/TestResult.php | 21 + app/TestType.php | 22 + app/Transformers/Json.php | 12 + app/Uploadable.php | 18 + app/User.php | 23 +- composer.json | 6 +- composer.lock | 995 +++++++++++++++++- config/app.php | 3 + config/auth.php | 3 +- config/cache.php | 2 +- config/database.php | 3 - config/permission.php | 129 +++ config/services.php | 4 + database/.gitignore | 1 - ...11_104648_create_medical_centers_table.php | 32 + .../2019_04_11_104800_create_users_table.php | 41 + ...9_04_11_104917_create_test_types_table.php | 35 + ...04_11_105013_create_test_results_table.php | 40 + .../2019_04_11_105057_create_inputs_table.php | 39 + ...04_11_105220_create_input_values_table.php | 31 + ...2019_04_11_105508_create_options_table.php | 34 + ...19_04_11_105601_create_galleries_table.php | 34 + ..._04_11_105658_create_uploadables_table.php | 35 + ..._04_18_152732_create_permission_tables.php | 102 ++ routes/api.php | 23 +- routes/routes.php | 15 + routes/web.php | 49 +- 61 files changed, 3266 insertions(+), 58 deletions(-) create mode 100644 app/Appended/Classes/Common/Response/Facades/MessageResponse.php create mode 100644 app/Appended/Classes/Common/Response/MessageResponse.php create mode 100644 app/Appended/Traites/Auth/Verification.php create mode 100644 app/Gallary.php create mode 100644 app/Http/Controllers/Api/Auth/ForgotPasswordController.php create mode 100644 app/Http/Controllers/Api/Auth/LoginController.php create mode 100644 app/Http/Controllers/Api/Auth/RegisterController.php create mode 100644 app/Http/Controllers/Api/Auth/ResetPasswordController.php create mode 100644 app/Http/Controllers/Api/ForgotPasswordController.php create mode 100644 app/Http/Controllers/Api/PassportController.php create mode 100644 app/Http/Controllers/Api/ResetPasswordController.php create mode 100644 app/Http/Controllers/HomeController.php create mode 100644 app/Http/Controllers/MedicalCenterController.php create mode 100644 app/Http/Controllers/TestResultController.php create mode 100644 app/Http/Controllers/TestTypeController.php create mode 100644 app/Http/Controllers/UserController.php create mode 100644 app/Http/Middleware/Cors.php create mode 100644 app/Http/Requests/StoreMedicalCenterRequest.php create mode 100644 app/Http/Requests/StoreTestTypeRequest.php create mode 100644 app/Http/Requests/StoreUserRequest.php create mode 100644 app/Input.php create mode 100644 app/InputValue.php create mode 100644 app/MedicalCenter.php create mode 100644 app/Option.php create mode 100644 app/Policies/MedicalCenterPolicy.php create mode 100644 app/Policies/TestTypePolicy.php create mode 100644 app/Policies/UserPolicy.php create mode 100644 app/Providers/MessageServiceProvider.php create mode 100644 app/TestResult.php create mode 100644 app/TestType.php create mode 100644 app/Transformers/Json.php create mode 100644 app/Uploadable.php create mode 100644 config/permission.php create mode 100644 database/migrations/2019_04_11_104648_create_medical_centers_table.php create mode 100644 database/migrations/2019_04_11_104800_create_users_table.php create mode 100644 database/migrations/2019_04_11_104917_create_test_types_table.php create mode 100644 database/migrations/2019_04_11_105013_create_test_results_table.php create mode 100644 database/migrations/2019_04_11_105057_create_inputs_table.php create mode 100644 database/migrations/2019_04_11_105220_create_input_values_table.php create mode 100644 database/migrations/2019_04_11_105508_create_options_table.php create mode 100644 database/migrations/2019_04_11_105601_create_galleries_table.php create mode 100644 database/migrations/2019_04_11_105658_create_uploadables_table.php create mode 100644 database/migrations/2019_04_18_152732_create_permission_tables.php create mode 100644 routes/routes.php diff --git a/app/Appended/Classes/Common/Response/Facades/MessageResponse.php b/app/Appended/Classes/Common/Response/Facades/MessageResponse.php new file mode 100644 index 00000000..33eb6c18 --- /dev/null +++ b/app/Appended/Classes/Common/Response/Facades/MessageResponse.php @@ -0,0 +1,10 @@ +json(['data' => $data, 'view' => $view], 200); + } + + public function success($message = null, $title = null, $status = 'Success' , $data = null , $view = null ) + { + $message = isset($message) ? $message : trans('messages.success_title'); + $title = isset($title) ? $title : trans('messages.success'); + return response()->json(['status' => $status, 'message' => $message, 'title' => $title, 'data' => $data, 'view' => $view], 200); + } + + public function error($message = null, $title = null, $status = 'Faild', $statusCode = 422 ) + { + $message = isset($message) ? $message : trans('messages.faild_message'); + $title = isset($title) ? $title : trans('messages.faild'); + return response()->json(['status' => $status, 'errors' => ['message' => [$message, 'Title' => $title]]], $statusCode); + } +} diff --git a/app/Appended/Traites/Auth/Verification.php b/app/Appended/Traites/Auth/Verification.php new file mode 100644 index 00000000..97d125de --- /dev/null +++ b/app/Appended/Traites/Auth/Verification.php @@ -0,0 +1,121 @@ +findOrFail($user_id) : $user_id; + $user->verified = $user->verified | $verify_number; + $user->save(); + return $user; + } + + /** + *-------------------------------------------------------------------------- + * farid saravi + * This function checks confirmation email and set user in the database as verified. lsb + *-------------------------------------------------------------------------- + */ + + public function confirm($token) + { + $user_id = Cache::pull($token); + if ($user_id) { + $user = $this->setVerified($user_id, 'email'); + if (! \Auth::check()) { + $this->guard()->login($user); + } + } + return redirect('/'); + } + + /** + *-------------------------------------------------------------------------- + * farid saravi + * This function checks confirmation sms and set user in the database as verified sms. msb + *-------------------------------------------------------------------------- + */ + + public function confirm_phone(Request $request) + { + $user_id = Cache::pull('phone_number_' . $request->number); + if ($user_id) + { + $user = $this->setVerified($user_id, 'phone_number'); + if (! \Auth::check()) + { + $this->guard()->login($user); + } + return response()->json(['status' => 'success']); + } + return response()->json(['status' => 'fail'], 422); + } + + /** + *-------------------------------------------------------------------------- + * farid saravi + * This function sends confirmation email to a user. + * @param \App\User + * @return void + *-------------------------------------------------------------------------- + */ + + public function mail_confirmation($user, $Type=null) + { + $Type = ($Type == null) ? 'VerifyUser' : $Type; + $email_token = str_random(30); + Cache::put($email_token, $user->id, Carbon::now()->addDays(2)); + Mail::to($user->email)->send(new RegistrationMailer($user, $email_token, $Type)); + } + + /** + *-------------------------------------------------------------------------- + * farid saravi + * This function sends confirmation sms to a user. + * @param \App\User + * @return void + *-------------------------------------------------------------------------- + */ + + public function phone_confirmation($user) + { + $rand_number = rand(100000, 999999); + Cache::put('phone_number_' . $rand_number, $user->id, 60); + if( $user->cell_number != '' && $user->cell_number != null ) { + $MessageText = ' کد فعالسازی شما :'. $rand_number; + $this->sendSMS($user->cell_number, $MessageText); + } + } + + protected function sendSMS($phone_number, $message) + { + $options = array( + 'login' => 'hs-harmony-istore', + 'password' => 'WillaSMS47CD47' + ); + $client = new \SoapClient('http://sms.sms-bartar.com/webservice/?WSDL', $options); + + try { + $messageId = $client->send($phone_number, $message); + + } catch (SoapFault $sf) { + + print $sf->faultcode . "\n"; + print $sf->faultstring . "\n"; + + return ['code' => $sf->faultcode, 'message' => $sf->faultstring]; + } + + } +} diff --git a/app/Gallary.php b/app/Gallary.php new file mode 100644 index 00000000..7024fa12 --- /dev/null +++ b/app/Gallary.php @@ -0,0 +1,21 @@ +morphedByMany('App\BusinessItem', 'uploadable'); + // } + + + +} diff --git a/app/Http/Controllers/Api/Auth/ForgotPasswordController.php b/app/Http/Controllers/Api/Auth/ForgotPasswordController.php new file mode 100644 index 00000000..1356bb76 --- /dev/null +++ b/app/Http/Controllers/Api/Auth/ForgotPasswordController.php @@ -0,0 +1,27 @@ +middleware('guest'); + } + + protected function sendResetLinkResponse($response) + { + return response()->json(['status' => 200, 'message' => trans($response)]); + } + + protected function sendResetLinkFailedResponse(Request $request, $response) + { + return response()->json(['status' => 401, 'email' => trans($response)]); + } +} diff --git a/app/Http/Controllers/Api/Auth/LoginController.php b/app/Http/Controllers/Api/Auth/LoginController.php new file mode 100644 index 00000000..2ff48339 --- /dev/null +++ b/app/Http/Controllers/Api/Auth/LoginController.php @@ -0,0 +1,60 @@ +validate($request, $this->rules(), $this->validationErrorMessages()); + + $request = Request::create('/oauth/token', 'POST', [ + 'grant_type' => 'password', + 'client_id' => config('services.vue_client.id'), + 'client_secret' => config('services.vue_client.secret'), + 'username' => $request->cell_number, + 'password' => $request->password, + ]); + + return app()->handle($request); + } + + public function logout() + { + $accessToken = auth()->user()->token(); + + DB::table('oauth_access_tokens')->where('id', $accessToken->id)->delete(); + DB::table('oauth_refresh_tokens')->where('access_token_id', $accessToken->id)->delete(); + + return response()->json(['status' => 200]); + } + + /** + * Get the login validation rules. + * + * @return array + */ + protected function rules() + { + return [ + 'cell_number' => 'required', + 'password' => 'required|min:6', + ]; + } + + /** + * Get the login validation error messages. + * + * @return array + */ + protected function validationErrorMessages() + { + return []; + } +} diff --git a/app/Http/Controllers/Api/Auth/RegisterController.php b/app/Http/Controllers/Api/Auth/RegisterController.php new file mode 100644 index 00000000..cabadaed --- /dev/null +++ b/app/Http/Controllers/Api/Auth/RegisterController.php @@ -0,0 +1,54 @@ +validate($request, $this->rules(), $this->validationErrorMessages()); + + $user = new User(); + $user->name = $request->name; + $user->email = $request->email; + $user->password = bcrypt( $request->password ); + $user->save(); + + return (new LoginController())->login($request); + } + + /** + * Get the user registration validation rules. + * + * @return array + */ + protected function rules() + { + return [ + 'name' => 'required|string|max:80', + 'email' => 'required|email|unique:users', + 'password' => 'required|confirmed|min:6', + ]; + } + + /** + * Get the user registration validation error messages. + * + * @return array + */ + protected function validationErrorMessages() + { + return []; + } +} diff --git a/app/Http/Controllers/Api/Auth/ResetPasswordController.php b/app/Http/Controllers/Api/Auth/ResetPasswordController.php new file mode 100644 index 00000000..6a5f3eff --- /dev/null +++ b/app/Http/Controllers/Api/Auth/ResetPasswordController.php @@ -0,0 +1,55 @@ +middleware('guest'); + } + + /** + * Reset the given user's password. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + */ + public function reset(Request $request) + { + $this->validate($request, $this->rules(), $this->validationErrorMessages()); + + // Here we will attempt to reset the user's password. If it is successful we + // will update the password on an actual user model and persist it to the + // database. Otherwise we will parse the error and return the response. + $response = $this->broker()->reset( + $this->credentials($request), function ($user, $password) { + $this->resetPassword($user, $password); + } + ); + + // If the password was successfully reset, we will redirect the user back to + // the application's home authenticated view. If there is an error we can + // redirect them back to where they came from with their error message. + return $response == Password::PASSWORD_RESET + ? $this->sendResetResponse($request) + : $this->sendResetFailedResponse($request, $response); + } + + protected function sendResetResponse($request) + { + return (new LoginController())->login($request); + } + + protected function sendResetFailedResponse(Request $request, $response) + { + return response()->json(['status' => 401, 'email' => trans($response)]); + } +} diff --git a/app/Http/Controllers/Api/ForgotPasswordController.php b/app/Http/Controllers/Api/ForgotPasswordController.php new file mode 100644 index 00000000..61c83b21 --- /dev/null +++ b/app/Http/Controllers/Api/ForgotPasswordController.php @@ -0,0 +1,49 @@ +middleware('guest'); + } + /** + * Send a reset link to the given user. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function getResetToken(Request $request) + { + dd($request->all()); + $this->validate($request, ['email' => 'required|email']); + if ($request->wantsJson()) { + $user = User::where('email', $request->input('email'))->first(); + if (!$user) { + return response()->json(Json::response(null, trans('passwords.user')), 400); + } + $token = $this->broker()->createToken($user); + return response()->json(Json::response(['token' => $token])); + } + } +} diff --git a/app/Http/Controllers/Api/PassportController.php b/app/Http/Controllers/Api/PassportController.php new file mode 100644 index 00000000..f8f0d0c7 --- /dev/null +++ b/app/Http/Controllers/Api/PassportController.php @@ -0,0 +1,100 @@ +validate($request, $this->rules(), $this->validationErrorMessages()); + $request = Request::create('/oauth/token', 'POST', [ + 'grant_type' => 'password', + 'client_id' => config('services.vue_client.id'), + 'client_secret' => config('services.vue_client.secret'), + 'username' => $request->cell_number, + 'password' => $request->password, + ]); + return app()->handle($request); + // $user = User::where('cell_number', $request->cell_number)->first(); + // if ($user && \Hash::check($request->password, $user->password)) { + // $token = $user->createToken('Laravel password Grant Client')->accessToken; + // $response = ['token' => $token]; + // return response()->json($response, 200); + // } else { + // return response()->json(trans('auth.failed'), 422); + // } + } + + public function logout(Request $request) + { + $value = $request->bearerToken(); + $id = (new Parser())->parse($value)->getHeader('jti'); + $token = $request->user()->tokens->find($id); + $token->revoke(); + return response()->json(trans('auth.logout_success'), 200); + } + + /** + * Register api + * + * @return \Illuminate\Http\Response + */ + public function register(Request $request) + { + $validator = Validator::make($request->all(), [ + 'name' => 'required|string|max:255', + 'medical_center_id' => 'required', + 'email' => 'email|max:255|unique:users', + 'cell_number' => 'required|digits_between:10,11|unique:users', + 'password' => 'required|string|min:6|confirmed', + ]); + + if ($validator->fails()) { + return response()->json(['error' => $validator->errors()], 401); + } + + $input = $request->all(); + $input['password'] = bcrypt($input['password']); + $input['status'] = 'Registered'; + $user = User::create($input); + $this->phone_confirmation($user); + + $success['token'] = $user->createToken('MyApp')->accessToken; + $success['name'] = $user->name; + + return response()->json(['success' => $success], 200); + } + + public function resetCode(Request $request) + { + $user = User::where('cell_number', $request->cell_number)->where('verified', 0)->first(); + if ($user) { + $this->phone_confirmation($user); + return response()->json(['success' => true], 200); + } + return response()->json(['success' => false], 403); + } + + public function sendLinkEmail(Request $request) + { + return response()->json(app('App\Http\Controllers\Auth\ForgotPasswordController')->sendResetLinkEmail($request)); + } + +} diff --git a/app/Http/Controllers/Api/ResetPasswordController.php b/app/Http/Controllers/Api/ResetPasswordController.php new file mode 100644 index 00000000..5e279445 --- /dev/null +++ b/app/Http/Controllers/Api/ResetPasswordController.php @@ -0,0 +1,61 @@ +middleware('guest'); + } + /** + * Reset the given user's password. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function reset(Request $request) + { + $this->validate($request, $this->rules(), $this->validationErrorMessages()); + // Here we will attempt to reset the user's password. If it is successful we + // will update the password on an actual user model and persist it to the + // database. Otherwise we will parse the error and return the response. + $response = $this->broker()->reset( + $this->credentials($request), function ($user, $password) { + $this->resetPassword($user, $password); + } + ); + if ($request->wantsJson()) { + if ($response == Password::PASSWORD_RESET) { + return response()->json(Json::response(null, trans('passwords.reset'))); + } else { + return response()->json(Json::response($request->input('email'), trans($response), 202)); + } + } + // If the password was successfully reset, we will redirect the user back to + // the application's home authenticated view. If there is an error we can + // redirect them back to where they came from with their error message. + return $response == Password::PASSWORD_RESET + ? $this->sendResetResponse($response) + : $this->sendResetFailedResponse($request, $response); + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index b2ea669a..33b70ee3 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -2,8 +2,13 @@ namespace App\Http\Controllers\Auth; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; -use Illuminate\Foundation\Auth\AuthenticatesUsers; +use Illuminate\Foundation\Auth\RedirectsUsers; +use Illuminate\Foundation\Auth\ThrottlesLogins; +use Illuminate\Validation\ValidationException; +use Illuminate\Support\Facades\Hash; class LoginController extends Controller { @@ -17,23 +22,103 @@ class LoginController extends Controller | to conveniently provide its functionality to your applications. | */ + use RedirectsUsers, ThrottlesLogins; - use AuthenticatesUsers; + protected $redirectTo = '/'; - /** - * Where to redirect users after login. - * - * @var string - */ - protected $redirectTo = '/home'; - - /** - * Create a new controller instance. - * - * @return void - */ public function __construct() { $this->middleware('guest')->except('logout'); } + + public function showLoginForm() + { + return view('auth.login'); + } + + public function login(Request $request) + { + $this->validateLogin($request); + + if ($this->hasTooManyLoginAttempts($request)) { + $this->fireLockoutEvent($request); + + return $this->sendLockoutResponse($request); + } + + if ($this->attemptLogin($request)) { + + return $this->sendLoginResponse($request); + } + + $this->incrementLoginAttempts($request); + return $this->sendFailedLoginResponse($request); + } + + protected function validateLogin(Request $request) + { + $this->validate($request, [ + $this->username() => 'required|string', + 'password' => 'required|string', + ]); + } + + protected function attemptLogin(Request $request) + { + return $this->guard()->attempt( + $this->credentials($request), $request->filled('remember') + ); + } + + protected function credentials(Request $request) + { + return $request->only($this->username(), 'password'); + } + + protected function sendLoginResponse(Request $request) + { + $request->session()->regenerate(); + $this->clearLoginAttempts($request); + + // $request->session()->put(['user_status'=> 'user logged in!']); + return $this->authenticated($request, $this->guard()->user()) + ?: redirect()->intended($this->redirectTo); + + } + + protected function authenticated(Request $request, $user) + { + // + } + + protected function sendFailedLoginResponse(Request $request) + { + $errors = [$this->username() => trans('auth.failed')]; + + if ($request->expectsJson()) { + return response()->json($errors, 422); + } + + return redirect()->back() + ->withInput($request->only($this->username(), 'remember')) + ->withErrors($errors); + + } + + public function username() + { + return 'cell_number'; + } + + public function logout(Request $request) + { + $this->guard()->logout(); + $request->session()->invalidate(); + return redirect('/'); + } + + protected function guard() + { + return Auth::guard(); + } } diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 85b9057a..4ed38b48 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -6,7 +6,14 @@ use App\User; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; -use Illuminate\Foundation\Auth\RegistersUsers; +// use Illuminate\Foundation\Auth\RegistersUsers; + +use Illuminate\Http\Request; +use Illuminate\Auth\Events\Registered; +use Illuminate\Support\Facades\Auth; +use App\Appended\Traites\Auth\Verification; +use Illuminate\Support\Facades\Cache; +use App\Appended\Traites\Auth\Mc; class RegisterController extends Controller { @@ -20,15 +27,15 @@ class RegisterController extends Controller | provide this functionality without requiring any additional code. | */ - - use RegistersUsers; + use Verification; + // use RegistersUsers; /** * Where to redirect users after registration. * * @var string */ - protected $redirectTo = '/home'; + protected $redirectTo = '/'; /** * Create a new controller instance. @@ -37,7 +44,7 @@ class RegisterController extends Controller */ public function __construct() { - $this->middleware('guest'); + // $this->middleware('guest'); } /** @@ -49,10 +56,13 @@ class RegisterController extends Controller protected function validator(array $data) { return Validator::make($data, [ - 'name' => ['required', 'string', 'max:255'], - 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], - 'password' => ['required', 'string', 'min:8', 'confirmed'], + 'name' => 'required|string|max:255', + 'medical_center_id' => 'required', + 'email' => 'email|max:255|unique:users', + 'cell_number' => 'required|digits_between:10,11|unique:users', + 'password' => 'required|string|min:6|confirmed', ]); + } /** @@ -63,10 +73,69 @@ class RegisterController extends Controller */ protected function create(array $data) { - return User::create([ + $userData = [ 'name' => $data['name'], + 'password' => bcrypt($data['password']), 'email' => $data['email'], - 'password' => Hash::make($data['password']), - ]); + 'cell_number' => $data['cell_number'], + 'medical_center_id' => $data['medical_center_id'], + 'status' => 'Registered', + ]; + + $userData['email'] ==="" ? $userData['email'] = null : null; + $userData['cell_number'] ==="" ? $userData['cell_number'] = null : null; + + // $answer=$data['mathcaptcha']; + + $user = User::create($userData); + if ($data['cell_number']) { + session(['temp_user' => $user]); + // $this->phone_confirmation($user); + } else + throw new \Exception('لطفا شماره همراه خود را وارد نمایید.'); + + return $user; + + + // $user = User::create($userData); + // dd($user); + + // if (!empty($userData['email'])) { + // $this->mail_confirmation($user,'register'); + // } else { + // $this->phone_confirmation($user); + // } + + } + public function showRegistrationForm() + { + return view('auth.register'); + } + + public function register(Request $request) + { + $this->validator($request->all())->validate(); + + event(new Registered($user = $this->create($request->all()))); + \Auth::loginUsingId($user->id); + return $this->registered($request, $user) + ?: response()->json(['url' => $this->redirectTo, 'message' => 'ثبت نام شما با موفقیت انجام شد.']); + } + + /** + * Get the guard to be used during registration. + * + * @return \Illuminate\Contracts\Auth\StatefulGuard + */ + protected function guard() + { + return Auth::guard(); + } + + protected function registered(Request $request, $user) + { + // + } + } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php new file mode 100644 index 00000000..7cbc2c3f --- /dev/null +++ b/app/Http/Controllers/HomeController.php @@ -0,0 +1,28 @@ +middleware('auth'); + } + + /** + * Show the application dashboard. + * + * @return \Illuminate\Contracts\Support\Renderable + */ + public function index() + { + return view('home'); + } +} diff --git a/app/Http/Controllers/MedicalCenterController.php b/app/Http/Controllers/MedicalCenterController.php new file mode 100644 index 00000000..2953a9b4 --- /dev/null +++ b/app/Http/Controllers/MedicalCenterController.php @@ -0,0 +1,51 @@ +paginate(10); + return response()->json(['MedicalCenters' => $MedicalCenters, 'LastPage' => $MedicalCenters->lastPage()]); + } + + public function create() + { + // + } + + public function store(StoreMedicalCenterRequest $request) + { + $MedicalCenter = MedicalCenter::create($request->all()); + return response()->json(trans('messages.success')); + } + + public function show($id) + { + // $MedicalCenter = MedicalCenter::with('users')->findOrFail($id); + // return response()->json(['MedicalCenter' => $MedicalCenter]); + } + + public function edit($id) + { + $MedicalCenter = MedicalCenter::with('users')->findOrFail($id); + return response()->json(['MedicalCenter' => $MedicalCenter]); + } + + public function update(StoreMedicalCenterRequest $request, MedicalCenter $MedicalCenter) + { + $MedicalCenter->update($request->all()); + return response()->json(trans('messages.success')); + } + + public function destroy($id) + { + // + } +} diff --git a/app/Http/Controllers/TestResultController.php b/app/Http/Controllers/TestResultController.php new file mode 100644 index 00000000..710fc2cc --- /dev/null +++ b/app/Http/Controllers/TestResultController.php @@ -0,0 +1,116 @@ +paginate(10); + return response()->json(['TestResult' => $TestResult, 'LastPage' => $TestResult->lastPage()]); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $TestResult = [ + 'user_id' => Auth::user()->id, + 'autoclave_id' => $request->autoclave_id, + 'test_type_id' => $request->test_type_id, + 'result' => $request->result, + 'verified' => 0, + ]; + $TestResultObj = TestResult::create($TestResult); + $TestResultInfo = $request->info; + + // $TestType = TestType::with('inputs')->where('id',$request->test_type_id)->first(); + $Inputs = Input::where('test_type_id',$request->test_type_id)->get(); + foreach ($Inputs as $Input) { + if ($Input->type == 'Select' || $Input->type == 'CheckBox') { + $OptionIDs = $Input->options->pluck('id')->toArray(); + $Value = $OptionIDs; + } + else { + $Value = $TestResultInfo[$Input->name]; + } + $InputValueObj = InputValue::create(['test_result_id' => $TestResultObj->id , 'input_id' => $Input->id , 'value' => $Value]); + } + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, TestResult $TestResult) + { + $this->validate($request, [ + 'user_id' => 'required', + 'autoclave_id' => 'required', + 'test_type_id' => 'required', + 'result' => 'required', + 'verified' => 'required', + ]); + $TestResult->update($request->all()); + return response()->json(trans('messages.success')); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } +} diff --git a/app/Http/Controllers/TestTypeController.php b/app/Http/Controllers/TestTypeController.php new file mode 100644 index 00000000..5f1c0897 --- /dev/null +++ b/app/Http/Controllers/TestTypeController.php @@ -0,0 +1,126 @@ +json(['TestTypes' => $TestTypes, 'LastPage' => $TestTypes->lastPage()]); + } + + public function create() + { + // + } + + public function CreateInput($Input,$TestType,$ParentID = null) + { + // dd($Input['name'],$TestType->id,$ParentID); + //---------------------------------------------Input + $InputData = [ + 'name' => $Input['name'], + 'type' => $Input['type'], + 'size' => $Input['size'], + 'test_type_id' => $TestType->id, + 'parent_id' => $ParentID + ]; + $InputObj = Input::create($InputData); + //---------------------------------------------Input + //---------------------------------------------Option + if ($Input['type'] == 'CheckBox' || $Input['type'] == 'Select') { + foreach ($Input['options'] as $Option) { + $Option = Option::create(['title' => $Option['title'] , 'input_id' => $InputObj->id]); + } + } + //---------------------------------------------Option + return $InputObj; + + } + public function CreateChildForm($Input,$TestType,$InputObj) + { + if (isset($Input['children'])) { + foreach ($Input['children'] as $InputChild) { + $InputChildObj = $this->CreateInput($InputChild,$TestType,$InputObj->id); + if (isset($InputChild['children'])) { + $this->CreateChildForm($InputChild,$TestType,$InputChildObj); + } + } + } + } + public function store(StoreTestTypeRequest $request) + { + $TestType = [ + 'name' => $request['name'], + 'unique_code' => $request['unique_code'], + 'user_id' => auth('api')->user()->id + ]; + + $TestType = TestType::create($TestType); + $TestTypeInfo = $request['info']; + + foreach ($TestTypeInfo as $Input) { + + $InputObj = $this->CreateInput($Input,$TestType); + + if ($Input['type'] == 'Form') { + $this->CreateChildForm($Input,$TestType,$InputObj); + } + } + return response()->json(trans('messages.success')); + } + + public function show($id) + { + // + } + + public function edit($id) + { + // + } + + public function update(Request $request, TestType $TestType) + { + $this->validate($request, [ + 'name' => 'required|max:100|unique:test_types,'.$TestType->id, + 'unique_code' => 'required|max:100|unique:test_types,'.$TestType->id, + 'info.*.name'=>'required', + 'info.*.type'=>'required', + 'info.*.size'=>'required', + 'info.*.parent_id'=>'nullable|numeric|exists:inputs', + ]); + $TestType = [ + 'name' => $request->name, + 'unique_code' => $request->unique_code + ]; + $TestType->update($TestType); + $TestTypeInfo = $request->info; + + // foreach ($TestTypeInfo as $Input) { + // if ($Input['id'] == 0) { + // $InputObj = $this->CreateInput($Input,$TestType); + // } + // else { + // // code... + // } + // $InputObj = $this->CreateInput($Input,$TestType); + // + // if ($Input->Type == 'Form') { + // $this->CreateChildForm($Input); + // } + // } + } + + public function destroy($id) + { + // + } +} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php new file mode 100644 index 00000000..d490c079 --- /dev/null +++ b/app/Http/Controllers/UserController.php @@ -0,0 +1,54 @@ +medical_center_id)->paginate(10); + return response()->json(['Users' => $Users, 'LastPage' => $Users->lastPage()]); + } + public function store(StoreUserRequest $request) + { + $UserData = [ + 'name' => $request->name , + 'cell_number' => $request->cell_number , + 'medical_center_id' => $request->medical_center_id , + 'status' => 'PreRegister', + 'verified' => 1, + 'password' => bcrypt($request->password), + ]; + $User = User::create($UserData); + + return response()->json(trans('messages.success')); + } + public function edit(User $User) + { + return response()->json(['User' => $User]); + } + public function update(StoreUserRequest $request, User $User) + { + $UserData = [ + 'name' => $request->name , + 'cell_number' => $request->cell_number , + 'medical_center_id' => $request->medical_center_id , + 'status' => 'PreRegister', + 'verified' => 1, + 'password' => bcrypt($request->password), + ]; + $User->update($UserData); + return response()->json(trans('messages.success')); + } + public function destroy(User $User) + { + if (auth('api')->user()->can('delete', $User)) { + return response()->json(trans('messages.failed')); + } + $User->delete();//????????????????? + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index a3d8c48d..88b099ab 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -19,6 +19,7 @@ class Kernel extends HttpKernel \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \App\Http\Middleware\TrustProxies::class, + \App\Http\Middleware\Cors::class, ]; /** diff --git a/app/Http/Middleware/Cors.php b/app/Http/Middleware/Cors.php new file mode 100644 index 00000000..f817ccbd --- /dev/null +++ b/app/Http/Middleware/Cors.php @@ -0,0 +1,30 @@ +header('Access-Control-Allow-Origin', '*') + ->header('Access-Control-Allow-credentials', true) + ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); + if (!$request->isMethod('OPTIONS')) { + return $response; + } + $allow = $response->headers->get('Allow'); // true list of allowed methods + if (!$allow) { + return $response; + } + $headers = [ + 'Access-Control-Allow-Methods' => $allow, + 'Access-Control-Max-Age' => 3600, + 'Access-Control-Allow-Headers' => 'X-Requested-With, Origin, X-Csrftoken, Content-Type, Accept', + ]; + return $response->withHeaders($headers); + } + + +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index 324a166b..16ed36a5 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -19,6 +19,6 @@ class VerifyCsrfToken extends Middleware * @var array */ protected $except = [ - // + 'api/*' ]; } diff --git a/app/Http/Requests/StoreMedicalCenterRequest.php b/app/Http/Requests/StoreMedicalCenterRequest.php new file mode 100644 index 00000000..02550274 --- /dev/null +++ b/app/Http/Requests/StoreMedicalCenterRequest.php @@ -0,0 +1,53 @@ +method() == 'POST') { + return auth('api')->check() && auth('api')->user()->can('store', MedicalCenter::class); + } else { + $MedicalCenter = $this->route('MedicalCenter'); + return auth('api')->check() && $MedicalCenter && auth('api')->user()->can('update', $MedicalCenter); + } + } + + public function rules() + { + switch ($this->method()) { + case 'POST': { + return [ + 'name' => 'required|max:100|unique:medical_centers', + // 'operatores.*.name'=>'required|string|max:255', + // 'operatores.*.cell_number'=>'required|digits_between:10,11|unique:users', + // 'operatores.*.password'=>'required|string|min:6', + ]; + break; + } + case 'PUT': + case 'PATCH': { + $MedicalCenter = $this->route('MedicalCenter'); + return [ + 'name' => 'required|max:100|unique:medical_centers,id,'.$MedicalCenter->id, + // 'operatores.*.name'=>'required|string|max:255', + // 'operatores.*.cell_number'=>'required|digits_between:10,11|unique:users', + // 'operatores.*.password'=>'required|string|min:6', + ]; + break; + + } + default: + break; + } + + } + +} diff --git a/app/Http/Requests/StoreTestTypeRequest.php b/app/Http/Requests/StoreTestTypeRequest.php new file mode 100644 index 00000000..ba46b257 --- /dev/null +++ b/app/Http/Requests/StoreTestTypeRequest.php @@ -0,0 +1,57 @@ +method() == 'POST') { + return auth('api')->check() && auth('api')->user()->can('store', TestType::class); + } else { + $TestType = $this->route('TestType'); + return auth('api')->check() && $TestType && auth('api')->user()->can('update', $TestType); + } + } + + public function rules() + { + switch ($this->method()) { + case 'POST': { + return [ + 'name' => 'required|max:100|unique:test_types', + 'unique_code' => 'required|max:100|unique:test_types', + 'info.*.name'=>'required', + 'info.*.type'=>'required', + 'info.*.size'=>'required', + 'info.*.parent_id'=>'nullable|numeric|exists:inputs,id', + ]; + break; + } + case 'PUT': + case 'PATCH': { + $TestType = $this->route('TestType'); + return [ + 'name' => 'required|max:100|unique:test_types,id,'.$TestType->id, + 'unique_code' => 'required|max:100|unique:test_types,id,'.$TestType->id, + 'info.*.name'=>'required', + 'info.*.type'=>'required', + 'info.*.size'=>'required', + 'info.*.parent_id'=>'nullable|numeric|exists:inputs,id', + ]; + break; + + } + default: + break; + } + + } + +} diff --git a/app/Http/Requests/StoreUserRequest.php b/app/Http/Requests/StoreUserRequest.php new file mode 100644 index 00000000..b458077e --- /dev/null +++ b/app/Http/Requests/StoreUserRequest.php @@ -0,0 +1,53 @@ +method() == 'POST') { + return auth('api')->check() && auth('api')->user()->can('store', User::class); + } else { + $User = $this->route('User'); + return auth('api')->check() && $User && auth('api')->user()->can('update', $User); + } + } + + public function rules() + { + switch ($this->method()) { + case 'POST': { + return [ + 'name'=>'required|string|max:255', + 'cell_number'=>'required|digits_between:10,11|unique:users', + 'password'=>'required|string|min:6', + 'medical_center_id' => 'required|numeric|exists:medical_centers,id', + ]; + break; + } + case 'PUT': + case 'PATCH': { + $User = $this->route('User'); + return [ + 'name'=>'required|string|max:255', + 'cell_number'=>'required|digits_between:10,11|unique:users,id,'.$User->id, + 'password'=>'required|string|min:6', + 'medical_center_id' => 'required|numeric|exists:medical_centers,id', + ]; + break; + + } + default: + break; + } + + } + +} diff --git a/app/Input.php b/app/Input.php new file mode 100644 index 00000000..1e774a5e --- /dev/null +++ b/app/Input.php @@ -0,0 +1,26 @@ +belongsTo('App\TestType'); + } + public function parent() + { + return $this->belongsTo('App\Input', 'parent_id'); + } + public function children() + { + return $this->hasMany('App\Input', 'parent_id'); + } + public function options() + { + return $this->hasMany('App\Option'); + } +} diff --git a/app/InputValue.php b/app/InputValue.php new file mode 100644 index 00000000..7fa2a7e7 --- /dev/null +++ b/app/InputValue.php @@ -0,0 +1,17 @@ +belongsTo('App\Input'); + } + public function testresult() + { + return $this->belongsTo('App\TestResult'); + } +} diff --git a/app/MedicalCenter.php b/app/MedicalCenter.php new file mode 100644 index 00000000..8a558a22 --- /dev/null +++ b/app/MedicalCenter.php @@ -0,0 +1,14 @@ +hasMany('App\User'); + } +} diff --git a/app/Option.php b/app/Option.php new file mode 100644 index 00000000..7943ddfb --- /dev/null +++ b/app/Option.php @@ -0,0 +1,14 @@ +belongsTo('App\Input'); + } +} diff --git a/app/Policies/MedicalCenterPolicy.php b/app/Policies/MedicalCenterPolicy.php new file mode 100644 index 00000000..5d2a6a17 --- /dev/null +++ b/app/Policies/MedicalCenterPolicy.php @@ -0,0 +1,29 @@ +hasRole('Admin')) + return true; + } + + public function update(User $User, MedicalCenter $MedicalCenter) + { + // if($User->hasRole('Admin')) + return true; + } + + public function store(User $User) + { + // if($User->hasRole('Admin')) + return true; + } +} diff --git a/app/Policies/TestTypePolicy.php b/app/Policies/TestTypePolicy.php new file mode 100644 index 00000000..34647577 --- /dev/null +++ b/app/Policies/TestTypePolicy.php @@ -0,0 +1,29 @@ +hasRole('Admin')) + return true; + } + + public function update(User $User, TestType $TestType) + { + // if($User->hasRole('Admin')) + return true; + } + + public function store(User $User) + { + // if($User->hasRole('Admin')) + return true; + } +} diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php new file mode 100644 index 00000000..3584a815 --- /dev/null +++ b/app/Policies/UserPolicy.php @@ -0,0 +1,28 @@ +hasRole('Admin') || $User->hasRole('Supervisor')) + return true; + } + + public function update(User $User, User $Operator) + { + // if($User->hasRole('Admin') || $User->id == $Operator->id) + return true; + } + + public function store(User $User) + { + // if($User->hasRole('Admin')) + return true; + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 0acc984b..465ec329 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -4,6 +4,7 @@ namespace App\Providers; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; +use Laravel\Passport\Passport; class AuthServiceProvider extends ServiceProvider { @@ -13,7 +14,9 @@ class AuthServiceProvider extends ServiceProvider * @var array */ protected $policies = [ - // 'App\Model' => 'App\Policies\ModelPolicy', + 'App\MedicalCenter' => 'App\Policies\MedicalCenterPolicy', + 'App\User' => 'App\Policies\UserPolicy', + 'App\TestType' => 'App\Policies\TestTypePolicy', ]; /** @@ -25,6 +28,6 @@ class AuthServiceProvider extends ServiceProvider { $this->registerPolicies(); - // + Passport::routes(); } } diff --git a/app/Providers/MessageServiceProvider.php b/app/Providers/MessageServiceProvider.php new file mode 100644 index 00000000..3d1b7bd6 --- /dev/null +++ b/app/Providers/MessageServiceProvider.php @@ -0,0 +1,28 @@ +app->singleton('messages', function() { + return new \App\Appended\Classes\Common\Response\MessageResponse; + }); + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return [MessageResponse::class]; + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 5ea48d39..e0596a39 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -35,6 +35,9 @@ class RouteServiceProvider extends ServiceProvider */ public function map() { + + $this->mapRoutes(); + $this->mapApiRoutes(); $this->mapWebRoutes(); @@ -66,8 +69,21 @@ class RouteServiceProvider extends ServiceProvider protected function mapApiRoutes() { Route::prefix('api') - ->middleware('api') - ->namespace($this->namespace) - ->group(base_path('routes/api.php')); + ->middleware('api') + ->namespace($this->namespace) + ->group(base_path('routes/api.php')); + } + + /** + * Define the routes without middleware for the application. + * + * These routes are typically stateless. + * + * @return void + */ + protected function mapRoutes() + { + Route::namespace($this->namespace) + ->group(base_path('routes/routes.php')); } } diff --git a/app/TestResult.php b/app/TestResult.php new file mode 100644 index 00000000..cf2b7664 --- /dev/null +++ b/app/TestResult.php @@ -0,0 +1,21 @@ +belongsTo('App\TestType'); + } + public function user() + { + return $this->belongsTo('App\User'); + } + public function inputvalues() + { + return $this->hasMany('App\InputValue'); + } +} diff --git a/app/TestType.php b/app/TestType.php new file mode 100644 index 00000000..f2ec8485 --- /dev/null +++ b/app/TestType.php @@ -0,0 +1,22 @@ +belongsTo('App\User'); + } + public function testresults() + { + return $this->hasMany('App\TestResult'); + } + public function inputs() + { + return $this->hasMany('App\Input'); + } +} diff --git a/app/Transformers/Json.php b/app/Transformers/Json.php new file mode 100644 index 00000000..8d45746c --- /dev/null +++ b/app/Transformers/Json.php @@ -0,0 +1,12 @@ + $data, + 'message' => $message, + ]; + } +} diff --git a/app/Uploadable.php b/app/Uploadable.php new file mode 100644 index 00000000..2a408d5c --- /dev/null +++ b/app/Uploadable.php @@ -0,0 +1,18 @@ +belongsTo('App\Gallery'); + } + +} diff --git a/app/User.php b/app/User.php index faa03c3b..663ddd0e 100644 --- a/app/User.php +++ b/app/User.php @@ -5,10 +5,11 @@ namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; +use Laravel\Passport\HasApiTokens; class User extends Authenticatable { - use Notifiable; + use Notifiable, HasApiTokens; /** * The attributes that are mass assignable. @@ -16,7 +17,7 @@ class User extends Authenticatable * @var array */ protected $fillable = [ - 'name', 'email', 'password', + 'name', 'email', 'password','cell_number','status','medical_center_id' ]; /** @@ -36,4 +37,22 @@ class User extends Authenticatable protected $casts = [ 'email_verified_at' => 'datetime', ]; + + public function medicalcenter() + { + return $this->belongsTo('App\MedicalCenter'); + } + public function testresults() + { + return $this->hasMany('App\TestResult'); + } + public function testtypes() + { + return $this->hasMany('App\TestType'); + } + + public function findForPassport($username) + { + return $this->where('cell_number', $username)->first(); + } } diff --git a/composer.json b/composer.json index 8e2b2d7e..d9eb2ad8 100644 --- a/composer.json +++ b/composer.json @@ -11,14 +11,16 @@ "php": "^7.1.3", "fideloper/proxy": "^4.0", "laravel/framework": "5.8.*", - "laravel/tinker": "^1.0" + "laravel/passport": "^7.2", + "laravel/tinker": "^1.0", + "spatie/laravel-permission": "^2.36" }, "require-dev": { "beyondcode/laravel-dump-server": "^1.0", "filp/whoops": "^2.0", "fzaninotto/faker": "^1.4", "mockery/mockery": "^1.0", - "nunomaduro/collision": "^3.0", + "nunomaduro/collision": "^2.0", "phpunit/phpunit": "^7.5" }, "config": { diff --git a/composer.lock b/composer.lock index b94476c7..6262c974 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,71 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "94d4bf9ac7f4a933030e46a346ee2917", + "content-hash": "181bdb262cee4face3bcdcaea8f1a4cf", "packages": [ + { + "name": "defuse/php-encryption", + "version": "v2.2.1", + "source": { + "type": "git", + "url": "https://github.com/defuse/php-encryption.git", + "reference": "0f407c43b953d571421e0020ba92082ed5fb7620" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/0f407c43b953d571421e0020ba92082ed5fb7620", + "reference": "0f407c43b953d571421e0020ba92082ed5fb7620", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "paragonie/random_compat": ">= 2", + "php": ">=5.4.0" + }, + "require-dev": { + "nikic/php-parser": "^2.0|^3.0|^4.0", + "phpunit/phpunit": "^4|^5" + }, + "bin": [ + "bin/generate-defuse-key" + ], + "type": "library", + "autoload": { + "psr-4": { + "Defuse\\Crypto\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Hornby", + "email": "taylor@defuse.ca", + "homepage": "https://defuse.ca/" + }, + { + "name": "Scott Arciszewski", + "email": "info@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "Secure PHP Encryption Library", + "keywords": [ + "aes", + "authenticated encryption", + "cipher", + "crypto", + "cryptography", + "encrypt", + "encryption", + "openssl", + "security", + "symmetric key cryptography" + ], + "time": "2018-07-24T23:27:56+00:00" + }, { "name": "dnoegel/php-xdg-base-dir", "version": "0.1", @@ -371,6 +434,235 @@ ], "time": "2019-01-10T14:06:47+00:00" }, + { + "name": "firebase/php-jwt", + "version": "v5.0.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", + "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": " 4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "time": "2017-06-27T22:17:23+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2018-04-22T15:46:56+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "9f83dded91781a01c63574e387eaa769be769115" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", + "reference": "9f83dded91781a01c63574e387eaa769be769115", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2018-12-04T20:46:45+00:00" + }, { "name": "jakub-onderka/php-console-color", "version": "v0.2", @@ -606,6 +898,76 @@ ], "time": "2019-04-04T13:39:49+00:00" }, + { + "name": "laravel/passport", + "version": "v7.2.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/passport.git", + "reference": "c0c3fca80d8f5af90dcbf65e62bdd1abee9ac25d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/passport/zipball/c0c3fca80d8f5af90dcbf65e62bdd1abee9ac25d", + "reference": "c0c3fca80d8f5af90dcbf65e62bdd1abee9ac25d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "firebase/php-jwt": "~3.0|~4.0|~5.0", + "guzzlehttp/guzzle": "~6.0", + "illuminate/auth": "~5.6.0|~5.7.0|~5.8.0|~5.9.0", + "illuminate/console": "~5.6.0|~5.7.0|~5.8.0|~5.9.0", + "illuminate/container": "~5.6.0|~5.7.0|~5.8.0|~5.9.0", + "illuminate/contracts": "~5.6.0|~5.7.0|~5.8.0|~5.9.0", + "illuminate/database": "~5.6.0|~5.7.0|~5.8.0|~5.9.0", + "illuminate/encryption": "~5.6.0|~5.7.0|~5.8.0|~5.9.0", + "illuminate/http": "~5.6.0|~5.7.0|~5.8.0|~5.9.0", + "illuminate/support": "~5.6.0|~5.7.0|~5.8.0|~5.9.0", + "league/oauth2-server": "^7.0", + "php": ">=7.1", + "phpseclib/phpseclib": "^2.0", + "symfony/psr-http-message-bridge": "~1.0", + "zendframework/zend-diactoros": "~1.0|~2.0" + }, + "require-dev": { + "mockery/mockery": "~1.0", + "phpunit/phpunit": "~7.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Passport\\PassportServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Passport\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Passport provides OAuth2 server support to Laravel.", + "keywords": [ + "laravel", + "oauth", + "passport" + ], + "time": "2019-03-13T14:21:06+00:00" + }, { "name": "laravel/tinker", "version": "v1.0.8", @@ -669,6 +1031,114 @@ ], "time": "2018-10-12T19:39:35+00:00" }, + { + "name": "lcobucci/jwt", + "version": "3.2.5", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "82be04b4753f8b7693b62852b7eab30f97524f9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/82be04b4753f8b7693b62852b7eab30f97524f9b", + "reference": "82be04b4753f8b7693b62852b7eab30f97524f9b", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "php": ">=5.5" + }, + "require-dev": { + "mdanter/ecc": "~0.3.1", + "mikey179/vfsstream": "~1.5", + "phpmd/phpmd": "~2.2", + "phpunit/php-invoker": "~1.1", + "phpunit/phpunit": "~4.5", + "squizlabs/php_codesniffer": "~2.3" + }, + "suggest": { + "mdanter/ecc": "Required to use Elliptic Curves based algorithms." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Otávio Cobucci Oblonczyk", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "time": "2018-11-11T12:22:26+00:00" + }, + { + "name": "league/event", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/event.git", + "reference": "d2cc124cf9a3fab2bb4ff963307f60361ce4d119" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/event/zipball/d2cc124cf9a3fab2bb4ff963307f60361ce4d119", + "reference": "d2cc124cf9a3fab2bb4ff963307f60361ce4d119", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "~1.0.1", + "phpspec/phpspec": "^2.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Event package", + "keywords": [ + "emitter", + "event", + "listener" + ], + "time": "2018-11-26T11:52:41+00:00" + }, { "name": "league/flysystem", "version": "1.0.51", @@ -753,6 +1223,83 @@ ], "time": "2019-03-30T13:22:34+00:00" }, + { + "name": "league/oauth2-server", + "version": "7.3.3", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-server.git", + "reference": "c7f499849704ebe2c60b45b6d6bb231df5601d4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/c7f499849704ebe2c60b45b6d6bb231df5601d4a", + "reference": "c7f499849704ebe2c60b45b6d6bb231df5601d4a", + "shasum": "" + }, + "require": { + "defuse/php-encryption": "^2.1", + "ext-openssl": "*", + "lcobucci/jwt": "^3.2.2", + "league/event": "^2.1", + "php": ">=7.0.0", + "psr/http-message": "^1.0.1" + }, + "replace": { + "league/oauth2server": "*", + "lncd/oauth2": "*" + }, + "require-dev": { + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpstan/phpstan-strict-rules": "^0.9.0", + "phpunit/phpunit": "^6.3 || ^7.0", + "roave/security-advisories": "dev-master", + "zendframework/zend-diactoros": "^1.3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\OAuth2\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Andy Millington", + "email": "andrew@noexceptions.io", + "homepage": "https://www.noexceptions.io", + "role": "Developer" + } + ], + "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.", + "homepage": "https://oauth2.thephpleague.com/", + "keywords": [ + "Authentication", + "api", + "auth", + "authorisation", + "authorization", + "oauth", + "oauth 2", + "oauth 2.0", + "oauth2", + "protect", + "resource", + "secure", + "server" + ], + "time": "2019-03-29T18:19:35+00:00" + }, { "name": "monolog/monolog", "version": "1.24.0", @@ -1098,6 +1645,98 @@ ], "time": "2015-07-25T16:39:46+00:00" }, + { + "name": "phpseclib/phpseclib", + "version": "2.0.15", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "11cf67cf78dc4acb18dc9149a57be4aee5036ce0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/11cf67cf78dc4acb18dc9149a57be4aee5036ce0", + "reference": "11cf67cf78dc4acb18dc9149a57be4aee5036ce0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phing/phing": "~2.7", + "phpunit/phpunit": "^4.8.35|^5.7|^6.0", + "sami/sami": "~2.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "suggest": { + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "time": "2019-03-10T16:53:45+00:00" + }, { "name": "psr/container", "version": "1.0.0", @@ -1147,6 +1786,108 @@ ], "time": "2017-02-14T16:28:37+00:00" }, + { + "name": "psr/http-factory", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "378bfe27931ecc54ff824a20d6f6bfc303bbd04c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/378bfe27931ecc54ff824a20d6f6bfc303bbd04c", + "reference": "378bfe27931ecc54ff824a20d6f6bfc303bbd04c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "time": "2018-07-30T21:54:04+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, { "name": "psr/log", "version": "1.1.0", @@ -1316,6 +2057,46 @@ ], "time": "2018-10-13T15:16:03+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "~3.7.0", + "satooshi/php-coveralls": ">=1.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2016-02-11T07:05:27+00:00" + }, { "name": "ramsey/uuid", "version": "3.8.0", @@ -1398,6 +2179,71 @@ ], "time": "2018-07-19T23:38:55+00:00" }, + { + "name": "spatie/laravel-permission", + "version": "2.36.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-permission.git", + "reference": "0d9c442dc4361ce829986697bc436578d816a9ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/0d9c442dc4361ce829986697bc436578d816a9ca", + "reference": "0d9c442dc4361ce829986697bc436578d816a9ca", + "shasum": "" + }, + "require": { + "illuminate/auth": "~5.3.0|~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0", + "illuminate/container": "~5.3.0|~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0", + "illuminate/contracts": "~5.3.0|~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0", + "illuminate/database": "~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0", + "php": ">=7.0" + }, + "require-dev": { + "orchestra/testbench": "~3.4.2|~3.5.0|~3.6.0|~3.7.0", + "phpunit/phpunit": "^5.7|6.2|^7.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Permission\\PermissionServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\Permission\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Permission handling for Laravel 5.4 and up", + "homepage": "https://github.com/spatie/laravel-permission", + "keywords": [ + "acl", + "laravel", + "permission", + "security", + "spatie" + ], + "time": "2019-03-05T14:58:35+00:00" + }, { "name": "swiftmailer/swiftmailer", "version": "v6.2.0", @@ -2307,6 +3153,71 @@ "homepage": "https://symfony.com", "time": "2019-03-10T20:07:02+00:00" }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad", + "reference": "9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad", + "shasum": "" + }, + "require": { + "php": "^7.1", + "psr/http-message": "^1.0", + "symfony/http-foundation": "^3.4 || ^4.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "symfony/phpunit-bridge": "^3.4.20 || ^4.0", + "zendframework/zend-diactoros": "^1.4.1 || ^2.0" + }, + "suggest": { + "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "time": "2019-03-11T18:22:33+00:00" + }, { "name": "symfony/routing", "version": "v4.2.5", @@ -2630,6 +3541,72 @@ "environment" ], "time": "2019-03-06T09:39:45+00:00" + }, + { + "name": "zendframework/zend-diactoros", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-diactoros.git", + "reference": "c3c330192bc9cc51b7e9ce968ff721dc32ffa986" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/c3c330192bc9cc51b7e9ce968ff721dc32ffa986", + "reference": "c3c330192bc9cc51b7e9ce968ff721dc32ffa986", + "shasum": "" + }, + "require": { + "php": "^7.1", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-dom": "*", + "ext-libxml": "*", + "http-interop/http-factory-tests": "^0.5.0", + "php-http/psr7-integration-tests": "dev-master", + "phpunit/phpunit": "^7.0.2", + "zendframework/zend-coding-standard": "~1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev", + "dev-develop": "2.2.x-dev", + "dev-release-1.8": "1.8.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/marshal_uri_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php" + ], + "psr-4": { + "Zend\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR HTTP Message implementations", + "keywords": [ + "http", + "psr", + "psr-7" + ], + "time": "2019-01-05T20:13:32+00:00" } ], "packages-dev": [ @@ -3024,16 +4001,16 @@ }, { "name": "nunomaduro/collision", - "version": "v3.0.1", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "af42d339fe2742295a54f6fdd42aaa6f8c4aca68" + "reference": "b5feb0c0d92978ec7169232ce5d70d6da6b29f63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/af42d339fe2742295a54f6fdd42aaa6f8c4aca68", - "reference": "af42d339fe2742295a54f6fdd42aaa6f8c4aca68", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/b5feb0c0d92978ec7169232ce5d70d6da6b29f63", + "reference": "b5feb0c0d92978ec7169232ce5d70d6da6b29f63", "shasum": "" }, "require": { @@ -3043,10 +4020,10 @@ "symfony/console": "~2.8|~3.3|~4.0" }, "require-dev": { - "laravel/framework": "5.8.*", + "laravel/framework": "5.7.*", "nunomaduro/larastan": "^0.3.0", - "phpstan/phpstan": "^0.11", - "phpunit/phpunit": "~8.0" + "phpstan/phpstan": "^0.10", + "phpunit/phpunit": "~7.3" }, "type": "library", "extra": { @@ -3084,7 +4061,7 @@ "php", "symfony" ], - "time": "2019-03-07T21:35:13+00:00" + "time": "2018-11-21T21:40:54+00:00" }, { "name": "phar-io/manifest", diff --git a/config/app.php b/config/app.php index c9960cde..f4a039e4 100644 --- a/config/app.php +++ b/config/app.php @@ -174,6 +174,8 @@ return [ // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, + App\Providers\MessageServiceProvider::class, + Laravel\Passport\PassportServiceProvider::class, ], @@ -225,6 +227,7 @@ return [ 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, + 'MessageResponse' => App\Appended\Classes\Common\Response\Facades\MessageResponse::class, ], diff --git a/config/auth.php b/config/auth.php index 897dc826..f8a1194b 100644 --- a/config/auth.php +++ b/config/auth.php @@ -42,9 +42,8 @@ return [ ], 'api' => [ - 'driver' => 'token', + 'driver' => 'passport', 'provider' => 'users', - 'hash' => false, ], ], diff --git a/config/cache.php b/config/cache.php index 414ca996..30f0cae2 100644 --- a/config/cache.php +++ b/config/cache.php @@ -97,6 +97,6 @@ return [ | */ - 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), ]; diff --git a/config/database.php b/config/database.php index 9b30dc1f..49ec59af 100644 --- a/config/database.php +++ b/config/database.php @@ -1,7 +1,5 @@ [ 'cluster' => env('REDIS_CLUSTER', 'predis'), - 'prefix' => Str::slug(env('APP_NAME', 'laravel'), '_').'_database_', ], 'default' => [ diff --git a/config/permission.php b/config/permission.php new file mode 100644 index 00000000..1a0b35a2 --- /dev/null +++ b/config/permission.php @@ -0,0 +1,129 @@ + [ + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * Eloquent model should be used to retrieve your permissions. Of course, it + * is often just the "Permission" model but you may use whatever you like. + * + * The model you want to use as a Permission model needs to implement the + * `Spatie\Permission\Contracts\Permission` contract. + */ + + 'permission' => Spatie\Permission\Models\Permission::class, + + /* + * When using the "HasRoles" trait from this package, we need to know which + * Eloquent model should be used to retrieve your roles. Of course, it + * is often just the "Role" model but you may use whatever you like. + * + * The model you want to use as a Role model needs to implement the + * `Spatie\Permission\Contracts\Role` contract. + */ + + 'role' => Spatie\Permission\Models\Role::class, + + ], + + 'table_names' => [ + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'roles' => 'roles', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your permissions. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'permissions' => 'permissions', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your models permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_permissions' => 'model_has_permissions', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your models roles. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_roles' => 'model_has_roles', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'role_has_permissions' => 'role_has_permissions', + ], + + 'column_names' => [ + + /* + * Change this if you want to name the related model primary key other than + * `model_id`. + * + * For example, this would be nice if your primary keys are all UUIDs. In + * that case, name this `model_uuid`. + */ + + 'model_morph_key' => 'model_id', + ], + + /* + * When set to true, the required permission/role names are added to the exception + * message. This could be considered an information leak in some contexts, so + * the default setting is false here for optimum safety. + */ + + 'display_permission_in_exception' => false, + + 'cache' => [ + + /* + * By default all permissions are cached for 24 hours to speed up performance. + * When permissions or roles are updated the cache is flushed automatically. + */ + + 'expiration_time' => \DateInterval::createFromDateString('24 hours'), + + /* + * The cache key used to store all permissions. + */ + + 'key' => 'spatie.permission.cache', + + /* + * When checking for a permission against a model by passing a Permission + * instance to the check, this key determines what attribute on the + * Permissions model is used to cache against. + * + * Ideally, this should match your preferred way of checking permissions, eg: + * `$user->can('view-posts')` would be 'name'. + */ + + 'model_key' => 'name', + + /* + * You may optionally indicate a specific cache driver to use for permission and + * role caching using any of the `store` drivers listed in the cache.php config + * file. Using 'default' here means to use the `default` set in cache.php. + */ + + 'store' => 'default', + ], +]; diff --git a/config/services.php b/config/services.php index f026b2c7..2a64d2d6 100644 --- a/config/services.php +++ b/config/services.php @@ -43,5 +43,9 @@ return [ 'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300), ], ], + 'vue_client' => [ + 'id' => env('MIX_APP_CLIENT_ID'), + 'secret' => env('MIX_APP_CLIENT_SECRET'), + ], ]; diff --git a/database/.gitignore b/database/.gitignore index 97fc9767..9b1dffd9 100644 --- a/database/.gitignore +++ b/database/.gitignore @@ -1,2 +1 @@ *.sqlite -*.sqlite-journal diff --git a/database/migrations/2019_04_11_104648_create_medical_centers_table.php b/database/migrations/2019_04_11_104648_create_medical_centers_table.php new file mode 100644 index 00000000..93a49402 --- /dev/null +++ b/database/migrations/2019_04_11_104648_create_medical_centers_table.php @@ -0,0 +1,32 @@ +bigIncrements('id'); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('medical_centers'); + } +} diff --git a/database/migrations/2019_04_11_104800_create_users_table.php b/database/migrations/2019_04_11_104800_create_users_table.php new file mode 100644 index 00000000..301d5cca --- /dev/null +++ b/database/migrations/2019_04_11_104800_create_users_table.php @@ -0,0 +1,41 @@ +bigIncrements('id'); + $table->string('name'); + $table->string('email'); + $table->string('cell_number'); + $table->smallInteger('verified'); + $table->string('status'); + $table->unsignedBigInteger('medical_center_id'); + $table->foreign('medical_center_id')->references('id')->on('medical_centers'); + //$table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users'); + } +} diff --git a/database/migrations/2019_04_11_104917_create_test_types_table.php b/database/migrations/2019_04_11_104917_create_test_types_table.php new file mode 100644 index 00000000..acba57cc --- /dev/null +++ b/database/migrations/2019_04_11_104917_create_test_types_table.php @@ -0,0 +1,35 @@ +bigIncrements('id'); + $table->string('name'); + $table->integer('unique_code'); + $table->unsignedBigInteger('user_id'); + $table->foreign('user_id')->references('id')->on('users'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('test_types'); + } +} diff --git a/database/migrations/2019_04_11_105013_create_test_results_table.php b/database/migrations/2019_04_11_105013_create_test_results_table.php new file mode 100644 index 00000000..e8ff5734 --- /dev/null +++ b/database/migrations/2019_04_11_105013_create_test_results_table.php @@ -0,0 +1,40 @@ +bigIncrements('id'); + $table->string('info'); + $table->string('result'); + $table->text('description'); + $table->smallInteger('verified'); + $table->integer('autoclave_id'); + $table->unsignedBigInteger('user_id'); + $table->foreign('user_id')->references('id')->on('users'); + $table->unsignedBigInteger('test_type_id'); + $table->foreign('test_type_id')->references('id')->on('test_types'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('test_results'); + } +} diff --git a/database/migrations/2019_04_11_105057_create_inputs_table.php b/database/migrations/2019_04_11_105057_create_inputs_table.php new file mode 100644 index 00000000..74c20710 --- /dev/null +++ b/database/migrations/2019_04_11_105057_create_inputs_table.php @@ -0,0 +1,39 @@ +bigIncrements('id'); + $table->string('name'); + $table->string('type'); + $table->unsignedBigInteger('test_type_id'); + $table->foreign('test_type_id')->references('id')->on('test_types'); + $table->unsignedBigInteger('parent_id')->nullable(); + $table->foreign('parent_id')->references('id')->on('inputs'); + $table->string('size'); + $table->string('value'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('inputs'); + } +} diff --git a/database/migrations/2019_04_11_105220_create_input_values_table.php b/database/migrations/2019_04_11_105220_create_input_values_table.php new file mode 100644 index 00000000..788103f2 --- /dev/null +++ b/database/migrations/2019_04_11_105220_create_input_values_table.php @@ -0,0 +1,31 @@ +bigIncrements('id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('input_values'); + } +} diff --git a/database/migrations/2019_04_11_105508_create_options_table.php b/database/migrations/2019_04_11_105508_create_options_table.php new file mode 100644 index 00000000..9094f9aa --- /dev/null +++ b/database/migrations/2019_04_11_105508_create_options_table.php @@ -0,0 +1,34 @@ +bigIncrements('id'); + $table->string('title'); + $table->unsignedBigInteger('input_id'); + $table->foreign('input_id')->references('id')->on('inputs'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('options'); + } +} diff --git a/database/migrations/2019_04_11_105601_create_galleries_table.php b/database/migrations/2019_04_11_105601_create_galleries_table.php new file mode 100644 index 00000000..0f200eb8 --- /dev/null +++ b/database/migrations/2019_04_11_105601_create_galleries_table.php @@ -0,0 +1,34 @@ +bigIncrements('id'); + $table->unsignedBigInteger('user_id'); + $table->foreign('user_id')->references('id')->on('users'); + $table->string('path'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('galleries'); + } +} diff --git a/database/migrations/2019_04_11_105658_create_uploadables_table.php b/database/migrations/2019_04_11_105658_create_uploadables_table.php new file mode 100644 index 00000000..35b5796d --- /dev/null +++ b/database/migrations/2019_04_11_105658_create_uploadables_table.php @@ -0,0 +1,35 @@ +bigIncrements('id'); + $table->unsignedBigInteger('uploadable_id'); + $table->string('uploadable_type'); + $table->unsignedBigInteger('gallery_id'); + $table->foreign('gallery_id')->references('id')->on('galleries'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('uploadables'); + } +} diff --git a/database/migrations/2019_04_18_152732_create_permission_tables.php b/database/migrations/2019_04_18_152732_create_permission_tables.php new file mode 100644 index 00000000..0fe3cac6 --- /dev/null +++ b/database/migrations/2019_04_18_152732_create_permission_tables.php @@ -0,0 +1,102 @@ +increments('id'); + $table->string('name'); + $table->string('guard_name'); + $table->timestamps(); + }); + + Schema::create($tableNames['roles'], function (Blueprint $table) { + $table->increments('id'); + $table->string('name'); + $table->string('guard_name'); + $table->timestamps(); + }); + + Schema::create($tableNames['model_has_permissions'], function (Blueprint $table) use ($tableNames, $columnNames) { + $table->unsignedInteger('permission_id'); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type', ]); + + $table->foreign('permission_id') + ->references('id') + ->on($tableNames['permissions']) + ->onDelete('cascade'); + + $table->primary(['permission_id', $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + }); + + Schema::create($tableNames['model_has_roles'], function (Blueprint $table) use ($tableNames, $columnNames) { + $table->unsignedInteger('role_id'); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type', ]); + + $table->foreign('role_id') + ->references('id') + ->on($tableNames['roles']) + ->onDelete('cascade'); + + $table->primary(['role_id', $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + }); + + Schema::create($tableNames['role_has_permissions'], function (Blueprint $table) use ($tableNames) { + $table->unsignedInteger('permission_id'); + $table->unsignedInteger('role_id'); + + $table->foreign('permission_id') + ->references('id') + ->on($tableNames['permissions']) + ->onDelete('cascade'); + + $table->foreign('role_id') + ->references('id') + ->on($tableNames['roles']) + ->onDelete('cascade'); + + $table->primary(['permission_id', 'role_id']); + }); + + app('cache') + ->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null) + ->forget(config('permission.cache.key')); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $tableNames = config('permission.table_names'); + + Schema::drop($tableNames['role_has_permissions']); + Schema::drop($tableNames['model_has_roles']); + Schema::drop($tableNames['model_has_permissions']); + Schema::drop($tableNames['roles']); + Schema::drop($tableNames['permissions']); + } +} diff --git a/routes/api.php b/routes/api.php index c641ca5e..0c6e25d7 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,7 +1,5 @@ get('/user', function (Request $request) { - return $request->user(); +Route::group(['namespace' => 'Api'],function () { + + Route::post('/login', 'Auth\LoginController@login')->name('login'); + Route::post('/logout', 'Auth\LoginController@logout')->name('logout')->middleware('auth:api'); + Route::post('/register', 'Auth\RegisterController@register')->name('register'); + Route::post('/password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email'); + Route::post('/password/reset', 'Auth\ResetPasswordController@reset')->name('password.reset'); + }); + + +use Illuminate\Http\Request; +Route::get('/user', function (Request $request) { + return $request->user(); +})->middleware('auth:api'); + +Route::resource('TestTypes', 'TestTypeController'); +Route::resource('TestResults', 'TestResultController'); +Route::resource('MedicalCenters', 'MedicalCenterController'); +Route::resource('Users', 'UserController'); diff --git a/routes/routes.php b/routes/routes.php new file mode 100644 index 00000000..73b9b746 --- /dev/null +++ b/routes/routes.php @@ -0,0 +1,15 @@ +middleware('throttle'); diff --git a/routes/web.php b/routes/web.php index dfcc57f5..5bc337d9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,7 +11,50 @@ | */ -Route::get('/', function () { + + +/* +|-------------------------------------------------------------------------- +| Laravel Passport Routes +|-------------------------------------------------------------------------- +| +| If you'd like to use full functionality of laravel passport +| use the routes below instead of registering your routes in +| AuthServiceProvider as instructed in passport documentation. +| This will use "auth:api" guard instead of "auth" +| +*/ +Route::get('oauth/authorize', '\Laravel\Passport\Http\Controllers\AuthorizationController@authorize')->middleware('auth:api'); +Route::delete('oauth/authorize', '\Laravel\Passport\Http\Controllers\DenyAuthorizationController@deny')->middleware('auth:api'); +Route::post('oauth/authorize', '\Laravel\Passport\Http\Controllers\ApproveAuthorizationController@approve')->middleware('auth:api'); + +Route::get('oauth/clients', '\Laravel\Passport\Http\Controllers\ClientController@forUser')->middleware('auth:api'); +Route::post('oauth/clients', '\Laravel\Passport\Http\Controllers\ClientController@store')->middleware('auth:api'); +Route::put('oauth/clients/{client_id}', '\Laravel\Passport\Http\Controllers\ClientController@update')->middleware('auth:api'); +Route::delete('oauth/clients/{client_id}', '\Laravel\Passport\Http\Controllers\ClientController@destroy')->middleware('auth:api'); + +Route::post('oauth/personal-access-tokens', '\Laravel\Passport\Http\Controllers\PersonalAccessTokenController@store')->middleware('auth:api'); +Route::get('oauth/personal-access-tokens', '\Laravel\Passport\Http\Controllers\PersonalAccessTokenController@forUser')->middleware('auth:api'); +Route::delete('oauth/personal-access-tokens/{token_id}', '\Laravel\Passport\Http\Controllers\PersonalAccessTokenController@destroy')->middleware('auth:api'); + +Route::get('oauth/scopes', '\Laravel\Passport\Http\Controllers\ScopeController@all')->middleware('auth:api'); +Route::post('oauth/token/refresh', '\Laravel\Passport\Http\Controllers\TransientTokenController@refresh')->middleware('auth:api'); +Route::get('oauth/tokens', '\Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser')->middleware('auth:api'); +Route::delete('oauth/tokens/{token_id}', '\Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy')->middleware('auth:api'); + + + + +/* +|-------------------------------------------------------------------------- +| Vue Router +|-------------------------------------------------------------------------- +| +| Allows vue router to pick up all other URL's. +| +*/ +Route::any('{all}', function(){ return view('welcome'); -}); -Route::redirect('{mskh}', '/'); +})->where(['all' => '.*']); + +