diff --git a/management/src/components/TenantModal.jsx b/management/src/components/TenantModal.jsx index 5b73e49..3d86853 100644 --- a/management/src/components/TenantModal.jsx +++ b/management/src/components/TenantModal.jsx @@ -130,7 +130,8 @@ const TenantModal = ({ isOpen, onClose, tenant = null, onSave }) => { const tenantData = { ...formData, auth_config: cleanAuthConfig, - // Convert empty email strings to null to avoid validation errors + // Convert empty strings to null to avoid validation errors + domain: formData.domain?.trim() || null, admin_email: formData.admin_email?.trim() || null, billing_email: formData.billing_email?.trim() || null } diff --git a/server/routes/management.js b/server/routes/management.js index 8f71ff3..1346b05 100644 --- a/server/routes/management.js +++ b/server/routes/management.js @@ -218,6 +218,11 @@ router.post('/tenants', async (req, res) => { }); } + // Convert empty domain string to null to avoid unique constraint issues + if (tenantData.domain === '') { + tenantData.domain = null; + } + // Check for unique slug const existingTenant = await Tenant.findOne({ where: { slug: tenantData.slug } }); if (existingTenant) { @@ -227,6 +232,17 @@ router.post('/tenants', async (req, res) => { }); } + // Check for unique domain if provided + if (tenantData.domain) { + const existingDomain = await Tenant.findOne({ where: { domain: tenantData.domain } }); + if (existingDomain) { + return res.status(409).json({ + success: false, + message: 'Domain already exists for another tenant' + }); + } + } + // Log management action console.log(`Management: Admin ${req.managementUser.username} creating tenant: ${tenantData.name}`); @@ -295,10 +311,33 @@ router.put('/tenants/:id', async (req, res) => { }); } + const updateData = req.body; + + // Convert empty domain string to null to avoid unique constraint issues + if (updateData.domain === '') { + updateData.domain = null; + } + + // Check for unique domain if provided and different from current + if (updateData.domain && updateData.domain !== tenant.domain) { + const existingDomain = await Tenant.findOne({ + where: { + domain: updateData.domain, + id: { [require('sequelize').Op.ne]: tenant.id } + } + }); + if (existingDomain) { + return res.status(409).json({ + success: false, + message: 'Domain already exists for another tenant' + }); + } + } + // Log management action console.log(`Management: Admin ${req.managementUser.username} updating tenant: ${tenant.name}`); - await tenant.update(req.body); + await tenant.update(updateData); res.json({ success: true,