Table of Contents
- A. Pendahuluan & Autentikasi API
- 1. Pendahuluan
- 2. Base URL
- 3. Autentikasi
- 4. Format Request
- 5. Format Respons Sukses
- 6. Format Respons Error Umum
- 7. Catatan Penting
- B. Endpoint Pengguna (Users)
- 1. Mendapatkan Daftar Pengguna Online
- C. Endpoint Akun (Accounts)
- 1. Membuat atau Memperbarui Akun Pengguna
- 2. Mendapatkan Daftar Semua Akun Pengguna
- 3. Menghapus Akun Pengguna
- D. Endpoint Channel (Channels)
- 1. Membuat Channel Baru
- 2. Mendapatkan Daftar Semua Channel
- 3. Menghapus Channel
- 4. Memperbarui Channel
- E. Catatan untuk Pengembang
- 1. TeamTalkClient.php (Inti Interaksi dengan Server TeamTalk)
- 2. Struktur dan Logika Rute (src/Routes/)
- 3. Konfigurasi (src/settings.php)
- 4. Pengujian (Testing)
- 5. Keamanan
- 6. Performa dan Skalabilitas
- 7. Dokumentasi Kode
- 8. Manajemen Versi API
- 9. tt5admin.php sebagai Referensi Utama
- Corat-coret
A. Pendahuluan & Autentikasi API
1. Pendahuluan
Selamat datang di dokumentasi API TeamTalk. API ini memungkinkan kamu untuk berinteraksi dan mengelola server TeamTalk 5 melalui antarmuka HTTP RESTful. Dibangun menggunakan Slim Framework dengan PHP, API ini dirancang untuk menyediakan cara terprogram untuk melakukan berbagai tindakan administratif yang sebelumnya mungkin memerlukan skriptt5admin.php atau interaksi manual.
Semua request dan response body menggunakan format JSON. Content-Type untuk request yang mengirimkan data (seperti POST dan PUT) harus application/json, dan response dari API juga akan selalu dalam format application/json.
2. Base URL
Semua URL yang dirujuk dalam dokumentasi ini menggunakan base URL berikut:- Development (sesuai konfigurasi
composer.json):http://localhost:8080/api - Production:
https://domain-kamu.com/api(sesuaikan dengan domain deployment kamu)
/api. Sebagai contoh, endpoint /users/online akan menjadi http://localhost:8080/api/users/online.
3. Autentikasi
API ini diamankan menggunakan API Key. Setiap permintaan ke endpoint di bawah/api harus menyertakan API Key yang valid dalam HTTP header X-API-Key.
- Header Name:
X-API-Key - Cara Mendapatkan API Key: API Key dikonfigurasi di sisi server dalam file
src/settings.phppada variabel$apiKey. Untuk lingkungan produksi, pastikan nilai ini diubah menjadi key yang kuat dan acak, dan idealnya dikelola melalui environment variables server.
curl -X GET "http://localhost:8080/api/users/online" \
-H "Content-Type: application/json" \
-H "X-API-Key: NILAI_API_KEY_KAMU"
Jika API Key tidak disertakan, tidak valid, atau kosong, server akan merespons dengan status 401 Unauthorized.
4. Format Request
- Content-Type: Untuk request yang mengirimkan data dalam body (misalnya, POST, PUT), header
Content-Typeharus disetel keapplication/json. - Metode HTTP: API ini menggunakan metode HTTP standar:
GET: Untuk mengambil resource.POST: Untuk membuat resource baru.PUT: Untuk memperbarui resource yang sudah ada secara keseluruhan atau sebagian (tergantung implementasi endpoint).DELETE: Untuk menghapus resource.
5. Format Respons Sukses
Respons yang berhasil (status HTTP2xx) umumnya akan mengikuti struktur berikut:
{
"status": "success",
"message": "Operasi berhasil.", // Opsional, tergantung endpoint
"data": {
// ... data spesifik yang dikembalikan oleh endpoint ...
}
}
Contoh untuk pembuatan resource baru (status 201 Created):
{
"status": "success",
"message": "Channel 'Nama Channel Baru' created successfully.",
"data": {
"id": 123, // ID resource yang baru dibuat
"name": "Nama Channel Baru",
// ... detail lain dari resource yang baru dibuat ...
}
}
Contoh untuk pengambilan daftar resource (status 200 OK):
{
"status": "success",
"data": {
"accounts": [
{ "username": "user1", "userType": 1, /* ... */ },
{ "username": "user2", "userType": 2, /* ... */ }
],
"count": 2
}
}
6. Format Respons Error Umum
Respons error (status HTTP4xx atau 5xx) akan mengikuti struktur yang didefinisikan oleh JsonErrorRenderer.
Struktur umum:
{
"error_type": "TipeErrorSpesifik",
"message": "Deskripsi error yang mudah dipahami."
}
Jika displayErrorDetails diaktifkan di konfigurasi server (biasanya hanya untuk development), payload error akan menyertakan field details:
{
"error_type": "TipeErrorSpesifik",
"message": "Deskripsi error yang mudah dipahami.",
"details": {
"exception_class": "NamaKelasException",
"code": 0, // Kode exception
"file": "/path/to/file.php",
"line": 123,
"trace": [ /* ... stack trace ... */ ] // Hanya untuk error 5xx atau jika bukan HttpException
}
}
Contoh Error Umum:
- 401 Unauthorized (API Key tidak valid atau hilang):
atau{ "error_type": "Unauthorized", "message": "API Key is missing." }{ "error_type": "Unauthorized", "message": "Invalid API Key." } - 400 Bad Request (Input tidak valid):
{ "error_type": "BadRequest", "message": "Invalid input provided. Username: Username is required and cannot be empty." } - 403 Forbidden (Aksi tidak diizinkan):
{ "error_type": "Forbidden", "message": "Deleting the API administrator account is not allowed." } - 404 Not Found (Endpoint atau resource tidak ditemukan):
atau (jika resource spesifik tidak ditemukan){ "error_type": "NotFound", "message": "The requested endpoint was not found on this server." }{ "error_type": "NotFound", "message": "User account 'username_tidak_ada' not found." } - 405 Method Not Allowed (Metode HTTP salah untuk endpoint):
{ "error_type": "MethodNotAllowed", "message": "Method Not Allowed. Must be one of: GET, POST", // Pesan bisa bervariasi "allowed_methods": ["GET", "POST"] } - 409 Conflict (Resource sudah ada saat mencoba membuat):
{ "error_type": "HttpError", // Bisa juga dikustomisasi di JsonErrorRenderer menjadi "Conflict" "message": "Channel 'Nama Channel' (or a channel with the same properties at that location) already exists." } - 500 Internal Server Error (Error tidak terduga di server):
{ "error_type": "InternalServerError", "message": "An unexpected internal error occurred." } - 503 Service Unavailable (Error koneksi atau login ke server TeamTalk):
{ "error_type": "HttpError", // JsonErrorRenderer akan mengklasifikasikannya sebagai HttpError jika tidak spesifik "message": "Failed to connect to TeamTalk server." // Pesan bisa bervariasi }
7. Catatan Penting
- Keamanan API Key: Jaga kerahasiaan API Key kamu. Jangan pernah mengeksposnya di sisi klien (frontend JavaScript, aplikasi mobile, dll.). API ini dimaksudkan untuk digunakan dari backend ke backend.
- Mode Produksi: Untuk lingkungan produksi, pastikan
displayErrorDetailsdisetel kefalsedalam konfigurasi server (src/settings.php) untuk mencegah kebocoran informasi sensitif. - Logging: Server API mencatat aktivitas dan error ke file log (biasanya
logs/app.log). Periksa log ini untuk debugging jika terjadi masalah.
B. Endpoint Pengguna (Users)
Bagian ini mendokumentasikan endpoint yang berkaitan dengan manajemen dan informasi pengguna yang sedang online di server TeamTalk.1. Mendapatkan Daftar Pengguna Online
- Endpoint:
GET /users/online - Metode:
GET - Deskripsi: Mengambil daftar semua pengguna yang saat ini sedang online di server TeamTalk. Informasi yang dikembalikan mencakup nickname pengguna dan path channel tempat mereka berada.
- Autentikasi: Memerlukan API Key (lihat A.3. Autentikasi).
X-API-Key: NILAI_API_KEY_KAMU(Wajib)Content-Type: application/json(Disarankan, meskipun GET tidak memiliki body)
curl -X GET "http://localhost:8080/api/users/online" \
-H "X-API-Key: kweW^^4345jfvzXeddduuww" \
-H "Content-Type: application/json"
Respons Sukses (200 OK):
Server akan merespons dengan daftar pengguna online.
{
"status": "success",
"data": {
"users": [
{
"nickname": "UserSatu",
"channel": "/Lobby Utama/Ruang Diskusi"
},
{
"nickname": "AdminServer",
"channel": "/"
},
{
"nickname": "PemainGame",
"channel": "/Gaming Zone/Game A"
},
{
"nickname": "TT5ClientAPI",
"channel": "N/A (API Client)"
}
],
"count": 4
}
}
Detail Field dalam users:
nickname(string): Nickname pengguna yang sedang online.channel(string): Path lengkap dari channel tempat pengguna berada.- Jika pengguna berada di root channel, nilainya adalah
/. - Jika pengguna adalah API client itu sendiri (sesuai nickname di konfigurasi), nilainya bisa
N/A (API Client). - Jika ada error resolusi path channel, pesan error akan ditampilkan di sini (misalnya,
In Channel ID: 123 (Path Resolution Error)).
- Jika pengguna berada di root channel, nilainya adalah
- 401 Unauthorized:
{ "error_type": "Unauthorized", "message": "API Key is missing." // atau "Invalid API Key." } - 503 Service Unavailable: Jika terjadi masalah saat API mencoba terhubung atau login ke server TeamTalk.
atau{ "error_type": "HttpError", "message": "TeamTalk service interaction error: Failed to connect to TeamTalk server." }
(Pesan{ "error_type": "HttpError", "message": "TeamTalk service interaction error: Failed to login to TeamTalk server with API credentials." }messagebisa bervariasi tergantung pada detail error dariTeamTalkClientException)
C. Endpoint Akun (Accounts)
Bagian ini mendokumentasikan endpoint yang berkaitan dengan manajemen akun pengguna (user accounts) di server TeamTalk. Akun pengguna berbeda dengan pengguna online; akun adalah entitas yang tersimpan di server dan digunakan untuk login.1. Membuat atau Memperbarui Akun Pengguna
- Endpoint:
POST /accounts - Metode:
POST - Deskripsi: Membuat akun pengguna baru di server TeamTalk. Jika akun dengan username yang sama sudah ada, perilaku server TeamTalk (melalui perintah
newaccount) mungkin akan menimpa akun tersebut (termasuk passwordnya). API ini saat ini tidak secara eksplisit membedakan antara "create" dan "update password" melalui endpoint ini; perintahnewaccountyang dikirim ke server akan diproses apa adanya. - Autentikasi: Memerlukan API Key (lihat A.3. Autentikasi).
{
"username": "penggunabaru",
"password": "PasswordKuat123!"
}
Detail Field Request Body:
username(string, wajib): Username untuk akun baru. Tidak boleh kosong.password(string, wajib): Password untuk akun baru. Tidak boleh kosong.
X-API-Key: NILAI_API_KEY_KAMU(Wajib)Content-Type: application/json(Wajib)
curl -X POST "http://localhost:8080/api/accounts" \
-H "X-API-Key: kweW^^4345jfvzXeddduuww" \
-H "Content-Type: application/json" \
-d '{
"username": "penggunabaru",
"password": "PasswordKuat123!"
}'
Respons Sukses (200 OK):
Server akan merespons bahwa akun telah berhasil diproses (dibuat atau diperbarui oleh server TeamTalk).
{
"status": "success",
"message": "User account 'penggunabaru' processed successfully (created or updated).",
"data": {
"username": "penggunabaru"
}
}
Respons Error:
- 400 Bad Request: Jika input tidak valid (misalnya,
usernameataupasswordkosong).
atau{ "error_type": "BadRequest", "message": "Invalid input provided. Username: Username is required and cannot be empty." }{ "error_type": "BadRequest", "message": "Invalid request body. Expected JSON object." } - 401 Unauthorized: (Lihat A.6. Format Respons Error Umum)
- 503 Service Unavailable: Jika terjadi masalah saat API mencoba terhubung, login, atau memproses perintah ke server TeamTalk.
(Pesan{ "error_type": "HttpError", "message": "TeamTalk Service Error: Failed to create user account 'penggunabaru': [Error Code dari TeamTalk] Pesan error dari TeamTalk" }messageakan mencerminkan error spesifik dariTeamTalkClientException)
2. Mendapatkan Daftar Semua Akun Pengguna
- Endpoint:
GET /accounts - Metode:
GET - Deskripsi: Mengambil daftar semua akun pengguna yang terdaftar di server TeamTalk.
- Autentikasi: Memerlukan API Key (lihat A.3. Autentikasi).
X-API-Key: NILAI_API_KEY_KAMU(Wajib)Content-Type: application/json(Disarankan)
curl -X GET "http://localhost:8080/api/accounts" \
-H "X-API-Key: kweW^^4345jfvzXeddduuww" \
-H "Content-Type: application/json"
Respons Sukses (200 OK):
Server akan merespons dengan daftar akun pengguna.
{
"status": "success",
"data": {
"accounts": [
{
"username": "admin",
"userType": 2, // 1 = Default, 2 = Admin
"note": "Akun administrator utama",
"initialChannel": "/Lobby Utama"
},
{
"username": "penggunabaru",
"userType": 1,
"note": "",
"initialChannel": ""
},
{
"username": "InfiArtt", // Akun yang digunakan API untuk login
"userType": 2,
"note": "",
"initialChannel": ""
}
],
"count": 3
}
}
Detail Field dalam accounts:
username(string): Username akun.userType(integer): Tipe pengguna (biasanya1untuk pengguna default,2untuk administrator).note(string): Catatan yang terkait dengan akun (jika ada).initialChannel(string): Path channel awal tempat pengguna akan ditempatkan saat login (jika dikonfigurasi).
- 401 Unauthorized: (Lihat A.6. Format Respons Error Umum)
- 503 Service Unavailable: Jika terjadi masalah saat API mencoba terhubung atau login ke server TeamTalk.
{ "error_type": "HttpError", "message": "TeamTalk Service Error: Error listing user accounts: Pesan error dari TeamTalk" }
3. Menghapus Akun Pengguna
- Endpoint:
DELETE /accounts/{username} - Metode:
DELETE - Deskripsi: Menghapus akun pengguna dari server TeamTalk berdasarkan username.
- Autentikasi: Memerlukan API Key (lihat A.3. Autentikasi).
username(string, wajib): Username dari akun yang akan dihapus. Penting: URL encoding mungkin diperlukan jika username mengandung karakter khusus (meskipun umumnya username tidak demikian).
X-API-Key: NILAI_API_KEY_KAMU(Wajib)Content-Type: application/json(Disarankan)
curl -X DELETE "http://localhost:8080/api/accounts/penggunayangakandihapus" \
-H "X-API-Key: kweW^^4345jfvzXeddduuww" \
-H "Content-Type: application/json"
Respons Sukses (200 OK):
Server akan merespons bahwa akun telah berhasil dihapus.
{
"status": "success",
"message": "User account 'penggunayangakandihapus' deleted successfully."
}
Respons Error:
- 400 Bad Request: Jika
usernametidak disertakan dalam path.{ "error_type": "BadRequest", "message": "Username parameter is required." } - 401 Unauthorized: (Lihat A.6. Format Respons Error Umum)
- 403 Forbidden: Jika mencoba menghapus akun yang digunakan oleh API itu sendiri untuk login ke TeamTalk (sesuai konfigurasi
teamtalk_server.usernamedisettings.php).{ "error_type": "Forbidden", "message": "Deleting the API administrator account is not allowed." } - 404 Not Found: Jika akun dengan
usernameyang diberikan tidak ditemukan di server TeamTalk.{ "error_type": "NotFound", "message": "User account 'username_tidak_ada' not found." } - 503 Service Unavailable: Jika terjadi masalah lain saat API mencoba terhubung, login, atau memproses perintah ke server TeamTalk (selain akun tidak ditemukan).
{ "error_type": "HttpError", "message": "TeamTalk Service Error: Pesan error dari TeamTalk selain 'not found'" }
D. Endpoint Channel (Channels)
Bagian ini mendokumentasikan endpoint yang berkaitan dengan manajemen channel di server TeamTalk.1. Membuat Channel Baru
- Endpoint:
POST /channels - Metode:
POST - Deskripsi: Membuat channel baru di server TeamTalk. Channel baru akan dibuat sebagai sub-channel dari
parentPathyang ditentukan, atau di bawah root server jikaparentPathtidak diberikan atau kosong. - Autentikasi: Memerlukan API Key (lihat A.3. Autentikasi).
{
"name": "Ruang Diskusi Baru",
"parentPath": "/Lobby Utama", // Opsional, default ke root server (ID 1)
"password": "passchannelrahasia", // Opsional, default ke tanpa password
"topic": "Topik diskusi untuk channel ini.", // Opsional, default ke kosong
"operatorPassword": "oppasschannel", // Opsional, default ke tanpa operator password
"audioBitrateKbps": 64, // Opsional, default ke 64. Pilihan: 16, 32, 64, 96, 128, 192, 256, 320
"audioChannels": "mono", // Opsional, default ke "mono". Pilihan: "mono", "stereo"
"audioApplication": "voip" // Opsional, default ke "voip". Pilihan: "voip", "music"
}
Detail Field Request Body:
name(string, wajib): Nama untuk channel baru. Tidak boleh kosong.parentPath(string, opsional): Path lengkap dari channel induk tempat channel baru akan dibuat.- Contoh:
/Lobby Utama/Sub Ruang. - Jika tidak diberikan, kosong (
""), atau/, channel akan dibuat di bawah root server (induknya adalah channel ID 1).
- Contoh:
password(string, opsional): Password untuk masuk ke channel. Defaultnya tidak ada password.topic(string, opsional): Topik atau deskripsi channel. Defaultnya kosong.operatorPassword(string, opsional): Password operator untuk channel. Defaultnya tidak ada operator password.audioBitrateKbps(integer, opsional): Bitrate audio (OPUS) dalam Kbps. Default:64. Nilai yang diizinkan:16, 32, 64, 96, 128, 192, 256, 320.audioChannels(string, opsional): Jumlah channel audio. Default:"mono". Pilihan:"mono", "stereo".audioApplication(string, opsional): Jenis aplikasi audio (OPUS). Default:"voip". Pilihan:"voip", "music".
X-API-Key: NILAI_API_KEY_KAMU(Wajib)Content-Type: application/json(Wajib)
curl -X POST "http://localhost:8080/api/channels" \
-H "X-API-Key: kweW^^4345jfvzXeddduuww" \
-H "Content-Type: application/json" \
-d '{
"name": "Channel Baru di Root",
"topic": "Channel untuk tes"
}'
Membuat sub-channel:
curl -X POST "http://localhost:8080/api/channels" \
-H "X-API-Key: kweW^^4345jfvzXeddduuww" \
-H "Content-Type: application/json" \
-d '{
"name": "Sub Diskusi",
"parentPath": "/Channel Baru di Root",
"audioBitrateKbps": 96,
"audioChannels": "stereo"
}'
Respons Sukses (201 Created):
Server akan merespons dengan detail channel yang baru dibuat, termasuk ID channel yang dihasilkan oleh server TeamTalk.
{
"status": "success",
"message": "Channel 'Ruang Diskusi Baru' created successfully.",
"data": {
"id": 125, // ID channel yang baru dibuat
"name": "Ruang Diskusi Baru",
"parentIdUsed": 10, // ID channel induk yang digunakan (hasil resolusi parentPath)
"topic": "Topik diskusi untuk channel ini.",
"audioBitrateKbpsUsed": 64,
"audioChannelsUsed": "mono",
"audioApplicationUsed": "voip"
}
}
Respons Error:
- 400 Bad Request: Jika input tidak valid (misalnya,
namekosong,parentPathtidak ditemukan, atau nilai audio tidak valid).
atau{ "error_type": "BadRequest", "message": "Invalid input provided. Channel name: Channel name is required and cannot be empty." }
atau{ "error_type": "BadRequest", "message": "Parent channel path '/PathTidakAda' not found." }{ "error_type": "BadRequest", "message": "Invalid input provided. audioBitrateKbps: Invalid audioBitrateKbps. Allowed: 16, 32, 64, 96, 128, 192, 256, 320." } - 401 Unauthorized: (Lihat A.6. Format Respons Error Umum)
- 409 Conflict: Jika channel dengan nama yang sama sudah ada di bawah parent yang sama, atau ada konflik lain yang dilaporkan oleh server TeamTalk (misalnya, error
[3004] Channel already exists).{ "error_type": "HttpError", "message": "Channel 'Ruang Diskusi Baru' (or a channel with the same properties at that location) already exists." } - 503 Service Unavailable: Jika terjadi masalah saat API mencoba terhubung, login, atau memproses perintah ke server TeamTalk.
{ "error_type": "HttpError", "message": "TeamTalk Service Error: Pesan error spesifik dari TeamTalkClientException" }
2. Mendapatkan Daftar Semua Channel
- Endpoint:
GET /channels - Metode:
GET - Deskripsi: Mengambil daftar semua channel yang ada di server TeamTalk, beserta struktur hierarkinya (melalui
parentIddanpath). - Autentikasi: Memerlukan API Key (lihat A.3. Autentikasi).
X-API-Key: NILAI_API_KEY_KAMU(Wajib)Content-Type: application/json(Disarankan)
curl -X GET "http://localhost:8080/api/channels" \
-H "X-API-Key: kweW^^4345jfvzXeddduuww" \
-H "Content-Type: application/json"
Respons Sukses (200 OK):
Server akan merespons dengan daftar channel.
{
"status": "success",
"data": {
"channels": [
{
"id": 1,
"name": "NamaServerTeamTalkKamu", // Nama root channel biasanya nama server
"topic": "Message of the Day server",
"parentId": 0,
"path": "/"
},
{
"id": 10,
"name": "Lobby Utama",
"topic": "Selamat datang di lobby",
"parentId": 1,
"path": "/Lobby Utama"
},
{
"id": 125,
"name": "Ruang Diskusi Baru",
"topic": "Topik diskusi untuk channel ini.",
"parentId": 10,
"path": "/Lobby Utama/Ruang Diskusi Baru"
}
],
"count": 3
}
}
Detail Field dalam channels:
id(integer): ID unik channel.name(string): Nama channel.topic(string): Topik atau deskripsi channel.parentId(integer): ID dari channel induk. Untuk root channel (biasanya ID 1),parentIdadalah0.path(string): Path lengkap channel dari root.
- 401 Unauthorized: (Lihat A.6. Format Respons Error Umum)
- 503 Service Unavailable: Jika terjadi masalah saat API mencoba terhubung atau login ke server TeamTalk.
{ "error_type": "HttpError", "message": "TeamTalk Service Error: Pesan error dari TeamTalkClientException" }
3. Menghapus Channel
- Endpoint:
DELETE /channels/{id} - Metode:
DELETE - Deskripsi: Menghapus channel dari server TeamTalk berdasarkan ID channel. Channel tidak dapat dihapus jika masih berisi sub-channel atau pengguna (tergantung konfigurasi server TeamTalk).
- Autentikasi: Memerlukan API Key (lihat A.3. Autentikasi).
id(integer, wajib): ID dari channel yang akan dihapus.
X-API-Key: NILAI_API_KEY_KAMU(Wajib)Content-Type: application/json(Disarankan)
curl -X DELETE "http://localhost:8080/api/channels/125" \
-H "X-API-Key: kweW^^4345jfvzXeddduuww" \
-H "Content-Type: application/json"
Respons Sukses (200 OK):
Server akan merespons bahwa channel telah berhasil dihapus.
{
"status": "success",
"message": "Channel ID 125 deleted successfully."
}
Respons Error:
- 400 Bad Request:
- Jika
idbukan angka atau0.{ "error_type": "BadRequest", "message": "Channel ID parameter is invalid." } - Jika mencoba menghapus channel yang tidak kosong (error dari TeamTalk
[3006] channel is not empty).{ "error_type": "BadRequest", "message": "Channel ID 125 cannot be deleted because it is not empty. Server message: [3006] Channel is not empty" }
- Jika
- 401 Unauthorized: (Lihat A.6. Format Respons Error Umum)
- 403 Forbidden: Jika mencoba menghapus root channel utama (ID 1).
{ "error_type": "Forbidden", "message": "Deleting the main root channel (ID 1) is not allowed." } - 404 Not Found: Jika channel dengan
idyang diberikan tidak ditemukan di server TeamTalk (error dari TeamTalk[3005] Channel not found).{ "error_type": "NotFound", "message": "Channel ID 120 tidak ditemukan." // Pesan dari API } - 503 Service Unavailable: Jika terjadi masalah lain saat API mencoba terhubung, login, atau memproses perintah ke server TeamTalk.
{ "error_type": "HttpError", "message": "TeamTalk Service Error: Pesan error lain dari TeamTalkClientException" }
4. Memperbarui Channel
- Endpoint:
PUT /channels/{id} - Metode:
PUT - Deskripsi: Memperbarui properti dari channel yang sudah ada berdasarkan ID-nya. Hanya parameter yang disertakan dalam body request yang akan dipertimbangkan untuk pembaruan.
- Autentikasi: Memerlukan API Key (lihat A.3. Autentikasi).
id(integer, wajib): ID dari channel yang akan diperbarui.
{
"name": "Nama Channel Diperbarui", // Opsional
"topic": "Topik channel yang baru.", // Opsional
"password": "passchannelbaru", // Opsional, kirim string kosong "" untuk menghapus password
"operatorPassword": "oppassbaru", // Opsional, kirim string kosong "" untuk menghapus op password
"audioBitrateKbps": 128, // Opsional
"audioChannels": "stereo", // Opsional
"audioApplication": "music" // Opsional
}
Detail Field Request Body (Opsional, sertakan hanya yang ingin diubah):
name(string): Nama baru untuk channel. Tidak boleh string kosong jika diberikan.topic(string): Topik atau deskripsi baru channel.password(string): Password baru untuk channel. Kirim string kosong ("") untuk menghapus password yang ada.operatorPassword(string): Password operator baru untuk channel. Kirim string kosong ("") untuk menghapus password operator yang ada.audioBitrateKbps(integer): Bitrate audio baru. Nilai yang diizinkan:16, 32, 64, 96, 128, 192, 256, 320.audioChannels(string): Jumlah channel audio baru. Pilihan:"mono", "stereo".audioApplication(string): Jenis aplikasi audio baru. Pilihan:"voip", "music".
- Mengubah
parentid(memindahkan channel) tidak didukung melalui endpoint ini. - Mengubah
typechannel (permanent/temporary) juga tidak didukung saat ini melalui endpoint ini (akan memerlukan penyesuaian diTeamTalkClient). - Mengirim body request kosong (
{}) atau body dengan parameter yang tidak valid/tidak diizinkan akan menghasilkan error400 Bad Request.
X-API-Key: NILAI_API_KEY_KAMU(Wajib)Content-Type: application/json(Wajib)
curl -X PUT "http://localhost:8080/api/channels/10" \
-H "X-API-Key: kweW^^4345jfvzXeddduuww" \
-H "Content-Type: application/json" \
-d '{
"name": "Lobby Utama (Updated)",
"topic": "Selamat datang di lobby yang sudah diperbarui!",
"audioBitrateKbps": 96
}'
Respons Sukses (200 OK):
Server akan merespons dengan detail channel yang telah diperbarui.
{
"status": "success",
"message": "Channel ID 10 updated successfully.",
"data": {
"id": 10,
"name": "Lobby Utama (Updated)",
"topic": "Selamat datang di lobby yang sudah diperbarui!",
"parentId": 1,
"path": "/Lobby Utama (Updated)", // Path juga akan terupdate jika nama berubah
// ... field lain dari channel yang mungkin terpengaruh oleh update audio ...
}
}
(Catatan: Field data akan berisi state channel setelah update, diambil dari TeamTalkClient)
Respons Error:
- 400 Bad Request:
- Jika
idbukan angka atau0.{ "error_type": "BadRequest", "message": "Channel ID parameter is invalid." } - Jika body request tidak valid (bukan JSON, kosong, atau parameter tidak valid).
atau{ "error_type": "BadRequest", "message": "Invalid request body. Expected JSON object with parameters to update." }
atau{ "error_type": "BadRequest", "message": "Request body is empty. No parameters to update." }{ "error_type": "BadRequest", "message": "Invalid input provided for update. audioBitrateKbps: Invalid audioBitrateKbps. Allowed: ..." } - Jika mencoba melakukan operasi yang tidak diizinkan oleh
TeamTalkClient(misalnya, mengubahparentidatauchanidyang dilempar sebagai exception oleh client).{ "error_type": "BadRequest", "message": "Update failed: Changing 'parentid' is not supported via this update method. Use a specific 'move' operation if available." }
- Jika
- 401 Unauthorized: (Lihat A.6. Format Respons Error Umum)
- 404 Not Found: Jika channel dengan
idyang diberikan tidak ditemukan di server TeamTalk (error dari TeamTalk[3005] Channel not found).{ "error_type": "NotFound", "message": "Channel ID 120 not found for update." } - 503 Service Unavailable: Jika terjadi masalah lain saat API mencoba terhubung, login, atau memproses perintah ke server TeamTalk.
{ "error_type": "HttpError", "message": "TeamTalk Service Error: Pesan error lain dari TeamTalkClientException" }
E. Catatan untuk Pengembang
Bagian ini berisi catatan penting, area potensial untuk perbaikan, dan pertimbangan teknis bagi kamu yang akan memelihara atau melanjutkan pengembangan API TeamTalk ini.1. TeamTalkClient.php (Inti Interaksi dengan Server TeamTalk)
Parsing Respons & Command Building:
- Metode
parseServerLinemenggunakan regular expression yang kompleks. Perlu pengujian menyeluruh terhadap berbagai format respons server TeamTalk, terutama untuk versi server yang berbeda atau pembaruan protokol. Pertimbangkan unit test yang lebih komprehensif. - Fungsi
escapeStringdanunescapeStringkrusial untuk keamanan dan integritas perintah. Pastikan semua string yang dikirim/diterima diproses dengan benar.
Manajemen State Internal:
TeamTalkClientmenyimpan state pengguna online ($this->users) dan channel ($this->channels). Sinkronisasi state ini penting. Perhatikan potensi race condition atau inkonsistensi jika instance client di-share antar request konkuren (meskipun saat ini cenderung per-request).- Setiap request API membuat instance
TeamTalkClientbaru, yang menyebabkan overhead koneksi dan login berulang ke server TeamTalk. Pertimbangkan strategi caching koneksi atau penggunaan koneksi persisten jika memungkinkan dan aman dalam lingkungan deployment kamu (misalnya dengan Swoole/RoadRunner), namun ini akan menambah kompleksitas terkait manajemen koneksi dan state.
Error Handling & Exception:
TeamTalkClientExceptionadalah exception generik. Pertimbangkan untuk membuat exception yang lebih spesifik (misalnya,TeamTalkAuthenticationException,TeamTalkResourceNotFoundException,TeamTalkCommandFailedException) untuk penanganan yang lebih baik di level Rute.
Timeout & Operasi Blocking:
- Operasi socket (
fgets,fwrite) bersifat blocking. Pastikan timeout (socketTimeoutdan timeout internal diprocessResponsesUntilBlockEnd) dikonfigurasi dengan baik untuk mencegah request API menggantung terlalu lama.
Kelengkapan Fitur (dibandingkan tt5admin.php):
- Banyak fitur administratif dari
tt5admin.phpbelum diimplementasikan di API (misalnya, kick/ban/move user, op/deop, manajemen server properties seperti nama server/MOTD, save config, query stats, dll.). Ini adalah area potensial untuk pengembangan. - Parameter
diskquotauntuk channel ada ditt5admin.phpdanTeamTalkClient(sebagai parameter yang diizinkan), tetapi belum tervalidasi atau digunakan secara penuh di Rute.
Refactoring Potensial:
- Seiring bertambahnya fitur, kelas
TeamTalkClientbisa menjadi sangat besar. Pertimbangkan untuk memecahnya menjadi kelas-kelas yang lebih kecil dengan tanggung jawab spesifik (misalnya,ChannelManager,AccountManageryang menggunakan objek koneksi dasar).
2. Struktur dan Logika Rute (src/Routes/)
- Duplikasi Kode: Terdapat pola koneksi, login, dan error handling dasar yang berulang di setiap metode Rute. Pertimbangkan penggunaan base handler/controller atau trait untuk mengurangi duplikasi.
- Validasi Input: Validasi input sudah ada, tetapi pastikan selalu komprehensif dan aman.
- Sinkronisasi State Client dengan Respons API:
Setelah operasi modifikasi (misalnya,
PUT /channels/{id}), ada upaya untuk mengambil state terbaru dariTeamTalkClientuntuk disertakan dalam respons. Logika ini (termasuk potensi reconnect diChannelRoutes) mungkin perlu kamu tinjau untuk efisiensi dan keandalan.
3. Konfigurasi (src/settings.php)
- Keamanan Kredensial: SANGAT PENTING untuk tidak menyimpan kredensial (password TeamTalk, API key) secara hardcoded di
settings.phpuntuk lingkungan produksi. Gunakan environment variables server atau sistem manajemen konfigurasi yang aman.
4. Pengujian (Testing)
- Unit Tests:
phpunitsudah ada dicomposer.json. Prioritaskan pembuatan unit test untuk:- Logika krusial di
TeamTalkClient.php(parsing, command building, state management). - Validasi input dan logika bisnis di setiap kelas Rute.
- Fungsionalitas middleware (
ApiKeyAuthMiddleware).
- Logika krusial di
- Integration Tests: Lakukan pengujian API secara menyeluruh dengan server TeamTalk yang aktif untuk memastikan interaksi end-to-end berfungsi dengan benar.
5. Keamanan
- Rate Limiting: Implementasikan mekanisme rate limiting untuk melindungi API dari penyalahgunaan atau serangan brute-force.
- Input Sanitization: Selain validasi, pastikan semua input benar-benar disanitasi sebelum digunakan, terutama jika ada interaksi langsung dengan sistem file atau database di masa depan.
- Ketergantungan: Selalu perbarui ketergantungan (via
composer update) untuk mendapatkan patch keamanan terbaru.
6. Performa dan Skalabilitas
- Koneksi Berulang: Seperti disebutkan, koneksi dan login berulang ke TeamTalk per request API bisa menjadi bottleneck. Evaluasi dampaknya dan pertimbangkan solusi jika menjadi masalah.
- Operasi Kompleks: Beberapa operasi seperti
getChannelIdByPathataugetChannelPathByIdbisa menjadi lambat jika struktur channel sangat besar/dalam.
7. Dokumentasi Kode
- Lengkapi dan jaga konsistensi PHPDoc block untuk semua kelas, metode, dan properti untuk memudahkan pemahaman dan pemeliharaan kode oleh tim atau kontributor di masa depan.
8. Manajemen Versi API
- Jika ada perubahan yang signifikan dan berpotensi breaking change pada fungsionalitas atau struktur respons API di masa depan, pertimbangkan untuk memperkenalkan versioning pada path API (misalnya,
/api/v2/...).
9. tt5admin.php sebagai Referensi Utama
- Skrip
tt5admin.phpasli dari BearWare.dk adalah sumber kebenaran untuk format perintah dan interaksi dengan server TeamTalk 5. Selalu rujuk ke skrip ini saat kamu mengimplementasikan fungsionalitas baru atau memecahkan masalah terkait protokol.
Corat-coret
Saya membuat API ini bertujuan untuk memudahkan para pengelola server TeamTalk atau para oprecker untuk mengelola TeamTalk dari mana pun agar terjadi integrasi yang mudah. Mari ciptakan kolaborasi diantara kita untuk mengembangkan ini, saya yakin diluaran sana ada potensi yang sangat besar untuk mendapatkan dan menyelesaikan API ini yang belum sempurna. Partisipasi Kamu sangat dibutuhkan, bergabunglah sekarang dalam pengembangan API ini!. file API dapat di download melalui URL dibawah, dan untuk mencegah orang-orang yang tidak berkepentingan, saya telah menggunakan password dalam file ini. Hubungi saya melalui Whatsapp untuk mendapatkan passwordnya, atau kirim pesan di Profile saya. Saat kamu memutuskan untuk memiliki API ini, berarti kamu siap mengembangkan dan tidak untuk sekedar memenuhi rasa penasaran ataupun hal serupa. Utamakan rasa menghargai satu sama lain!download API Di sini
Komentar 0