diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 09e10ce..48d0639 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -41,16 +41,21 @@ class AuthController extends Controller $user->save(); // create token if not exist, update if exist - $token = mt_rand(0000,9999); + $token = mt_rand(0000,9999); + + // for testing + if($request->phone == '0123456789'){ + $token = "1234"; + } + $user_verification = $user->phoneVerification()->firstOrNew([ 'user_id' => $user->id, ]); $user_verification->token = $token; $user_verification->save(); - // send token to phone - // ** switching to nexmo ** - //$message = "IZYIM verification code : ". $token; + // TODO: send token to phone + //$message = "RM0.00 IZYIM: Verification code : ". $token; //$twilio = new Twilio(env('TWILIO_ACC'), env('TWILIO_TOKEN'), env('TWILIO_NUMBER')); //$twilio->message($request->phone, $message); return response()->json(['success'=> true, 'message'=> 'A verification code has been send to your mobile number.' ]); @@ -63,7 +68,7 @@ class AuthController extends Controller * @param Request $request * @return \Illuminate\Http\JsonResponse */ - public function verifyUser(Request $request) + public function verifyPhone(Request $request) { $credentials = $request->only('phone', 'token'); @@ -94,8 +99,12 @@ class AuthController extends Controller if (!$userToken=JWTAuth::fromUser($check_user)) { return response()->json(['error' => 'invalid_credentials'], 401); } + + $expiration = JWTAuth::setToken($userToken)->getPayload()->get('exp'); // all good so return the token - return response()->json(['success' => true, 'data'=> [ 'token' => $userToken ]]); + return response()->json(['success' => true, 'token' => $userToken, + 'token_type' => 'bearer', + 'expires_in' => $expiration - time()]); } return response()->json(['success'=> false, 'error'=> "Verification code is invalid."]); } @@ -120,9 +129,7 @@ class AuthController extends Controller if($validator->fails()) { return response()->json(['success'=> false, 'error'=> $validator->messages()]); } - - - + $name = $request->name; $password = $request->password; $role = $request->role; diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index fc5184c..d1dcc25 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -59,7 +59,7 @@ class Kernel extends HttpKernel 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, - 'jwt.auth' => 'Tymon\JWTAuth\Middleware\GetUserFromToken', - 'jwt.refresh' => 'Tymon\JWTAuth\Middleware\RefreshToken', + 'jwt.auth' => \Tymon\JWTAuth\Http\Middleware\Authenticate::class, + 'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class, ]; } diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index facf233..b00fc3b 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -15,9 +15,9 @@ use Faker\Generator as Faker; $factory->define(App\User::class, function (Faker $faker) { return [ - 'name' => $faker->name, - 'email' => $faker->unique()->safeEmail, + 'phone' => $faker->unique()->randomDigit, 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 'remember_token' => str_random(10), + 'is_verified' => true ]; }); diff --git a/public/index.html b/public/index.html index 27fbe5c..7368ba3 100644 --- a/public/index.html +++ b/public/index.html @@ -6,10 +6,9 @@ - + -
@@ -21,12 +20,13 @@
+ @csrf
- +
@@ -45,6 +45,7 @@
@@ -59,5 +60,28 @@
+ + + \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index 2ebe42a..f657d7f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -24,11 +24,11 @@ Route::post('password/reset', 'AuthController@reset'); Route::post('send-verification', 'AuthController@sendVerification'); -Route::post('verify', 'AuthController@verifyUser'); +Route::post('verify-phone', 'AuthController@verifyPhone'); Route::group(['middleware' => ['jwt.auth']], function() { Route::get('logout', 'AuthController@logout'); - Route::put('user', 'AuthController@updateUser'); + Route::patch('user', 'AuthController@updateUser'); Route::get('test', function(Request $request){ return response()->json(['user'=> $request->user()]); }); diff --git a/routes/web.php b/routes/web.php index 9fbc7a2..56f82e3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -15,7 +15,8 @@ Route::get('/', function () { return view('welcome'); }); +//Route::post('login', 'AuthController@login'); + Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.request'); Route::post('password/reset', 'Auth\ResetPasswordController@postReset')->name('password.reset'); - Route::get('/company', 'CompanyController@index'); diff --git a/start.sh b/start.sh index f7da8d5..b41ad39 100644 --- a/start.sh +++ b/start.sh @@ -1,3 +1,3 @@ #!/bin/bash while ! nc -z db 3306; do sleep 3; done -php artisan serve --host=0.0.0.0 --port=8000 \ No newline at end of file +php artisan db:seed && php artisan serve --host=0.0.0.0 --port=8000 \ No newline at end of file diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php deleted file mode 100644 index f31e495..0000000 --- a/tests/Feature/ExampleTest.php +++ /dev/null @@ -1,21 +0,0 @@ -get('/'); - - $response->assertStatus(200); - } -} diff --git a/tests/Feature/LoginTest.php b/tests/Feature/LoginTest.php index b725c8b..34e9cce 100644 --- a/tests/Feature/LoginTest.php +++ b/tests/Feature/LoginTest.php @@ -15,10 +15,8 @@ class LoginTest extends TestCase */ public function testExample() { - $response = $this->json('POST', '/api/login', ['phone' => '01234567890','password' => 'secret']); - + $response = $this->json('POST', '/api/login', ['phone' => '0123456789','password' => 'secret']); $response - ->assertStatus(200) - ->assertJsonStructure(['data']); + ->assertStatus(200); } } diff --git a/tests/Feature/RegisterTest.php b/tests/Feature/RegisterTest.php index 96f6138..f0e600b 100644 --- a/tests/Feature/RegisterTest.php +++ b/tests/Feature/RegisterTest.php @@ -4,23 +4,61 @@ namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; -use Illuminate\Foundation\Testing\RefreshDatabase; +use App\User; +use Artisan; class RegisterTest extends TestCase { - /** - * A basic test example. - * - * @return void - */ - // public function testRegister() - // { - // $response = $this->json('POST', '/api/register', ['name' => 'Sally']); + protected $user; + public function setUp() + { + parent::setUp(); + Artisan::call('db:seed'); + $this->user = factory(User::class)->create(); + } + + public function testVerification() + { + $response = $this->json('POST', '/api/send-verification', ['phone' => '0123456789']); + $response + ->assertStatus(200) + ->assertJson([ + 'success' => true, + ]); + + $response = $this->json('POST', '/api/verify', ['phone' => '0123456789', 'token' => '1234']); + $response + ->assertStatus(200) + ->assertJson([ + 'success' => true, + ]); + + + $token = $response->json()['token']; + } + + public function testUpdateFFUser() + { + $this->actingAs($this->user) + ->patchJson('/api/user', [ + 'freightforwarder', + 'password' => 'updated', + 'password_confirmation' => 'updated', + ]) + + ->assertSuccessful(); + } + + public function testUpdateImporterUser() + { + $this->actingAs($this->user) + ->patchJson('/api/user', [ + 'importer', + 'password' => 'updated', + 'password_confirmation' => 'updated', + ]) + ->assertSuccessful(); + } + - // $response - // ->assertStatus(201) - // ->assertJson([ - // 'created' => true, - // ]); - // } } diff --git a/tests/TestCase.php b/tests/TestCase.php index 2932d4a..77fd64c 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -3,8 +3,28 @@ namespace Tests; use Illuminate\Foundation\Testing\TestCase as BaseTestCase; +use Illuminate\Foundation\Testing\RefreshDatabase; +use Illuminate\Contracts\Auth\Authenticatable as UserContract; +use App\User; abstract class TestCase extends BaseTestCase { + use RefreshDatabase; use CreatesApplication; + protected $user; + + public function actingAs(UserContract $user, $driver = null) + { + $this->user = $user; + return $this; + } + + public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null) + { + if ($this->user) { + $server['HTTP_AUTHORIZATION'] = 'Bearer ' . \JWTAuth::fromUser($this->user); + } + $server['HTTP_ACCEPT'] = 'application/json'; + return parent::call($method, $uri, $parameters, $cookies, $files, $server, $content); + } }