When creating a new tenant via the ABP Tenant Management API (POST /api/tenant-management/tenants) from an external application, the tenant and admin user are created successfully. However, after logging in as the newly created admin user, the user is unable to create additional users due to missing permissions or role assignment.
This suggests that role-to-user mapping is not being applied automatically during tenant creation when the API is called externally (e.g., from Postman, another service, or automated script), even though the same call works correctly when made via Swagger or ABP UI. here is the example payload we are passing from other abp application { "name": "Tenant30", "tenantType": 0, "editionId": "Basic", "activationState": 0, "adminEmailAddress": "itp@gmail.com", "adminPassword": "Password@123", "extraProperties": { "subscriptionPlan": 0, "contact": "09876543210", "adminName": "Vasudha Gurram", "tenantHostName": "T30", "adminEmail": "itp@gmail.com", "firstName": "Vasudha", "lastName": "Gurram", "description": null, "country": "India", "region": "HYD" } }
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
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
}
}