Coding Talk#03

Register Login
Flutter + Lumen

MEMBUAT
REST API

Install Composer

1. Buat dua buah folder

2. Masuk ke folder lumen dan buka terminal

composer create-project --prefer-dist laravel/lumen fluttertalk03
cd fluttertalk03
code .

baris 1 : membuat project lumen dengan nama fluttertalk03

baris 2 : masuk ke dalam project

baris 3 : membuka project dengan vscode

Membuat Project

Connect Ke Database

1. Buat Database di mysql dengan nama : fluttertalk03

2. Update file .env sesuai pengaturan mysql

Membuat Tabel

php artisan make:migration CreateUsers

1. Buat migration user dengan ketikan di terminal

2. Buka File Database/Migration/

        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('username');
            $table->string('password');
            $table->string('email');
            $table->timestamps();
        });

2020_02_18_151506_create_users.php

Tambahkan pada fungsi up

3. Jalankan fungsi migrasi dengan ketikan di terminal

php artisan migrate:refresh

Ubah Model User

App/User.php

    protected $fillable = [
        'username', 'password', 'email',
    ];

aktifkan eloquent di boostrap/app.php baris 24 & 26

app/ResponseHandler.php

Buat Model Response

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ResponseHandler extends Model
{
    public function send($status = 200, $message, $data = []) {
        return response()->json([
            'status' => $status,
            'message' => $message,
            'data' => $data
        ]);
    }

    public function notFound($message) {
        return response()->json([
            'status' => 404,
            'message' => "$message not found",
        ]);
    }

    public function internalError() {
        return response()->json([
            'status' => 500,
            'message' => "Internal server error",
        ]);
    }

    public function exists($message) {
        return response()->json([
            'status' => 400,
            'message' => "$message already exists",
        ]);
    }

    public function validateError($errors) {
        
        return response()->json([
            'status' => 422,
            'message' => 'Validation errors',
            'error' => $errors
        ]);
    }

    public function badCredentials() {
        
        return response()->json([
            'status' => 401,
            'message' => 'Username or password is wrong',
        ]);
    }
}

app/http/Resources/UserResource.php

Buat Resources

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

class UserResource extends Resource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'username' => $this->username,
            'email' => $this->email,
        ];
    }
}

app/http/AuthController.php

Buat Controller

<?php

namespace App\Http\Controllers;

use App\Http\Resources\UserResource;
use App\ResponseHandler;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Arr;

class AuthController extends Controller
{
    private $user;
    private $respHandler;

    public function __construct()
    {
        $this->user = new User();
        $this->respHandler = new ResponseHandler();
    }

    public function register(Request $request)
    {
        $validate = Validator::make($request->all(), [
            'username' => 'required|string',
            'password' => 'required|string',
            'email' => 'required|string|email'
        ]);

        if ($validate->fails()) {return $this->respHandler->validateError($validate->errors());}

        $input = $request->all();
        
        if (!$this->user->where('username', $input['username'])->where('email', $input['email'])->first()) {

            $input['password'] = Hash::make($input['password']);
            $user = $this->user->create($input);
            return $this->respHandler->send(201, "Register Success", new UserResource($user));
        } else {
            return $this->respHandler->exists("Users");
        }
    }

    public function login(Request $request)
    {
        $validate = Validator::make($request->all(), [
            'username' => 'required|string',
            'password' => 'required'
        ]);

        if ($validate->fails()) {return $this->respHandler->validateError($validate->errors());}

        $input = $request->all();

        $user = $this->user->where('username', $input["username"])->first();
        if ($user) {
            if (Hash::check($input['password'], $user->password)) {
                return $this->respHandler->send(200, "Berhasil login", new UserResource($user));
            } else {
                return $this->respHandler->badCredentials();
            }
        } else {
            return $this->respHandler->notFound("Users");
        }
    }
}
$router->group([
    'prefix' => 'auth'
], function() use ($router) {
    $router->post('/register', 'AuthController@register');
    $router->post('/login', 'AuthController@login');
});

Buat Route

route/web.php

TESTING
REST API

RUN SERVER

1. cek ip local dengan cara mengetikan di terminal : ipconfig

 

2. Jalankan server lumen dengan perintah

 

php -S 192.168.1.11:8000 -t public

POSTMAN

Test : Register

192.168.1.11:8000/auth/register

Test : Login

192.168.1.11:8000/auth/login

FLUTTER

http://flutter.id/api/fluttertalk03/public

PrimaryButton

import 'package:flutter/material.dart';

class PrimaryButton extends StatelessWidget {
  Color color;
  String text;
  Function onClick;

  PrimaryButton({
    @required this.color, 
    @required this.text, 
    @required this.onClick
  });

  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      onPressed: onClick,
      color: color,
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(8),
      ),
      child: Text(
        text,
        style: TextStyle(
          color: Colors.white, 
          fontSize: 15,
          fontWeight: FontWeight.bold
        )
      ),
    );
  }
}

InputField

import 'package:flutter/material.dart';

class InputField extends StatelessWidget {
  TextEditingController controller;
  TextInputAction action;
  TextInputType type;
  String hintText;
  bool secureText;
  bool readOnly;
  Function onTap;

  InputField({
    this.controller, this.action,
    this.type, this.hintText, this.secureText = false,
    this.onTap, this.readOnly = false
  });
  
  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        color: Colors.grey.withOpacity(0.2),
        shape: BoxShape.rectangle,
        borderRadius: BorderRadius.circular(6),
      ),
      child: Padding(
        padding: const EdgeInsets.only(left: 10, right: 10),
        child: TextField(
          controller: controller,
          onTap: () => onTap != null ? onTap() : {},
          // textInputAction: action,
          textInputAction: TextInputAction.next,
          keyboardType: type,
          obscureText: secureText,
          readOnly: readOnly,
          decoration: InputDecoration(
            hintText: hintText,
            border: InputBorder.none,
            


          ),
        ),
      )
    );
  }
}

endpoint.dart

class Endpoint{
  static String _baseURL = "http://flutter.id/api/fluttertalk03/public";
  static String register = "${_baseURL}/auth/register";
  static String login = "${_baseURL}/auth/login";
}

auth_model.dart

class auth_model {
  int status;
  String message;
  Data data;

  auth_model({this.status, this.message, this.data});

  auth_model.fromJson(Map<String, dynamic> json) {
    status = json['status'];
    message = json['message'];
    data = json['data'] != null ? new Data.fromJson(json['data']) : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['status'] = this.status;
    data['message'] = this.message;
    if (this.data != null) {
      data['data'] = this.data.toJson();
    }
    return data;
  }
}

class Data {
  int id;
  String username;
  String email;

  Data({this.id, this.username, this.email});

  Data.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    username = json['username'];
    email = json['email'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['username'] = this.username;
    data['email'] = this.email;
    return data;
  }
}

toast_utils.dart

import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';

class ToastUtils {

  static Future<void> show(String message) async {
    Fluttertoast.showToast(
      msg: message,
      toastLength: Toast.LENGTH_SHORT,
      gravity: ToastGravity.CENTER,
      timeInSecForIos: 1,
      backgroundColor: Colors.black87,
      textColor: Colors.white,
      fontSize: 16.0
    );



  }


}
Made with Slides.com