KembaliArsip / superappgov / databasekumuhbangkim
superappgov

databasekumuhbangkim

865 file ยท 15.1 MB

Sistem informasi live โ€” databasekumuhbangkim.vercel.appBuka di tab baru

README

<p align="center"> <img src="https://img.shields.io/badge/Status-Production%20Ready-brightgreen" alt="Status"> <img src="https://img.shields.io/badge/Version-1.0.0-blue" alt="Version"> <img src="https://img.shields.io/badge/License-MIT-yellow" alt="License"> <img src="https://img.shields.io/badge/Python-3.9+-3776AB?logo=python&logoColor=white" alt="Python"> <img src="https://img.shields.io/badge/Flask-3.0.0-000000?logo=flask&logoColor=white" alt="Flask"> <img src="https://img.shields.io/badge/Vercel-Deployed-000000?logo=vercel&logoColor=white" alt="Vercel"> </p>

๐Ÿ˜๏ธ Database Kumuh Bangkim

Sistem Informasi Terpadu untuk Pengelolaan Data Kawasan Permukiman Kumuh Indonesia

Aplikasi web berbasis cloud untuk manajemen dan monitoring data verifikasi dokumen serta delineasi kawasan kumuh yang mencakup 34 provinsi dan 514 kabupaten/kota di seluruh Indonesia. Dikembangkan untuk mendukung program penanganan permukiman kumuh Direktorat Jenderal Perumahan, Kementerian PUPR.


๐Ÿ“‹ Daftar Isi


๐ŸŽฏ Tentang Proyek

Latar Belakang

Database Kumuh Bangkim merupakan sistem informasi yang dikembangkan untuk:

  • Sentralisasi Data: Mengumpulkan dan mengelola data kawasan kumuh dari seluruh Indonesia dalam satu platform terpusat
  • Monitoring Verifikasi: Memantau kelengkapan dokumen verifikasi (Berita Acara, Matriks, Shapefile)
  • Analisis Delineasi: Mengelola data luas kawasan kumuh berdasarkan kewenangan (Kabupaten/Kota, Provinsi, Pusat)
  • Manajemen Dokumentasi: Mengelola surat masuk, surat keluar, nota dinas, dan dokumen administratif lainnya

Cakupan Data

KategoriJumlah
Wilayah Administratif3 Wilayah
Provinsi34 Provinsi
Kabupaten/Kota514 Kab/Kota
Data Verifikasi Dokumen71+ Records
Data Luas Delineasi21+ Records

โœจ Fitur Utama

๐Ÿ“Š Dashboard Analytics

  • Statistik Real-time: Total dokumen, total luas kawasan (Ha), status kelengkapan
  • Visualisasi Interaktif: 4 chart dinamis (Bar Chart, Pie Chart)
  • Top 10 Provinsi: Ranking berdasarkan luas kawasan kumuh
  • Distribusi Kewenangan: Pembagian luas per tingkat kewenangan

๐Ÿ“ Manajemen Data Kategori 1 - Kesesuaian Dokumen

  • Monitoring status kelengkapan dokumen (BA, Matriks, SHP)
  • Indikator visual status: โœ… Lengkap, โš ๏ธ Perlu Perbaikan, โŒ Tidak Ada
  • Direct link ke Google Drive untuk akses dokumen
  • Filter berdasarkan wilayah dan provinsi
  • Export data ke format CSV

๐Ÿ“ Manajemen Data Kategori 2 - Data Luas Kumuh

  • Data delineasi kawasan kumuh per kabupaten/kota
  • Pembagian luas berdasarkan kewenangan penanganan
  • Metode verifikasi (Desk Review / Desk & Survei)
  • Link peta dan dokumen pendukung
  • Export data ke format CSV

๐Ÿ“ Sistem Dokumentasi Surat

  • Manajemen surat masuk dan keluar
  • Kategorisasi: Surat Masuk, Surat Keluar, Nota Dinas, SK/Keputusan
  • Pencatatan lengkap: nomor, tanggal, perihal, pengirim/penerima
  • Integrasi Google Drive untuk penyimpanan dokumen

๐Ÿ” Multi-Level Access Control

  • Role-Based Access Control (RBAC)
  • Pembatasan akses berdasarkan wilayah
  • Audit trail aktivitas pengguna

