• SMK NAWA BHAKTI KEBUMEN
  • SEKOLAH TERAKREDITASI A

Belajar Laravel API

Tahap 1 Persiapan :

Buatlah Folder SERVER_MODULE

Buka Folder tersebut melalui CMD

 

cd c:\xampp\htdocs\SERVER_MODULE

 

Install Project Laravel

 

composer create-project laravel/laravel:^9.0 backend

 

buka folder backend pada CMD

cd backend

Install Laravel Sanctum

composer require laravel/sanctum

 Buatlah database laravel_api pada http://localhost/phpmyadmin

Import File SQL dari Sumber.

Bukalah Folder Project Backend pada Editor VSCode

Buka File .env

edit dan Sesuaikan nama database pada DB_DATABASE sesuai dengan yang tadi dibuat.

////////////////////////////////////////////////////////////////////

Tahap 2 Membuat Model 

Jalankan perintar Berikut satu persatu pada terminal

php artisan make:model Form

php artisan make:model Allowed_Domain

php artisan make:model Question

php artisan make:model Response

php artisan make:model Answer

 

Buka File Form.php  pada Folder Models

Tambahkan Script Berikut pada baris setelah use HasFactory;

protected $table = "forms";
protected $guarded = [];

 

Buka File Allowed_Domain  pada Folder Models

Tambahkan Script Berikut pada baris setelah use HasFactory;

protected $table = "allowed_domains";
protected $guarded = [];

 

Buka File Question  pada Folder Models

Tambahkan Script Berikut pada baris setelah use HasFactory;

protected $table = "questions";
protected $guarded = [];
public function answer() {
return $this->hasMany(Answer::class);
}

 

Buka File Response pada Folder Models

Tambahkan Script Berikut pada baris setelah use HasFactory;

protected $table = "responses";
protected $guarded = [];
public function answer() {
return $this->hasMany(Answer::class);
}

Buka File Answer pada Folder Models

Tambahkan Script Berikut pada baris setelah use HasFactory;

protected $table = "answers";
protected $guarded = [];
 
public function response() {
        return $this->belongsTo(Response::class);
}

public function question() {
        return $this->belongsTo(Question::class);
}

 

///////////////////////////////////////////////////////////////////

 

Tahap 3 Membuat Controller

Jalankan perintar Berikut satu persatu pada terminal

php artisan make:controller AuthController

php artisan make:controller FormController

php artisan make:controller QuestionController

php artisan make:controller ResponseController

 

///////////////////////////////////////////////////////////////////

 

Tahap 4 Membuat Rules

Buatlah Rule Baru dengan AlphaDashDotWithoutSpace nama menggunakan perintah berikut pada Terminal

php artisan make:rule AlphaDashDotWithoutSpace

Buka File AlphaDashDotWithoutSpace pada Folder Rules

Tambahkan script berikut pada baigan passes

return preg_match('/^[a-zA-Z0-9.-]+$/', $value);

 

///////////////////////////////////////////////////////////////////

 

Tahap 5 Membuat Login dan Logout :

 

Bukalah File AuthController.php pada Forlder Controller

Lengkapi Script sbb:

/////////////////////////////////////
namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class AuthController extends Controller
{
    //
    public function login(Request $request){
        $rules = [
            'email' => 'required|email',
            'password' => 'required|min:5'
        ];
        $validator=Validator::make($request->all(),$rules);
        if($validator->fails()){
            return response()->json([
                'message' => 'Invalid field',
                'errors' => $validator->errors()
            ],422);
        }
        if(!Auth::attempt($request->only(['email','password']))){
            return response()->json([
                'message' => 'Email or password incorrect'
            ], 401);
        }

        $datauser = User::where('email',$request->email)->first();
        return response()->json([
            'message' => 'Login Success',
            'user' => [
                'name' => $datauser->name,
                'email' => $datauser->email,
                'accessToken' => $datauser->createToken('Token')->plainTextToken
            ]
            ],200);
    }
    public function logout(Request $request) {
        if($request->user()->currentAccessToken()->delete()) {
            return response()->json([
                'message' => 'Logout Success'
            ],200);
        }else{
            return response()->json([
                'message' => 'Unauthenticated'
            ],401);
        }
    }
}
/////////////////////////////////////

Buka lah File api.php pada folder routes

tambahkan script berikut pada bagian atas

use App\Http\Controllers\AuthController;

