RINEMA adalah platform digital yang didedikasikan untuk merayakan dan mengeksplorasi sinema Indonesia. Dirancang untuk membangun komunitas pecinta film yang bersemangat, RINEMA menyediakan ruang untuk memberikan rating, berkomentar, berdiskusi, dan masuk dengan mudah menggunakan akun Google. Baik Anda penggemar film layar lebar atau karya independen, RINEMA adalah tempat untuk menyelami kekayaan perfilman Tanah Air.
README.md English Ver.
π Demo Langsung: Kunjungi RINEMA di https://rinemaa.paramadina.ac.id/
π¬ Demo Video: Tonton Demo Rinema di https://drive.google.com/demo-rinema
- Tentang RINEMA
- Arsitektur Hybrid
- Fitur
- Teknologi
- Dokumentasi API
- Struktur Proyek
- Struktur Database
- UML (Unifiede Modeling Language)
- Instalasi
- Penggunaan
- Tangkapan Layar
- Kontribusi
- Lisensi
- Kontak
Industri perfilman Indonesia sedang mengalami masa keemasan, dengan karya berkualitas yang semakin sering tampil di bioskop dan festival film, baik nasional maupun internasional. Namun, belum ada platform terpusat yang memungkinkan penggemar untuk mengapresiasi dan mendiskusikan film Indonesia secara mendalam. RINEMA hadir untuk mengisi kekosongan ini, terinspirasi oleh platform global seperti IMDb, tetapi dirancang khusus untuk sinema Indonesia.
- Membangun platform interaktif untuk pecinta film Indonesia.
- Mendorong komunitas aktif yang suportif dengan kebebasan berpendapat yang bertanggung jawab.
- Menyediakan ruang aman untuk rating jujur, komentar terbuka, dan diskusi dinamis tentang film Indonesia.
Proyek RINEMA dirancang dengan pendekatan hybrid yang unik, menjadikannya sebuah portofolio yang komprehensif:
-
Aplikasi Web Fungsional: Proyek ini mencakup aplikasi web lengkap yang dibangun dengan Laravel Blade. Aplikasi ini siap pakai, interaktif, dan berfungsi penuh, menampilkan semua fitur RINEMA secara langsung.
-
API Terpisah: Di samping aplikasi web, RINEMA juga menyediakan serangkaian API yang robust. API ini memungkinkan pengembang lain (misalnya Frontend Developer dengan React/Vue atau Mobile Developer) untuk membangun aplikasi klien mereka sendiri dengan menggunakan data dan logika bisnis dari RINEMA.
Pendekatan ini menunjukkan kemampuan dalam membangun baik aplikasi monolitik tradisional maupun backend API yang headless.
- Pencarian Film: Temukan film Indonesia dengan cepat menggunakan kata kunci, seperti judul, sutradara, atau aktor.
- Filter Film: Saring film berdasarkan terpopuler, terbaru, terlawas, atau genre untuk menemukan konten yang sesuai minat Anda.
- Mobile-Friendly: Nikmati pengalaman yang mulus di perangkat mobile dengan desain responsif.
- Rating Film: Berikan penilaian pribadi untuk film yang telah ditonton, ekspresikan suka atau tidak suka secara jujur.
- Komentar Bebas: Tulis pemikiran dan perasaan Anda, dari kritik membangun hingga pujian tanpa batas.
- Forum Diskusi: Ikut serta dalam percakapan seru, bahas detail film, teori, atau kekurangan bersama pengguna lain.
- Profil Pengguna: Kelola aktivitas Anda, lihat riwayat rating, komentar, dan partisipasi di forum.
- Manajemen Akun: Perbarui informasi profil atau hapus akun sesuai kebutuhan.
- Login dengan Google: Masuk dengan cepat dan aman menggunakan akun Google, memudahkan akses ke semua fitur.
- Role Admin: Mengelola dan memantau keseluruhan platform agar berjalan dengan baik
- Role Editor: Mengelola film yang ditampilkan di Rinema
RINEMA dibangun dengan teknologi modern dan andal:
- Front-end:
- Laravel Blade (Templating Engine)
- Tailwind CSS (Styling)
- Vanilla JavaScript (Interaktivitas)
- Back-end:
- Laravel 12 (Framework)
- PHP
- Database:
- MySQL
- Integrasi:
- Google OAuth untuk fitur Login dengan Google
- Deployment:
- Dihosting melalui cPanel di https://rinemaa.paramadina.ac.id/
API ini memungkinkan aplikasi eksternal untuk berinteraksi dengan data RINEMA.
Base URL: http://localhost:8000/api
atau https://rinemaa.paramadina.ac.id/api
Beberapa endpoint memerlukan autentikasi. API ini menggunakan Bearer Token melalui Laravel Sanctum. Untuk mendapatkan token, silakan gunakan endpoint POST /register
atau POST /login
.
Sertakan token Anda pada header setiap permintaan ke endpoint yang terproteksi:
Authorization: Bearer <YOUR_API_TOKEN>
Endpoint ini digunakan untuk registrasi dan login pengguna.
- Endpoint:
POST /register
- Deskripsi: Mendaftarkan pengguna baru ke dalam sistem.
- Autentikasi: Tidak diperlukan.
- Body Request (JSON):
{ "name": "Nama User Baru", "email": "userbaru@example.com", "password": "password123", "password_confirmation": "password123" }
- Respons Sukses (201 Created):
{ "message": "Registrasi berhasil.", "access_token": "1|aBcDeFgHiJkLmNoPqRsTuVwXyZ...", "token_type": "Bearer", "user": { ... } }
- Endpoint:
POST /login
- Deskripsi: Melakukan login untuk pengguna yang sudah terdaftar.
- Autentikasi: Tidak diperlukan.
- Body Request (JSON):
{ "email": "userbaru@example.com", "password": "password123" }
- Respons Sukses (200 OK):
{ "message": "Login berhasil.", "access_token": "2|aBcDeFgHiJkLmNoPqRsTuVwXyZ...", "token_type": "Bearer", "user": { ... } }
- Endpoint:
POST /auth/google/callback
- Deskripsi: Endpoint yang dihubungi oleh frontend setelah menerima code otorisasi dari Google.
- Autentikasi: Tidak diperlukan.
- Body Request (JSON):
{ "code": "4/0AeaYSH... (kode yang didapat dari Google)" }
- Respons Sukses (200 OK):
{ "message": "Login dengan Google berhasil.", "access_token": "3|aBcDeFgHiJkLmNoPqRsTuVwXyZ...", "token_type": "Bearer", "user": { ... } }
Endpoint ini bisa diakses secara publik.
- Endpoint:
GET /films/allFilm
- Autentikasi: Tidak diperlukan.
- Endpoint:
GET /films/latest
- Autentikasi: Tidak diperlukan.
- Endpoint:
GET /films/oldest
- Autentikasi: Tidak diperlukan.
- Endpoint:
GET /films/popular
- Autentikasi: Tidak diperlukan.
- Endpoint:
GET /films/search?query={nama_film}
- Autentikasi: Tidak diperlukan.
- Query Parameter:
query
(wajib): Kata kunci judul film yang ingin dicari.- Contoh:
/api/films/search?query=Dilan
- Endpoint:
GET /films/allGenre
- Autentikasi: Tidak diperlukan.
- Endpoint:
GET /films/genre/{genre}
- Autentikasi: Tidak diperlukan.
- URL Parameter:
{genre}
(wajib): ID dari genre.
- Endpoint:
GET /films/{film}
- Autentikasi: Tidak diperlukan.
- URL Parameter:
{film}
(wajib): ID dari film.
- Endpoint:
GET /films/{film}/ratingsView
- Autentikasi: Tidak diperlukan.
- URL Parameter:
{film}
(wajib): ID dari film.
- Endpoint:
POST /films/{film}/ratings
- Autentikasi: Diperlukan (Bearer Token).
- URL Parameter:
{film}
(wajib): ID dari film. - Body Request (JSON):
{ "rating": 8.5, "comment": "Komentar saya tentang film ini." }
- Endpoint:
GET /films/{film}/ratings/user
- Autentikasi: Diperlukan (Bearer Token).
- URL Parameter:
{film}
(wajib): ID dari film.
- Endpoint:
DELETE /films/{film}/ratings
- Autentikasi: Diperlukan (Bearer Token).
- URL Parameter:
{film}
(wajib): ID dari film.
- Endpoint:
GET /films/{film}/forum-replies
- Autentikasi: Tidak diperlukan.
- URL Parameter:
{film}
(wajib): ID dari film.
- Endpoint:
POST /films/{film}/forum-replies
- Autentikasi: Diperlukan (Bearer Token).
- URL Parameter:
{film}
(wajib): ID dari film. - Body Request (JSON):
{ "body": "Isi komentar saya di forum.", "parent_reply_id": null }
- Endpoint:
DELETE /forum-replies/{reply}
- Autentikasi: Diperlukan (Bearer Token).
- URL Parameter:
{reply}
(wajib): ID dari balasan yang ingin dihapus.
- Endpoint:
PUT /user/update-email
- Autentikasi: Diperlukan (Bearer Token).
- Body Request (JSON):
{ "email": "emailbaru@example.com" }
- Endpoint:
PUT /user/update-password
- Autentikasi: Diperlukan (Bearer Token).
- Body Request (JSON):
{ "current_password": "password123", "new_password": "passwordbaru123", "new_password_confirmation": "passwordbaru123" }
- Endpoint:
GET /user/profil
- Autentikasi: Diperlukan (Bearer Token).
- Respons Sukses (200 OK):
{ "user": { "id": 11, "name": "demo", "email": "demo@gmail.com", "role": "user", "email_verified_at": null, "is_active": 1, ... } }
- Endpoint:
GET /user/ratings
- Autentikasi: Diperlukan (Bearer Token).
- Endpoint:
GET /user/forum-replies
- Autentikasi: Diperlukan (Bearer Token).
RINEMA/
βββ app/
β βββ Http/
β β βββ Controllers/ # Controller
β β βββ api/ # API
β βββ Models/ # Model
β
βββ resource/
β βββ views/ # Views
β βββ admin/ # halaman dashboard admin
β βββ auth/ # halaman autentikasi (login & register)
β βββ error/ # halaman 404
β βββ komponen/ # komponen
β βββ page/ # halaman untuk pengguna
β βββ index.blade.php # main index
β
βββ routes/ # Handling Route
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
username VARCHAR(255) UNIQUE NOT NULL,
password TEXT NOT NULL,
role VARCHAR(50) DEFAULT 'user',
is_active BOOLEAN DEFAULT TRUE,
avatar VARCHAR(255) NULL,
last_login TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE films (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
release_date DATE NOT NULL,
director VARCHAR(255) NOT NULL,
poster VARCHAR(255) NOT NULL,
duration INT NOT NULL,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE genres (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL
);
CREATE TABLE film_genre (
film_id INT REFERENCES films(id) ON DELETE CASCADE,
genre_id INT REFERENCES genres(id) ON DELETE CASCADE,
PRIMARY KEY (film_id, genre_id)
);
CREATE TABLE ratings (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id) ON DELETE CASCADE,
film_id INT REFERENCES films(id) ON DELETE CASCADE,
rating DECIMAL(2,1) CHECK (rating BETWEEN 0 AND 10),
comment TEXT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE (user_id, film_id)
);
CREATE TABLE forums (
id SERIAL PRIMARY KEY,
film_id INT REFERENCES films(id) ON DELETE CASCADE,
user_id INT REFERENCES users(id) ON DELETE CASCADE,
title VARCHAR(255) NOT NULL,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE forum_replies (
id SERIAL PRIMARY KEY,
forum_id INT REFERENCES forums(id) ON DELETE CASCADE,
user_id INT REFERENCES users(id) ON DELETE CASCADE,
parent_reply_id INT NULL REFERENCES forum_replies(id) ON DELETE CASCADE,
reply TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Untuk menjalankan RINEMA secara lokal, ikuti langkah-langkah berikut:
- PHP >= 8.1
- Composer
- MySQL
- Node.js & npm
- Git
- Akun Google Developer untuk konfigurasi OAuth (opsional untuk fitur Login dengan Google)
-
Kloning Repositori:
git clone https://github.com/ichramsyah/rinema-fullstack-webapp.git cd rinema
-
Instal Dependensi:
composer install npm install
-
Konfigurasi Lingkungan:
-
Salin file
.env.example
menjadi.env
:cp .env.example .env
-
Perbarui
.env
dengan kredensial database dan Google OAuth (jika menggunakan fitur Login dengan Google):DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=rinema DB_USERNAME=nama_pengguna_anda DB_PASSWORD=kata_sandi_anda GOOGLE_CLIENT_ID=your_google_client_id GOOGLE_CLIENT_SECRET=your_google_client_secret GOOGLE_REDIRECT_URI=http://localhost:8000/auth/google/callback
-
-
Buat Kunci Aplikasi:
php artisan key:generate
-
Jalankan Migrasi Database:
php artisan migrate
-
Bangun Aset Front-end:
npm run dev
-
Jalankan Server Pengembangan:
php artisan serve
Akses RINEMA di
http://localhost:8000
.
- Buat kredensial OAuth di Google Developer Console.
- Tambahkan kredensial ke file
.env
seperti di atas. - Pastikan rute callback (
/auth/google/callback
) sesuai dengan pengaturan aplikasi Anda.
- Daftar/Masuk: Buat akun baru, masuk dengan email, atau gunakan Login dengan Google untuk akses cepat.
- Jelajahi Film: Telusuri film Indonesia dan lihat detail seperti pemeran, sutradara, dan sinopsis.
- Beri Rating & Komentar: Bagikan penilaian dan opini Anda tentang film yang telah ditonton.
- Ikuti Diskusi: Bergabung di forum untuk membahas alur, tema, atau teori bersama pengguna lain.
- Kelola Profil: Lihat riwayat aktivitas Anda dan perbarui pengaturan akun.
Berikut adalah pratinjau halaman utama RINEMA :
-
Halaman Beranda
-
Halaman Film
-
Halaman Detail Film
-
Forum Diskusi
-
Pemberian Rating
-
Halaman Login
-
Halaman Register
-
Halaman Profil
-
Halaman Dashboard Admin
Kami menyambut kontribusi untuk membuat RINEMA semakin baik! Untuk berkontribusi:
- Fork repositori ini.
- Buat cabang baru (
git checkout -b fitur/nama-fitur
). - Lakukan perubahan dan commit (
git commit -m "Menambahkan fitur"
). - Push ke cabang (
git push origin fitur/nama-fitur
). - Buka Pull Request dengan deskripsi jelas tentang perubahan Anda.
Harap patuhi Kode Etik kami dan pastikan kontribusi Anda sejalan dengan misi RINEMA untuk diskusi yang konstruktif dan hormat.
- Tingkatkan fitur pencarian dan filter (misalnya, berdasarkan genre atau sutradara).
- Tambahkan upvote/downvote untuk komentar atau balasan bertingkat di forum.
- Integrasikan rekomendasi film berdasarkan aktivitas pengguna.
- Kembangkan alat moderasi untuk menjaga diskusi yang sehat.
Proyek ini dilisensikan di bawah Lisensi MIT. Lihat file LICENSE untuk detailnya.
Untuk pertanyaan, umpan balik, atau peluang kolaborasi, hubungi tim RINEMA:
Bergabunglah dengan kami untuk merayakan sinema Indonesia bersama RINEMA! π₯