localist/frontend/src/services/eventService.js
2026-06-21 16:51:07 -04:00

46 lines
No EOL
1.7 KiB
JavaScript

import {EventPostSchema} from "../schemas/eventPostSchema";
// Service responsible for sending event POST requests to the API.
// - Validates and coerces the outgoing payload using EventPostSchema
// - Logs validation errors (if any) and the final payload sent
// - Sends the request with CSRF token (if available) and returns parsed JSON response
const API_BASE = import.meta.env.VITE_API_BASE
function getCSRFToken() {
const name = "csrftoken";
const match = document.cookie.match(new RegExp('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)'));
return match ? match.pop() : null;
}
export default class EventService {
constructor(base = API_BASE) {
this.base = base;
}
async createEvent(rawPayload) {
// Validate and coerce the outgoing payload
const parsed = EventPostSchema.parse(rawPayload); // will throw if invalid
console.log("EventService sending payload:", JSON.stringify(rawPayload, null, 2)); // Log here
const res = await fetch(`${this.base}/event`, {
method: "POST",
headers: {
"Content-Type": "application/json",
// X-CSRFToken if using django session auth in browser
...(getCSRFToken() ? {"X-CSRFToken": getCSRFToken()} : {}),
},
credentials: "same-origin", // change to 'include' if cross-site cookies
body: JSON.stringify(parsed),
});
if (!res.ok) {
const text = await res.text();
const err = new Error("Failed to create event");
err.status = res.status;
err.body = text;
throw err;
}
return res.json();
}
}