Şu ana kadar kullanıcı sayfasının çok kiracılı tarzda çalışmasını sağladık. Görünüşe göre işe yaraması için çok fazla değişiklik yaptık. Ancak çok kiracılı olarak tasarlanmamış bir sistemi böyle bir sisteme dönüştürmeye çalıştığımızı unutmayın.
Benzer ilkeleri Roller tablosuna uygulayalım.
Yine, bir kiracıdaki kullanıcı diğer kiracılardaki rolleri görmemeli veya değiştirmemeli ve ayrı olarak çalışmamalıdır.
RoleRow.cs'ye TenantId özelliğini ekleyerek başlıyoruz :
namespace MultiTenancy.Administration
{
//...
public sealed class RoleRow : Row<RoleRow.RowFields>, IIdRow, INameRow
{
[Insertable(false), Updatable(false)]
public int? TenantId
{
get => Fields.TenantId[this];
set => Fields.TenantId[this] = value;
}
//...
public class RowFields : RowFieldsBase
{
//...
public Int32Field TenantId;
//...
}
}
}
Daha sonra requestHandlers'da birkaç değişiklik yapacağız :
public class RoleSaveHandler : SaveRequestHandler<MyRow, MyRequest, MyResponse>, IRoleSaveHandler
{
//...
protected override void SetInternalFields()
{
base.SetInternalFields();
if (IsCreate)
Row.TenantId = User.GetTenantId();
}
protected override void ValidateRequest()
{
base.ValidateRequest();
if (IsUpdate)
{
if (Old.TenantId != User.GetTenantId())
Permissions.ValidatePermission(PermissionKeys.Tenants, Localizer);
}
}
}
public class RoleDeleteHandler : DeleteRequestHandler<MyRow, MyRequest, MyResponse>, IRoleDeleteHandler
{
//...
protected override void ValidateRequest()
{
base.ValidateRequest();
if (Row.TenantId != User.GetTenantId())
Permissions.ValidatePermission(PermissionKeys.Tenants, Localizer);
}
}
public class RoleRetrieveHandler : RetrieveRequestHandler<MyRow, MyRequest, MyResponse>, IRoleRetrieveHandler
{
//...
private static MyRow.RowFields Fld { get { return MyRow.Fields; } }
protected override void PrepareQuery(SqlQuery query)
{
base.PrepareQuery(query);
if (!Permissions.HasPermission(PermissionKeys.Tenants))
query.Where(Fld.TenantId == User.GetTenantId());
}
}
public class RoleListHandler : ListRequestHandler<MyRow, MyRequest, MyResponse>, IRoleListHandler
{
//...
private static MyRow.RowFields Fld { get { return MyRow.Fields; } }
protected override void ApplyFilters(SqlQuery query)
{
base.ApplyFilters(query);
if (!Permissions.HasPermission(PermissionKeys.Tenants))
query.Where(Fld.TenantId == User.GetTenantId());
}
}