R10 logo

APP Api

v1.0.0 documentation

Base URL http://localhost:8080/api/v1

Introduction

APPR10Hub API adalah REST API untuk pengelolaan data streams, sentiment analysis, automation log, settings, dan report generation. Backend dibangun dengan Go + Gin dan mengikuti best practice ala Base UI.

Key capabilities

  • • JWT + role based authorization
  • • Streams search + manual enrichment
  • • Report generator (Gamma API)
  • • Settings sentiment & category per project
  • • Automation log viewer
  • • User management (admin only)
  • • Audit logging untuk semua request

Authentication

Seluruh endpoint (kecuali register & login) memerlukan token JWT. Logout memanfaatkan token blacklist agar sesi langsung diterminasi.

Header

Authorization: Bearer <jwt_token>

Authentication Endpoints

POST /auth/register

Mendaftarkan user baru ke sistem. Setelah registrasi berhasil, user akan otomatis login dan menerima JWT token. Password harus minimal 6 karakter dan harus sama dengan confirm_password.

Request Body

{
  "email": "user@example.com",      // Email unik, wajib
  "name": "John Doe",                // Nama lengkap, wajib
  "password": "password123",         // Password minimal 6 karakter, wajib
  "confirm_password": "password123"  // Harus sama dengan password, wajib
}

Response (201 Created)

