92 lines
3.2 KiB
JavaScript
92 lines
3.2 KiB
JavaScript
// File: src/services/API/RegisterService.js
|
|
|
|
/**
|
|
* RegisterService
|
|
*
|
|
* Handles user registration API calls to the MaplePress backend.
|
|
* Based on backend API: POST /api/v1/register
|
|
*/
|
|
|
|
import ApiClient from "./ApiClient.js";
|
|
|
|
/**
|
|
* Register a new user and create a tenant
|
|
*
|
|
* @param {Object} data - Registration data
|
|
* @param {string} data.email - User's email address
|
|
* @param {string} data.password - User's password (min 8 characters)
|
|
* @param {string} data.first_name - User's first name
|
|
* @param {string} data.last_name - User's last name
|
|
* @param {string} data.tenant_name - Organization/tenant name (slug auto-generated from this)
|
|
* @param {string} [data.timezone] - User's timezone (defaults to "UTC")
|
|
* @param {boolean} data.agree_terms_of_service - Must be true
|
|
* @param {boolean} [data.agree_promotions] - Optional (default: false)
|
|
* @param {boolean} [data.agree_to_tracking_across_third_party_apps_and_services] - Optional (default: false)
|
|
*
|
|
* @returns {Promise<Object>} Registration response with tokens
|
|
* @throws {Error} Registration error with message
|
|
*/
|
|
async function register(data) {
|
|
try {
|
|
console.log("[RegisterService] Registering user:", data.email);
|
|
|
|
// No frontend validation - all validation handled by backend
|
|
// This allows backend to return ALL validation errors at once
|
|
|
|
// Prepare request body matching backend RegisterRequest structure
|
|
const requestBody = {
|
|
email: data.email,
|
|
password: data.password,
|
|
confirm_password: data.confirmPassword,
|
|
first_name: data.first_name,
|
|
last_name: data.last_name,
|
|
tenant_name: data.tenant_name,
|
|
timezone: data.timezone || "UTC",
|
|
agree_terms_of_service: data.agree_terms_of_service,
|
|
agree_promotions: data.agree_promotions || false,
|
|
agree_to_tracking_across_third_party_apps_and_services:
|
|
data.agree_to_tracking_across_third_party_apps_and_services || false,
|
|
};
|
|
|
|
// Call backend API
|
|
const response = await ApiClient.post("/api/v1/register", requestBody);
|
|
|
|
console.log("[RegisterService] Registration successful:", response.user_id);
|
|
|
|
// Return response matching backend RegisterResponse structure
|
|
return {
|
|
// User details
|
|
userId: response.user_id,
|
|
userEmail: response.user_email,
|
|
userName: response.user_name,
|
|
userRole: response.user_role,
|
|
|
|
// Tenant details
|
|
tenantId: response.tenant_id,
|
|
tenantName: response.tenant_name,
|
|
tenantSlug: response.tenant_slug,
|
|
|
|
// Authentication tokens
|
|
sessionId: response.session_id,
|
|
accessToken: response.access_token,
|
|
accessExpiry: new Date(response.access_expiry),
|
|
refreshToken: response.refresh_token,
|
|
refreshExpiry: new Date(response.refresh_expiry),
|
|
|
|
createdAt: new Date(response.created_at),
|
|
};
|
|
} catch (error) {
|
|
console.error("[RegisterService] Registration failed:", error);
|
|
|
|
// Pass through the original error object to preserve RFC 9457 fields
|
|
// (validationErrors, title, status, etc.) that ApiClient attached
|
|
// The Register page component will parse and display field-specific errors
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
const RegisterService = {
|
|
register,
|
|
};
|
|
|
|
export default RegisterService;
|