I have one more question to ask. I want one tenan to have its own domain, Can you suggesst for me implement solution this? And I also want the way how to implement it both of following solutions: Authentication is not separated module Authentication is a separated module
Please create a new question, thanks.
use <db_name> in mongo db
create tenant in UI angular with format connectionString: mongodb://<user>:<password>@<replicaset_name>/<db_name> I got the error: Cannot create namespace <db_name>.AbpPermissionGrants in multi-document transaction
I will check it.
Hi,
It looks like a problem with the MongoDB driver.
Here is some information that might be useful: https://www.google.com/search?q=WaitForDescriptionChangedHelper+site:www.mongodb.com&sxsrf=AB5stBggHEDVtpC-rhwe1L8woOD-mncgJg:1691032670349&sa=X&ved=2ahUKEwiJqvrMw7-AAxWbHHAKHUEzAcIQrQIoBHoECBMQBQ&biw=1920&bih=857&dpr=2
Hi,
How do I reproduce the problem? Could you provide a new project to reproduce the problem? I will check it out. shiwei.liang@volosoft.com
Can a tenant have multiple tenants in ABP Commercial?
No, ABP does not provide such an infrastructure, you need to implement it yourself.
If not, what solution is the best practice for this use case?
This is a big topic. I can only give you some simple ideas:
Use the extended entity system to add ParentTenantId property to Tenant entity:
https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities
Data isolation between tenants, you can manually close the data filter: https://docs.abp.io/en/abp/latest/Data-Filtering#imultitenant
How can I override the routing path for Auto API Controllers? I mean that all API endpoint in the swagger must be generated with tenant-id by default as follows;
You can try:
[ExposeServices(typeof(IConventionalRouteBuilder))]
public class MyConventionalRouteBuilder : ConventionalRouteBuilder
{
public MyConventionalRouteBuilder(IOptions<AbpConventionalControllerOptions> options) : base(options)
{
}
protected override string NormalizeControllerNameCase(string controllerName, ConventionalControllerSetting? configuration)
{
var name = base.NormalizeControllerNameCase(controllerName, configuration);
return name += "/{tenant-id}";
}
}
[ExposeServices(typeof(IAbpServiceConvention))]
public class MyAppServiceConvention : AbpServiceConvention
{
public MyAppServiceConvention(IOptions<AbpAspNetCoreMvcOptions> options, IConventionalRouteBuilder conventionalRouteBuilder) : base(options, conventionalRouteBuilder)
{
}
protected override void ConfigureSelector(ControllerModel controller, ConventionalControllerSetting? configuration)
{
RemoveEmptySelectors(controller.Selectors);
var controllerType = controller.ControllerType.AsType();
var remoteServiceAtt = ReflectionHelper.GetSingleAttributeOrDefault<RemoteServiceAttribute>(controllerType.GetTypeInfo());
if (remoteServiceAtt != null && !remoteServiceAtt.IsEnabledFor(controllerType))
{
return;
}
if (controller.Selectors.Any(selector => selector.AttributeRouteModel != null))
{
foreach (var selector in controller.Selectors)
{
if (selector.AttributeRouteModel != null)
{
selector.AttributeRouteModel.Template += "/{tenant-id}";
}
}
return;
}
var rootPath = GetRootPathOrDefault(controller.ControllerType.AsType());
foreach (var action in controller.Actions)
{
ConfigureSelector(rootPath, controller.ControllerName, action, configuration);
}
}
}
You need also to create a custom tenant resolver to get the resolve from route:
https://docs.abp.io/en/abp/latest/Multi-Tenancy#custom-tenant-resolvers
Hi,
ABP has a lot of unit test code, you can refer to:
https://github.com/abpframework/abp/tree/dev/framework/test https://github.com/abpframework/abp/tree/dev/modules/cms-kit/test
Hi,
Yes, this is a public endpoint, but it is safe. If the user is not logged in, there will be no sensitive information.
Hi,
Could you share the full error logs? thanks.
Also: https://docs.abp.io/en/abp/latest/Migration-Guides/Abp-7_3