Activities of "Hon-Tre_IFS"

Please Replay Soon I am working on deadline

I'm encountering an issue with SendGrid email delivery in my application when deployed to Azure. The problem occurs specifically in a layered (multi-tier) architecture, while the same code works perfectly in a single-layer setup and also functions correctly in local development environments.

Do we need configure an Extra in Layred solution

Thanks, Issue Resolved

I have Sent Logs.txt to above Email Please Check.

I have added the controller HttpApi layer and facing Swagger error add a screen shot

namespace Hon.IFS.SiteManagement.SiteRiskIndices
{
    [RemoteService(Name = SiteManagementRemoteServiceConsts.RemoteServiceName)]
    [Area(SiteManagementRemoteServiceConsts.ModuleName)]
    [ControllerName("SiteRiskIndex")]
    [Route("api/site-management/site-risk-indices")]
    [ApiController]
    public class SiteRiskIndexController : ISiteRiskIndexAppService
    {
        protected ISiteRiskIndexAppService _siteRiskIndexAppService;

        public SiteRiskIndexController(ISiteRiskIndexAppService siteRiskIndexAppService)
        {
            _siteRiskIndexAppService = siteRiskIndexAppService;
        }
        public async Task<List<RiskIndexDto>> CreateBulkRiskIndicesAsync(Guid siteId, List<Guid> buildingIds)
        {
            // Implementation logic for creating bulk risk indices
            // Replace the following line with actual implementation
            return await _siteRiskIndexAppService.CreateBulkRiskIndicesAsync( siteId, buildingIds);
        }

        public async Task<List<RiskIndexDto>> GetListBySiteAndBuildingsAsync(Guid siteId, List<Guid> buildingIds)
        {
            // Implementation logic for retrieving risk indices by site and buildings
            // Replace the following line with actual implementation
            return await _siteRiskIndexAppService.GetListBySiteAndBuildingsAsync(siteId, buildingIds);
        }
    }
}

If Possible, please provide Step by Step process to create the Custon Api in module Application it Helps

Module

HI have Did that Still the issue is there

For Your Referance I have added the code

namespace Hon.IFS.SiteManagement.SiteRiskIndices
{
    [RemoteService]
    public abstract class SiteRiskIndexAppService : SiteManagementAppService ,ITransientDependency
    {
        #region Initialization and Constructor
        private readonly RiskIndexManager _riskIndexManager;

        private readonly IRiskIndexRepository _riskIndexRepository; // Add this field

        public SiteRiskIndexAppService(IRiskIndexRepository riskIndexRepository, RiskIndexManager riskIndexManager) // Update constructor
        {
            _riskIndexManager = riskIndexManager;
            _riskIndexRepository = riskIndexRepository; // Initialize the repository
        }

        #endregion
        #region BUlK CREATE RISK INDICES
        [Authorize(SiteManagementPermissions.RiskIndices.Create)]
        public  async Task<List<RiskIndexDto>> CreateBulkRiskIndicesAsync(Guid siteId, List<Guid> buildingIds)
        {
            var random = new Random();
            var createdRiskIndices = new List<RiskIndexDto>();

            foreach (var buildingId in buildingIds)
            {
                // Generate random values with 2 decimal places for each field
                var communityRiskIndex = Math.Round(random.NextDouble() * 100, 2); // Define communityRiskIndex
                var neighbourhoodRiskIndex = Math.Round(random.NextDouble() * 100, 2); // Define neighbourhoodRiskIndex
                var buildingRiskIndex = Math.Round(random.NextDouble() * 100, 2);
                var buildingRiskIndexPercentage = 20;
                var historicalFireIncident = random.Next(0, 11); // Integer between 0-10
                var historicalFireIncidentPercentage = 10;
                var maintenance = Math.Round(random.NextDouble() * 100, 2);
                var maintenancePercentage = 10;
                var fireSupression = Math.Round(random.NextDouble() * 100, 2);
                var fireSupressionPercentage = 10;
                var fireService = Math.Round(random.NextDouble() * 100, 2);
                var fireServicePercentage = Math.Round(random.NextDouble() * 100, 2);
                var buildingOrg = Math.Round(random.NextDouble() * 100, 2);
                var buildingOrgPercentage = 10;
                var passiveFire = Math.Round(random.NextDouble() * 100, 2);
                var passiveFirePercentage = 10;
                var detection = Math.Round(random.NextDouble() * 100, 2);
                var detectionPercentage = 10;
                var ignition = Math.Round(random.NextDouble() * 100, 2);
                var ignitionPercentage = 10; // Ensure ignitionPercentage is included
                var riskIndexScore = (buildingRiskIndex * buildingRiskIndexPercentage)
                                    + (historicalFireIncident * historicalFireIncidentPercentage)
                                    + (maintenance * maintenancePercentage)
                                    + (fireSupression * fireSupressionPercentage)
                                    + (fireService * fireServicePercentage)
                                    + (buildingOrg * buildingOrgPercentage)
                                    + (passiveFire * passiveFirePercentage)
                                    + (detection * detectionPercentage)
                                    + (ignition * ignitionPercentage);

                // Create risk index for the building
                var riskIndex = await _riskIndexManager.CreateAsync(
                    siteId, buildingId,
                    (decimal)communityRiskIndex, (decimal)neighbourhoodRiskIndex, // Use the defined variables
                    (decimal)buildingRiskIndex, (decimal)buildingRiskIndexPercentage,
                    historicalFireIncident, (decimal)historicalFireIncidentPercentage,
                    (decimal)maintenance, (decimal)maintenancePercentage,
                    (decimal)fireSupression, (decimal)fireSupressionPercentage,
                    (decimal)fireService, (decimal)fireServicePercentage,
                    (decimal)buildingOrg, (decimal)buildingOrgPercentage,
                    (decimal)passiveFire, (decimal)passiveFirePercentage,
                    (decimal)detection, (decimal)detectionPercentage,
                    (decimal)ignition, (decimal)ignitionPercentage, // Pass ignitionPercentage here
                    (decimal)riskIndexScore
                );

                createdRiskIndices.Add(ObjectMapper.Map<RiskIndex, RiskIndexDto>(riskIndex));
            }

            return createdRiskIndices;
        }

