Nontonio Logo

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.json

Fokus tahap awal pengembangan:

  • backend dikerjakan lebih dahulu di Apps/API
  • dokumentasi backend dan database disimpan di Docs/Backend dan Docs/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.json

Aturan 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:

  • CreateContentAction
  • PublishContentAction
  • CreateEpisodeAction
  • AssignRoleToUserAction

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

  1. Admin upload file/video
  2. Backend membuat record media job
  3. File ditempatkan di intake storage
  4. Queue mengirim job ke worker
  5. Worker FFmpeg memproses:
    • transcode
    • HLS packaging
    • thumbnail generation
    • metadata extraction
  6. Hasil dipindahkan ke object storage / Internal storage
  7. Backend menerima update status
  8. Media ditandai ready
  9. 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.

On this page