tambahkan script berikut pada akhir baris

////////////////////////////////////////

Route::get('/',function(){ return response()->json(['message'=>'Unauthenticated'],401);})->name('login');

Route::post('v1/auth/login', [AuthController::class,'login']);

Route::middleware('auth:sanctum')->post('v1/auth/logout', [AuthController::class,'logout']);

///////////////////////////////////////

 

///////////////////////////////////////////////////////////////////

Tahap 6 Membuat Form

Buka File FormController.php pada Folder Controller

Tambahkan Script Berikut pada bagian atas

////////////////////

use App\Models\Form;
use App\Models\Allowed_Domain;
use App\Models\Question;
use App\Models\User;
use App\Rules\AlphaDashDotWithoutSpace;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

////////////////////

Pada Bagian class FormController masukkan script berikut :

///////////////////////////////////////////////

    public function index()
    {
        //
        $data=Form::where('creator_id','=', auth()->user()->id)->get();
        return response()->json([
            'message' => 'Get all forms success',
            'forms' =>$data
        ],200);
    }

    public function create(Request $request)
    {
        //
        $limit_one_response = $request->limit_one_response;

        if ($limit_one_response == 'true') {
            $limit_one_response = 1;
        } else {
            $limit_one_response = 0;
        }

        $allowed_domains = $request->allowed_domains;

        $rules = [
            'name' => 'required',
            'slug' => ['required',new AlphaDashDotWithoutSpace],
            'allowed_domains' => 'array'
        ];

        $validator=Validator::make($request->all(),$rules);

        if($validator->fails()){
            return response()->json([
                'message' => 'Invalid field',
                'errors' => $validator->errors()
            ],422);
        }else{
            $data=[
                'name'=>$request->name,
                'slug'=>$request->slug,
                'description'=>$request->description,
                'limit_one_response'=>$limit_one_response,
                'creator_id'=>auth()->user()->id
            ];
            $create_form=Form::create($data);
            $form_id=$create_form->id;
            $allowed_domains=implode(',',$allowed_domains);
            $data_allowed_domains=[
                'form_id'=>$form_id,
                'domain'=>$allowed_domains
            ];
            $create_allowed_domain=Allowed_Domain::create($data_allowed_domains);

            return response()->json([
                'message' => 'Create form Success',
                'form'=>$create_form
            ],200);

        }  
    }

    public function detail(string $slug){
        $data_detail=Form::where('slug','=',$slug)->first();

        if($data_detail){
            $form_id=$data_detail->id;
            $creator_id = $data_detail->creator_id;
            $creator_detail = User::where('id','=',$creator_id)->first();
            $data_allowed_domains=Allowed_Domain::where('form_id','=',$form_id)->first();
            $allowed_domains = $data_allowed_domains->domain;

            $data_question=Question::where('form_id','=',$form_id)->get();
            $data_detail['allowed_domains']=explode(', ',$allowed_domains);
            $data_detail['creator']=$creator_detail;

            if($data_question){
                $data_detail['question']=$data_question;
            }

            $user_domain = explode('@', auth()->user()->email)[1];

            if(!in_array($user_domain,$data_detail->allowed_domains) && $data_detail->allowed_domains[0] !="" && $creator_id != auth()->user()->id){
                return response()->json([
                    'message'=>'Forbidden access'
                ],403);
            }

            return response()->json([
                'message'=>'Get form Success',
                'form'=>$data_detail
            ],200);

        }else{
            return response()->json([
                'message'=>'Form not found'
            ],404);
        }

    }
////////////////////////////////////////////////////////////
 

Buka lah File api.php pada folder routes

tambahkan script berikut pada bagian atas

use App\Http\Controllers\FormController;

tambahkan script berikut pada akhir baris

Route::middleware('auth:sanctum')->post('v1/forms',[FormController::class,'create']);
Route::middleware('auth:sanctum')->get('v1/forms',[FormController::class,'index']);
Route::middleware('auth:sanctum')->get('v1/forms/{slug}',[FormController::class,'detail']);
 
 
 
 

///////////////////////////////////////////////////////////////////

Tahap 7 Membuat Question 

 

Buka File QuestionController.php pada Folder Controller
 
Tambahkan Script Berikut pada bagian atas
 
/////////////////////////////
 
use App\Models\Answer;
use App\Models\Form;
use App\Models\Question;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
 
