jodijonatan / jo-server
Library PHP ultra-ringan untuk persiapan LKS Web Technology Indonesia (Modul B).
1.0.0
2026-04-12 09:54 UTC
Requires
- php: >=8.0
- ext-gd: *
README
Jo-Server adalah library helper PHP ultra-ringan untuk kompetisi LKS Web Technology.
Menyediakan abstraksi untuk database CRUD, routing, auth, validasi, dan UI siap pakai.
✨ Fitur Utama
- 🗄️ Database + Schema: Query builder chainable (where, orderBy, limit, CRUD lengkap) + migration builder
- 🌐 Router + CORS: Regex router dengan middleware, route groups, dan CORS otomatis
- 📥 Request: Auto-sanitasi, validasi dengan rules (
required|email|min:6), support JSON + form data - 🔑 Auth Manager: Hash bcrypt, token HMAC-SHA256 dengan expiry, role-based access
- 📦 Response: JSON response standar
- 🖼️ Image Processor: GD wrapper untuk resize dan crop
- 🎨 UI Kit: CSS components (card, form, table, modal, toast, navbar, badge, pagination) + JS helpers
📦 Instalasi
composer require jodijonatan/jo-server
🚀 Panduan Penggunaan
1. Setup Entry Point (index.php)
<?php require 'vendor/autoload.php'; use LKSCore\Core\{Router, Database}; // Konfigurasi Database Database::init([ 'host' => 'localhost', 'db' => 'lks_db', 'user' => 'root', 'pass' => '' ]); // CORS Router::handleCORS(); // Routes Router::get('/api/products', 'ProductController@index'); Router::post('/api/products', 'ProductController@store', [[AuthManager::class, 'protect']]); Router::put('/api/products/{id}', 'ProductController@update', [[AuthManager::class, 'protect']]); Router::delete('/api/products/{id}', 'ProductController@destroy', [[AuthManager::class, 'protect']]); Router::run();
2. Database & Migration
use LKSCore\Core\{Database, Schema}; // Migration Schema::drop('products'); Schema::create('products', function($table) { $table->id(); $table->string('name'); $table->decimal('price'); $table->text('description'); $table->timestamps(); }); // CRUD $products = Database::table('products')->all(); $product = Database::table('products')->find(1); $filtered = Database::table('products')->where('price', '>', 100)->orderBy('name')->all(); $id = Database::table('products')->insert(['name' => 'Item', 'price' => 50000]); Database::table('products')->where('id', 1)->update(['name' => 'Updated']); Database::table('products')->where('id', 1)->delete();
3. Validasi Request
use LKSCore\Core\Request; // Simple required check $data = Request::validate(['username', 'password']); // Advanced validation $data = Request::validate([ 'email' => 'required|email', 'password' => 'required|min:6', 'name' => 'required|max:100' ]); $name = Request::input('name', 'Guest');
4. Autentikasi
use LKSCore\Auth\AuthManager; // Hash & Verify $hashed = AuthManager::hash('password123'); $valid = AuthManager::verify('password123', $hashed); // Generate & Decode Token $token = AuthManager::generateToken(['id' => 1, 'role' => 'admin']); $payload = AuthManager::decodeToken($token); // Proteksi Endpoint $user = AuthManager::protect(); // Cek token valid $admin = AuthManager::requireRole('admin'); // Cek role
5. Base Controller
use LKSCore\Core\Controller; class ProductController extends Controller { public function index() { $data = $this->db('products')->all(); $this->success("Data retrieved", $data); } public function store() { $data = $this->validate(['name' => 'required', 'price' => 'required|numeric']); $id = $this->db('products')->insert(Request::only(['name', 'price'])); $this->created("Product created", ['id' => $id]); } public function update($id) { $this->validate(['name' => 'required']); $this->db('products')->where('id', $id)->update(Request::only(['name', 'price'])); $this->success("Product updated"); } public function destroy($id) { $this->db('products')->where('id', $id)->delete(); $this->success("Product deleted"); } }
6. Frontend UI (CSS/JS)
<link rel="stylesheet" href="vendor/jodijonatan/jo-server/resources/css/jo-ui.css"> <script src="vendor/jodijonatan/jo-server/resources/js/jo-ui.js"></script> <!-- Toast --> <button class="btn btn-primary" onclick="JoUI.toast('Berhasil!', 'success')">Save</button> <!-- Confirm Dialog --> <button class="btn btn-danger" onclick="handleDelete()">Hapus</button> <script> async function handleDelete() { if (await JoUI.confirm('Yakin ingin menghapus?')) { // delete logic } } </script>
📁 Struktur Direktori
src/
├── Auth/
│ └── AuthManager.php # Hash, Token (HMAC-SHA256), Protect, RequireRole
├── Core/
│ ├── Controller.php # Base Controller dengan helper methods
│ ├── Database.php # PDO Wrapper, Query Builder (where, orderBy, CRUD)
│ ├── Request.php # Input sanitasi, validasi rules, file upload
│ ├── Router.php # Regex Router, CORS, Middleware, Groups
│ └── Schema.php # Migration Builder
└── Utils/
├── Response.php # JSON Response formatter
└── ImageProcessor.php # GD Wrapper (resize, crop)
resources/
├── css/jo-ui.css # Complete UI library (layout + components)
└── js/jo-ui.js # Toast, Modal, Confirm, Loading helpers
📄 Lisensi
MIT — Dibuat oleh Jodi Jonatan untuk pejuang LKS Indonesia.