        [Authorize(SiteManagementPermissions.RiskIndices.Default)]
        public  async Task<List<RiskIndexDto>> GetListBySiteAndBuildingsAsync(Guid siteId, List<Guid> buildingIds)
        {
            // Create a query to filter by siteId
            var query = await _riskIndexRepository.GetQueryableAsync();
            query = query.Where(ri => ri.SiteId == siteId);

            // Further filter by buildingIds if provided
            if (buildingIds != null && buildingIds.Any())
            {
                query = query.Where(ri => buildingIds.Contains(ri.BuildingId));
            }

            // Execute the query and retrieve the results
            var items = await AsyncExecuter.ToListAsync(query);

            // Map the results to DTOs and return
            return ObjectMapper.Map<List<RiskIndex>, List<RiskIndexDto>>(items);

        }

        #endregion
    }
}

I have done it like this: Reference Code below

  public virtual async Task<SaasTenantDto> CreateSiteTenanatAsync(SaasTenantCreateDto input)
  {
      input.ConnectionStrings = await NormalizedConnectionStringsAsync(input.ConnectionStrings);

      Tenant tenant = null;

      async Task CreateTenantAsync()
      {
          tenant = await TenantManager.CreateAsync(input.Name, input.EditionId);

          if (!input.ConnectionStrings.Default.IsNullOrWhiteSpace())
          {
              tenant.SetDefaultConnectionString(input.ConnectionStrings.Default);
          }

          if (input.ConnectionStrings.Databases != null)
          {
              foreach (var database in input.ConnectionStrings.Databases)
              {
                  tenant.SetConnectionString(database.DatabaseName, database.ConnectionString);
              }
          }

          await CheckConnectionStringAsync(tenant);

          input.MapExtraPropertiesTo(tenant);

          tenant.SetActivationState(input.ActivationState);
          if (tenant.ActivationState == TenantActivationState.ActiveWithLimitedTime)
          {
              tenant.SetActivationEndDate(input.ActivationEndDate);
          }
          /* Auto saving to ensure TenantCreatedEto handler can get the tenant! */
          await TenantRepository.InsertAsync(tenant, autoSave: true);
      }

      if (input.ConnectionStrings.Default.IsNullOrWhiteSpace() &&
          input.ConnectionStrings.Databases.IsNullOrEmpty())
      {
          /* Creating the tenant in the current UOW */
          await CreateTenantAsync();
      }
      else
      {
          /* Creating the tenant in a separate UOW to ensure it is created
           * before creating the database.
           * TODO: We should remove inner UOW once https://github.com/abpframework/abp/issues/6126 is done
           */
          using (var uow = UnitOfWorkManager.Begin(requiresNew: true))
          {
              await CreateTenantAsync();
              await uow.CompleteAsync();
          }
      }
      var adminName = "admin"; // default
      if (input.ExtraProperties.TryGetValue("adminName", out var nameObj) && nameObj is string nameStr && !string.IsNullOrWhiteSpace(nameStr))
      {
          adminName = nameStr;
      }

     
    

      await DistributedEventBus.PublishAsync(
          new TenantCreatedEto
          {
              Id = tenant.Id,
              Name = tenant.Name,
              Properties =
              {
                      {"AdminEmail", input.AdminEmailAddress},
                      {"AdminPassword", input.AdminPassword},
                 **     { "AdminName", adminName}** Added this line still not working
              }
          }
      );

      return ObjectMapper.Map<Tenant, SaasTenantDto>(tenant);
  }
Showing 1 to 10 of 16 entries
Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.0.0-preview. Updated on September 18, 2025, 07:10