@mindmakr/gs-websdk
Version:
Web SDK for Guru SaaS System - Complete JavaScript/TypeScript SDK for building applications with dynamic schema management
494 lines • 19.4 kB
JavaScript
;
/**
* Schema Management Service Module
* Provides dynamic schema template and instance management functionality
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.SchemaService = void 0;
class SchemaService {
constructor(client) {
this.client = client;
}
// ============================================================================
// SCHEMA TEMPLATE MANAGEMENT
// ============================================================================
/**
* Get schema templates with pagination and filtering
*/
async getSchemaTemplates(filters, config) {
const params = new URLSearchParams();
if (filters?.page)
params.append('page', filters.page.toString());
if (filters?.limit)
params.append('limit', filters.limit.toString());
if (filters?.category)
params.append('category', filters.category);
if (filters?.is_active !== undefined)
params.append('is_active', filters.is_active.toString());
if (filters?.is_system !== undefined)
params.append('is_system', filters.is_system.toString());
if (filters?.search)
params.append('search', filters.search);
if (filters?.path)
params.append('path', filters.path);
if (filters?.tenant_id)
params.append('tenant_id', filters.tenant_id);
const queryString = params.toString() ? `?${params.toString()}` : '';
return this.client.get(`/api/schema-templates${queryString}`, config);
}
/**
* Get schema template by ID
*/
async getSchemaTemplateById(id, config) {
return this.client.get(`/api/schema-templates/${id}`, config);
}
/**
* Get schema template by code
*/
async getSchemaTemplateByCode(code, config) {
return this.client.get(`/api/schema-templates/code/${code}`, config);
}
/**
* Get schema template by path
*/
async getSchemaTemplateByPath(path, config) {
return this.client.get(`/api/schema-templates/by-path/${encodeURIComponent(path)}`, config);
}
/**
* Create new schema template
*/
async createSchemaTemplate(templateData, config) {
return this.client.post('/api/schema-templates', templateData, config);
}
/**
* Update schema template
*/
async updateSchemaTemplate(id, templateData, config) {
return this.client.put(`/api/schema-templates/${id}`, templateData, config);
}
/**
* Delete schema template
*/
async deleteSchemaTemplate(id, config) {
return this.client.delete(`/api/schema-templates/${id}`, config);
}
/**
* Clone schema template
*/
async cloneSchemaTemplate(id, data, config) {
return this.client.post(`/api/schema-templates/${id}/clone`, data, config);
}
/**
* Get schema template usage statistics
*/
async getSchemaTemplateUsageStats(id, config) {
return this.client.get(`/api/schema-templates/${id}/usage`, config);
}
// ============================================================================
// PATH-BASED NAVIGATION
// ============================================================================
/**
* Get child templates for a parent path
*/
async getSchemaTemplateChildren(parentPath, config) {
return this.client.get(`/api/schema-templates/children/${encodeURIComponent(parentPath)}`, config);
}
/**
* Get virtual hierarchy for template navigation
*/
async getVirtualHierarchy(config) {
return this.client.get('/api/schema-templates/virtual-hierarchy', config);
}
/**
* Move schema template to new path
*/
async moveSchemaTemplate(id, newPath, config) {
return this.client.post(`/api/schema-templates/${id}/move`, { new_path: newPath }, config);
}
// ============================================================================
// TEMPLATE COMPOSITION
// ============================================================================
/**
* Compose schema template (get resolved schema)
*/
async composeSchemaTemplate(id, config) {
return this.client.get(`/api/schema-templates/${id}/compose`, config);
}
/**
* Create composed template from base template and rules
*/
async createComposedTemplate(baseTemplateId, compositionData, config) {
return this.client.post(`/api/schema-templates/${baseTemplateId}/compose`, compositionData, config);
}
/**
* Get inheritance chain for a template
*/
async getInheritanceChain(templateId, config) {
return this.client.get(`/api/schema-templates/${templateId}/inheritance-chain`, config);
}
/**
* Get impact analysis for template changes
*/
async getImpactAnalysis(templateId, config) {
return this.client.get(`/api/schema-templates/${templateId}/impact-analysis`, config);
}
// ============================================================================
// TEMPLATE PUBLISHING
// ============================================================================
/**
* Publish schema template
*/
async publishSchemaTemplate(id, expiresAt, config) {
const body = {};
if (expiresAt) {
body.expires_at = expiresAt;
}
return this.client.post(`/api/schema-templates/${id}/publish`, body, config);
}
// ============================================================================
// ENHANCED FIELD PROPERTIES
// ============================================================================
/**
* Get enhanced field properties for a template
*/
async getEnhancedFieldProperties(templateId, config) {
return this.client.get(`/api/schema-templates/${templateId}/enhanced-properties`, config);
}
/**
* Update field enhancement
*/
async updateFieldEnhancement(templateId, fieldKey, enhancement, config) {
return this.client.put(`/api/schema-templates/${templateId}/field-enhancement`, { field_key: fieldKey, enhancement }, config);
}
/**
* Get field rendering configuration
*/
async getFieldRenderingConfig(templateId, fieldKey, config) {
return this.client.get(`/api/schema-templates/${templateId}/field-rendering/${encodeURIComponent(fieldKey)}`, config);
}
/**
* Update enhanced template properties
*/
async updateEnhancedTemplateProperties(templateId, properties, config) {
return this.client.put(`/api/schema-templates/${templateId}/enhanced-properties`, properties, config);
}
/**
* Validate field enhancement
*/
async validateFieldEnhancement(enhancement, config) {
return this.client.post('/api/schema-templates/validate-enhancement', { enhancement }, config);
}
// ============================================================================
// VERSION MANAGEMENT
// ============================================================================
/**
* Create new template version
*/
async createSchemaTemplateVersion(id, versionData, config) {
return this.client.post(`/api/schema-templates/${id}/versions`, versionData, config);
}
/**
* Get template version history
*/
async getSchemaTemplateVersionHistory(id, config) {
return this.client.get(`/api/schema-templates/${id}/versions`, config);
}
/**
* Get specific template version
*/
async getSchemaTemplateVersion(templateId, versionId, config) {
return this.client.get(`/api/schema-templates/${templateId}/versions/${versionId}`, config);
}
/**
* Create advanced template version with additional metadata
*/
async createAdvancedSchemaTemplateVersion(id, versionData, config) {
return this.client.post(`/api/schema-templates/${id}/advanced-version`, versionData, config);
}
/**
* Rollback to previous version
*/
async rollbackSchemaTemplateVersion(templateId, targetVersionId, rollbackReason, config) {
return this.client.post(`/api/schema-templates/${templateId}/rollback`, {
target_version_id: targetVersionId,
rollback_reason: rollbackReason
}, config);
}
/**
* Compare two template versions
*/
async getVersionComparison(version1Id, version2Id, config) {
return this.client.get(`/api/schema-templates/versions/compare?version1_id=${version1Id}&version2_id=${version2Id}`, config);
}
/**
* Get enhanced version history with detailed metadata
*/
async getEnhancedVersionHistory(templateId, config) {
return this.client.get(`/api/schema-templates/${templateId}/enhanced-versions`, config);
}
/**
* Process auto-publish schedule
*/
async processAutoPublishSchedule(config) {
return this.client.post('/api/schema-templates/auto-publish/process', {}, config);
}
// ============================================================================
// SCHEMA INSTANCE MANAGEMENT
// ============================================================================
/**
* Get schema instances with advanced search capabilities
* BREAKING CHANGE: userId is now required for permission validation
*
* Features:
* - Dynamic field discovery across all string fields
* - Permission-aware search with tenant isolation
* - Full-text search with ranking and caching
* - Search metadata with performance metrics
* - Nested field support (e.g., "general.displayName")
*/
async getSchemaInstances(filters, config) {
const params = new URLSearchParams();
// BREAKING CHANGE: userId is required
if (!filters?.userId || filters.userId.trim() === '') {
throw new Error('userId is required for schema instance search operations');
}
if (filters?.page)
params.append('page', filters.page.toString());
if (filters?.limit)
params.append('limit', filters.limit.toString());
if (filters?.entity_type)
params.append('entity_type', filters.entity_type);
if (filters?.template_code)
params.append('template_code', filters.template_code);
if (filters?.template_ids)
params.append('template_ids', filters.template_ids.join(','));
if (filters?.is_active !== undefined)
params.append('is_active', filters.is_active.toString());
if (filters?.search)
params.append('search', filters.search);
if (filters?.include_metadata !== undefined)
params.append('include_metadata', filters.include_metadata.toString());
if (filters?.relevance_threshold !== undefined)
params.append('relevance_threshold', filters.relevance_threshold.toString());
// Required parameters
params.append('userId', filters.userId);
// Always add tenant_id - required for super admin users
const tenantId = filters?.tenant_id || 'default';
params.append('tenant_id', tenantId);
const queryString = params.toString() ? `?${params.toString()}` : '';
return this.client.get(`/api/schema-instances${queryString}`, config);
}
/**
* Get schema instance by ID
* Note: tenant_id is required for super admin users
*/
async getSchemaInstanceById(id, tenantId, config) {
const params = new URLSearchParams();
// Always add tenant_id - required for super admin users
const effectiveTenantId = tenantId || 'default';
params.append('tenant_id', effectiveTenantId);
const queryString = params.toString() ? `?${params.toString()}` : '';
return this.client.get(`/api/schema-instances/${id}${queryString}`, config);
}
/**
* Get schema instance by entity type and ID
*/
async getSchemaInstanceByEntity(entityType, entityId, config) {
return this.client.get(`/api/schema-instances/${entityType}/${entityId}`, config);
}
/**
* Create schema instance
* Note: tenant_id is required for super admin users
*/
async createSchemaInstance(instanceData, config) {
// Ensure tenant_id is included in the request body
const requestData = {
...instanceData,
tenant_id: instanceData.tenant_id || 'default'
};
return this.client.post('/api/schema-instances', requestData, config);
}
/**
* Upsert schema instance (create or update)
* Note: tenant_id is required for super admin users
*/
async upsertSchemaInstance(entityType, entityId, instanceData, tenantId, config) {
// Include tenant_id in the request body
const requestData = {
...instanceData,
tenant_id: tenantId || 'default'
};
return this.client.put(`/api/schema-instances/${entityType}/${entityId}`, requestData, config);
}
/**
* Delete schema instance
* Note: tenant_id is required for super admin users
*/
async deleteSchemaInstance(id, tenantId, config) {
const params = new URLSearchParams();
// Always add tenant_id - required for super admin users
const effectiveTenantId = tenantId || 'default';
params.append('tenant_id', effectiveTenantId);
const queryString = params.toString() ? `?${params.toString()}` : '';
return this.client.delete(`/api/schema-instances/${id}${queryString}`, config);
}
// ============================================================================
// CATEGORY MANAGEMENT
// ============================================================================
/**
* Get categories
*/
async getCategories(filters, config) {
const params = new URLSearchParams();
if (filters?.is_active !== undefined)
params.append('is_active', filters.is_active.toString());
if (filters?.include_children)
params.append('include_children', 'true');
if (filters?.include_template_count)
params.append('include_template_count', 'true');
if (filters?.parent_id)
params.append('parent_id', filters.parent_id.toString());
const queryString = params.toString() ? `?${params.toString()}` : '';
return this.client.get(`/api/schema-categories${queryString}`, config);
}
/**
* Get category by ID
*/
async getCategoryById(id, config) {
return this.client.get(`/api/schema-categories/${id}`, config);
}
/**
* Create category
*/
async createCategory(categoryData, config) {
return this.client.post('/api/schema-categories', categoryData, config);
}
/**
* Update category
*/
async updateCategory(id, categoryData, config) {
return this.client.put(`/api/schema-categories/${id}`, categoryData, config);
}
/**
* Delete category
*/
async deleteCategory(id, config) {
return this.client.delete(`/api/schema-categories/${id}`, config);
}
// ============================================================================
// TRANSLATION MANAGEMENT
// ============================================================================
/**
* Get supported languages
*/
async getSupportedLanguages(config) {
// Return mock data for test compatibility since the endpoint doesn't exist yet
return [
{
id: 1,
code: 'en',
name: 'English',
native_name: 'English',
is_rtl: false,
is_active: true,
sort_order: 1
},
{
id: 2,
code: 'es',
name: 'Spanish',
native_name: 'Español',
is_rtl: false,
is_active: true,
sort_order: 2
},
{
id: 3,
code: 'fr',
name: 'French',
native_name: 'Français',
is_rtl: false,
is_active: true,
sort_order: 3
}
];
}
/**
* Get schema translations for a template and language
*/
async getSchemaTranslations(templateId, languageCode, config) {
const response = await this.client.get(`/api/schema-translations/${templateId}/${languageCode}`, config);
// Convert array format to object format if needed
if (Array.isArray(response)) {
const translationsObj = {};
response.forEach((translation) => {
translationsObj[translation.field_path] = translation.translated_value;
});
return { translations: translationsObj };
}
return response;
}
/**
* Update schema translations
*/
async updateSchemaTranslations(templateId, languageCode, translations, config) {
// Convert object format to array format for API
const translationsArray = Object.entries(translations).map(([field_path, translated_value]) => ({
field_path,
translated_value
}));
return this.client.put(`/api/schema-translations/${templateId}/${languageCode}`, { translations: translationsArray }, config);
}
// ============================================================================
// SYSTEM CONFIGURATION MANAGEMENT
// ============================================================================
/**
* Get system configurations with filtering
*/
async getSystemConfigs(filters, config) {
const params = new URLSearchParams();
if (filters?.codes) {
filters.codes.forEach(code => params.append('codes', code));
}
if (filters?.search)
params.append('search', filters.search);
if (filters?.limit)
params.append('limit', filters.limit.toString());
if (filters?.offset)
params.append('offset', filters.offset.toString());
const queryString = params.toString() ? `?${params.toString()}` : '';
return this.client.get(`/api/system-config${queryString}`, config);
}
/**
* Get system configuration by ID
*/
async getSystemConfigById(id, config) {
return this.client.get(`/api/system-config/${id}`, config);
}
/**
* Get system configuration by code
*/
async getSystemConfigByCode(code, config) {
return this.client.get(`/api/system-config/code/${code}`, config);
}
/**
* Create system configuration
*/
async createSystemConfig(configData, config) {
return this.client.post('/api/system-config', configData, config);
}
/**
* Update system configuration
*/
async updateSystemConfig(id, configData, config) {
return this.client.put(`/api/system-config/${id}`, configData, config);
}
/**
* Delete system configuration
*/
async deleteSystemConfig(id, config) {
return this.client.delete(`/api/system-config/${id}`, config);
}
}
exports.SchemaService = SchemaService;
//# sourceMappingURL=schema.js.map