Senin, 09 September 2024

Kastemisasi tampilan terminal linux menjadi keren




Install Oh My Posh
langkah pertama anda dapat menginstal Oh My Posh dan Unzip agar dapat mengekstraknya, ketikkan perintah di terminal.

sudo wget https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/posh-linux-amd64 -O /usr/local/bin/oh-my-posh
sudo chmod +x /usr/local/bin/oh-my-posh
sudo apt install unzip

Selanjutnya Anda perlu mendownload temanya
mkdir ~/.poshthemes
wget https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/themes.zip -O ~/.poshthemes/themes.zip
unzip ~/.poshthemes/themes.zip -d ~/.poshthemes
chmod u+rw ~/.poshthemes/*.json
rm ~/.poshthemes/themes.zip
Instal Nerd Font
Anda perlu menggunakan Nerd Font untuk menampilkan semua ikon khusus yang bagus. Anda dapat mendownloadnya langsung dari sini. Simpan saja di komputer Anda, unzip dan instal.
Kemudian, Anda perlu mengatur font ini dari pengaturan terminal.

Aktivasi Bashrc
Sekarang Anda perlu menambahkan beberapa kode ke file bashrc Anda; tema mana yang ingin Anda gunakan di Oh My Posh akan ditunjukkan. Itu adalah langkah penting untuk penyesuaian terminal.

Buka file bashrc Anda dengan menjalankan perintah di bawah ini:
nano ~/.bashrc

Dan tambahkan dua baris berikut di bawahnya:
# Oh My Posh Theme Config
eval "$(oh-my-posh --init --shell bash --config '~/.poshthemes/atomic.omp.json')"

Sekarang tekan ctrl + o dan enter untuk menyimpan file dan ctrl + x untuk menutup file anda.
Terakhir anda perlu mengaktifkan tema dengan menjalankan perintah di bawah ini:
source ~/.bashrc

Senin, 02 September 2024

Membuat restful api sederhana dengan framework actix web dan database mysql

 Sebelum kita mulai koding alangkah baiknya kita baca basmallah dalam hati.

Yuk kita intip langkah - langkah apa saja yang perlu disiapkan dalam membuat restful api ini.

- Pertama kalian harus install rust di dalam komputer masing - masing buka linknya di sini https://www.rust-lang.org/tools/install

- Kedua setelah selesai penginstalan kita mulai pembuatan projeknya ya, ketikkan perintah di dalam terminal. " cargo new nama projek"

- Ketiga siapkan database mysql dengan nama blog_db dan  buat tabel baru di dalam database tersebut misalnya posts. Isi tabel tersebut ada id, title dan content

- Keempat , langkah ini barulah kita buatkan script atau kodenya. Di file main.rs isi kodenya seperti ini ya:

mod handler;
mod model;
mod schema;




use actix_web::middleware::Logger;
use actix_web::{web, App, HttpServer};
use sqlx::mysql::{MySqlPool, MySqlPoolOptions};
use dotenv::dotenv;

pub struct AppState {
    db: MySqlPool,
}


#[actix_web::main]
async fn main() -> std::io::Result<()>{
    if std::env::var_os("RUST_LOG").is_none() {
        std::env::set_var("RUST_LOG", "actix_web=info")
    }
    dotenv().ok();
    env_logger::init();

    let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set");
    let pool = match MySqlPoolOptions::new()
            .max_connections(10)
            .connect(&database_url)
            .await
    {
        Ok(pool) => {
            println!("✅Connection to the database is successful!");
            pool
        },
        Err(err) => {
            println!("🔥 Failed to connect to the database: {:?}", err);
            std::process::exit(1);
        }  
    };

    println!("🚀 Server started successfully");

    HttpServer::new(move || {
        App::new()
        .app_data(web::Data::new(AppState { db : pool.clone()}))
        .wrap(Logger::default())
        .service(handler::get_post)
        .service(handler::create_post)
        .service(handler::get_single_post)
        .service(handler::edit_post)
        .service(handler::delete_post)
       
    })
    .bind(("127.0.0.1", 5050))?
            .run()
            .await

}

selain file main.rs ada beberapa file yang perlu dipersiapkan diantaranya: handler.rs, model.rs dan schema.rs. 

Di dalam file handler.rs memiliki tugas untuk menjalankan segala service yang dibutuhkan dalam mengolah data untuk kodenya bisa dilihat di bawah ini.

use actix_web::{delete, get, patch, post, web, HttpResponse, Responder};
use serde_json::json;
use crate::{
    model::{Post, PostResponse}, schema::{CreatePostSchema, FilterOptions}, AppState
};


fn filter_db_record(post: &Post) -> PostResponse {
    PostResponse {
        id: post.id.to_owned(),
        title: post.title.to_owned(),
        content: post.content.to_owned(),
    }
}

#[get("/api/posts")]
pub async fn get_post(opt: web::Query<FilterOptions>,config: web::Data<AppState>)-> impl Responder{
    let limit = opt.limit.unwrap_or(10);
    let offset = (opt.page.unwrap_or(1) - 1) * limit;
    let posts = sqlx::query_as!(Post, r#"SELECT id, title, content FROM posts ORDER BY id DESC LIMIT ? OFFSET ?"#, limit as i32, offset as i32)
        .fetch_all(&config.db)
        .await
        .unwrap();

    let post_resp = posts
                            .into_iter()
                            .map(|post| filter_db_record(&post))
                            .collect::<Vec<PostResponse>>();
    let response = serde_json::json!({
        "status" : "success",
        "posts" : post_resp
    });

    HttpResponse::Ok().json(response)
}

#[post("/api/posts")]
pub async fn create_post(body: web::Json<CreatePostSchema>, config: web::Data<AppState>) -> impl Responder{
    sqlx::query!(r#"INSERT INTO posts(title, content) VALUES(?, ?)"#, body.title, body.content)
        .execute(&config.db)
        .await;

    let query_result = sqlx::query_as!(Post ,r#"SELECT id, title, content FROM posts WHERE title =?"#, body.title)
        .fetch_one(&config.db)
        .await;

    match query_result {
        Ok(value) => {
            let post_response = serde_json::json!({"status": "success", "data": serde_json::json!({"post": filter_db_record(&value)})});

            return HttpResponse::Ok().json(post_response);
        },
        Err(err) => {
            return HttpResponse::InternalServerError().json(serde_json::json!({
                "status": "error",
                "message": format!("{:?}", err)
            }));
        }
    }
}

#[get("/api/posts/{id}")]
pub async fn get_single_post(path: web::Path<i32>, config: web::Data<AppState>) -> impl Responder{
    let post_id = path.into_inner().to_string();
    let query_result = sqlx::query_as!(Post, r#"SELECT id, title, content FROM posts WHERE id=?"#, post_id)
                    .fetch_one(&config.db)
                    .await;

    match query_result {
        Ok(post) => {
            let post_response = serde_json::json!({"status": "success", "data": serde_json::json!({"post": filter_db_record(&post)})});

            return HttpResponse::Ok().json(post_response)
        },
        Err(err) => {
            return HttpResponse::InternalServerError()
                    .json(serde_json::json!({"status": "error", "message": format!("{:?}", err)}));
        }
    }
}

#[patch("/api/posts/{id}")]
pub async fn edit_post(path: web::Path<i32>, body: web::Json<CreatePostSchema>, config: web::Data<AppState>)-> impl Responder{
    let post_id = path.into_inner().to_string();

    let update_result = sqlx::query(r#"UPDATE posts SET title = ?, content = ? WHERE id= ?"#)
    .bind(body.title.to_owned())
    .bind(body.content.to_owned())
    .bind(post_id.to_owned())
    .execute(&config.db)
    .await;
   
    match  update_result{
        Ok(value) => {
            if value.rows_affected() == 0 {
                let message = format!("Post with ID: {} not found", post_id);
                return HttpResponse::NotFound().json(json!({"status": "fail", "message": message}));
            }
        },
        Err(err) => {
            let message = format!("Internal server error: {}", err);
            return HttpResponse::InternalServerError().json(json!({"status": "error", "message": message}));
        }
    }

    let _result = sqlx::query_as!(Post, r#"SELECT id, title, content FROM posts WHERE id=?"#, post_id.to_owned())
            .fetch_one(&config.db)
            .await;
    match _result {
        Ok(row) => {
            let note_response = serde_json::json!({"status": "success","data": serde_json::json!({
                "note": filter_db_record(&row)
            })});

            HttpResponse::Ok().json(note_response)
        }
        Err(e) => HttpResponse::InternalServerError()
            .json(serde_json::json!({"status": "error","message": format!("{:?}", e)})),
    }
}

#[delete("/api/posts/{id}")]
pub async fn delete_post(path: web::Path<i32>, config: web::Data<AppState>) -> impl Responder{
    let post_id = path.into_inner().to_string();
    let query_result = sqlx::query!(r#"DELETE FROM posts WHERE id = ?"#, post_id )
                .execute(&config.db).await;

    match  query_result {
        Ok(result) => {
            if result.rows_affected() == 0 {
                let message = format!("Post with ID: {} not found", post_id);
                return HttpResponse::NotFound().json(json!({"status": "fail", "message": message}));
            } else {
                return HttpResponse::Ok().json(json!({"status": "success", "message": "Delete record successfully"}));
            }
        },
        Err(err) => {
            return HttpResponse::InternalServerError().json(json!({"status": "error", "message": format!("Internal server error {:?}", err)}));
        }
    }
}

Selanjutnya di dalam file model berisi field yang dibutuhkan di dalam tabel posts:

use serde::{Deserialize, Serialize};

#[derive(Debug, sqlx::FromRow, Serialize, Deserialize)]
#[allow(non_snake_case)]
pub struct  Post {
    pub id: i32,
    pub title: Option<String>,
    pub content: Option<String>,
}

#[derive(Debug, Serialize, Deserialize)]
#[allow(non_snake_case)]
pub struct  PostResponse {
    pub id: i32,
    pub title: Option<String>,
    pub content: Option<String>,
}

Kemudian file schema.rs memiliki beberapa parameter atau inputan query yang digunakan di setiap endpointnya

use serde::{Deserialize, Serialize};

#[derive(Deserialize, Debug)]
pub struct FilterOptions {
    pub page: Option<usize>,
    pub limit: Option<usize>,
}

#[derive(Deserialize, Debug)]
pub struct ParamOptions {
    pub id: String,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct CreatePostSchema{
    pub title: Option<String>,
    pub content: Option<String>,
}

ada 2 file yang gak boleh kelewat ya .env dan cargo.toml . masing - masing dari file tersebut memiliki tugas yang berbeda - beda. Jika file .env bertugas untuk konfigurasi koneksi database mysql sedangkan cargo.toml berisi modul - modul program yang  yang dibutuhkan dalam pembuatan projek tersebut.

Settingan dari koneksi database mysql di dalam file .env sangat mudah sekali yaitu:

MYSQL_USER= root
MYSQL_DATABASE=blog_db
MYSQL_ROOT_PASSWORD=password
MYSQL_PASSWORD=password
DATABASE_URL=mysql://${MYSQL_USER}:${MYSQL_ROOT_PASSWORD}@localhost:3306/${MYSQL_DATABASE}

Tambahkan modul atau library di file cargo.toml ya

[dependencies]
sqlx = { version = "0.8", features = ["mysql", "runtime-async-std"]}
actix-web = "4.9.0"
mysql = "25.0.1"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
chrono = { version = "0.4", features = ["serde"] }
derive_more = "0.99"
env_logger = "0.11"
isahc = "1.7"
log="0.4"
dotenv = "0.15.0"

Jika semua kode sudah dikerjakan dengan benar di dalam projek anda maka anda bisa melakukan uji coba api lewat curl saja.
1. Method Post : Create new a record
    curl -H 'Content-Type: application/json' \
      -d '{ "title": "lorem ipsum", "content" : "lorem ipsum dolar sit ae"}' \
      -X POST \
      http://127.0.0.1:5050/api/posts
2. Method Get : singgle record
    curl -H 'Content-Type: application/json' \
      -X GET  http://127.0.0.1:5050/api/posts/6
3. Method Get : All records
    curl -H 'Content-Type: application/json' \
    -X GET http://127.0.0.1:5050/api/posts
4. Method Patch : update record by id
    curl -H 'Content-Type: application/json' \
      -d '{ "title": "Hello coders", "content" : "Hello coders, how are you?"}' \
      -X PATCH \
      http://127.0.0.1:5050/api/posts/6
5. Method Delete : delete record
    curl -H 'Content-Type: application/json' \
      -X DELETE http://127.0.0.1:5050/api/posts/6

Begitulah tahapan demi tahapan dalam pembuatan simpel restful api menggunakan bahasa pemrograman rust alias framework actix web. Semoga pembelajaran ini bisa bermanfaat di kemudian hari. Selamat mencobanya ya....heeppiii coding brooo.


Senin, 20 Mei 2024

Membangun rest api menggunakan flask python dan database mysql

Sebelum memulai koding langkah - langkah yang perlu dipersiapkan anda harus menyiapkan database mysql dan menginstal flask terlebih dahulu, diantara caranya sebagai berikut:

  • Langkah pertama buat database baru bernama flask_restapi sebagai contoh saja kalian bisa membuatnya sesuai kebutuhan dan kemudian buatlah tabel baru bernama users

CREATE TABLE users(

   id INTEGER PRIMARY KEY AUTO_INCREMENT,

   username VARCHAR(50) NOT NULL,

   email VARCHAR(150) NOT NULL,

   pass VARCHAR(200) NOT NULL,

   is_admin BOOLEAN DEFAULT 0,

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

  • Langkah kedua Buat folder projek baru dan folde .venv

* untuk windows *

> mkdir myproject
> cd myproject
> py -3 -m venv .venv

* untuk linux *

$ mkdir myproject
$ cd myproject
$ python3 -m venv .venv

  • Langkah ketiga Aktifkan environment
* untuk windows *
.venv\Scripts\activate
* untuk linux *
$ . .venv/bin/activate

  • Dan keempat baru kita install flask
pip install flask

setelah framework flask berhasil terinstal apa yang perlu disiapkan lagi?. Yupss...,
kita harus buat file baru kita beri nama api.py (optional). nama file boleh bebas ya. lihat
struktur projek tampak terlihat seperti gambar di bawah.

Masih ada library yang dibutuhin untk pembuatan kode program rest api menggunakan flask
yaitu perintah yang perlu kita jalanin lewat terminal
pip install flask-mysqldb dan pip install passlib. Barulah memulai untuk membuat kodenya di
file api.py

import MySQLdb.cursors
from flask import Flask, jsonify, request
from flask_mysqldb import MySQL
from passlib.hash import sha256_crypt


app = Flask(__name__)

app.config["MYSQL_HOST"] = "localhost"
app.config["MYSQL_USER"] = "root"
app.config["MYSQL_PASSWORD"] = ""
app.config["MYSQL_DB"] = "flask_restapi"

mysql = MySQL(app)

@app.get('/')
def hello():

    return jsonify([
        {"message": "Hello world...!"}
    ]), 200

@app.post("/api/users")
def create_user():
    data = request.get_json()
    username = data["username"]
    email = data["email"]
    password = sha256_crypt.encrypt(data["password"])
    cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
    cursor.execute("SELECT * FROM users WHERE username =%s", (username,))
    account = cursor.fetchone()
    if(account):
        return jsonify({"error" : "Account already exist"}), 403
    else:
   
        cursor.execute("INSERT INTO users (username, email, pass) VALUES (%s, %s, %s)", (username, email, password))
        mysql.connection.commit()
        cursor.close()
        message = "Created "+username+" successfully"
        return jsonify(
            {"message": message}
        ), 201
   
@app.put("/api/users/<int:id>")
def update_user(id):
    data = request.get_json()
    username = data["username"]
    email = data["email"]
    password = sha256_crypt.encrypt(data["password"])
    cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)

    cursor.execute("SELECT * FROM users WHERE id=%s", (id,))
    account = cursor.fetchone()

    if(account):
        cursor.execute("UPDATE users SET username =%s,\
                email =%s, pass=%s WHERE id =%s",\
                (username, email, password, id))
        mysql.connection.commit()
        cursor.close()
        message = "Updated "+username+" successfully"
        return jsonify(
                {"message": message}
            ), 200
    else:
        cursor.close()
        message = "User id "+id+" not found"
        return jsonify(
                {"error": message}
            ), 404
   
@app.delete("/api/users/<int:id>")
def delete_user(id):
    cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
    cursor.execute("SELECT * FROM users WHERE id =%s", (id,))
    account = cursor.fetchone()

    if(account):
        cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
        cursor.execute("DELETE FROM users WHERE id=%s", (id,))
        mysql.connection.commit()
        cursor.close()
        return jsonify({"message": "Delete user data successfully"}), 200
    else:
        return jsonify({"error": "User not found"}), 404


@app.get("/api/users/<int:id>")
def single_user(id):
    cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
    cursor.execute("SELECT * FROM users WHERE id=%s", (id,))
    account = cursor.fetchone()
    cursor.close()

    return jsonify(account), 200

@app.get("/api/users")
def multiple_user():
    cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
    cursor.execute("SELECT * FROM users ORDER BY id DESC")
    accounts = cursor.fetchall()
    cursor.close()
   
    return jsonify(accounts), 200

if __name__ == '__main__':
    app.run(debug=True)





setelah kode program kita coba jalan endpoin tersebut menggunakan postman. program
akan berjalan seperti pada gambar
  • fetch all user
  • single user
  • create user
update user
  • delete user
Oh ya, sampai lupa untuk menjalankan program di server development cukup ketikan perintah
" flask --app api run ". nama aplikasi yang kita jalani kita sesuaikan dengan nama file masing - masing kita buat ya. Selamat mencoba, hepii coding!.











Selasa, 14 Mei 2024

Tutorial belajar membuat rest api sederhana menggunakan PHP native dan database mysql

Langkah  pertama sebelum membuat program jalankan dulu web server anda di local komputer. Web server local saya sudah terpasang otomatis apachenya menggunakan control panel Laragon, jadi si laragon ini sudah bundle yang lengkap di dalamya sudah include database, php, node, bahkan python. Lihat interface control panel laragon kalo sudah jalan seperti gambar di bawah.

Selanjutnya buat folder baru masuk file explorer windows cari tempat penyimpan file instalasi laragon terlebih dahulu misal punya saya di path "C:\laragon\www"  kemudian buat folder baru beri nama " belajar-restapi-php ". Perhatikan struktur foldernya  seperti ini. 

Kode yang ada di file database.php dan user.php yaitu:

<?php

class Database {

    protected $connect;
    protected $stmt;
    protected $user = "root";
    protected $pass = "";

    public function __construct()
    {
        $this->connect = new PDO("mysql:host=localhost;dbname=test_db", $this->user, $this->pass);
    }

    public function query($sql, $data = [])
    {
        $this->stmt = $this->connect->prepare($sql);
        $this->stmt->execute($data);
    }

    public function multipleSet()
    {
        return $this->stmt->fetchAll(PDO::FETCH_OBJ);
    }
   
    public function singleSet()
    {
        return $this->stmt->fetch(PDO::FETCH_OBJ);
    }

    public function createTable()
    {
        $sql = "CREATE TABLE users(
            id INT(11) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
            username VARCHAR(50) NOT NULL,
            email VARCHAR(150) NOT NULL,
            pass VARCHAR(200) NOT NULL,
            is_admin BOOLEAN DEFAULT 0,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
        )";
        $this->query($sql);
        echo json_encode(['status' => 200, 'message'=> 'Create table successfully']);
    }
}


<?php
require_once("database.php");

class User extends Database{

    public function findAll()
    {
        $sql = "SELECT * FROM users ORDER BY id DESC";
        $this->query($sql);
        return $this->multipleSet();
       
    }

    public function findById($id)
    {
        $sql = "SELECT * FROM users WHERE id = :id";
        $data = array(
            'id'=> $id
        );
        $this->query($sql, $data);
        return $this->singleSet();

    }

    public function findByUsername($username)
    {
        $sql = "SELECT * FROM users WHERE username = :username";
        $data = array(
            'username'=> $username
        );
        $this->query($sql, $data);
        return $this->singleSet();

    }

    public function create($username, $email, $pass)
    {
        $sql = "INSERT INTO users(username, email, pass) VALUES(:username, :email, :pass)";

        $form_data = array(
            'username' => $username,
            'email' => $email,
            'pass' => password_hash($pass, PASSWORD_BCRYPT)
        );
        $this->query($sql, $form_data);
    }

    public function update($username, $email, $pass, $id)
    {
        $sql = "UPDATE users SET username = :username, email = :email, pass = :pass WHERE id = :id";

        $form_data = array(
            'username' => $username,
            'email' => $email,
            'pass' => password_hash($pass, PASSWORD_BCRYPT),
            'id' => $id
        );
        $this->query($sql, $form_data);
    }

    public function delete($id)
    {
        $sql = "DELETE FROM users WHERE id = :id";
        $data = array(
            'id' => $id
        );

        $this->query($sql, $data);
    }
}


Oh ya jangan lupa siapkan nama database beserta tabelnya sesuai konfigurasi nama class Database di atas yaitu test_db dan nama tabelnya users dulu abaikan yang folder products kita hanya buat crud rest api data user saja . cara membuat tabel user buka heidi sql dari laragon kemudian tombol tab query baru kita masukan syntaknya.

CREATE TABLE users(
            id INT(11) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
            username VARCHAR(50) NOT NULL,
            email VARCHAR(150) NOT NULL,
            pass VARCHAR(200) NOT NULL,
            is_admin BOOLEAN DEFAULT 0,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
        )



Langkah terakhir buat file baru diberi nama index.php di folder api/users dan isi kodenya seperti terlihat pada gambar di bawah.
















<?php
require_once('../user.php');

header("Content-Type: application/json");

$method = $_SERVER["REQUEST_METHOD"];

switch($method) {

    case 'GET':
     
        $user = new User();
        if(!empty($_GET['id'])){
            $id = $_GET['id'];
            $data = array(
                'status'=> 200,
                'user'=> $user->findById($id)
            );
        } else {
            $data = array(
                'status'=> 200,
                'users'=> $user->findAll()
            );
        }
       
        echo json_encode($data);
        break;
    case 'POST':
        $post = json_decode(file_get_contents('php://input'), true);
        $username = $post['username'];
        $email = $post['email'];
        $pass = $post['pass'];

        $user = new User();
        $row = $user->findByUsername($username);
        if($row){
            $data = array(
                'status' => 203,
                'message' => "$username found"
            );

        } else {
            $user->create($username, $email, $pass);
            $data = array(
                'status' => 201,
                'message' => 'Created successfully'
            );
        }
       
   
        echo json_encode($data);
       
        break;
    case 'PUT':

        $input = json_decode(file_get_contents('php://input'), true);
        $id = $input['id'];
        $username = $input['username'];
        $email = $input['email'];
        $pass = $input['pass'];
   
        $user = new User();
        $user->update($username, $email, $pass, $id);
        $data = array(
            'status' => 200,
            'message' => 'Updated successfully'
        );
   
        echo json_encode($data);
        break;
    case 'DELETE':
       
        $id = $_GET['id'];
        $user = new User();
        $user->delete($id);
        $data = array(
            'status' => 200,
            'message' => 'Deleted successfully'
        );
       
        echo json_encode($data);
        break;
    default:
        http_response_code(405);
        echo json_encode(['error' => 'Method not allowed']);
        break;
}



 

Untuk menguji api bisa jalan atau tidak bisa buka menggunakan postman. Bagi yang belum mengistalnya silahkan download dulu di situs resminya https://www.postman.com/downloads/.  di api yang saya buat ada 5 Endpoin user seperti menampilkan semua data user, single user, create user baru, update user dan delete user.
  • CREATE USER




  • UPDATE USER


  • DELETE USER


  • FETCH ALL USERS


  • SINGLE USER

Baik cukup sampai di sini belajar membuat simple crud rest api menggunakan php nativenya. Semoga artikel ini bermanfaat bagi kalian yang ingin mencobanya, silahkan kalian explore sendiri untuk pembuatan endpoint lainnya. Terima kasih, Happy Coding!👌

Kastemisasi tampilan terminal linux menjadi keren

Install Oh My Posh langkah pertama anda dapat menginstal Oh My Posh dan Unzip agar dapat mengekstraknya, ketikkan perintah di terminal. sudo...