Dokumentasi ini disusun berdasarkan implementasi di folder src/ proyek. Struktur respons dan parameter mengikuti yang ada di kode (routes.js, controllers/*, services/*).
http://localhost:3000/api
Tidak diperlukan pada versi ini. Beberapa fitur cuaca menggunakan OpenWeather dan memerlukan konfigurasi OW_API_KEY di environment server.
Cek status API.
Endpoint
GET /health
Response
{ "status": "ok" }Mengambil ringkasan cuaca pada koordinat tertentu. Parameter lat dan lon wajib.
Endpoint
GET /weather
Query Parameters
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| lat | number | ya | Lintang |
| lon | number | ya | Bujur |
Response
Struktur respons disusun dari weatherController.get, locationService, dan weatherService:
{
"coord": { "lat": "-6.2", "lon": "106.8" },
"location": {},
"weather": {
"description": "broken clouds",
"humidity": 78,
"temp_c": 29.5,
"pressure": 1007,
"wind": { "speed_mps": 4.2, "category": "Angin sedang" },
"gust": { "speed_mps": 6.0, "category": "Angin kencang" },
"direction": { "direction": "Timur", "deg": 90 }
}
}Kode Status
- 200 OK
- 400 jika
lat/lontidak diberikan - 500 jika layanan pihak ketiga gagal
Mengambil daftar grid laut dari file src/map/map.json beserta atribut yang dikalkulasikan.
Endpoint
GET /map
Response
Array of object. Contoh 2 item pertama (diambil langsung dari map.json dan dipetakan oleh mapController.get):
[
{
"id": 0,
"gridId": "GRID_007",
"tanggal": "2025-09-01",
"latitude": -10.9326,
"longitude": 94.0686,
"sst": 30.61,
"chlorophyll": 1.1,
"zpi": 9,
"kedalamanClass": 5534.87,
"kedalamanMeter": "Abisal (zona sangat dalam)",
"musim": "Musim Barat)"
},
{
"id": 1,
"gridId": "GRID_012",
"tanggal": "2025-09-01",
"latitude": -10.9326,
"longitude": 94.2059,
"sst": 29.93,
"chlorophyll": 0.61,
"zpi": 55,
"kedalamanClass": 5066.26,
"kedalamanMeter": "Abisal (zona sangat dalam)",
"musim": "Musim Barat)"
}
]Keterangan field:
kedalamanClass: nilai kedalaman dalam meter (apa adanya dari data).kedalamanMeter: klasifikasi zona kedalaman (hasildepthClass()).musim: hasilfishingSeasonNow().jenisIkan: array 3 ikan acak darisrc/map/fish.js(tidak ditampilkan pada contoh di atas untuk ringkas).
Kode Status
- 200 OK
- 500 Internal Server Error
Detail satu grid beserta info lokasi dan cuaca pada koordinat titik grid. Juga memuat prediksi kandidat ikan dari model Gemini (hasil dibersihkan lewat safeJSONParse).
Endpoint
GET /map/detail
Query Parameters
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| id | string | ya | Kode grid, misal: GRID_007 |
Response
{
"id": null,
"gridId": "GRID_007",
"tanggal": "2025-09-01",
"latitude": -10.9326,
"longitude": 94.0686,
"sst": 30.61,
"chlorophyll": 1.1,
"zpi": 9,
"kedalamanClass": 5534.87,
"kedalamanMeter": "Abisal (zona sangat dalam)",
"musim": "Musim Barat)",
"location": {},
"weather": {
"description": "broken clouds",
"humidity": 78,
"temp_c": 29.5,
"pressure": 1007,
"wind": { "speed_mps": 4.2, "category": "Angin sedang" },
"gust": { "speed_mps": 6.0, "category": "Angin kencang" },
"direction": { "direction": "Timur", "deg": 90 }
},
"jenisIkan": [
{ "id": 35, "name": "Kuwe Laut Dalam" },
{ "id": 36, "name": "Kakap Laut Dalam" },
{ "id": 37, "name": "Selar Laut Dalam" }
]
}Catatan:
jenisIkanberasal darifishPredictionService(Gemini). Jika model mengembalikan teks dengan awalanjsonatau ada karakter lain, server membersihkan dan melakukanJSON.parseaman viasafeJSONParse.- Jika grid tidak ditemukan: 404.
Kode Status
- 200 OK
- 404 Grid not found
- 500 Internal Server Error
Endpoint untuk meminta ringkasan strategi, estimasi BBM, waktu tempuh, dan risiko dari AI berdasarkan input lingkungan, musim, cuaca, dan spesifikasi mesin kapal.
Catatan penting: Di kode saat ini, route terdaftar sebagai GET (/map/prediction) tetapi controller membaca req.body. Klien umum biasanya tidak mengirim body pada GET. Disarankan mengganti method menjadi POST di sisi server. Dokumentasi di bawah mengikuti implementasi controller.
Endpoint (sesuai routes.js)
GET /map/prediction
Request Body (JSON)
{
"zpi": 78,
"chl_a": 0.32,
"temp_c": 29.1,
"depth": 200,
"musim": "Musim Timur",
"distance": 12.5,
"weather": {
"windDirection": { "direction": "Timur", "deg": 90 },
"windSpeed": { "speed_mps": 4.2, "category": "Angin sedang" },
"humidity": 78,
"pressure": 1007
},
"engine": {
"power": 15,
"weight": 220,
"speed": 8
}
}Response
{
"data": {
"incomePotential": "sedang",
"fuelEstimation": 10.8,
"travellingTime": { "day": 0, "hour": 2, "minute": 30 },
"strategyRecommendation": "Fokus di area dengan CHL 0.2β0.4 mg/m3, hindari saat angin kencang...",
"anotherConsideration": "Perhatikan perubahan tekanan...",
"riskLevel": "moderate"
}
}Catatan:
- Struktur
dataadalah hasil daripredictionService(Gemini) yang diformat ke JSON dan dibersihkan olehsafeJSONParse. - Jika parsing gagal, server mengembalikan 500 dengan pesan Internal server error (invalid JSON).
Kode Status
- 200 OK
- 500 Internal Server Error
400 lat & lon requiredpada/weatherbila parameter tidak diisi.404 Grid not foundpada/map/detailbilaidtidak ada dimap.json.500 Internal Server Errorbila- gagal mengambil data pihak ketiga (OpenWeather, lokasi pantai/lautan),
- atau hasil AI tidak dapat diparse menjadi JSON.
- Semua endpoint berada di bawah prefix
/api(lihatapp.js). - File sumber penting:
src/routes.jssrc/controllers/*.jssrc/services/*.jssrc/utils/allUtils.js(fungsisafeJSONParseuntuk membersihkan respons Gemini).
- Dependensi eksternal:
- OpenWeather (
env.owApiBase,OW_API_KEY) - Marine Regions / Nominatim untuk nama lokasi
- Google Gemini (
GEMINI_API_KEY)
- OpenWeather (