Source: utils/userServiceClient.js

/**
 * User Service HTTP Client for Containerized APIs
 *
 * Copy this file to other API containers to access cached user data
 * across your microservices architecture.
 *
 * Usage:
 * const client = new UserServiceClient('http://members-api:3000');
 * const userData = await client.getUserData(userId, orgId, authToken);
 */

export class UserServiceClient {
    constructor(membersApiUrl = 'http://members-api:3000') {
        this.membersApiUrl = membersApiUrl;
    }

    /**
     * Get user data from Members API (with automatic cache population)
     * @param {string} userUID - User UUID
     * @param {string} orgaUID - Organization UUID
     * @param {string} authToken - Auth token for API calls
     * @returns {Object} - User validation data
     */
    async getUserData(userUID, orgaUID, authToken) {
        try {
            const response = await fetch(`${this.membersApiUrl}/api/validate-user`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': `Bearer ${authToken}`,
                    'X-User-UID': userUID,
                    'X-Orga-UID': orgaUID
                },
                body: JSON.stringify({ userUID, orgaUID })
            });

            if (response.ok) {
                const data = await response.json();
                if (data.success) {
                    return {
                        valid: data.valid,
                        isAdmin: data.isAdmin,
                        userData: data.userData,
                        userUID: data.userUID
                    };
                }
            }

            console.warn(`[UserServiceClient] API call failed: ${response.status}`);
            return { valid: false, isAdmin: false };

        } catch (error) {
            console.error(`[UserServiceClient] Error: ${error.message}`);
            return { valid: false, isAdmin: false };
        }
    }

    /**
     * Check if user has admin privileges
     * @param {string} userUID - User UUID
     * @param {string} orgaUID - Organization UUID
     * @param {string} authToken - Auth token
     * @returns {boolean} - True if user is admin
     */
    async isUserAdmin(userUID, orgaUID, authToken) {
        const userData = await this.getUserData(userUID, orgaUID, authToken);
        return userData.isAdmin || false;
    }

    /**
     * Validate user access to organization
     * @param {string} userUID - User UUID
     * @param {string} orgaUID - Organization UUID
     * @param {string} authToken - Auth token
     * @returns {boolean} - True if user has valid access
     */
    async validateUserAccess(userUID, orgaUID, authToken) {
        const userData = await this.getUserData(userUID, orgaUID, authToken);
        return userData.valid || false;
    }
}