///////////////////////////////////////////
 
Tambahkan script Berikut pada class QuestionController
 
/////////////////////////////////////////////
 
 public function add(string $slug, Request $request){
       

        $rules=[
           'name' => 'required',
           'choice_type'=>'required|in:"short answer", "paragraph", "date", "multiple choice", "dropdown", "checkboxes"',
           'choices' => 'required_if:choice_type,==,multiple choice|required_if:choice_type,==,dropdown|required_if:choice_type,==,checkboxes'
        ];
        $validator=Validator::make($request->all(),$rules);

       
        if($validator->fails()){
            return response()->json([
                'message' => 'Invalid field',
                'errors' => $validator->errors()                
            ],422);
        }else{
            $data_form=Form::where('slug','=',$slug)->first();
            if($data_form){
               
                $form_id=$data_form->id;
                if($data_form && $data_form->creator_id == auth()->user()->id){
                    $is_required = $request->is_required;
                    if($is_required == 'true'){
                        $is_required = 1;
                    }else{
                        $is_required = 0;
                    }
                    $data_question=[
                        'form_id'=> $form_id,
                        'name'=> $request->name,
                        'choice_type' => $request->choice_type,
                        'is_required' => $is_required
                    ];
                    if($request->choices){
                        $data_question['choices'] = implode(', ',$request->choices);
                    }

                    $create_question = Question::create($data_question);
                        return response()->json([
                            'message' => 'Add question success',
                            'quesion'=>$create_question
                        ],200);
                }else{
                    return response()->json([
                        'message' => 'Forbidden access'                
                    ],403);
                }
            }else{
                return response()->json([
                    'message' => 'Form not Found'                
                ],404);
            }
        }
    }

    public function remove($slug, $question_id){
        $data_form=Form::where('slug','=',$slug)->first();
        if($data_form){
            $form_id=$data_form->id;
            $data_question=Question::where('id','=',$question_id)->first();
            if($data_question){
                if($data_form->creator_id == auth()->user()->id){
                    $delete_answer= Answer::where('question_id','=',$question_id)->delete();
                    $delete_question= Question::where('id','=',$question_id)->delete();
                    return response()->json([
                        'message'=>'Remove question success'
                    ],200);
                }else{
                    return response()->json([
                        'message'=>'Forbidden access'
                    ],403);
                }

            }else{
                return response()->json([
                    'message'=>'Question not found'
                ],404);
            }
        }else{
            return response()->json([
                'message'=>'Form not found'
            ],404);
        }
    }
 
///////////////////////////////////////////////////////////
 
Bukalah File api.php pada Folder routes
 
Tambahkan script berikut pada bagian atas
 
/////////////////////////////////////////
 
use App\Http\Controllers\QuestionController;
 
////////////////////////////////////////
 
 
Tambahkan script berikut pada bagian bawah
 
/////////////////////////////////////////////
 
Route::middleware('auth:sanctum')->post('v1/forms/{slug}/questions',[QuestionController::class,'add']);
Route::middleware('auth:sanctum')->delete('v1/forms/{slug}/questions/{question_id}',[QuestionController::class,'remove']);
 
/////////////////////////////////////////////
 

///////////////////////////////////////////////////////////////////

Tahap 8 Membuat Response

 
Buka File ResponseController.php pada Folder Controller
 
Tambahkan Script Berikut pada bagian atas
 
/////////////////////////////
 
use App\Models\Allowed_Domain;
use App\Models\Answer;
use App\Models\Form;
use App\Models\Question;
use App\Models\Response;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
 
///////////////////////////////////////////
 
Tambahkan script Berikut pada class ResponseController
 
/////////////////////////////////////////////
 
