409 lines
13 KiB
JavaScript

/**
* WalkGuide API Client — Reusable HTTP wrapper for k6 tests
* Semua request ke Spring Boot backend melewati modul ini.
*/
import http from "k6/http";
import { check, fail } from "k6";
import { metricsHelper } from "./metrics-helper.js";
const BASE_URL = __ENV.BASE_URL || "http://202.46.28.160:8080";
const API_BASE = `${BASE_URL}/api/v1`;
/**
* Default headers tanpa auth
*/
function jsonHeaders(extra = {}) {
return Object.assign(
{ "Content-Type": "application/json", Accept: "application/json" },
extra,
);
}
/**
* Default headers dengan Bearer token
*/
function authHeaders(token, extra = {}) {
return jsonHeaders(
Object.assign({ Authorization: `Bearer ${token}` }, extra),
);
}
// ──────────────────────────────────────────────
// AUTH endpoints
// ──────────────────────────────────────────────
export function register(payload) {
const res = http.post(`${API_BASE}/auth/register`, JSON.stringify(payload), {
headers: jsonHeaders(),
tags: { endpoint: "register" },
});
metricsHelper.recordEndpoint("register", res);
return res;
}
export function login(email, password) {
const res = http.post(
`${API_BASE}/auth/login`,
JSON.stringify({ email, password }),
{ headers: jsonHeaders(), tags: { endpoint: "login" } },
);
metricsHelper.recordEndpoint("login", res);
return res;
}
export function refreshToken(refreshTok) {
const res = http.post(
`${API_BASE}/auth/refresh`,
JSON.stringify({ refreshToken: refreshTok }),
{ headers: jsonHeaders(), tags: { endpoint: "refresh_token" } },
);
metricsHelper.recordEndpoint("refresh_token", res);
return res;
}
export function logout(token) {
const res = http.post(`${API_BASE}/auth/logout`, null, {
headers: authHeaders(token),
tags: { endpoint: "logout" },
});
metricsHelper.recordEndpoint("logout", res);
return res;
}
export function ping() {
const res = http.get(`${API_BASE}/auth/ping`, { tags: { endpoint: "ping" } });
metricsHelper.recordEndpoint("ping", res);
return res;
}
export function updateFcmToken(token, fcmToken) {
const res = http.post(
`${API_BASE}/auth/fcm-token`,
JSON.stringify({ fcmToken }),
{ headers: authHeaders(token), tags: { endpoint: "fcm_token" } },
);
metricsHelper.recordEndpoint("fcm_token", res);
return res;
}
// ──────────────────────────────────────────────
// PAIRING endpoints
// ──────────────────────────────────────────────
export function inviteUser(token, uniqueUserId) {
const res = http.post(
`${API_BASE}/pairing/invite`,
JSON.stringify({ uniqueUserId }),
{ headers: authHeaders(token), tags: { endpoint: "pairing_invite" } },
);
metricsHelper.recordEndpoint("pairing_invite", res);
return res;
}
export function respondPairing(token, pairingId, accept) {
const res = http.post(
`${API_BASE}/pairing/respond`,
JSON.stringify({ pairingId, accept }),
{ headers: authHeaders(token), tags: { endpoint: "pairing_respond" } },
);
metricsHelper.recordEndpoint("pairing_respond", res);
return res;
}
export function getPairingStatus(token) {
const res = http.get(`${API_BASE}/pairing/status`, {
headers: authHeaders(token),
tags: { endpoint: "pairing_status" },
});
metricsHelper.recordEndpoint("pairing_status", res);
return res;
}
export function unpair(token) {
const res = http.del(`${API_BASE}/pairing/unpair`, null, {
headers: authHeaders(token),
tags: { endpoint: "pairing_unpair" },
});
metricsHelper.recordEndpoint("pairing_unpair", res);
return res;
}
// ──────────────────────────────────────────────
// USER endpoints
// ──────────────────────────────────────────────
export function getUserProfile(token) {
const res = http.get(`${API_BASE}/user/profile`, {
headers: authHeaders(token),
tags: { endpoint: "user_profile" },
});
metricsHelper.recordEndpoint("user_profile", res);
return res;
}
export function updateLocation(
token,
lat,
lng,
accuracy = 5.0,
speed = 1.4,
heading = 90.0,
) {
const res = http.post(
`${API_BASE}/user/location`,
JSON.stringify({ lat, lng, accuracy, speed, heading }),
{ headers: authHeaders(token), tags: { endpoint: "location_update" } },
);
metricsHelper.recordEndpoint("location_update", res);
return res;
}
export function logObstacle(token, payload) {
const res = http.post(`${API_BASE}/user/obstacle`, JSON.stringify(payload), {
headers: authHeaders(token),
tags: { endpoint: "obstacle_log" },
});
metricsHelper.recordEndpoint("obstacle_log", res);
return res;
}
export function triggerSos(token, triggerType, lat, lng) {
const res = http.post(
`${API_BASE}/user/sos`,
JSON.stringify({ triggerType, lat, lng }),
{ headers: authHeaders(token), tags: { endpoint: "sos_trigger" } },
);
metricsHelper.recordEndpoint("sos_trigger", res);
return res;
}
export function getActivityLogs(token, page = 0, size = 20) {
const res = http.get(
`${API_BASE}/user/activity-logs?page=${page}&size=${size}`,
{ headers: authHeaders(token), tags: { endpoint: "activity_logs" } },
);
metricsHelper.recordEndpoint("activity_logs", res);
return res;
}
export function getNotifications(token, page = 0, size = 20) {
const res = http.get(
`${API_BASE}/user/notifications?page=${page}&size=${size}`,
{ headers: authHeaders(token), tags: { endpoint: "notifications" } },
);
metricsHelper.recordEndpoint("notifications", res);
return res;
}
export function getUnreadCount(token) {
const res = http.get(`${API_BASE}/user/notifications/unread-count`, {
headers: authHeaders(token),
tags: { endpoint: "unread_count" },
});
metricsHelper.recordEndpoint("unread_count", res);
return res;
}
export function markAllRead(token) {
const res = http.put(`${API_BASE}/user/notifications/mark-all-read`, null, {
headers: authHeaders(token),
tags: { endpoint: "mark_all_read" },
});
metricsHelper.recordEndpoint("mark_all_read", res);
return res;
}
export function markOneRead(token, notifId) {
const res = http.put(`${API_BASE}/user/notifications/${notifId}/read`, null, {
headers: authHeaders(token),
tags: { endpoint: "mark_one_read" },
});
metricsHelper.recordEndpoint("mark_one_read", res);
return res;
}
export function startWalkguide(token) {
const res = http.post(`${API_BASE}/user/walkguide/start`, null, {
headers: authHeaders(token),
tags: { endpoint: "walkguide_start" },
});
metricsHelper.recordEndpoint("walkguide_start", res);
return res;
}
export function stopWalkguide(token) {
const res = http.post(`${API_BASE}/user/walkguide/stop`, null, {
headers: authHeaders(token),
tags: { endpoint: "walkguide_stop" },
});
metricsHelper.recordEndpoint("walkguide_stop", res);
return res;
}
export function getUserSettings(token) {
const res = http.get(`${API_BASE}/user/settings`, {
headers: authHeaders(token),
tags: { endpoint: "user_settings_get" },
});
metricsHelper.recordEndpoint("user_settings_get", res);
return res;
}
export function updateUserSettings(token, payload) {
const res = http.put(`${API_BASE}/user/settings`, JSON.stringify(payload), {
headers: authHeaders(token),
tags: { endpoint: "user_settings_put" },
});
metricsHelper.recordEndpoint("user_settings_put", res);
return res;
}
export function getUserAiConfig(token) {
const res = http.get(`${API_BASE}/user/ai-config`, {
headers: authHeaders(token),
tags: { endpoint: "ai_config_get" },
});
metricsHelper.recordEndpoint("ai_config_get", res);
return res;
}
// ──────────────────────────────────────────────
// GUARDIAN endpoints
// ──────────────────────────────────────────────
export function getGuardianDashboard(token) {
const res = http.get(`${API_BASE}/guardian/dashboard`, {
headers: authHeaders(token),
tags: { endpoint: "guardian_dashboard" },
});
metricsHelper.recordEndpoint("guardian_dashboard", res);
return res;
}
export function getUserLocation(token) {
const res = http.get(`${API_BASE}/guardian/user-location`, {
headers: authHeaders(token),
tags: { endpoint: "guardian_user_location" },
});
metricsHelper.recordEndpoint("guardian_user_location", res);
return res;
}
export function getLocationHistory(token, page = 0, size = 50) {
const res = http.get(
`${API_BASE}/guardian/location-history?page=${page}&size=${size}`,
{ headers: authHeaders(token), tags: { endpoint: "location_history" } },
);
metricsHelper.recordEndpoint("location_history", res);
return res;
}
export function getObstacleLogs(token, page = 0, size = 20) {
const res = http.get(
`${API_BASE}/guardian/obstacle-logs?page=${page}&size=${size}`,
{ headers: authHeaders(token), tags: { endpoint: "obstacle_logs_get" } },
);
metricsHelper.recordEndpoint("obstacle_logs_get", res);
return res;
}
export function sendNotification(token, payload) {
const res = http.post(
`${API_BASE}/guardian/notifications/send`,
JSON.stringify(payload),
{ headers: authHeaders(token), tags: { endpoint: "send_notification" } },
);
metricsHelper.recordEndpoint("send_notification", res);
return res;
}
export function getSosEvents(token, page = 0, size = 20) {
const res = http.get(
`${API_BASE}/guardian/sos-events?page=${page}&size=${size}`,
{ headers: authHeaders(token), tags: { endpoint: "sos_events_get" } },
);
metricsHelper.recordEndpoint("sos_events_get", res);
return res;
}
export function acknowledgeSos(token, sosId) {
const res = http.put(`${API_BASE}/guardian/sos/${sosId}/acknowledge`, null, {
headers: authHeaders(token),
tags: { endpoint: "sos_acknowledge" },
});
metricsHelper.recordEndpoint("sos_acknowledge", res);
return res;
}
export function getAiConfig(token) {
const res = http.get(`${API_BASE}/guardian/ai-config`, {
headers: authHeaders(token),
tags: { endpoint: "ai_config_guardian_get" },
});
metricsHelper.recordEndpoint("ai_config_guardian_get", res);
return res;
}
export function updateAiConfig(token, payload) {
const res = http.put(
`${API_BASE}/guardian/ai-config`,
JSON.stringify(payload),
{
headers: authHeaders(token),
tags: { endpoint: "ai_config_guardian_put" },
},
);
metricsHelper.recordEndpoint("ai_config_guardian_put", res);
return res;
}
export function getActivityLogsGuardian(token, page = 0, size = 20) {
const res = http.get(
`${API_BASE}/guardian/activity-logs?page=${page}&size=${size}`,
{
headers: authHeaders(token),
tags: { endpoint: "activity_logs_guardian" },
},
);
metricsHelper.recordEndpoint("activity_logs_guardian", res);
return res;
}
export function getGeofenceConfig(token) {
const res = http.get(`${API_BASE}/guardian/geofence`, {
headers: authHeaders(token),
tags: { endpoint: "geofence_get" },
});
metricsHelper.recordEndpoint("geofence_get", res);
return res;
}
export function updateGeofenceConfig(token, payload) {
const res = http.put(
`${API_BASE}/guardian/geofence`,
JSON.stringify(payload),
{ headers: authHeaders(token), tags: { endpoint: "geofence_put" } },
);
metricsHelper.recordEndpoint("geofence_put", res);
return res;
}
// ──────────────────────────────────────────────
// SHARED check helpers
// ──────────────────────────────────────────────
export function checkSuccess(res, label) {
check(res, {
[`${label}: status 2xx`]: (r) => r.status >= 200 && r.status < 300,
[`${label}: has body`]: (r) => r.body && r.body.length > 0,
});
}
export function parseBody(res) {
try {
return JSON.parse(res.body);
} catch (_) {
return null;
}
}