/**
* 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;
}
}