678 lines
29 KiB
Markdown
678 lines
29 KiB
Markdown
# Dokumentasi Struktur Proyek - Desa Darmasaba
|
|
|
|
## 1. Ringkasan Proyek
|
|
|
|
**Desa Darmasaba** adalah aplikasi web komprehensif untuk layanan pemerintahan desa di Desa Darmasaba, Kabupaten Badung, Bali. Aplikasi ini berfungsi sebagai platform digital untuk layanan pemerintah, informasi publik, dan keterlibatan masyarakat.
|
|
|
|
### Tech Stack
|
|
|
|
| Kategori | Teknologi |
|
|
|----------|-----------|
|
|
| **Framework Frontend** | Next.js 15 dengan App Router |
|
|
| **Bahasa** | TypeScript (strict mode) |
|
|
| **Styling** | Mantine UI v7/v8 + Custom CSS |
|
|
| **Backend API** | Elysia.js (high-performance TypeScript framework) |
|
|
| **Database** | PostgreSQL |
|
|
| **ORM** | Prisma 6.3.1 |
|
|
| **Runtime** | Bun |
|
|
| **State Management** | Jotai + Valtio + SWR |
|
|
| **Autentikasi** | iron-session + JWT |
|
|
| **File Storage** | Seafile |
|
|
| **Rich Text Editor** | TipTap |
|
|
| **Charts** | Recharts + Chart.js |
|
|
| **Maps** | Leaflet + react-leaflet |
|
|
| **UI Components** | Mantine, PrimeReact, Framer Motion |
|
|
| **Validasi** | Zod |
|
|
| **Testing** | Vitest (unit), Playwright (E2E) |
|
|
| **Deployment** | Docker + GitHub Actions + Portainer |
|
|
| **Registry** | GitHub Container Registry (GHCR) |
|
|
|
|
---
|
|
|
|
## 2. Struktur Direktori
|
|
|
|
```
|
|
desa-darmasaba/
|
|
├── .github/workflows/ # GitHub Actions CI/CD
|
|
│ ├── docker-publish.yml # Auto build & push saat tag v*
|
|
│ ├── publish.yml # Manual build & push ke GHCR
|
|
│ ├── re-pull.yml # Manual re-pull image di Portainer
|
|
│ └── script/ # Script deployment
|
|
│
|
|
├── prisma/
|
|
│ ├── schema.prisma # Database schema (2413 baris, 100+ model)
|
|
│ ├── seed.ts # Database seeder utama
|
|
│ └── _seeder_list/ # Data seed per modul
|
|
│ ├── desa/ # Seed berita, gallery, layanan, dll
|
|
│ ├── ekonomi/ # Seed APBDes, demografi, dll
|
|
│ ├── inovasi/ # Seed ide inovatif, desa digital
|
|
│ ├── keamanan/ # Seed keamanan, kontak darurat
|
|
│ ├── kesehatan/ # Seed fasilitas kesehatan, posyandu
|
|
│ ├── kependudukan/ # Seed data penduduk
|
|
│ ├── lingkungan/ # Seed lingkungan desa
|
|
│ ├── pendidikan/ # Seed sekolah, beasiswa
|
|
│ ├── ppid/ # Seed PPID
|
|
│ └── landing-page/ # Seed landing page
|
|
│
|
|
├── src/
|
|
│ ├── app/ # Next.js App Router
|
|
│ │ ├── _com/ # Komponen global (SplashScreen, WebVitals)
|
|
│ │ ├── admin/ # Panel administrasi (protected)
|
|
│ │ │ ├── _com/ # Komponen admin shared
|
|
│ │ │ ├── (dashboard)/ # Dashboard admin dengan route groups
|
|
│ │ │ │ ├── _com/ # Komponen dashboard shared
|
|
│ │ │ │ ├── _state/ # State khusus dashboard
|
|
│ │ │ │ ├── _utils/ # Utilitas dashboard
|
|
│ │ │ │ ├── auth/ # Autentikasi admin
|
|
│ │ │ │ ├── desa/ # Admin: berita, gallery, profil, layanan
|
|
│ │ │ │ ├── ekonomi/ # Admin: APBDes, demografi, BUMDes
|
|
│ │ │ │ ├── inovasi/ # Admin: ide inovatif, desa digital
|
|
│ │ │ │ ├── keamanan/ # Admin: keamanan, kontak darurat
|
|
│ │ │ │ ├── kependudukan/# Admin: banjar, agama, umur, migrasi
|
|
│ │ │ │ ├── kesehatan/ # Admin: puskesmas, posyandu, wabah
|
|
│ │ │ │ ├── landing-page/# Admin: konten landing page
|
|
│ │ │ │ ├── lingkungan/ # Admin: konservasi, sampah, penghijauan
|
|
│ │ │ │ ├── musik/ # Admin: musik desa
|
|
│ │ │ │ ├── pendidikan/ # Admin: sekolah, beasiswa, perpustakaan
|
|
│ │ │ │ ├── ppid/ # Admin: PPID, IKM, permohonan
|
|
│ │ │ │ └── user&role/ # Admin: manajemen user & role
|
|
│ │ │ ├── auth/ # Halaman login admin
|
|
│ │ │ ├── csv/ # Upload/demo CSV
|
|
│ │ │ ├── images/ # Manajemen gambar
|
|
│ │ │ └── upload-demo/ # Demo upload
|
|
│ │ │
|
|
│ │ ├── api/ # API routes (Elysia.js)
|
|
│ │ │ ├── [[...slugs]]/ # Catch-all route untuk Elysia
|
|
│ │ │ │ ├── _lib/ # Modul API per domain
|
|
│ │ │ │ │ ├── auth/ # Autentikasi API
|
|
│ │ │ │ │ ├── desa/ # API modul desa
|
|
│ │ │ │ │ ├── ekonomi/ # API modul ekonomi
|
|
│ │ │ │ │ ├── fileStorage/ # API file storage
|
|
│ │ │ │ │ ├── inovasi/ # API modul inovasi
|
|
│ │ │ │ │ ├── keamanan/# API modul keamanan
|
|
│ │ │ │ │ ├── kependudukan/ # API modul kependudukan
|
|
│ │ │ │ │ ├── kesehatan/ # API modul kesehatan
|
|
│ │ │ │ │ ├── landing_page/ # API landing page
|
|
│ │ │ │ │ ├── lingkungan/ # API modul lingkungan
|
|
│ │ │ │ │ ├── pendidikan/ # API modul pendidikan
|
|
│ │ │ │ │ ├── ppid/ # API modul PPID
|
|
│ │ │ │ │ ├── search/ # API pencarian global
|
|
│ │ │ │ │ └── user/ # API user management
|
|
│ │ │ │ └── route.ts # Entry point Elysia server
|
|
│ │ │ ├── admin/ # API khusus admin
|
|
│ │ │ ├── auth/ # API autentikasi
|
|
│ │ │ ├── health/ # Health check endpoint
|
|
│ │ │ ├── layout/ # API layout
|
|
│ │ │ ├── news/ # API berita
|
|
│ │ │ ├── subscribe/ # API subscription (email)
|
|
│ │ │ └── tts/ # Text-to-Speech (ElevenLabs)
|
|
│ │ │
|
|
│ │ ├── context/ # React contexts
|
|
│ │ │ └── MusicContext.tsx # Context untuk pemutar musik
|
|
│ │ │
|
|
│ │ ├── darmasaba/ # Halaman publik (front-facing)
|
|
│ │ │ ├── _com/ # Komponen shared publik
|
|
│ │ │ │ ├── main-page/ # Komponen halaman utama
|
|
│ │ │ │ ├── Navbar.tsx # Navigasi utama
|
|
│ │ │ │ ├── Footer.tsx # Footer
|
|
│ │ │ │ ├── FixedPlayerBar.tsx # Music player bar
|
|
│ │ │ │ ├── LoadDataFirstClient.tsx # Data prefetching
|
|
│ │ │ │ ├── NewsReader.tsx # Component pembaca berita
|
|
│ │ │ │ ├── globalSearch.tsx # Pencarian global
|
|
│ │ │ │ └── scrollToTopButton.tsx
|
|
│ │ │ ├── (pages)/ # Halaman publik utama
|
|
│ │ │ │ ├── desa/ # Halaman: profil, berita, gallery, layanan
|
|
│ │ │ │ ├── ekonomi/ # Halaman: APBDes, BUMDes, demografi
|
|
│ │ │ │ ├── inovasi/ # Halaman: inovasi desa
|
|
│ │ │ │ ├── keamanan/ # Halaman: keamanan lingkungan
|
|
│ │ │ │ ├── kependudukan/# Halaman: data penduduk
|
|
│ │ │ │ ├── kesehatan/ # Halaman: fasilitas kesehatan
|
|
│ │ │ │ ├── lingkungan/ # Halaman: lingkungan desa
|
|
│ │ │ │ ├── module/ # Halaman modul tambahan
|
|
│ │ │ │ ├── musik/ # Halaman: musik desa
|
|
│ │ │ │ ├── pendidikan/ # Halaman: pendidikan
|
|
│ │ │ │ └── ppid/ # Halaman: PPID publik
|
|
│ │ │ ├── (tambahan)/ # Halaman tambahan
|
|
│ │ │ ├── layout.tsx # Layout utama publik
|
|
│ │ │ └── page.tsx # Landing page utama
|
|
│ │ │
|
|
│ │ ├── login/ # Halaman login
|
|
│ │ ├── registrasi/ # Halaman registrasi
|
|
│ │ ├── waiting-room/ # Halaman waiting room
|
|
│ │ ├── terms-of-service/ # Halaman syarat layanan
|
|
│ │ ├── test-upload/ # Halaman tes upload
|
|
│ │ ├── validasi/ # Halaman validasi
|
|
│ │ ├── coba/ # Halaman percobaan
|
|
│ │ ├── percobaan/ # Halaman percobaan lainnya
|
|
│ │ ├── layout.tsx # Root layout (MantineProvider)
|
|
│ │ ├── page.tsx # Root page
|
|
│ │ ├── error.tsx # Error boundary
|
|
│ │ ├── not-found.tsx # 404 page
|
|
│ │ ├── globals.css # Global styles
|
|
│ │ └── favicon.ico
|
|
│ │
|
|
│ ├── components/
|
|
│ │ └── admin/ # Komponen admin reusable
|
|
│ │ ├── AdminThemeProvider.tsx
|
|
│ │ ├── DarkModeToggle.tsx
|
|
│ │ ├── UnifiedSurface.tsx
|
|
│ │ └── UnifiedTypography.tsx
|
|
│ │
|
|
│ ├── con/ # Constants & konfigurasi
|
|
│ │ └── colors.ts # Palet warna
|
|
│ │
|
|
│ ├── lib/ # Utility functions
|
|
│ │ ├── router/ # Router utilities
|
|
│ │ ├── api-auth.ts # Autentikasi API
|
|
│ │ ├── api-fetch.ts # Helper fetch API
|
|
│ │ ├── EnvStringParse.ts # Parser environment variables
|
|
│ │ ├── prisma.ts # Prisma client instance
|
|
│ │ ├── seafile-auth-service.ts # Integrasi Seafile
|
|
│ │ └── session.ts # iron-session helper
|
|
│ │
|
|
│ ├── middlewares/ # Next.js middleware
|
|
│ ├── state/ # Global state (Jotai/Valtio)
|
|
│ │ ├── darkModeStore.ts # State dark mode
|
|
│ │ ├── state-layanan.ts # State layanan
|
|
│ │ ├── state-list-image.ts # State daftar gambar
|
|
│ │ └── state-nav.ts # State navigasi
|
|
│ │
|
|
│ ├── store/ # State management tambahan
|
|
│ └── types/ # TypeScript type definitions
|
|
│
|
|
├── public/ # Static assets
|
|
│ └── assets/ # Gambar, icon, dll
|
|
│
|
|
├── uploads/ # Directory upload (runtime)
|
|
│ └── image/ # Upload gambar
|
|
│
|
|
├── .env.example # Contoh environment variables
|
|
├── .gitignore
|
|
├── AGENTS.md # Panduan untuk AI coding agents
|
|
├── Dockerfile # Docker image definition
|
|
├── docker-entrypoint.sh # Entry point container
|
|
├── next.config.ts # Next.js configuration
|
|
├── package.json # Dependencies & scripts
|
|
├── tsconfig.json # TypeScript configuration
|
|
├── biome.json # Biome linter config
|
|
├── eslint.config.mjs # ESLint config
|
|
├── NOTE.md # Catatan deployment
|
|
└── QWEN.md # Konteks & memori proyek
|
|
```
|
|
|
|
---
|
|
|
|
## 3. Arsitektur Aplikasi
|
|
|
|
### 3.1 Arsitektur Keseluruhan
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ Client (Browser) │
|
|
└────────────┬────────────────────────────┬────────────────┘
|
|
│ │
|
|
│ Next.js Pages │ API Calls
|
|
│ (SSR/CSR) │
|
|
▼ ▼
|
|
┌────────────────────────┐ ┌────────────────────────────┐
|
|
│ Next.js 15 App Router│ │ Elysia.js API Server │
|
|
│ - Pages publik │ │ - RESTful endpoints │
|
|
│ - Admin dashboard │ │ - File upload │
|
|
│ - Server components │ │ - Swagger docs (/api/docs│
|
|
│ - Client components │ │ - Static file serving │
|
|
└────────────┬───────────┘ └────────────┬───────────────┘
|
|
│ │
|
|
│ │
|
|
▼ ▼
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ PostgreSQL Database │
|
|
│ (via Prisma ORM) │
|
|
└─────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ Seafile File Storage │
|
|
│ (Images & Documents) │
|
|
└─────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 3.2 Next.js App Router
|
|
|
|
- Menggunakan **App Router** (bukan Pages Router)
|
|
- Route groups `(dashboard)`, `(pages)`, `(tambahan)` untuk organisasi tanpa mempengaruhi URL
|
|
- Layout bersarang: root layout -> admin/darmasaba layout -> page layouts
|
|
- `force-dynamic` digunakan untuk menghindari error prerendering
|
|
- View Transitions API diaktifkan via `next-view-transitions`
|
|
|
|
### 3.3 Elysia.js API Server
|
|
|
|
- Terintegrasi sebagai **catch-all route** di `/api/[[...slugs]]/route.ts`
|
|
- Semua HTTP methods (GET, POST, PATCH, DELETE, PUT) di-handle oleh Elysia
|
|
- Plugin yang digunakan:
|
|
- `@elysiajs/cors` - CORS configuration
|
|
- `@elysiajs/static` - Static file serving dari `/uploads`
|
|
- `@elysiajs/swagger` - API documentation di `/api/docs`
|
|
- `@elysiajs/jwt` - JWT authentication
|
|
- `@elysiajs/cookie` - Cookie handling
|
|
- Endpoint file upload: `/api/upl-img`, `/api/upl-img-single`, `/api/upl-csv`
|
|
- Image serving: `/api/img/:name` dengan resize support
|
|
|
|
### 3.4 Rendering Strategy
|
|
|
|
- **Server Components**: Halaman publik untuk SEO optimal
|
|
- **Client Components**: Komponen interaktif (form, state, animasi)
|
|
- **Force Dynamic**: Beberapa halaman menggunakan `force-dynamic`
|
|
- **ISR**: Caching header untuk assets (1 jam cache)
|
|
|
|
---
|
|
|
|
## 4. Modul Domain
|
|
|
|
### 4.1 Profil Desa (Desa)
|
|
**Admin**: `/admin/desa/*` | **Publik**: `/darmasaba/desa/*`
|
|
|
|
| Sub-modul | Fungsi |
|
|
|-----------|--------|
|
|
| `berita` | CRUD berita/pengumuman desa |
|
|
| `gallery` | Galeri foto dan video |
|
|
| `layanan` | Manajemen layanan desa |
|
|
| `penghargaan` | Penghargaan yang diraih |
|
|
| `pengumuman` | Pengumuman publik |
|
|
| `potensi` | Potensi desa (pertanian, pariwisata, dll) |
|
|
| `profil` | Profil desa (sejarah, visi misi, lambang, maskot, perangkat) |
|
|
|
|
### 4.2 PPID (Pejabat Pengelola Informasi dan Dokumentasi)
|
|
**Admin**: `/admin/ppid/*` | **Publik**: `/darmasaba/ppid/*`
|
|
|
|
| Sub-modul | Fungsi |
|
|
|-----------|--------|
|
|
| `profil-ppid` | Profil pejabat PPID |
|
|
| `struktur-ppid` | Struktur organisasi PPID |
|
|
| `visi-misi-ppid` | Visi dan misi PPID |
|
|
| `daftar-informasi-publik` | Daftar informasi yang tersedia |
|
|
| `dasar-hukum` | Dasar hukum PPID |
|
|
| `permohonan-informasi-publik` | Form permohonan informasi |
|
|
| `permohonan-keberatan-informasi-publik` | Form keberatan |
|
|
| `indeks-kepuasan-masyarakat` | Survei kepuasan masyarakat (IKM) |
|
|
|
|
### 4.3 Kesehatan
|
|
**Admin**: `/admin/kesehatan/*` | **Publik**: `/darmasaba/kesehatan/*`
|
|
|
|
| Sub-modul | Fungsi |
|
|
|-----------|--------|
|
|
| `fasilitas-kesehatan` | Data puskesmas, klinik, dokter |
|
|
| `posyandu` | Manajemen posyandu |
|
|
| `program-kesehatan` | Program kesehatan desa |
|
|
| `info-wabah-penyakit` | Informasi wabah |
|
|
| `penanganan-darurat` | Prosedur penanganan darurat |
|
|
| `kontak-darurat` | Kontak darurat kesehatan |
|
|
| `data-kesehatan-warga` | Statistik kesehatan warga |
|
|
| `artikel-kesehatan` | Artikel kesehatan |
|
|
|
|
### 4.4 Ekonomi
|
|
**Admin**: `/admin/ekonomi/*` | **Publik**: `/darmasaba/ekonomi/*`
|
|
|
|
| Sub-modul | Fungsi |
|
|
|-----------|--------|
|
|
| `APBDes` | Anggaran Pendapatan dan Belanja Desa (hierarki items + realisasi) |
|
|
| `PADesa-pendapatan-asli-desa` | Pendapatan asli desa |
|
|
| `demografi-pekerjaan` | Demografi pekerjaan penduduk |
|
|
| `jumlah-penduduk-miskin` | Data penduduk miskin |
|
|
| `jumlah-pengangguran` | Data pengangguran |
|
|
| `lowongan-kerja-lokal` | Lowongan kerja lokal |
|
|
| `pasar-desa` | Data pasar desa |
|
|
| `program-kemiskinan` | Program penanganan kemiskinan |
|
|
| `sektor-unggulan-desa` | Sektor unggulan ekonomi |
|
|
| `Struktur-Organisasi-Dan-Sk-Pengurus-BumDes` | Struktur BUMDes |
|
|
|
|
### 4.5 Kependudukan
|
|
**Admin**: `/admin/kependudukan/*` | **Publik**: `/darmasaba/kependudukan/*`
|
|
|
|
| Sub-modul | Fungsi |
|
|
|-----------|--------|
|
|
| `data-banjar` | Data banjar (unit wilayah tradisional Bali) |
|
|
| `distribusi-agama` | Distribusi agama penduduk |
|
|
| `distribusi-umur` | Distribusi umur penduduk |
|
|
| `migrasi-penduduk` | Data migrasi (masuk/keluar) |
|
|
|
|
### 4.6 Pendidikan
|
|
**Admin**: `/admin/pendidikan/*` | **Publik**: `/darmasaba/pendidikan/*`
|
|
|
|
| Sub-modul | Fungsi |
|
|
|-----------|--------|
|
|
| `beasiswa-desa` | Program beasiswa |
|
|
| `bimbingan-belajar-desa` | Bimbingan belajar |
|
|
| `data-pendidikan` | Data statistik pendidikan |
|
|
| `info-sekolah` | Informasi sekolah |
|
|
| `pendidikan-non-formal` | Pendidikan non-formal |
|
|
| `perpustakaan-digital` | Perpustakaan digital |
|
|
| `program-pendidikan-anak` | Program pendidikan anak |
|
|
|
|
### 4.7 Keamanan
|
|
**Admin**: `/admin/keamanan/*` | **Publik**: `/darmasaba/keamanan/*`
|
|
|
|
| Sub-modul | Fungsi |
|
|
|-----------|--------|
|
|
| `keamanan-lingkungan-pecalang-patwal` | Keamanan lingkungan (pecalang Bali) |
|
|
| `kontak-darurat` | Kontak darurat keamanan |
|
|
| `laporan-publik` | Laporan publik |
|
|
| `pencegahan-kriminalitas` | Pencegahan kriminalitas |
|
|
| `polsek-terdekat` | Data polsek terdekat |
|
|
| `tips-keamanan` | Tips keamanan |
|
|
|
|
### 4.8 Lingkungan
|
|
**Admin**: `/admin/lingkungan/*` | **Publik**: `/darmasaba/lingkungan/*`
|
|
|
|
| Sub-modul | Fungsi |
|
|
|-----------|--------|
|
|
| `data-lingkungan-desa` | Data lingkungan desa |
|
|
| `edukasi-lingkungan` | Edukasi lingkungan |
|
|
| `gotong-royong` | Kegiatan gotong royong |
|
|
| `konservasi-adat-bali` | Konservasi adat Bali |
|
|
| `pengelolaan-sampah-bank-sampah` | Bank sampah |
|
|
| `program-penghijauan` | Program penghijauan |
|
|
|
|
### 4.9 Inovasi
|
|
**Admin**: `/admin/inovasi/*` | **Publik**: `/darmasaba/inovasi/*`
|
|
|
|
| Sub-modul | Fungsi |
|
|
|-----------|--------|
|
|
| `ajukan-ide-inovatif` | Form pengajuan ide inovatif |
|
|
| `desa-digital-smart-village` | Program desa digital |
|
|
| `info-teknologi-tepat-guna` | Info teknologi tepat guna |
|
|
| `kolaborasi-inovasi` | Kolaborasi inovasi |
|
|
| `layanan-online-desa` | Layanan online desa |
|
|
| `program-kreatif-desa` | Program kreatif desa |
|
|
|
|
### 4.10 Musik Desa
|
|
**Admin**: `/admin/musik/*` | **Publik**: `/darmasaba/musik/*`
|
|
|
|
- Manajemen audio dan cover musik desa
|
|
- Fixed player bar di halaman publik
|
|
- Context provider untuk state pemutar musik
|
|
|
|
### 4.11 Landing Page
|
|
**Admin**: `/admin/landing-page/*`
|
|
|
|
| Sub-modul | Fungsi |
|
|
|-----------|--------|
|
|
| `desa-anti-korupsi` | Konten anti-korupsi |
|
|
| `prestasi-desa` | Prestasi yang diraih |
|
|
| `sdgs-desa` | SDGs (Sustainable Development Goals) |
|
|
| `profil-landing-page` | Profil dan media sosial |
|
|
|
|
### 4.12 User & Role
|
|
**Admin**: `/admin/user&role/*`
|
|
|
|
- Manajemen pengguna admin
|
|
- Manajemen role dan permission
|
|
- Manajemen menu akses
|
|
|
|
---
|
|
|
|
## 5. Database Schema
|
|
|
|
### 5.1 Overview
|
|
|
|
Database menggunakan **PostgreSQL** dengan **Prisma ORM** (versi 6.3.1).
|
|
Schema terdiri dari **2413 baris** dengan **100+ model**.
|
|
|
|
### 5.2 Model Utama
|
|
|
|
#### FileStorage
|
|
Model sentral untuk semua file (gambar, dokumen, audio):
|
|
```prisma
|
|
model FileStorage {
|
|
id String @id @default(cuid())
|
|
name String @unique
|
|
realName String
|
|
path String
|
|
mimeType String
|
|
category String // "image" / "document" / "audio" / "other"
|
|
link String
|
|
isActive Boolean @default(true)
|
|
// Relasi ke 50+ model lain (Berita, PotensiDesa, GalleryFoto, dll)
|
|
}
|
|
```
|
|
|
|
#### AppMenu & AppMenuChild
|
|
Menu navigasi aplikasi:
|
|
```prisma
|
|
model AppMenu {
|
|
id String @id @default(cuid())
|
|
name String @unique
|
|
link String
|
|
isActive Boolean @default(true)
|
|
AppMenuChild AppMenuChild[]
|
|
}
|
|
```
|
|
|
|
#### User & Role (Autentikasi Admin)
|
|
- `User` - Data pengguna admin
|
|
- `Role` - Role/peran pengguna
|
|
- `Menu` - Menu akses per role
|
|
|
|
#### Modul Desa
|
|
- `Berita` - Berita desa (dengan featured image & gallery)
|
|
- `GalleryFoto` / `GalleryVideo` - Galeri media
|
|
- `Layanan` - Layanan desa
|
|
- `Pengumuman` - Pengumuman
|
|
- `PotensiDesa` - Potensi desa
|
|
- `ProfileDesaImage` - Gambar profil desa
|
|
- `ProfilPerbekel` - Profil perbekel (kepala desa)
|
|
- `PejabatDesa` - Pejabat desa
|
|
- `Penghargaan` - Penghargaan
|
|
- `PrestasiDesa` - Prestasi
|
|
- `MediaSosial` - Media sosial desa
|
|
|
|
#### Modul PPID
|
|
- `StrukturPPID` - Struktur organisasi
|
|
- `PosisiOrganisasiPPID` - Posisi dengan hierarki
|
|
- `PegawaiPPID` - Data pegawai
|
|
- `ProfilePPID` - Profil PPID
|
|
- `VisiMisiPPID` - Visi misi
|
|
- `DasarHukumPPID` - Dasar hukum
|
|
- `DaftarInformasiPublik` - Daftar informasi
|
|
- `PermohonanInformasiPublik` - Permohonan informasi
|
|
- `FormulirPermohonanKeberatan` - Formulir keberatan
|
|
- `IndeksKepuasanMasyarakat` - IKM
|
|
- `Responden` + lookup tables - Data responden IKM
|
|
|
|
#### Modul Kesehatan
|
|
- `Puskesmas` - Data puskesmas
|
|
- `Posyandu` - Data posyandu
|
|
- `ProgramKesehatan` - Program kesehatan
|
|
- `FasilitasKesehatan` - Fasilitas
|
|
- `InfoWabahPenyakit` - Info wabah
|
|
- `PenangananDarurat` - Penanganan darurat
|
|
- `KontakDarurat` - Kontak darurat
|
|
- `ArtikelKesehatan` - Artikel
|
|
|
|
#### Modul Ekonomi
|
|
- `APBDes` & `APBDesItem` - Anggaran desa (hierarki tree structure)
|
|
- `RealisasiItem` - Realisasi anggaran (multiple per item)
|
|
- `PasarDesa` - Pasar desa
|
|
- `PegawaiBumDes` - Pegawai BUMDes
|
|
- `StrukturBumDes` - Struktur BUMDes
|
|
- `DemografiPekerjaan` - Demografi pekerjaan
|
|
- `JumlahPendudukMiskin` - Data kemiskinan
|
|
- `JumlahPengangguran` - Data pengangguran
|
|
- `LowonganKerjaLokal` - Lowongan kerja
|
|
- `ProgramKemiskinan` - Program kemiskinan
|
|
- `SektorUnggulanDesa` - Sektor unggulan
|
|
- `PendapatanAsli` - Pendapatan asli desa
|
|
|
|
#### Modul Kependudukan
|
|
- `DataBanjar` - Data banjar
|
|
- `DistribusiAgama` - Distribusi agama
|
|
- `DistribusiUmur` - Distribusi umur
|
|
- `MigrasiPenduduk` - Migrasi
|
|
|
|
#### Modul Pendidikan
|
|
- `InfoSekolah` - Data sekolah
|
|
- `BeasiswaDesa` - Beasiswa
|
|
- `BimbinganBelajar` - Bimbingan belajar
|
|
- `PendidikanNonFormal` - Pendidikan non-formal
|
|
- `DataPerpustakaan` - Perpustakaan
|
|
|
|
#### Modul Keamanan
|
|
- `KeamananLingkungan` - Keamanan lingkungan
|
|
- `MenuTipsKeamanan` - Tips keamanan
|
|
- `PencegahanKriminalitas` - Pencegahan kriminalitas
|
|
- `PolsekTerdekat` - Polsek terdekat
|
|
- `LaporanPublik` - Laporan publik
|
|
|
|
#### Modul Lingkungan
|
|
- `DataLingkunganDesa` - Data lingkungan
|
|
- `KonservasiAdatBali` - Konservasi adat
|
|
- `BankSampah` - Bank sampah
|
|
- `ProgramPenghijauan` - Penghijauan
|
|
- `GotongRoyong` - Gotong royong
|
|
- `EdukasiLingkungan` - Edukasi
|
|
|
|
#### Modul Inovasi
|
|
- `ProgramInovasi` - Program inovasi
|
|
- `DesaDigital` - Desa digital
|
|
- `InfoTekno` - Info teknologi
|
|
- `KolaborasiInovasi` + `MitraKolaborasi` - Kolaborasi
|
|
- `LayananOnlineDesa` - Layanan online
|
|
- `ProgramKreatifDesa` - Program kreatif
|
|
- `Ajukan` - Pengajuan ide
|
|
|
|
#### Modul Musik
|
|
- `MusikDesa` - Musik desa
|
|
- `audioFile` -> FileStorage
|
|
- `coverImage` -> FileStorage
|
|
|
|
#### Landing Page
|
|
- `DesaAntiKorupsi` + `KategoriDesaAntiKorupsi`
|
|
- `SdgsDesa` - SDGs
|
|
- `PrestasiDesa` + `KategoriPrestasiDesa`
|
|
- `MediaSosial`
|
|
- `LandingPage_Layanan`
|
|
|
|
#### APBDes (Struktur Hierarki)
|
|
```prisma
|
|
model APBDesItem {
|
|
kode String // "4", "4.1", "4.1.2"
|
|
uraian String // Nama item
|
|
anggaran Float // Anggaran dalam Rupiah
|
|
tipe String? // "pendapatan" | "belanja" | "pembiayaan"
|
|
level Int // 1, 2, 3
|
|
parentId String? // Self-referencing untuk tree
|
|
children APBDesItem[]
|
|
totalRealisasi Float @default(0) // Auto-calculated
|
|
selisih Float @default(0) // totalRealisasi - anggaran
|
|
persentase Float @default(0) // (totalRealisasi / anggaran) * 100
|
|
realisasiItems RealisasiItem[]
|
|
}
|
|
```
|
|
|
|
### 5.3 Pola Umum Model
|
|
|
|
Hampir semua model mengikuti pola:
|
|
```prisma
|
|
model Contoh {
|
|
id String @id @default(cuid())
|
|
// ... fields
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
deletedAt DateTime? @default(now()) // Soft delete
|
|
isActive Boolean @default(true) // Soft delete flag
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 6. API Routes
|
|
|
|
### 6.1 Struktur API
|
|
|
|
Semua API routes ditangani oleh **Elysia.js** di `/src/app/api/[[...slugs]]/route.ts`
|
|
|
|
### 6.2 API Groups
|
|
|
|
| Prefix | Modul | Contoh Endpoints |
|
|
|--------|-------|------------------|
|
|
| `/api/layanan` | Layanan | `GET /api/layanan` |
|
|
| `/api/potensi` | Potensi | `GET /api/potensi` |
|
|
| `/api/desa/*` | Desa | CRUD berita, gallery, profil, dll |
|
|
| `/api/ppid/*` | PPID | CRUD struktur, profil, permohonan |
|
|
| `/api/kesehatan/*` | Kesehatan | CRUD puskesmas, posyandu, dll |
|
|
| `/api/ekonomi/*` | Ekonomi | CRUD APBDes, BUMDes, demografi |
|
|
| `/api/kependudukan/*` | Kependudukan | CRUD banjar, demografi |
|
|
| `/api/pendidikan/*` | Pendidikan | CRUD sekolah, beasiswa |
|
|
| `/api/keamanan/*` | Keamanan | CRUD keamanan, kontak darurat |
|
|
| `/api/lingkungan/*` | Lingkungan | CRUD data lingkungan |
|
|
| `/api/inovasi/*` | Inovasi | CRUD program inovasi |
|
|
| `/api/landing-page/*` | Landing Page | CRUD konten landing page |
|
|
| `/api/user/*` | User | CRUD user admin |
|
|
| `/api/user/role/*` | Role | CRUD role & permission |
|
|
| `/api/search` | Search | Pencarian global |
|
|
| `/api/file-storage/*` | File Storage | CRUD file storage |
|
|
| `/api/img/:name` | Image | GET gambar dengan resize |
|
|
| `/api/upl-img` | Upload | Upload multiple images |
|
|
| `/api/upl-img-single` | Upload | Upload single image |
|
|
| `/api/upl-csv` | Upload | Upload CSV files |
|
|
| `/api/utils/version` | Utils | GET versi aplikasi |
|
|
|
|
### 6.3 API Documentation
|
|
|
|
Swagger UI tersedia di: **`/api/docs`**
|
|
|
|
### 6.4 API Route Lainnya
|
|
|
|
| Route | Fungsi |
|
|
|-------|--------|
|
|
| `/api/health` | Health check endpoint |
|
|
| `/api/news` | API berita (standalone) |
|
|
| `/api/subscribe` | Subscription email |
|
|
| `/api/tts` | Text-to-Speech (ElevenLabs) |
|
|
| `/api/admin/*` | API khusus admin |
|
|
| `/api/auth/*` | API autentikasi |
|
|
|
|
---
|
|
|
|
## 7. Halaman Admin
|
|
|
|
### 7.1 Struktur
|
|
|
|
Admin dashboard berada di `/admin` dengan route group `(dashboard)`.
|
|
|
|
| Section | Path | Fungsi |
|
|
|---------|------|--------|
|
|
| **Dashboard** | `/admin` | Dashboard utama |
|
|
| **Autentikasi** | `/admin/auth` | Login admin |
|
|
| **Desa** | `/admin/desa/*` | Berita, gallery, profil, layanan, penghargaan, pengumuman, potensi |
|
|
| **PPID** | `/admin/ppid/*` | Profil, struktur, visi-misi, daftar informasi, dasar hukum, permohonan, IKM |
|
|
| **Kesehatan** | `/admin/kesehatan/*` | Puskesmas, posyandu, program kesehatan, wabah, kontak darurat |
|
|
| **Ekonomi** | `/admin/ekonomi/*` | APBDes, PAD, demografi, pengangguran, kemiskinan, BUMDes, pasar desa |
|
|
| **Kependudukan** | `/admin/kependudukan/*` | Banjar, distribusi agama, distribusi umur, migrasi |
|
|
| **Pendidikan** | `/admin/pendidikan/*` | Sekolah, beasiswa, bimbingan belajar, perpustakaan digital |
|
|
| **Keamanan** | `/admin/keamanan/*` | Keamanan lingkungan, kontak darurat, pencegahan kriminalitas, polsek |
|
|
| **Lingkungan** | `/admin/lingkungan/*` | Data lingkungan, konservasi, bank sampah, penghijauan, gotong royong |
|
|
| **Inovasi** | `/admin/inovasi/*` | Ide inovatif, desa digital, teknologi tepat guna, kolaborasi |
|
|
| **Musik** | `/admin/musik/*` | Manajemen musik desa |
|
|
| **Landing Page** | `/admin/landing-page/*` | Anti-korupsi, prestasi, SDGs, media sosial |
|
|
| **User & Role** | `/admin/user&role/*` | Manajemen user dan role |
|
|
| **Images** | `/admin/images/*` | Manajemen gambar |
|
|
| **CSV** | `/admin/csv/*` | Upload/import CSV |
|
|
|
|
### 7.2 Komponen Admin Shared
|
|
|
|
- `AdminThemeProvider.tsx` - Theme provider untuk dark/light mode
|
|
- `DarkModeToggle.tsx` - Toggle dark mode
|
|
- `UnifiedSurface.tsx` - Komponen surface/card unified
|
|
- `UnifiedTypography.tsx` - Tipografi unified
|
|
|
|
---
|
|
|
|
## 8. Halaman Publik
|
|
|
|
### 8.1 Struktur
|
|
|
|
Halaman publik berada di `/darmasaba` dengan layout yang mencakup Navbar, Footer, dan Fixed Music Player.
|
|
|
|
| Halaman | Path | Konten |
|
|
|---------|------|--------|
|
|
| **Landing Page |