using CMSDAL.CustomCode.Site; using CMSDAL.DTO.Site; using GB5Shared.DTO.Framework.Login; using GB5Shared.Resource.Response; using GB5Shared.Validation; namespace CMSBLL.Site; public class SiteDomainBLL : ISiteDomainBLL { private readonly ISiteDomainDAL _dal; private readonly ISiteDAL _siteDal; private readonly ICrossTenantGuard _guard; public SiteDomainBLL(ISiteDomainDAL dal, ISiteDAL siteDal, ICrossTenantGuard guard) { _dal = dal; _siteDal = siteDal; _guard = guard; } public async Task GetBySiteAsync(int siteId, LoginDTO loginDTO, CancellationToken ct = default) { try { return await _dal.GetBySiteAsync(siteId, loginDTO, ct); } catch { throw; } } public async Task SaveAsync(SiteDomainDTO dto, LoginDTO loginDTO, CancellationToken ct = default) { try { // Only a brand-new domain binding attaches to a caller-supplied SiteId — without // this check, any tenant could bind a domain to another tenant's Site by guessing // its SiteId (the domain itself is still globally unique at the DB level, but the // SiteId attachment must also be verified before that point). if (dto.SiteDomainId == 0) { var ownerTenantId = await _siteDal.GetSiteTenantIdAsync(dto.SiteId, loginDTO, ct); _guard.EnsureOwnedByTenant(ownerTenantId, loginDTO.ClientId, "Site", dto.SiteId); } dto.TenantId = loginDTO.ClientId; dto.ModifiedById = loginDTO.UserId; dto.ModifiedOn = DateTime.UtcNow; if (dto.SiteDomainId == 0) { dto.CreatedById = loginDTO.UserId; dto.CreatedOn = DateTime.UtcNow; } await _dal.SaveAsync(dto, loginDTO, ct: ct); return SuccessResponse.SaveSuccessMessage; } catch { throw; } } public async Task DeleteAsync(int siteDomainId, LoginDTO loginDTO, CancellationToken ct = default) { try { return await _dal.DeleteAsync(siteDomainId, loginDTO, ct); } catch { throw; } } }