{
  "success": true,
  "message": "User registered successfully",
  "data": {
    "user": {
      "id": 1,
      "email": "user@example.com",
      "name": "John Doe",
      "role": "user",
      "created_at": "2024-01-15T10:30:00Z"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  }
}
POST /auth/login

Autentikasi user dengan email dan password. Jika berhasil, akan mengembalikan JWT token yang digunakan untuk mengakses endpoint protected lainnya. Token berlaku selama 24 jam.

Request Body

{
  "email": "user@example.com",  // Email yang terdaftar, wajib
  "password": "password123"      // Password user, wajib
}

Response (200 OK)

{
  "success": true,
  "message": "Login successful",
  "data": {
    "user": {
      "id": 1,
      "email": "user@example.com",
      "name": "John Doe",
      "role": "user"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  }
}

Error Response (401 Unauthorized)

{
  "success": false,
  "message": "Invalid email or password"
}
POST /auth/logout

Menginvalidasi token JWT yang sedang aktif dengan menambahkannya ke blacklist. Setelah logout, token tersebut tidak dapat digunakan lagi untuk mengakses endpoint protected sampai masa berlaku token berakhir. Memerlukan header Authorization dengan Bearer token.

Headers

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response (200 OK)

{
  "success": true,
  "message": "Logout successful"
}

Token yang sudah logout disimpan di blacklist sampai masa berlaku berakhir. Sistem akan otomatis membersihkan token yang sudah expired dari blacklist setiap jam.

Profile Management

GET /profile

Mengambil informasi profil user yang sedang login berdasarkan token JWT yang dikirim. Mengembalikan data lengkap user termasuk email, nama, role, dan timestamp.

Headers

Authorization: Bearer <jwt_token>

Response (200 OK)

{
  "success": true,
  "message": "Profile retrieved successfully",
  "data": {
    "id": 1,
    "email": "user@example.com",
    "name": "John Doe",
    "role": "user",
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T10:30:00Z"
  }
}
POST /change-password

Mengubah password user yang sedang login. Memerlukan validasi password lama untuk keamanan. Password baru harus minimal 6 karakter dan berbeda dari password lama.

Headers

Authorization: Bearer <jwt_token>

Request Body

{
  "old_password": "password123",    // Password saat ini, wajib
  "new_password": "newpassword123"   // Password baru minimal 6 karakter, wajib
}

Response (200 OK)

{
  "success": true,
  "message": "Password changed successfully"
}

Error Response (400 Bad Request)

{
  "success": false,
  "message": "Old password is incorrect"
}

Streams Management

GET /streams

Mengambil daftar streams dengan pagination, sorting, dan berbagai filter. Mendukung pencarian berdasarkan channel, project, sentiment, user, text content, dan rentang tanggal. Default pagination: page=1, limit=10.

Query Parameters

  • page (int, default: 1) - Nomor halaman
  • limit (int, default: 10) - Jumlah item per halaman
  • sort_by (string) - Field untuk sorting (date, channel, sentiment, dll)
  • sort_dir (string) - Arah sorting: ASC atau DESC
  • channel (string) - Filter berdasarkan channel (twitter, instagram, facebook, dll)
  • project (int) - Filter berdasarkan project ID
  • sentiment (int) - Filter sentiment: -1 (negative), 0 (neutral), 1 (positive)
  • user (string) - Filter berdasarkan username
  • text (string) - Pencarian dalam text content
  • date_from (string) - Tanggal mulai (format: YYYY-MM-DD)
  • date_to (string) - Tanggal akhir (format: YYYY-MM-DD)

Response (200 OK)

{
  "success": true,
  "message": "Streams retrieved successfully",
  "data": [
    {
      "id": 1,
      "channel": "twitter",
      "text": "Great service!",
      "source": "https://twitter.com/...",
      "sentiment": 1,
      "topic": "Service",
      "project_id": 1,
      "project_name": "Bank BRI",
      "date": "2024-01-15T10:30:00Z",
      "created_at": "2024-01-15T10:30:00Z",
      "updated_at": "2024-01-15T10:30:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 150,
    "total_pages": 15
  }
}
GET /streams/:id

Mengambil detail lengkap satu stream berdasarkan ID. Mengembalikan semua informasi termasuk sentiment, topic, OCEAN scores, dan emotion scores jika tersedia.

Response (200 OK)

{
  "success": true,
  "message": "Stream retrieved successfully",
  "data": {
    "id": 1,
    "channel": "twitter",
    "text": "Great service!",
    "source": "https://twitter.com/...",
    "sentiment": 1,
    "is_sentiment": 1,
    "sentiment_date": "2024-01-15T10:30:00Z",
    "topic": "Service",
    "is_topic": 1,
    "topic_date": "2024-01-15T10:30:00Z",
    "ocean_o": 75,
    "ocean_c": 80,
    "ocean_e": 70,
    "ocean_a": 85,
    "ocean_n": 50,
    "is_ocean": 1,
    "ocean_date": "2024-01-15T10:30:00Z",
    "emotion_joy": 0.85,
    "emotion_anger": 0.05,
    "emotion_sad": 0.10,
    "emotion_fear": 0.05,
    "is_emotion": 1,
    "emotion_date": "2024-01-15T10:30:00Z",
    "project_id": 1,
    "project_name": "Bank BRI",
    "date": "2024-01-15T10:30:00Z",
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T10:30:00Z"
  }
}
PUT /streams/:id/sentiment

Memperbarui sentiment stream secara manual. Nilai sentiment: -1 (negative), 0 (neutral), 1 (positive). Sistem akan otomatis mengupdate flag is_sentiment dan sentiment_date.

Request Body

{
  "sentiment": 1  // -1 (negative), 0 (neutral), 1 (positive)
}

Response (200 OK)

{
  "success": true,
  "message": "Sentiment updated successfully",
  "data": {
    "id": 1,
    "sentiment": 1,
    "is_sentiment": 1,
    "sentiment_date": "2024-01-15T10:30:00Z"
  }
}
PUT /streams/:id/topic

Memperbarui topic/category stream. Topic adalah label kategori yang diberikan untuk mengklasifikasikan konten stream. Sistem akan otomatis mengupdate flag is_topic dan topic_date.

Request Body

{
  "topic": "Customer Service"  // String, wajib
}

Response (200 OK)

{
  "success": true,
  "message": "Topic updated successfully",
  "data": {
    "id": 1,
    "topic": "Customer Service",
    "is_topic": 1,
    "topic_date": "2024-01-15T10:30:00Z"
  }
}
PUT /streams/:id/ocean

Memperbarui skor OCEAN personality traits. OCEAN adalah model Big Five personality: Openness (O), Conscientiousness (C), Extraversion (E), Agreeableness (A), Neuroticism (N). Nilai range 0-100.

Request Body

{
  "ocean_o": 75,  // Openness (0-100)
  "ocean_c": 80,  // Conscientiousness (0-100)
  "ocean_e": 70,  // Extraversion (0-100)
  "ocean_a": 85,  // Agreeableness (0-100)
  "ocean_n": 50   // Neuroticism (0-100)
}

Response (200 OK)

{
  "success": true,
  "message": "OCEAN scores updated successfully",
  "data": {
    "id": 1,
    "ocean_o": 75,
    "ocean_c": 80,
    "ocean_e": 70,
    "ocean_a": 85,
    "ocean_n": 50,
    "is_ocean": 1,
    "ocean_date": "2024-01-15T10:30:00Z"
  }
}
PUT /streams/:id/emotion

Memperbarui skor emosi stream. Emosi yang didukung: joy (kegembiraan), anger (kemarahan), sad (kesedihan), fear (ketakutan). Nilai range 0.0-1.0 (float). Total semua emosi sebaiknya mendekati 1.0.

Request Body

{
  "emotion_joy": 0.85,   // Kegembiraan (0.0-1.0)
  "emotion_anger": 0.05, // Kemarahan (0.0-1.0)
  "emotion_sad": 0.10,   // Kesedihan (0.0-1.0)
  "emotion_fear": 0.05   // Ketakutan (0.0-1.0)
}

Response (200 OK)

{
  "success": true,
  "message": "Emotion scores updated successfully",
  "data": {
    "id": 1,
    "emotion_joy": 0.85,
    "emotion_anger": 0.05,
    "emotion_sad": 0.10,
    "emotion_fear": 0.05,
    "is_emotion": 1,
    "emotion_date": "2024-01-15T10:30:00Z"
  }
}
GET /streams/export

Mengekspor hasil filter streams ke file CSV. Menggunakan query parameters yang sama dengan endpoint GET /streams untuk filtering. File CSV akan berisi semua kolom stream data.

Query Parameters

Sama dengan GET /streams (channel, project, sentiment, date_from, date_to, dll)

Response (200 OK)

Mengembalikan file CSV dengan Content-Type: text/csv. File dapat diunduh langsung oleh browser.

Report Generator

POST /reports

Membuat record report baru di database. Report ini akan digunakan untuk generate report melalui Gamma API. Status awal report adalah PENDING. Setelah dibuat, gunakan endpoint /reports/:id/generate untuk memulai proses generation.

Request Body

{
  "input_text": "Create social media analysis report",  // Deskripsi report, wajib
  "num_cards": 10,                                        // Jumlah slide/card: 5, 10, 15, 20, 25, 30
  "export_as": "pdf",                                     // Format: "pdf" atau "pptx"
  "language": "id",                                       // Bahasa: "id" (Indonesia) atau "en" (English)
  "additional_instructions": "Focus on engagement"      // Instruksi tambahan (opsional)
}

Response (201 Created)

{
  "success": true,
  "message": "Report created successfully",
  "data": {
    "id": 1,
    "input_text": "Create social media analysis report",
    "num_cards": 10,
    "export_as": "pdf",
    "language": "id",
    "additional_instructions": "Focus on engagement",
    "generation_id": null,
    "status": "PENDING",
    "url_report": null,
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T10:30:00Z"
  }
}
GET /reports

Mengambil daftar semua reports dengan pagination. Mendukung query parameters: page, limit untuk pagination.

Query Parameters

  • page (int, default: 1) - Nomor halaman
  • limit (int, default: 10) - Jumlah item per halaman

Response (200 OK)

{
  "success": true,
  "message": "Reports retrieved successfully",
  "data": [
    {
      "id": 1,
      "input_text": "Create social media analysis report",
      "num_cards": 10,
      "export_as": "pdf",
      "language": "id",
      "additional_instructions": "Focus on engagement",
      "generation_id": "gen_123456",
      "status": "COMPLETED",
      "url_report": "https://gamma.app/...",
      "created_at": "2024-01-15T10:30:00Z",
      "updated_at": "2024-01-15T10:35:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 25,
    "total_pages": 3
  }
}
POST /reports/:id/generate

Memulai proses generate report melalui Gamma API. Endpoint ini akan memanggil Gamma API dengan data report yang sudah dibuat. Status report akan diupdate menjadi PENDING dan generation_id akan diisi setelah request berhasil dikirim ke Gamma API.

Response (200 OK)

{
  "success": true,
  "message": "Report generation started",
  "data": {
    "id": 1,
    "generation_id": "gen_123456",
    "status": "PENDING"
  }
}

Error Response (400 Bad Request)

{
  "success": false,
  "message": "Report generation already in progress"
}
GET /reports/:id/status

Memeriksa status generation report dari Gamma API. Endpoint ini akan memanggil Gamma API untuk mendapatkan status terbaru dan mengupdate status serta url_report jika generation sudah selesai. Status yang mungkin: PENDING, COMPLETED, FAILED.

Response (200 OK)

{
  "success": true,
  "message": "Status retrieved successfully",
  "data": {
    "id": 1,
    "generation_id": "gen_123456",
    "status": "COMPLETED",
    "url_report": "https://gamma.app/report/abc123"
  }
}
GET /reports/:id

Mengambil detail lengkap satu report berdasarkan ID. Mengembalikan semua informasi termasuk status generation dan URL report jika sudah selesai.

Response (200 OK)

{
  "success": true,
  "message": "Report retrieved successfully",
  "data": {
    "id": 1,
    "input_text": "Create social media analysis report",
    "num_cards": 10,
    "export_as": "pdf",
    "language": "id",
    "additional_instructions": "Focus on engagement",
    "generation_id": "gen_123456",
    "status": "COMPLETED",
    "url_report": "https://gamma.app/report/abc123",
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T10:35:00Z"
  }
}
PUT /reports/:id

Memperbarui informasi report. Hanya field yang dikirim yang akan diupdate. Tidak dapat mengupdate generation_id, status, dan url_report (diupdate otomatis oleh sistem).

Request Body

{
  "input_text": "Updated report description",  // Opsional
  "num_cards": 15,                               // Opsional
  "export_as": "pptx",                           // Opsional
  "language": "en",                               // Opsional
  "additional_instructions": "New instructions" // Opsional
}

Response (200 OK)

{
  "success": true,
  "message": "Report updated successfully",
  "data": {
    "id": 1,
    "input_text": "Updated report description",
    "num_cards": 15,
    "export_as": "pptx",
    "language": "en",
    "additional_instructions": "New instructions",
    "generation_id": "gen_123456",
    "status": "PENDING",
    "url_report": null,
    "updated_at": "2024-01-15T11:00:00Z"
  }
}
DELETE /reports/:id

Menghapus report dari database. Hanya dapat menghapus report yang statusnya bukan COMPLETED atau yang sedang dalam proses generation.

Response (200 OK)

{
  "success": true,
  "message": "Report deleted successfully"
}

Error Response (400 Bad Request)

{
  "success": false,
  "message": "Cannot delete report that is completed or in progress"
}

Settings Category

CRUD operations untuk mengelola setting category/topic per project. Setting ini digunakan untuk konfigurasi prompt kategori yang akan digunakan dalam analisis stream berdasarkan data source dan project tertentu.

POST /settings/category

Membuat setting category baru untuk project tertentu. Setting ini menentukan bagaimana sistem akan mengkategorikan stream berdasarkan data source dan project. Prompt category digunakan sebagai instruksi untuk AI dalam mengklasifikasikan konten.

Request Body

{
  "data_source": "twitter_api",                              // Sumber data, wajib
  "project_id": 1,                                            // ID project, wajib
  "project_name": "Bank BRI",                                 // Nama project, wajib
  "prompt_category": "Categorize into: Service, Product, Complaint"  // Prompt untuk kategori, wajib
}

Response (201 Created)

{
  "success": true,
  "message": "Setting category created successfully",
  "data": {
    "id": 1,
    "data_source": "twitter_api",
    "project_id": 1,
    "project_name": "Bank BRI",
    "prompt_category": "Categorize into: Service, Product, Complaint",
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T10:30:00Z"
  }
}
GET /settings/category

Mengambil daftar semua setting category. Mendukung query parameters untuk filtering berdasarkan data_source dan project_id.

Query Parameters

  • data_source (string) - Filter berdasarkan data source
  • project_id (int) - Filter berdasarkan project ID

Response (200 OK)

{
  "success": true,
  "message": "Settings retrieved successfully",
  "data": [
    {
      "id": 1,
      "data_source": "twitter_api",
      "project_id": 1,
      "project_name": "Bank BRI",
      "prompt_category": "Categorize into: Service, Product, Complaint",
      "created_at": "2024-01-15T10:30:00Z",
      "updated_at": "2024-01-15T10:30:00Z"
    }
  ]
}
GET /settings/category/:id

Mengambil detail satu setting category berdasarkan ID.

Response (200 OK)

{
  "success": true,
  "message": "Setting retrieved successfully",
  "data": {
    "id": 1,
    "data_source": "twitter_api",
    "project_id": 1,
    "project_name": "Bank BRI",
    "prompt_category": "Categorize into: Service, Product, Complaint",
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T10:30:00Z"
  }
}
PUT /settings/category/:id

Memperbarui setting category. Hanya field yang dikirim yang akan diupdate.

Request Body

{
  "prompt_category": "Updated categorization prompt"  // Opsional, field lain juga bisa diupdate
}

Response (200 OK)

{
  "success": true,
  "message": "Setting updated successfully",
  "data": {
    "id": 1,
    "data_source": "twitter_api",
    "project_id": 1,
    "project_name": "Bank BRI",
    "prompt_category": "Updated categorization prompt",
    "updated_at": "2024-01-15T11:00:00Z"
  }
}

Settings Sentiment

CRUD operations untuk mengelola setting sentiment per project. Setting ini menentukan bagaimana sistem akan menganalisis sentiment stream berdasarkan indikator positif, negatif, dan netral yang dikonfigurasi untuk setiap project dan data source.

POST /settings/sentiment

Membuat setting sentiment baru untuk project tertentu. Setting ini berisi prompt yang menjelaskan indikator untuk sentiment positif, negatif, dan netral. Prompt ini digunakan oleh AI untuk menganalisis sentiment konten stream.

Request Body

{
  "data_source": "twitter_api",                    // Sumber data, wajib
  "project_id": 1,                                  // ID project, wajib
  "project_name": "Bank BRI",                       // Nama project, wajib
  "prompt_positif": "Positive indicators: praise, satisfaction, recommendation",  // Prompt untuk positif, wajib
  "prompt_negatif": "Negative indicators: complaint, dissatisfaction, criticism",  // Prompt untuk negatif, wajib
  "prompt_netral": "Neutral indicators: factual information, questions, general statements"  // Prompt untuk netral, wajib
}

Response (201 Created)

{
  "success": true,
  "message": "Setting sentiment created successfully",
  "data": {
    "id": 1,
    "data_source": "twitter_api",
    "project_id": 1,
    "project_name": "Bank BRI",
    "prompt_positif": "Positive indicators: praise, satisfaction, recommendation",
    "prompt_negatif": "Negative indicators: complaint, dissatisfaction, criticism",
    "prompt_netral": "Neutral indicators: factual information, questions, general statements",
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T10:30:00Z"
  }
}
GET /settings/sentiment

Mengambil daftar semua setting sentiment. Mendukung query parameters untuk filtering berdasarkan data_source dan project_id.

Query Parameters

  • data_source (string) - Filter berdasarkan data source
  • project_id (int) - Filter berdasarkan project ID

Response (200 OK)

{
  "success": true,
  "message": "Settings retrieved successfully",
  "data": [
    {
      "id": 1,
      "data_source": "twitter_api",
      "project_id": 1,
      "project_name": "Bank BRI",
      "prompt_positif": "Positive indicators: praise, satisfaction, recommendation",
      "prompt_negatif": "Negative indicators: complaint, dissatisfaction, criticism",
      "prompt_netral": "Neutral indicators: factual information, questions, general statements",
      "created_at": "2024-01-15T10:30:00Z",
      "updated_at": "2024-01-15T10:30:00Z"
    }
  ]
}

Automation Logs

GET /automation

Mengambil daftar automation logs dengan berbagai filter. Automation logs mencatat aktivitas otomatis seperti pengiriman alert dan report generation yang dijadwalkan. Mendukung pagination dan sorting.

Query Parameters

  • tipe (string) - Filter tipe: "alert" atau "report"
  • status (string) - Filter status: "pending", "success", atau "failed"
  • freq_send (string) - Filter frekuensi: "daily", "weekly", "monthly", atau "custom"
  • page (int, default: 1) - Nomor halaman
  • limit (int, default: 10) - Jumlah item per halaman
  • sort_by (string) - Field untuk sorting
  • sort_dir (string) - Arah sorting: ASC atau DESC

Response (200 OK)

{
  "success": true,
  "message": "Automation logs retrieved successfully",
  "data": [
    {
      "id": 1,
      "tipe": "alert",
      "status": "success",
      "freq_send": "daily",
      "message": "Alert sent successfully",
      "created_at": "2024-01-15T10:30:00Z",
      "updated_at": "2024-01-15T10:30:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 50,
    "total_pages": 5
  }
}
GET /automation/:id

Mengambil detail lengkap satu automation log berdasarkan ID. Mengembalikan semua informasi termasuk tipe, status, frekuensi, pesan, dan timestamp.

Response (200 OK)

{
  "success": true,
  "message": "Automation log retrieved successfully",
  "data": {
    "id": 1,
    "tipe": "alert",
    "status": "success",
    "freq_send": "daily",
    "message": "Alert sent successfully",
    "error_message": null,
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T10:30:00Z"
  }
}

User Management

Admin only endpoint. Hanya pengguna dengan role admin yang dapat mengakses resource ini. Semua endpoint di section ini memerlukan JWT token dengan role admin.

GET /users

Mengambil daftar semua users dalam sistem. Hanya dapat diakses oleh admin. Mendukung pagination untuk mengelola daftar user yang banyak.

Query Parameters

  • page (int, default: 1) - Nomor halaman
  • limit (int, default: 10) - Jumlah item per halaman

Response (200 OK)

{
  "success": true,
  "message": "Users retrieved successfully",
  "data": [
    {
      "id": 1,
      "email": "user@example.com",
      "name": "John Doe",
      "role": "user",
      "created_at": "2024-01-15T10:30:00Z",
      "updated_at": "2024-01-15T10:30:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 25,
    "total_pages": 3
  }
}

Error Response (403 Forbidden)

{
  "success": false,
  "message": "Access denied. Admin role required"
}
POST /users

Membuat user baru dalam sistem. Hanya admin yang dapat membuat user baru. Email harus unik dan password minimal 6 karakter. Role default adalah "user" jika tidak ditentukan.

Request Body

{
  "email": "newuser@example.com",  // Email unik, wajib
  "name": "Jane Doe",               // Nama lengkap, wajib
  "password": "password123",        // Password minimal 6 karakter, wajib
  "role": "user"                    // Role: "user" atau "admin", default: "user"
}

Response (201 Created)

{
  "success": true,
  "message": "User created successfully",
  "data": {
    "id": 2,
    "email": "newuser@example.com",
    "name": "Jane Doe",
    "role": "user",
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T10:30:00Z"
  }
}

Error Response (409 Conflict)

{
  "success": false,
  "message": "Email already exists"
}
GET /users/:id

Mengambil detail lengkap satu user berdasarkan ID. Hanya admin yang dapat mengakses endpoint ini.

Response (200 OK)

{
  "success": true,
  "message": "User retrieved successfully",
  "data": {
    "id": 1,
    "email": "user@example.com",
    "name": "John Doe",
    "role": "user",
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T10:30:00Z"
  }
}
PUT /users/:id

Memperbarui informasi user. Admin dapat mengupdate email, nama, dan role user. Password tidak dapat diupdate melalui endpoint ini (gunakan /change-password).

Request Body

{
  "email": "updated@example.com",  // Opsional
  "name": "Updated Name",           // Opsional
  "role": "admin"                   // Opsional: "user" atau "admin"
}

Response (200 OK)

{
  "success": true,
  "message": "User updated successfully",
  "data": {
    "id": 1,
    "email": "updated@example.com",
    "name": "Updated Name",
    "role": "admin",
    "updated_at": "2024-01-15T11:00:00Z"
  }
}

Response Format

Success Response

{
  "success": true,
  "message": "Operation successful",
  "data": {}
}

Error Response

{
  "success": false,
  "message": "Error description"
}

Pagination Response

{
  "success": true,
  "message": "Data retrieved",
  "data": [],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 100,
    "total_pages": 10
  }
}

HTTP Status Codes

  • 200 OK
  • 201 Created
  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 409 Conflict
  • 500 Internal Server Error