Architecture
Arsitektur Proyek Nontonio
Struktur Monorepo
Nontonio/
├── Apps/
│ ├── API/
│ ├── Web/
│ └── Admin/
├── Packages/
│ ├── UI/
│ ├── Config/
│ ├── Types/
│ └── Utils/
├── Infrastructur/
│ ├── Docker/
│ ├── Nginx/
│ ├── Scripts/
│ └── Ci/
├── Docs/
│ ├── API/
│ ├── Backend/
│ ├── Backend-Instruction/
│ ├── Database/
│ ├── Frontend/
│ └── Frontend-Instruction/
├── README.md
└── package.jsonFokus tahap awal pengembangan:
- backend dikerjakan lebih dahulu di
Apps/API - dokumentasi backend dan database disimpan di
Docs/BackenddanDocs/Database - frontend belum diimplementasikan penuh, tetapi kebutuhan frontend harus tetap menjadi acuan dalam desain API
Struktur Project Laravel
Apps/API/
├── app/
│ ├── DTOs/
│ ├── Enums/
│ ├── Events/
│ ├── Exceptions/
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── Api/
│ │ │ └── Admin/
│ │ ├── Middleware/
│ │ ├── Requests/
│ │ └── Resources/
│ ├── Jobs/
│ ├── Listeners/
│ ├── Models/
│ ├── Notifications/
│ ├── Policies/
│ ├── Providers/
│ ├── Repositories/
│ ├── Services/
│ ├── Support/
│ └── Traits/
├── bootstrap/
├── config/
├── database/
│ ├── factories/
│ ├── migrations/
│ └── seeders/
├── Domains/
├── routes/
│ ├── api.php
│ ├── admin.php
│ └── console.php
├── storage/
├── tests/
└── composer.jsonAturan utama:
- jangan menaruh business logic besar di controller;
- validasi harus melalui Form Request;
- response harus melalui Resource/formatter yang konsisten;
- logic domain harus dipisah secara modular.
Arsitektur Domain Backend
Backend harus memakai pendekatan domain-modular architecture.
Struktur domain:
Nontonio/Domains/
├── Auth/
├── User/
├── RolePermission/
├── Movie/
├── Series/
├── Anime/
├── Video/
├── ShortDrama/
├── KDrama/
├── Manga/
├── Member/
├── Novel/
├── Season/
├── Episode/
├── Media/
├── Search/
├── Comment/
├── Review/
├── Watchlist/
├── WatchHistory/
├── Notification/
├── Plan/
├── Subscription/
├── CMS/
├── Advertisement/
├── News/
├── Report/
├── Tools/
├── Logging/
└── Setting/Setiap domain minimal dapat berisi:
Actions/DTOs/Enums/Repositories/Services/Requests/Resources/Policies/
Contoh:
Domains/Movies/
├── Actions/
├── DTOs/
├── Enums/
├── Repositories/
├── Requests/
├── Resources/
├── Services/
└── Policies/Layer Arsitektur Backend
Controller
Tanggung jawab:
- menerima HTTP request;
- memanggil action/service;
- mengembalikan response.
Larangan:
- jangan menulis business logic kompleks di controller;
- jangan menulis query berat langsung di controller.
Form Request
Tanggung jawab:
- validasi input;
- authorization dasar per request.
DTO
Tanggung jawab:
- menyatukan bentuk data antar layer;
- mengurangi coupling antar request, service, dan repository.
Action
Digunakan untuk use-case spesifik, misalnya:
CreateContentActionPublishContentActionCreateEpisodeActionAssignRoleToUserAction
Service
Digunakan untuk orchestration logic yang lebih besar dari satu action.
Repository
Digunakan untuk:
- query kompleks;
- filtering;
- sorting;
- pagination;
- data access abstraction yang memang perlu.
Resource
Digunakan untuk standardisasi response API.
Policy
Digunakan untuk authorization per domain/per action.
Job
Digunakan untuk proses asynchronous seperti:
- indexing search;
- sinkronisasi metadata;
- pengiriman notifikasi;
- media processing;
- analytics processing.
Search Architecture
Search Engine
Gunakan Meilisearch untuk tahap awal.
Indexed fields minimal
- id
- type
- slug
- title
- original_title
- synopsis
- genres
- tags
- release_year
- popularity_score
- status
- language
Trigger indexing
- content published
- content updated
- content archived
- media ready jika berpengaruh pada availability
Semua indexing harus melalui queue/job.
Media Processing Architecture
Alur media processing
- Admin upload file/video
- Backend membuat record media job
- File ditempatkan di intake storage
- Queue mengirim job ke worker
- Worker FFmpeg memproses:
- transcode
- HLS packaging
- thumbnail generation
- metadata extraction
- Hasil dipindahkan ke object storage / Internal storage
- Backend menerima update status
- Media ditandai ready
- Search/index dan content availability di-update bila perlu
Status media job
- pending
- queued
- processing
- success
- failed
- cancelled
Aturan:
- proses video tidak boleh dilakukan langsung dalam request HTTP;
- worker media harus terpisah dari web/API process.
