This commit is contained in:
2022-05-19 13:41:22 +01:00
parent d17cce340e
commit 56f6b0bb7e
48 changed files with 850 additions and 319 deletions
@@ -21,40 +21,55 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
{
//-------------------------------------------------------------------
// Member data.
private class MemberData_List
private class MemberData_List : AjaxResponse_Data.ItemData_Base
{
public String Id { get; set; }
// User.
public String UserAccountId { get; set; }
public bool? Self { get; set; } = null;
public String EmailAddress { get; set; }
public String DisplayName { get; set; }
public String UserStatusCode { get; set; }
public String UserStatusDesc { get; set; }
public bool? UserActive { get { return UserStatusCode.EqualsCI(SacsSystem.GetStatusCode(SaStatus.Active)) ? true : (bool?)null; } }
// Organisation.
public String OrganisationId { get; set; }
public String OrganisationName { get; set; }
public List<String> RoleCodes { get; } = new List<string>();
// Organisation user.
public int RoleCount { get; set; }
public String StatusCode { get; set; }
public String StatusDesc { get; set; }
public bool? Member { get; set; } = null;
}
private class MemberData_Full : MemberData_List
{
// Organisation user.
public List<String> RoleCodes { get; } = new List<string>();
}
private void PopulateMemberResponseData(MemberData_List data, SaxUserOrganisation userOrganisation, SaxUserAccount userAccount, SaxOrganisation organisation)
{
data.Id = SysId.ToString(userOrganisation.Id);
// User.
data.UserAccountId = SysId.ToString(userAccount.Id);
if (userAccount.Id.Equals(UserAccountId)) data.Self = true;
data.EmailAddress = userAccount.EmailAddress;
data.DisplayName = userAccount.GetDisplayName();
data.UserStatusCode = userAccount.StatusCode;
data.UserStatusDesc = userAccount.StatusDesc;
// Organisation.
data.OrganisationId = SysId.ToString(organisation.Id);
data.OrganisationName = organisation.Name;
// Exclude 'Member' role.
foreach (Sax.OrganisationRole organisationRole in userOrganisation.GetOrganisationRoles().ToList().FindAll(item => item != Sax.OrganisationRole.Member))
data.RoleCodes.Add(OrganisationRoleCodes.GetCodeForType(organisationRole));
// Organisation user:
data.RoleCount = userOrganisation.OrganisationRoleCount - 1;
data.StatusCode = userOrganisation.StatusCode;
data.StatusDesc = userOrganisation.StatusDesc;
if (userOrganisation.GetOrganisationRoles().ToList().Exists(item => item == Sax.OrganisationRole.Member))
data.Member = true;
}
private void PopulateMemberResponseData(MemberData_Full data, SaxUserOrganisation userOrganisation, SaxUserAccount userAccount, SaxOrganisation organisation)
{
PopulateMemberResponseData(data as MemberData_List, userOrganisation, userAccount, organisation);
// Organisation user:
// Exclude 'Member' role.
foreach (Sax.OrganisationRole organisationRole in userOrganisation.GetOrganisationRoles().ToList().FindAll(item => item != Sax.OrganisationRole.Member))
data.RoleCodes.Add(OrganisationRoleCodes.GetCodeForType(organisationRole));
}
//-------------------------------------------------------------------
@@ -119,7 +134,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.OrganisationIdsIncluded.Add(organisationId);
prmUserOrganisation.OrganisationMembersOnly = true;
prmUserOrganisation.UserAccountStatusCat = SaxUserAccount.StatusCat.AwaitingOnly;
prmUserOrganisation.UserAccountStatusCat = SaxUserAccount.StatusCat.NotDeleted;
prmUserOrganisation.StatusCat = SaxUserOrganisation.StatusCat.NotDeleted;
model.Paging.ItemTotal = (ulong)AccountMgr.GetUserOrganisationCount(prmUserOrganisation);
model.PopulatePagingTo(prmUserOrganisation.ResultsPaging);
@@ -129,6 +144,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
ColumnDfn colUserAccountId = AccountMgr.GetUserOrganisationColumnDfn(SaxUserOrganisation.Column.UserAccountId);
ColumnDfn colUserEmailAddress = AccountMgr.GetUserOrganisationColumnDfn(SaxUserOrganisation.Column.User_EmailAddress);
ColumnDfn colUserDisplayName = AccountMgr.GetUserOrganisationColumnDfn(SaxUserOrganisation.Column.User_DisplayName);
ColumnDfn colUserStatus = AccountMgr.GetUserOrganisationColumnDfn(SaxUserOrganisation.Column.User_Status);
ColumnDfn colOrganisationId = AccountMgr.GetUserOrganisationColumnDfn(SaxUserOrganisation.Column.OrganisationId);
ColumnDfn colOrganisationName = AccountMgr.GetUserOrganisationColumnDfn(SaxUserOrganisation.Column.Organisation_Name);
ColumnDfn colRoleCodes = AccountMgr.GetUserOrganisationColumnDfn(SaxUserOrganisation.Column.OrganisationRoleCodes);
@@ -136,14 +152,10 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
ColumnDfn colStatus = AccountMgr.GetUserOrganisationColumnDfn(SaxUserOrganisation.Column.Status);
List<ColumnDfn> columns = new List<ColumnDfn>()
{
colId,
colUserAccountId,
colUserEmailAddress,
colUserDisplayName,
colOrganisationId,
colOrganisationName,
colRoleCodes,
colRoleCount,
colId, colUserAccountId,
colUserEmailAddress, colUserDisplayName, colUserStatus,
colOrganisationId, colOrganisationName,
colRoleCodes, colRoleCount,
colStatus
};
@@ -156,15 +168,20 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
MemberData_List memberData = new MemberData_List()
{
Id = values.GetString(colId.DataName),
// User.
UserAccountId = values.GetString(colUserAccountId.DataName),
EmailAddress = values.GetString(colUserEmailAddress.DataName),
DisplayName = AccountMgr.GetUserOrganisationDataValue(colUserDisplayName, values).ToString(),
UserStatusCode = values.GetString(colUserStatus.DataName),
UserStatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colUserStatus.DataName)),
// Organisation.
OrganisationId = values.GetString(colOrganisationId.DataName),
OrganisationName = values.GetString(colOrganisationName.DataName),
// Role count - 1 to ignore 'Member' role.
RoleCount = (int)values.GetLong(colRoleCount.DataName) - 1,
StatusCode = values.GetString(colStatus.DataName),
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)),
Member = (values.GetLong(colRoleCount.DataName) > 0) ? true : (bool?)null
};
members.Add(memberData);
}
@@ -365,6 +382,88 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
return Json(responseData);
}
//-------------------------------------------------------------------
// Remove Organisation Member ajax request.
//-------------------------------------------------------------------
[HttpPost]
[Route("Organisation/Ajax/RemoveMember")]
public IActionResult Ajax_RemoveMember(Model_OrganisationMembers model)
{
String fn = GetType().Name + ".Ajax_RemoveMember";
String messageTitle = Localiser["organisation.caption.member"];
AjaxResponse_Member responseData = new AjaxResponse_Member(model);
// Validate session.
if (!ValidUserSession)
return GetAjaxResult_InvalidSession(responseData);
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
{
// Organisation.
SysId organisationId = model.OrganisationId.ToSysId();
SaxOrganisation organisation = AccountMgr.GetOrganisationById(organisationId);
if (organisation == null)
{
SaLogger.Warn(fn + " Failed to retrieve Organisation for Id: '" + model.OrganisationId + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.data.incomplete"]));
}
disposableItems.Add(organisation);
// User Organisation.
SysId userOrganisationId = model.UserOrganisationId.ToSysId();
SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisationById(userOrganisationId);
disposableItems.Add(userOrganisation);
if (userOrganisation == null)
{
SaLogger.Warn(fn + " Failed to retrieve user organisation for Id: '" + userOrganisationId + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
if (!userOrganisation.OrganisationId.Equals(organisation.Id))
{
SaLogger.Warn(fn + " Inconsistent user organisation properties. OrganisationId: " + userOrganisation.OrganisationId + " vs " + organisation.Id + ".");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.data.inconsistent"]));
}
// User Account.
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(userOrganisation.UserAccountId);
disposableItems.Add(userAccount);
if (userAccount == null)
{
SaLogger.Warn(fn + " Failed to retrieve user account for Id: '" + userOrganisation.UserAccountId + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
}
// Remove all roles and store.
userOrganisation.ClearOrganisationRoles();
// Store item.
if (!SysId.IsValid(userOrganisation.Id))
{
if (!AccountMgr.InsertUserOrganisation(userOrganisation, DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to insert user organisation: " + AccountMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + AccountMgr.ErrorStateMessage));
}
}
else
{
if (!AccountMgr.UpdateUserOrganisation(userOrganisation, DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to update user organisation [Id:" + SysId.ToString(userOrganisation.Id) + "]: " + AccountMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + AccountMgr.ErrorStateMessage));
}
}
// Construct response.
PopulateMemberResponseData(responseData.Member, userOrganisation, userAccount, organisation);
}
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
}
//=======================================================================