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