409 lines
13 KiB
JavaScript
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;
|
|
}
|
|
}
|