Platform streaming film berbasis web dengan sistem manajemen konten, langganan berbayar, dan tiga tingkat akses pengguna.
- Buka halaman utama di
frontend/index.htmluntuk melihat film trending, terbaru, artikel, dan berita. - Cari film melalui halaman katalog atau search.
- Lihat detail film, sinopsis, pemeran, sutradara, dan ulasan.
- Baca artikel dan berita hiburan.
- Lihat halaman FAQ, About Us, Kebijakan Privasi.
- Daftar akun baru melalui halaman Register.
- Login melalui halaman Login.
Setelah login, pengguna memiliki akses ke halaman pengguna melalui sidebar:
- Profil -- melihat dan mengedit data diri.
- Pengaturan -- mengubah preferensi akun.
- Keamanan -- mengganti kata sandi.
- Riwayat -- melihat riwayat tontonan film.
- Watchlist -- daftar film yang ingin ditonton.
- Film Favorit / Aktor Favorit / Sutradara Favorit -- menyimpan favorit.
- Langganan -- melihat paket langganan aktif (Basic gratis, Standard Rp49.000/bulan, Premium Rp79.000/bulan).
- Pembayaran -- metode pembayaran dan riwayat transaksi.
- Poin -- menukarkan poin loyalitas.
- Notifikasi -- melihat pemberitahuan.
Pengguna juga bisa:
- Memberi rating dan ulasan pada film.
- Menonton video streaming (memerlukan login).
- Menggunakan kode promo dari halaman Promo.
- Berlangganan melalui halaman Harga Langganan.
Admin mengelola konten website melalui 9 halaman admin:
- Kelola film (tambah, edit, hapus).
- Kelola aktor dan sutradara.
- Kelola artikel.
- Kelola FAQ.
- Edit profil admin.
Akses admin didapatkan jika role akun adalah "admin".
Manager memiliki akses lebih luas dari admin, meliputi:
- Persetujuan Konten -- menyetujui atau menolak konten yang dibuat pengguna, termasuk film, aktor, sutradara, artikel, dan berita. Konten yang disetujui otomatis dipindahkan dari file content.json ke file seed data masing-masing.
- Balas Ulasan -- membalas ulasan pengguna pada film.
- Kirim Notifikasi -- mengirim notifikasi ke pengguna (disimpan di localStorage).
- Kelola Akun -- mengubah peran pengguna, menonaktifkan, atau membanned akun.
- Laporan -- melihat laporan pendapatan dan traffic.
- Ekspor Data -- mengekspor data ke CSV.
Akses manager didapatkan jika role akun adalah "manager". Manager adalah super admin yang memiliki semua kemampuan admin ditambah fitur di atas.
Aplikasi ini menggunakan arsitektur sederhana tanpa framework:
Browser (Frontend)
| localStorage "pilih-in-db" (cache data)
| localStorage "pilih-in-session" (session login)
|
| fetch() / apiRequest()
|
v
Node.js HTTP Server (Port 3000)
| membaca/menulis file JSON
v
File System (data/*.json)
Saat halaman pertama kali dibuka, init.js melakukan:
- Membaca localStorage. Jika belum ada data atau versi berbeda, jalankan
_loadSeedData(). _loadSeedData()mengambil semua file dari folderdata/(data-film.json, data-actor.json, dll.) melalui fetch HTTP.- Data tersebut disimpan ke localStorage dengan key
pilih-in-db. - Kemudian
_syncFromApi()dipanggil untuk mengambil data tambahan dari server (konten buatan pengguna yang sudah disetujui). - Data dari server digabungkan dengan data localStorage. Data server menimpa data lokal jika ada conflict.
- Repository siap digunakan oleh halaman-halaman frontend.
Untuk operasi baca (seperti menampilkan daftar film di halaman utama):
- Halaman memanggil
repositories.films.findPublished()atau method lain. - Repository membaca dari
DatabaseManageryang membaca dari localStoragepilih-in-db. - Data langsung ditampilkan. Tidak ada panggilan API untuk baca data publik.
Untuk data pengguna (favorit, watchlist, riwayat), dua pendekatan digunakan:
- Film favorit dan watchlist dibaca dari server melalui UserData API.
- Aktor/sutradara favorit dibaca dari localStorage langsung.
Untuk operasi tulis (seperti registrasi, buat konten, ubah role):
- Halaman mengirim request ke server API melalui
apiRequest()atau fetch langsung. - Server (server.js) memproses request, membaca/menulis file JSON di folder
data/. - Server mengembalikan response sukses/gagal.
- Setelah sukses, halaman frontend juga menyimpan perubahan ke localStorage agar data tetap sinkron.
Contoh alur registrasi:
- User isi form register.
- Frontend kirim
POST /api/auth/registerdengan data user. - Server baca
account.json, cek email duplikat, tambah user baru, simpan file. - Server kembali ke frontend dengan data user baru.
- Frontend simpan user baru ke localStorage
pilih-in-dbuntuk referensi local. - User diarahkan ke halaman login.
Registrasi:
- User mengisi username, email, dan password.
- Frontend mengirim data ke
POST /api/auth/register. - Server memvalidasi email belum terdaftar di
account.json. - Data user baru ditambahkan dengan role default "user" dan status "active".
- Password disimpan sebagai teks biasa (tanpa hashing).
- File
account.jsonditulis ulang.
Login:
- User memasukkan email dan password.
- AuthService mengambil data dari
account.json. - Password dibandingkan langsung (plaintext).
- Jika cocok dan status aktif, session disimpan di localStorage dengan key
pilih-in-session. - Session berisi userId, username, email, role, dan waktu login.
- Role menentukan halaman yang bisa diakses setelah login.
Role Akun:
- Tiga level:
user(default),admin,manager. - Manager bisa mengubah role akun melalui halaman Kelola Akun.
- Manager juga bisa menonaktifkan (suspend) atau banned akun.
Lupa Sandi:
- User memasukkan email.
- Frontend mengirim
POST /api/auth/forgot-password. - Server mencari user berdasarkan email, membuat reset token, dan menyimpannya.
- Token dikembalikan ke frontend (tidak ada pengiriman email sungguhan).
Menambah Film (oleh Admin):
- Admin mengisi form di halaman admin/film-create.html.
- Data film dikirim ke server API.
- Server menambahkan film ke
data-film.json(seed file). - Film muncul di localStorage setelah
_syncFromApi()berikutnya.
Menambah Film (oleh User Biasa):
- User membuat konten film melalui halaman konten.
- Data masuk ke
content.jsondengan status "pending". - Manager menyetujui atau menolak melalui halaman Approvals.
- Jika disetujui, server memindahkan data dari
content.jsonkedata-film.json. - Jika ditolak, data dihapus dari
content.json.
Approval Konten:
- Manager melihat daftar konten pending dari
content.json. - Tombol Approve akan memindahkan konten ke file seed (data-film.json, data-actor.json, dll).
- Tombol Reject akan menghapus konten dari
content.json. - Semua perubahan dilakukan oleh server API.
- Tiga tier: Basic (gratis), Standard (Rp49.000/bulan), Premium (Rp79.000/bulan).
- User memilih paket dari halaman pricing atau promo.
- Pembayaran diproses oleh
POST /api/payment/process. - Server mencatat transaksi di
transactions.json, memperbarui subscription user diaccount.json. - Server juga mengelola poin loyalitas: user mendapat bonus poin saat berlangganan.
- Poin bisa ditukarkan di halaman Redeem Points.
- Tombol Favorit dan Watchlist ada di halaman detail film.
- Untuk film: data disimpan di server melalui UserData API dan di localStorage.
- Untuk aktor dan sutradara: data disimpan di localStorage saja (konsisten dengan halaman profil aktor/sutradara yang juga localStorage).
- Halaman Favorit Film dan Watchlist membaca dari server API.
- Halaman Favorit Aktor dan Favorit Sutradara membaca dari localStorage.
- Menampilkan 5 film terbaik berdasarkan rating dan jumlah tontonan.
- Gambar menggunakan poster dari folder
frontend/assets/posters/. - Tombol Tonton mengarah ke halaman detail film (bagian video).
- Tombol Selengkapnya mengarah ke halaman detail film (bagian info judul).
- State sidebar (buka/tutup) disimpan di localStorage.
Semua data disimpan sebagai file JSON di folder data/:
| File | Fungsi |
|---|---|
account.json |
Data akun pengguna (username, email, password, role, status, subscription). |
data-film.json |
Data film (judul, sinopsis, genre, pemeran, rating, poster, URL streaming). |
data-actor.json |
Data aktor. |
data-director.json |
Data sutradara. |
genres.json |
Daftar genre film. |
data-artikel.json |
Artikel. |
data-berita.json |
Berita. |
faq.json |
Pertanyaan umum. |
pricing-tiers.json |
Paket harga langganan. |
promotions.json |
Kode promo. |
user-data.json |
Data per pengguna (favorit, watchlist, riwayat, notifikasi). |
userpoints.json |
Poin loyalitas per pengguna. |
transactions.json |
Riwayat transaksi pembayaran. |
content.json |
Konten buatan pengguna yang menunggu persetujuan. |
contact-messages.json |
Pesan dari halaman kontak. |
| Key | Fungsi |
|---|---|
pilih-in-db |
Cache data utama (film, aktor, sutradara, genre, artikel, dll). |
pilih-in-session |
Session login pengguna. |
pilih-in-theme |
Preferensi tema (dark/light). |
pilih-in-initialized |
Penanda bahwa seed data sudah dimuat. |
pilih-in-sidebar-closed |
State sidebar (tertutup/terbuka). |
- Frontend: HTML, CSS, JavaScript (ES Modules) -- tanpa framework.
- Backend: Node.js (HTTP module built-in) -- tanpa framework, port 3000.
- Penyimpanan: File JSON di filesystem + localStorage browser.
- Ikon: Feather Icons.
- Font: Poppins, Google Sans Flex.
- Poster Film: File JPG lokal di
frontend/assets/posters/.