๐Ÿ› ๏ธ Tech Stack

Backend

TechnologyVersionDeskripsi
Python3.9+Bahasa pemrograman utama
Flask3.0.0Micro web framework
Flask-CORS4.0.0Cross-Origin Resource Sharing
Flask-JWT-Extended4.6.0JWT Authentication
Werkzeug3.0.1WSGI utilities

Frontend

TechnologyVersionDeskripsi
HTML5/CSS3-Struktur dan styling
JavaScriptES6+Logic dan interaktivitas
Bootstrap5.3.2UI Framework
Bootstrap Icons1.11.1Icon library
jQuery3.7.1DOM manipulation
DataTables1.13.7Advanced table features
Chart.js4.xData visualization

Infrastructure & Deployment

TechnologyDeskripsi
VercelServerless deployment platform
Git/GitHubVersion control & collaboration
Google Drive APIDocument storage integration

Development Tools

โ”œโ”€โ”€ IDE: VS Code / PyCharm
โ”œโ”€โ”€ API Testing: Postman / Thunder Client
โ”œโ”€โ”€ Version Control: Git
โ””โ”€โ”€ Package Manager: pip

๐Ÿ—๏ธ Arsitektur Sistem

High-Level Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                           CLIENT LAYER                               โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                  โ”‚
โ”‚  โ”‚   Browser   โ”‚  โ”‚   Mobile    โ”‚  โ”‚   Tablet    โ”‚                  โ”‚
โ”‚  โ”‚  (Desktop)  โ”‚  โ”‚  (Safari)   โ”‚  โ”‚  (Chrome)   โ”‚                  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ”‚
โ”‚         โ”‚                โ”‚                โ”‚                          โ”‚
โ”‚         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                          โ”‚
โ”‚                          โ”‚                                           โ”‚
โ”‚                    HTTPS/TLS 1.3                                     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                          โ–ผ                                           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚                    VERCEL EDGE NETWORK                       โ”‚    โ”‚
โ”‚  โ”‚                  (Global CDN & SSL/TLS)                      โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                            โ”‚                                         โ”‚
โ”‚           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                       โ”‚
โ”‚           โ–ผ                                 โ–ผ                        โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”‚
โ”‚  โ”‚  Static Files   โ”‚              โ”‚  Serverless     โ”‚               โ”‚
โ”‚  โ”‚  (HTML/JS/CSS)  โ”‚              โ”‚  Functions      โ”‚               โ”‚
โ”‚  โ”‚                 โ”‚              โ”‚  (Python/Flask) โ”‚               โ”‚
โ”‚  โ”‚  /public/*      โ”‚              โ”‚  /api/*         โ”‚               โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ”‚
โ”‚                                            โ”‚                         โ”‚
โ”‚                           PRESENTATION LAYER                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                             โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                         APPLICATION LAYER   โ”‚                        โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚              FLASK APPLICATION          โ”‚                    โ”‚    โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚ Auth Module  โ”‚  โ”‚ API Routes   โ”‚  โ”‚ Middleware   โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚              โ”‚  โ”‚              โ”‚  โ”‚              โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚ - Login      โ”‚  โ”‚ - /wilayah   โ”‚  โ”‚ - CORS       โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚ - Token      โ”‚  โ”‚ - /provinsi  โ”‚  โ”‚ - JWT Auth   โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚ - Verify     โ”‚  โ”‚ - /kategori1 โ”‚  โ”‚ - Logging    โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚              โ”‚  โ”‚ - /kategori2 โ”‚  โ”‚              โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚              โ”‚  โ”‚ - /dokumen   โ”‚  โ”‚              โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                                                                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚                    BUSINESS LOGIC                            โ”‚    โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚ Access       โ”‚  โ”‚ Data         โ”‚  โ”‚ Report       โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚ Control      โ”‚  โ”‚ Filtering    โ”‚  โ”‚ Generation   โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚              โ”‚  โ”‚              โ”‚  โ”‚              โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚ - RBAC       โ”‚  โ”‚ - By Wilayah โ”‚  โ”‚ - Dashboard  โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚ - Wilayah    โ”‚  โ”‚ - By Provinceโ”‚  โ”‚ - Charts     โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚ - Permission โ”‚  โ”‚ - By Status  โ”‚  โ”‚ - Export CSV โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                   โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                       DATA LAYER โ”‚                                   โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚           IN-MEMORY DATA STORE                               โ”‚    โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”          โ”‚    โ”‚
โ”‚  โ”‚  โ”‚   USERS     โ”‚  โ”‚  WILAYAH    โ”‚  โ”‚  PROVINSI   โ”‚          โ”‚    โ”‚
โ”‚  โ”‚  โ”‚  (5 admin)  โ”‚  โ”‚ (3 region)  โ”‚  โ”‚ (34 prov)   โ”‚          โ”‚    โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚    โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”          โ”‚    โ”‚
โ”‚  โ”‚  โ”‚ KATEGORI1   โ”‚  โ”‚ KATEGORI2   โ”‚  โ”‚ DOKUMENTASI โ”‚          โ”‚    โ”‚
โ”‚  โ”‚  โ”‚ (71 docs)   โ”‚  โ”‚ (21 areas)  โ”‚  โ”‚ (5+ surat)  โ”‚          โ”‚    โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                                                                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚              EXTERNAL INTEGRATIONS                           โ”‚    โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚              GOOGLE DRIVE                          โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚  - Document Storage                                โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚  - Shapefile Repository                            โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ”‚  - Map Files Storage                               โ”‚      โ”‚    โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Request Flow Diagram

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Client โ”‚โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚  Vercel โ”‚โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚  Flask   โ”‚โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚  Data    โ”‚
โ”‚        โ”‚      โ”‚  Edge   โ”‚      โ”‚  API     โ”‚      โ”‚  Store   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
    โ”‚               โ”‚                 โ”‚                 โ”‚
    โ”‚   1. Request  โ”‚                 โ”‚                 โ”‚
    โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚                 โ”‚                 โ”‚
    โ”‚               โ”‚  2. Route       โ”‚                 โ”‚
    โ”‚               โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚                 โ”‚
    โ”‚               โ”‚                 โ”‚  3. Validate    โ”‚
    โ”‚               โ”‚                 โ”‚     Token       โ”‚
    โ”‚               โ”‚                 โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚
    โ”‚               โ”‚                 โ”‚  4. Fetch Data  โ”‚
    โ”‚               โ”‚                 โ”‚โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
    โ”‚               โ”‚  5. Response    โ”‚                 โ”‚
    โ”‚               โ”‚โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚                 โ”‚
    โ”‚  6. JSON      โ”‚                 โ”‚                 โ”‚
    โ”‚โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚                 โ”‚                 โ”‚
    โ”‚               โ”‚                 โ”‚                 โ”‚

Directory Structure

databasekumuhbangkim/
โ”‚
โ”œโ”€โ”€ ๐Ÿ“ api/
โ”‚   โ””โ”€โ”€ ๐Ÿ“„ index.py            # Main Flask API (Serverless Function)
โ”‚                               # - Authentication endpoints
โ”‚                               # - CRUD operations
โ”‚                               # - Data filtering logic
โ”‚                               # - Business logic
โ”‚
โ”œโ”€โ”€ ๐Ÿ“ public/
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ index.html          # Single Page Application (SPA)
โ”‚   โ”‚                          # - Login interface
โ”‚   โ”‚                          # - Dashboard UI
โ”‚   โ”‚                          # - Data tables
โ”‚   โ”‚                          # - Charts & visualizations
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ ๐Ÿ“„ app.js              # Frontend Application Logic
โ”‚                               # - API communication
โ”‚                               # - State management
โ”‚                               # - UI interactions
โ”‚                               # - Export functionality
โ”‚
โ”œโ”€โ”€ ๐Ÿ“„ local_server.py         # Local development server
โ”œโ”€โ”€ ๐Ÿ“„ requirements.txt        # Python dependencies
โ”œโ”€โ”€ ๐Ÿ“„ vercel.json            # Vercel deployment config
โ”œโ”€โ”€ ๐Ÿ“„ .gitignore             # Git ignore rules
โ””โ”€โ”€ ๐Ÿ“„ README.md              # Project documentation

๐Ÿ” Keamanan & Autentikasi

Authentication Flow

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    AUTHENTICATION FLOW                           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚  Client  โ”‚                              โ”‚   Flask Server   โ”‚
  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜                              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚                                             โ”‚
       โ”‚  1. POST /api/auth/login                    โ”‚
       โ”‚     {username, password}                    โ”‚
       โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚
       โ”‚                                             โ”‚
       โ”‚                                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
       โ”‚                                   โ”‚ 2. Hash password  โ”‚
       โ”‚                                   โ”‚    with SHA-256   โ”‚
       โ”‚                                   โ”‚                   โ”‚
       โ”‚                                   โ”‚ 3. Compare with   โ”‚
       โ”‚                                   โ”‚    stored hash    โ”‚
       โ”‚                                   โ”‚                   โ”‚
       โ”‚                                   โ”‚ 4. Generate token โ”‚
       โ”‚                                   โ”‚    if valid       โ”‚
       โ”‚                                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚                                             โ”‚
       โ”‚  5. Response                                โ”‚
       โ”‚     {token, user_info, wilayah_akses}       โ”‚
       โ”‚โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
       โ”‚                                             โ”‚
       โ”‚  6. Store token in localStorage             โ”‚
       โ”‚                                             โ”‚
       โ”‚  7. Subsequent requests with                โ”‚
       โ”‚     Authorization: Bearer <token>           โ”‚
       โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚
       โ”‚                                             โ”‚
       โ”‚                                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
       โ”‚                                   โ”‚ 8. Verify token   โ”‚
       โ”‚                                   โ”‚    & permissions  โ”‚
       โ”‚                                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚                                             โ”‚
       โ”‚  9. Protected data response                 โ”‚
       โ”‚โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
       โ”‚                                             โ”‚

Security Features

1. Password Security

# Password hashing menggunakan SHA-256
import hashlib

def hash_password(password):
    return hashlib.sha256(password.encode()).hexdigest()

# Password tidak pernah disimpan dalam plain text
# Hanya hash yang disimpan dan dibandingkan

2. Token-Based Authentication

  • Bearer Token: Setiap request API memerlukan token di header
  • Token Validation: Server memvalidasi token pada setiap request
  • Session Management: Token disimpan di localStorage browser

3. Role-Based Access Control (RBAC)

PermissionSuper AdminAdmin PusatAdmin Wilayah
View Dashboardโœ…โœ…โœ…
View All Wilayahโœ…โœ…โŒ
View Own Wilayahโœ…โœ…โœ…
CRUD Kategori 1โœ…โŒโŒ
CRUD Kategori 2โœ…โŒโŒ
CRUD Dokumentasiโœ…โœ…โœ… (own)
Export CSVโœ…โœ…โœ…

4. Data Access Control

# Wilayah-based data filtering
WILAYAH_PROVINSI_MAPPING = {
    "1": ["Aceh", "Sumatera Utara", ...],      # Wilayah 1
    "2": ["DKI Jakarta", "Jawa Barat", ...],   # Wilayah 2
    "3": ["Kalimantan Barat", "Papua", ...]    # Wilayah 3
}

# Admin Wilayah hanya dapat mengakses data wilayahnya
def filter_by_user_access(data, user):
    if user.role == "admin_wilayah":
        return [d for d in data if d.wilayah_id == user.wilayah_akses]
    return data

5. Security Headers & CORS

# CORS Configuration
CORS(app, resources={
    r"/api/*": {
        "origins": ["*"],  # Configure for production
        "methods": ["GET", "POST", "PUT", "DELETE"],
        "allow_headers": ["Content-Type", "Authorization"]
    }
})

6. Input Validation

  • URL validation untuk Google Drive links
  • Input sanitization untuk mencegah injection
  • Type checking pada semua API endpoints

Security Best Practices Implemented

PracticeStatusDescription
Password Hashingโœ…SHA-256 encryption
Token Authenticationโœ…Bearer token pada setiap request
Role-Based Accessโœ…3 level akses berbeda
CORS Protectionโœ…Configured Flask-CORS
HTTPS Enforcementโœ…Via Vercel SSL/TLS
Input Validationโœ…URL & data validation
Error Handlingโœ…Generic error messages

๐Ÿ“Š Struktur Database

Entity Relationship Diagram

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    DATABASE SCHEMA (IN-MEMORY)                       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚     USERS       โ”‚       โ”‚    WILAYAH      โ”‚       โ”‚    PROVINSI     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค       โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค       โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ username (PK)   โ”‚       โ”‚ id (PK)         โ”‚โ”€โ”€โ”    โ”‚ id (PK)         โ”‚
โ”‚ password_hash   โ”‚       โ”‚ kode_wilayah    โ”‚  โ”‚    โ”‚ kode            โ”‚
โ”‚ nama_lengkap    โ”‚       โ”‚ nama_wilayah    โ”‚  โ”‚    โ”‚ nama            โ”‚
โ”‚ role            โ”‚       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚    โ”‚ wilayah_id (FK) โ”‚โ”€โ”€โ”
โ”‚ wilayah_akses   โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚ provinsi_akses  โ”‚                                                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                                        โ”‚
                                                                           โ”‚
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚      KATEGORI1          โ”‚         โ”‚      KATEGORI2          โ”‚
โ”‚  (Kesesuaian Dokumen)   โ”‚         โ”‚   (Data Luas Kumuh)     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค         โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ id (PK)                 โ”‚         โ”‚ id (PK)                 โ”‚
โ”‚ wilayah_id (FK)         โ”‚         โ”‚ wilayah_id (FK)         โ”‚
โ”‚ provinsi                โ”‚         โ”‚ provinsi                โ”‚
โ”‚ kab_kota                โ”‚         โ”‚ kab_kota                โ”‚
โ”‚ ba (0/1/2)              โ”‚         โ”‚ metode                  โ”‚
โ”‚ matriks (0/1/2)         โ”‚         โ”‚ total_luas              โ”‚
โ”‚ shp (0/1/2)             โ”‚         โ”‚ luas_kab                โ”‚
โ”‚ link_matriks            โ”‚         โ”‚ luas_prov               โ”‚
โ”‚ link_shp                โ”‚         โ”‚ luas_pusat              โ”‚
โ”‚ link_ba                 โ”‚         โ”‚ link_lokasi             โ”‚
โ”‚ catatan                 โ”‚         โ”‚ link_peta               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚ link_ba                 โ”‚
                                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚     DOKUMENTASI         โ”‚
โ”‚   (Manajemen Surat)     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ id (PK)                 โ”‚
โ”‚ wilayah_id (FK)         โ”‚
โ”‚ kategori                โ”‚
โ”‚ nomor_surat             โ”‚
โ”‚ tanggal                 โ”‚
โ”‚ perihal                 โ”‚
โ”‚ pengirim                โ”‚
โ”‚ penerima                โ”‚
โ”‚ link_dokumen            โ”‚
โ”‚ keterangan              โ”‚
โ”‚ created_by              โ”‚
โ”‚ created_at              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Data Models

Users Collection

USERS = {
    "super_admin": {
        "username": "super_admin",
        "password_hash": "sha256_hash",  # superadmin123
        "nama_lengkap": "Super Administrator",
        "role": "super_admin",
        "wilayah_akses": "ALL",
        "provinsi_akses": None
    },
    "admin_pusat": {
        "username": "admin_pusat",
        "password_hash": "sha256_hash",  # admin123
        "nama_lengkap": "Admin Pusat",
        "role": "admin_pusat",
        "wilayah_akses": "ALL",
        "provinsi_akses": None
    },
    # ... admin_wil1, admin_wil2, admin_wil3
}

Status Values

ValueStatusIconDeskripsi
0Tidak AdaโŒDokumen tidak tersedia
1Perlu Perbaikanโš ๏ธDokumen ada tapi perlu revisi
2Lengkap/Sesuaiโœ…Dokumen lengkap dan sesuai

๐Ÿ“ก API Documentation

Base URL

Production: https://your-domain.vercel.app/api
Local:      http://localhost:8000/api

Authentication Endpoints

Login

POST /api/auth/login
Content-Type: application/json

{
    "username": "string",
    "password": "string"
}

Response (200 OK):

{
    "status": "success",
    "token": "generated_token_string",
    "user": {
        "username": "admin_pusat",
        "nama_lengkap": "Admin Pusat",
        "role": "admin_pusat",
        "wilayah_akses": "ALL"
    }
}

Get Current User

GET /api/auth/me
Authorization: Bearer <token>

Data Endpoints

Get Wilayah

GET /api/wilayah
Authorization: Bearer <token>

Response:

{
    "status": "success",
    "data": [
        {"id": 1, "kode_wilayah": "WIL1", "nama_wilayah": "Wilayah 1"},
        {"id": 2, "kode_wilayah": "WIL2", "nama_wilayah": "Wilayah 2"},
        {"id": 3, "kode_wilayah": "WIL3", "nama_wilayah": "Wilayah 3"}
    ]
}

Get Provinsi

GET /api/provinsi?wilayah_id=1
Authorization: Bearer <token>

Get Kategori 1 (Kesesuaian Dokumen)

GET /api/kategori1?wilayah_id=1&provinsi=Aceh
Authorization: Bearer <token>

Response:

{
    "status": "success",
    "data": [
        {
            "id": 1,
            "wilayah_id": 1,
            "provinsi": "Aceh",
            "kab_kota": "Kota Banda Aceh",
            "ba": 2,
            "matriks": 2,
            "shp": 1,
            "link_matriks": "https://drive.google.com/...",
            "link_shp": "https://drive.google.com/...",
            "link_ba": "https://drive.google.com/...",
            "catatan": "Shapefile perlu revisi koordinat"
        }
    ]
}

Get Kategori 2 (Data Luas Kumuh)

GET /api/kategori2?wilayah_id=1
Authorization: Bearer <token>

Response:

{
    "status": "success",
    "data": [
        {
            "id": 1,
            "wilayah_id": 1,
            "provinsi": "Aceh",
            "kab_kota": "Kota Banda Aceh",
            "metode": "Desk & Survei",
            "total_luas": 150.5,
            "luas_kab": 50.0,
            "luas_prov": 45.5,
            "luas_pusat": 55.0,
            "link_lokasi": "https://drive.google.com/...",
            "link_peta": "https://drive.google.com/...",
            "link_ba": "https://drive.google.com/..."
        }
    ]
}

Get Dokumentasi

GET /api/dokumentasi?kategori=Surat%20Masuk
Authorization: Bearer <token>

Dashboard Endpoints

Get Statistics

GET /api/dashboard/stats
Authorization: Bearer <token>

Response:

{
    "status": "success",
    "data": {
        "total_dokumen": 71,
        "total_luas": 3250.75,
        "dokumen_lengkap": 45,
        "total_area": 21
    }
}

Get Chart Data

GET /api/dashboard/chart-data
Authorization: Bearer <token>

CRUD Operations (Super Admin Only)

Create Kategori 1

POST /api/kategori1
Authorization: Bearer <token>
Content-Type: application/json

{
    "wilayah_id": 1,
    "provinsi": "Aceh",
    "kab_kota": "Kota Sabang",
    "ba": 0,
    "matriks": 0,
    "shp": 0,
    "catatan": "Data baru"
}

Update Kategori 1

PUT /api/kategori1/1
Authorization: Bearer <token>
Content-Type: application/json

{
    "ba": 2,
    "link_ba": "https://drive.google.com/..."
}

Delete Kategori 1

DELETE /api/kategori1/1
Authorization: Bearer <token>

Error Responses

// 401 Unauthorized
{
    "status": "error",
    "message": "Token tidak valid atau sudah kadaluarsa"
}

// 403 Forbidden
{
    "status": "error",
    "message": "Anda tidak memiliki akses ke resource ini"
}

// 404 Not Found
{
    "status": "error",
    "message": "Data tidak ditemukan"
}

๐Ÿš€ Instalasi & Deployment

Prerequisites

  • Python 3.9 atau lebih tinggi
  • pip (Python package manager)
  • Git
  • Node.js (untuk Vercel CLI, opsional)

Local Development

1. Clone Repository

git clone https://github.com/your-username/databasekumuhbangkim.git
cd databasekumuhbangkim

2. Setup Virtual Environment

# Buat virtual environment
python -m venv venv

# Aktivasi (Linux/Mac)
source venv/bin/activate

# Aktivasi (Windows)
venv\Scripts\activate

3. Install Dependencies

pip install -r requirements.txt

4. Run Local Server

python local_server.py

Server akan berjalan di http://localhost:8000

Production Deployment (Vercel)

1. Install Vercel CLI

npm i -g vercel

2. Login to Vercel

vercel login

3. Deploy

# Deploy to preview
vercel

# Deploy to production
vercel --prod

Configuration Files

vercel.json

{
  "version": 2,
  "builds": [
    {
      "src": "api/index.py",
      "use": "@vercel/python"
    },
    {
      "src": "public/**",
      "use": "@vercel/static"
    }
  ],
  "routes": [
    {
      "src": "/api/(.*)",
      "dest": "/api/index.py"
    },
    {
      "src": "/(.*)",
      "dest": "/public/$1"
    }
  ]
}

requirements.txt

Flask==3.0.0
Flask-CORS==4.0.0
Flask-JWT-Extended==4.6.0
Werkzeug==3.0.1

๐Ÿ“– Penggunaan

Login

  1. Buka aplikasi di browser
  2. Masukkan kredensial sesuai role:
RoleUsernamePassword
Super Administratorsuper_adminsuperadmin123
Admin Pusatadmin_pusatadmin123
Admin Wilayah 1admin_wil1wilayah1
Admin Wilayah 2admin_wil2wilayah2
Admin Wilayah 3admin_wil3wilayah3

Dashboard

Setelah login, dashboard akan menampilkan:

  • Statistik overview (total dokumen, luas, kelengkapan)
  • Chart distribusi data
  • Quick access ke semua modul

Navigasi Menu

๐Ÿ“Š Dashboard       โ†’ Overview dan statistik
๐Ÿ“ Kategori 1      โ†’ Data kesesuaian dokumen
๐Ÿ“ Kategori 2      โ†’ Data luas kawasan kumuh
๐Ÿ“ Dokumentasi     โ†’ Manajemen surat dan dokumen
๐Ÿ‘ค Profile         โ†’ Informasi user
๐Ÿšช Logout          โ†’ Keluar dari sistem

Export Data

  1. Buka halaman data yang ingin di-export
  2. Klik tombol "Export CSV"
  3. File akan otomatis ter-download

๐Ÿ‘ฅ Roles & Permissions

Super Administrator

Akses Penuh ke Seluruh Sistem

โœ… Lihat semua data (Wilayah 1, 2, 3)
โœ… Tambah data baru (Kategori 1 & 2)
โœ… Edit data existing
โœ… Hapus data
โœ… Kelola dokumentasi
โœ… Export semua data
โœ… Akses dashboard lengkap

Admin Pusat

Akses View ke Seluruh Data

โœ… Lihat semua data (Wilayah 1, 2, 3)
โŒ Tambah/Edit/Hapus Kategori 1 & 2
โœ… Kelola dokumentasi (Pusat)
โœ… Export semua data
โœ… Akses dashboard lengkap

Admin Wilayah

Akses Terbatas pada Wilayah Sendiri

โœ… Lihat data wilayah sendiri saja
โŒ Tambah/Edit/Hapus Kategori 1 & 2
โœ… Kelola dokumentasi (Wilayah sendiri)
โœ… Export data wilayah sendiri
โœ… Akses dashboard (filtered)

Permission Matrix

FeatureSuper AdminAdmin PusatAdmin Wil 1Admin Wil 2Admin Wil 3
View Wilayah 1โœ…โœ…โœ…โŒโŒ
View Wilayah 2โœ…โœ…โŒโœ…โŒ
View Wilayah 3โœ…โœ…โŒโŒโœ…
CRUD Kategori 1โœ…โŒโŒโŒโŒ
CRUD Kategori 2โœ…โŒโŒโŒโŒ
CRUD Dokumentasiโœ…โœ…โœ…โœ…โœ…

๐Ÿ—บ๏ธ Roadmap Pengembangan

Phase 1: Foundation (Completed โœ…)

  • Setup project structure
  • Implement authentication system
  • Create role-based access control
  • Build dashboard with statistics
  • Develop Kategori 1 module
  • Develop Kategori 2 module
  • Implement documentation management
  • Deploy to Vercel

Phase 2: Data Persistence (Q1 2026)

  • Migrate to PostgreSQL/Supabase database
  • Implement data backup & recovery
  • Add data versioning (audit trail)
  • Create admin panel for user management
  • Implement proper session management with refresh tokens

Phase 3: Enhanced Features (Q2 2026)

  • Advanced filtering & search
  • Bulk import from Excel/CSV
  • Automated report generation (PDF)
  • Email notifications
  • Data validation rules
  • Map visualization (Leaflet/Mapbox integration)

Phase 4: Integration & Automation (Q3 2026)

  • Google Drive API integration (real-time sync)
  • SSO integration (Google/Microsoft)
  • Mobile responsive optimization
  • PWA (Progressive Web App) support
  • API rate limiting
  • Webhook notifications

Phase 5: Analytics & AI (Q4 2026)

  • Advanced analytics dashboard
  • Trend analysis & predictions
  • Automated data quality checks
  • AI-powered document classification
  • Natural language query interface

Phase 6: Enterprise Features (2027)

  • Multi-tenant architecture
  • Custom role creation
  • Workflow automation
  • Integration dengan SIMBG/OSS
  • Open API untuk third-party integration
  • High availability & disaster recovery

๐Ÿค Contributing

Kami menyambut kontribusi dari semua pihak! Berikut panduan untuk berkontribusi:

Getting Started

  1. Fork repository ini
  2. Clone fork ke local machine
  3. Create branch untuk fitur baru
  4. Commit perubahan dengan pesan yang jelas
  5. Push ke fork
  6. Submit Pull Request

Branch Naming Convention

feature/   โ†’ Fitur baru (feature/add-export-pdf)
bugfix/    โ†’ Perbaikan bug (bugfix/fix-login-error)
hotfix/    โ†’ Perbaikan urgent (hotfix/security-patch)
docs/      โ†’ Dokumentasi (docs/update-readme)
refactor/  โ†’ Refactoring code (refactor/cleanup-api)

Commit Message Format

type(scope): description

# Examples:
feat(auth): add JWT refresh token
fix(dashboard): correct chart rendering
docs(readme): update installation guide
refactor(api): improve error handling

Code Style Guidelines

Python (Backend):

  • Follow PEP 8 style guide
  • Use meaningful variable names
  • Add docstrings to functions
  • Handle exceptions appropriately

JavaScript (Frontend):

  • Use ES6+ syntax
  • Keep functions small and focused
  • Comment complex logic
  • Use consistent naming

Pull Request Process

  1. Update README.md jika ada perubahan interface
  2. Update requirements.txt jika ada dependency baru
  3. Pastikan semua test pass
  4. Request review dari maintainer
  5. Tunggu approval sebelum merge

๐Ÿ“„ Lisensi

Proyek ini dilisensikan di bawah MIT License.

MIT License

Copyright (c) 2024 Database Kumuh Bangkim

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

๐Ÿ“ž Kontak & Support

Technical Support

Development Team

  • Lead Developer: Tim IT Bangkim
  • UI/UX: Tim IT Bangkim
  • DevOps: Tim IT Bangkim

Useful Links


<p align="center"> <strong>Database Kumuh Bangkim</strong><br> <em>Sistem Informasi Terpadu Pengelolaan Data Kawasan Permukiman Kumuh Indonesia</em><br><br> Direktorat Jenderal Perumahan<br> Kementerian Pekerjaan Umum dan Perumahan Rakyat<br><br> <img src="https://img.shields.io/badge/Made%20with-โค๏ธ-red" alt="Made with love"> <img src="https://img.shields.io/badge/Indonesia-๐Ÿ‡ฎ๐Ÿ‡ฉ-red" alt="Indonesia"> </p> # Vercel-GitHub Integration Test Last verified: 2026-03-26 09:07 UTC # Verified: 2026-03-26 09:10 UTC

File Utama

  • .SYNC_TEST
  • .gitignore
  • ADD_MISSING_ENTRIES.py
  • ALL_KALBAR_LINKS.json
  • BATCH_COLLECT.py
  • COMPLETE_COLLECTION.py
  • COMPLETE_REMAINING.py
  • CONTINUE_COLLECTION.py