Taryana
MongoDB Event StoreCompliance & Observability
TESTER READY • LIVE ENGINE

Automated Activity Audit Trail

Append-Only Compliance & Administrative Mutation Event Store

Pencatatan riwayat audit append-only di koleksi MongoDB activity_logs untuk seluruh aksi administratif, mutasi kontrak, dan perubahan konten.

Diagram Alur Data & Arsitektur Sistem

Visual Interaktif

Arsitektur Interceptor Audit Trail Otomatis

Perekaman peristiwa mutasi secara asinkron tanpa membebani latensi response

client
Mutator

Admin / Manager

Mutasi State API

HTTP Request
service
Execution

NestJS Route

Controller Handler

Pipe handle()
guard
Observable

Activity Interceptor

Tap Operator (Async)

Non-blocking insert
db
Immutable

MongoDB activity_logs

Append-Only Collection

Query log stream
service
SLA Monitor

Audit Dashboard

Live Telemetry Feed

Problem & Latar Belakang Kebutuhan

Dalam kontrak B2B bernilai tinggi, transparansi operasional menjadi syarat mutlak dalam SLA. Operator IPTV harus memiliki bukti forensik digital lengkap jika terjadi insiden (misalnya: siapa yang menonaktifkan saluran tertentu, kapan durasi kontrak diperpanjang, atau akun mana yang mengganti video sambutan kamar).

Implementasi Rekayasa Backend NestJS

NestJS memanfaatkan ActivityLogInterceptor yang membungkus endpoint mutasi (POST, PUT, DELETE, PATCH). Setiap kali controller selesai mengeksekusi request, interceptor secara asinkron menyimpan log peristiwa lengkap ke koleksi activity_logs di MongoDB tanpa memperlambat response time ke klien.

Aspek Model Database MongoDB

Koleksi activity_logs diindeks berdasarkan { propertyId: 1, createdAt: -1 } dan { userId: 1, createdAt: -1 }. Dokumen log bersifat immutable dan dipaginate secara efisien.

Keamanan, Idempotensi & Kepatuhan SLA

Mencatat IP address, user agent, route path, userId, userRole, dan status hasil eksekusi untuk audit trail kepatuhan SOC2 / ISO 27001.

NestJS ActivityLogInterceptor & MongoDB ModelNestJS (TypeScript)
// ActivityLogInterceptor: Pencatatan Mutasi Asinkron
@Injectable()
export class ActivityLogInterceptor implements NestInterceptor {
  constructor(@InjectModel(ActivityLog.name) private logModel: Model<ActivityLog>) {}

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const req = context.switchToHttp().getRequest();
    const startTime = Date.now();

    return next.handle().pipe(
      tap({
        next: async () => {
          await this.logModel.create({
            userId: req.user?._id,
            userName: req.user?.fullName,
            userRole: req.user?.role,
            propertyId: req.params.propertyId || req.body.propertyId || null,
            action: `${req.method} ${req.route?.path || req.url}`,
            executionTimeMs: Date.now() - startTime,
            status: 'SUCCESS',
            ipAddress: req.ip,
            createdAt: new Date(),
          });
        },
      }),
    );
  }
}

Live Simulator & Execution Sandbox

Interactive State Tester
Koleksi MongoDB:activity_logs (Append-Only)Setiap mutasi dicatat asinkron tanpa membebani response latency.
Execution Telemetry Console
HTTP 201 Created
POST/api/v1/properties/contracts
> Guard Evaluation Trace:

RolesGuard verified caller is 'admin'. Idempotency Key verified in Redis. MongoDB document updated.

> Database & State Result:

Contract for 'Grand Horizon Hotel & Resort' persisted into Property document with 1-Year validity.

Audit Trail MongoDB (2 events)Auto-Appended
[10:14:02]ADMIN(Rian (Platform Admin))•PROPERTY_CONTRACT_PROVISIONED

Provisioned 1-Year Platinum Contract #PKS-2026-042 via manual B2B order.

SUCCESS
[10:22:15]MANAGER(Ahmad (IT Manager))•WELCOME_CONTENT_MUTATED

Updated welcome video banner and personalized TV dining directory.

SUCCESS