2025-08-03 17:48:34 +02:00
|
|
|
// frontend/src/api/services/tenant.service.ts
|
|
|
|
|
/**
|
|
|
|
|
* Tenant Management Service
|
|
|
|
|
* Handles all tenant-related operations
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import { apiClient } from '../client';
|
|
|
|
|
import { serviceEndpoints } from '../client/config';
|
|
|
|
|
import type {
|
|
|
|
|
TenantInfo,
|
|
|
|
|
TenantCreate,
|
|
|
|
|
TenantUpdate,
|
|
|
|
|
TenantMember,
|
|
|
|
|
InviteUser,
|
|
|
|
|
TenantStats,
|
|
|
|
|
PaginatedResponse,
|
|
|
|
|
BaseQueryParams,
|
|
|
|
|
} from '../types';
|
|
|
|
|
|
|
|
|
|
export class TenantService {
|
|
|
|
|
private baseEndpoint = serviceEndpoints.tenant;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create New Tenant
|
|
|
|
|
*/
|
|
|
|
|
async createTenant(data: TenantCreate): Promise<TenantInfo> {
|
|
|
|
|
return apiClient.post(`${this.baseEndpoint}/register`, data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get Tenant Details
|
|
|
|
|
*/
|
|
|
|
|
async getTenant(tenantId: string): Promise<TenantInfo> {
|
|
|
|
|
return apiClient.get(`${this.baseEndpoint}/${tenantId}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Update Tenant
|
|
|
|
|
*/
|
|
|
|
|
async updateTenant(tenantId: string, data: TenantUpdate): Promise<TenantInfo> {
|
|
|
|
|
return apiClient.put(`${this.baseEndpoint}/${tenantId}`, data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Delete Tenant
|
|
|
|
|
*/
|
|
|
|
|
async deleteTenant(tenantId: string): Promise<{ message: string }> {
|
|
|
|
|
return apiClient.delete(`${this.baseEndpoint}/${tenantId}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get Tenant Members
|
|
|
|
|
*/
|
|
|
|
|
async getTenantMembers(
|
|
|
|
|
tenantId: string,
|
|
|
|
|
params?: BaseQueryParams
|
|
|
|
|
): Promise<PaginatedResponse<TenantMember>> {
|
|
|
|
|
return apiClient.get(`${this.baseEndpoint}/${tenantId}/members`, { params });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Invite User to Tenant
|
|
|
|
|
*/
|
|
|
|
|
async inviteUser(tenantId: string, invitation: InviteUser): Promise<{ message: string }> {
|
|
|
|
|
return apiClient.post(`${this.baseEndpoint}/${tenantId}/invite`, invitation);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Remove Member from Tenant
|
|
|
|
|
*/
|
|
|
|
|
async removeMember(tenantId: string, userId: string): Promise<{ message: string }> {
|
|
|
|
|
return apiClient.delete(`${this.baseEndpoint}/${tenantId}/members/${userId}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Update Member Role
|
|
|
|
|
*/
|
|
|
|
|
async updateMemberRole(
|
|
|
|
|
tenantId: string,
|
|
|
|
|
userId: string,
|
|
|
|
|
role: string
|
|
|
|
|
): Promise<TenantMember> {
|
|
|
|
|
return apiClient.patch(`${this.baseEndpoint}/${tenantId}/members/${userId}`, { role });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get Tenant Statistics
|
|
|
|
|
*/
|
|
|
|
|
async getTenantStats(tenantId: string): Promise<TenantStats> {
|
|
|
|
|
return apiClient.get(`${this.baseEndpoint}/${tenantId}/stats`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2025-08-15 17:53:59 +02:00
|
|
|
* Get User's Tenants - Get tenants where user is owner
|
2025-08-03 17:48:34 +02:00
|
|
|
*/
|
|
|
|
|
async getUserTenants(): Promise<TenantInfo[]> {
|
2025-08-15 17:53:59 +02:00
|
|
|
try {
|
|
|
|
|
// First get current user info to get user ID
|
|
|
|
|
const currentUser = await apiClient.get(`/users/me`);
|
|
|
|
|
const userId = currentUser.id;
|
|
|
|
|
|
|
|
|
|
// Then get tenants owned by this user
|
|
|
|
|
return apiClient.get(`${this.baseEndpoint}/user/${userId}`);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Failed to get user tenants:', error);
|
|
|
|
|
// Return empty array if API call fails
|
|
|
|
|
return [];
|
|
|
|
|
}
|
2025-08-03 17:48:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const tenantService = new TenantService();
|