//
    public function submit(String $slug, Request $request){
        $data_form=Form::where('slug','=',$slug)->first();

        if($data_form){
           
                $form_id=$data_form->id;
                $question_required=Question::where('form_id','=',$form_id)->where('is_required','=','1')->get();
                $limit_one_response=$data_form->limit_one_response;
                date_default_timezone_set('Asia/Jakarta');
                $rules=[
                    'answers' => 'required|array'
                ];
                $validator=Validator::make($request->all(),$rules);

                if($validator->fails()){
                    return response()->json([
                        'message' => 'Invalid field',
                        'errors' => $validator->errors()
                    ],422);
                }

                $data_allowed_domain=Allowed_Domain::where('form_id','=',$form_id)->first();
                $allowed_domain=explode(',',$data_allowed_domain->domain);
                $user_email=explode('@', auth()->user()->email)[1];

                if(!in_array($user_email,$allowed_domain) && $allowed_domain[0] != "" ){
                    return response()->json([
                        'message'=>'Forbidden Access',
                    ],403);
                }

                if($limit_one_response == 1){
                    $user_id = auth()->user()->id;
                    $data_response=Response::where('form_id','=',$form_id)->where('user_id','=',$user_id)->get();

                    if(count($data_response)){
                        return response()->json([
                            'message'=>'You can not submit form twice'
                        ],422);
                    }
                }

                $answer_question_id = [];

                foreach($request->answers as $answer){
                    $answer_question_id[] = $answer['question_id'];
                }

                $question_required_id = [];
                foreach($question_required as $item){
                    $question_required_id[]=$item->id;
                }

                $question_not_filled = array_diff($question_required_id,$answer_question_id);

                if(count($question_not_filled)){
                    $required_question = Question::where('id','=',$question_not_filled)->get();

                    return response()->json([
                        'message' => 'Question is required',
                        'errors' => $required_question
                    ],422);
                }

                $create_response = Response::create([
                    'form_id'=>$form_id,
                    'user_id'=>auth()->user()->id,
                    'date'=>date('Y-m-d H:i:s')

                ]);

                $response_id= $create_response->id;


                foreach($request->answers as $answer){
                    Answer::create([
                        'response_id'=>$response_id,
                        'question_id'=>$answer['question_id'],
                        'value'=>$answer['value']
                    ]);
                }
                return response()->json([
                    'message'=>'Submit response success'
                ],200);
           
        }else{
            return response()->json([
                'message'=>'Form not found'
            ],404);
        }
             
    }

    public function index(string $slug){
        $data_form=Form::where('slug','=',$slug)->first();

        if($data_form){
           

            $user_id = $data_form->creator_id;
            $current_user = auth()->user()->id;
            if($user_id != $current_user){
                return response()->json([
                    'message'=>'Forbidden access'
                ]);
            }
            $form_id=$data_form->id;
            $data_response=Response::where('form_id','=',$form_id)->get();

            $data_answer=Answer::with('question')->get();

            $results = ['responses' => []];
            $results = ['message'] => 'Get responses success';
            $answer = [];

            foreach($data_response as $key => $response){
                foreach($data_answer as $key => $item){
                    if($item->response_id == $response->id){
                        $answer += [
                            $item->question->name => $item->value
                        ];
                    }
                }

                $results['responses'][]=[
                    'date'=>$response->date,
                    'user'=>User::where('id','=',$response->user_id)->first(),
                    'answer'=>$answer
                ];

            }
            return response()->json(
                $results
            ,200);

        }else{
            return response()->json([
                'message'=>'Form not found'
            ],404);
        }
    }
 
///////////////////////////////////////////////////////////
 
Bukalah File api.php pada Folder routes
 
Tambahkan script berikut pada bagian atas
 
/////////////////////////////////////////
 
use App\Http\Controllers\ResponseController;
 
////////////////////////////////////////
 
 
Tambahkan script berikut pada bagian bawah
 
/////////////////////////////////////////////
 
Route::middleware('auth:sanctum')->post('v1/forms/{slug}/responses',[ResponseController::class,'submit']);
Route::middleware('auth:sanctum')->get('v1/forms/{slug}/responses',[ResponseController::class,'index']);
 
/////////////////////////////////////////////
 

///////////////////////////////////////////////////////////////////

 
 
Tahap Terakhir
 
Jalankan Server laravel menggunakan perintah berikut pada terminal
 
php artisan serve
 
 
 
Lakukan pengetesan menggunakan postman
 

Komentari Tulisan Ini
Tulisan Lainnya
Game JS

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-sc

02/05/2024 10:36 - Oleh Administrator - Dilihat 18 kali
KUNJUNGAN INDUSTRI UNTUK MENGENAL DUNIA KERJA

Nawabhakti.sch.id. Kunjungan Industri adalah suatu kegiatan tahunan yang dilakukan oleh siswa-siswi kelas X SMK Nawa Bhakti Kebumen. Kunjungan Industri tahun ajaran 2023-2024 ini d

23/03/2024 10:08 - Oleh Administrator - Dilihat 72 kali