using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Sarand.BusinessMgr.Net.Core.Web.App; using Sarand.BusinessMgr.Net.Core.Web.Consoles; using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control; using Sarand.BusinessMgr.Net.Standard.Base.Consoles; using Sarand.BusinessMgr.Web.Control.Consoles; using Sarand.BusinessMgr.Web.Control.Models; using Sarand.BusinessMgr.Web.Control.Models.Instance; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Security; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; using System.Linq; namespace Sarand.BusinessMgr.Web.Control.Controllers.Instance { //======================================================================= public partial class RepositoryInitController : SbmController_Control { //------------------------------------------------------------------- // Definitions. // Repository data. /// /// Repository initialisation data. /// - May have multiple (internal) Organisations. /// - Each Organisation may have multiple 'Superuser' users. /// public class RepositoryData { // Repository data. public String Id { get; set; } public String OwnerId { get; set; } public String OwnerName { get; set; } public String Context { get; set; } // Organisations. public List Organisations { get; } = new List(); } public class RepositoryOrganisationData { // Organisation data. public String AffiliateId { get; set; } public String AssociationId { get; set; } public String Name { get; set; } public String Website { get; set; } public String CompanyNo { get; set; } public String VatReg { get; set; } // Registered users. public List Users { get; } = new List(); } public class RepositoryUserData { public String AffiliateId { get; set; } public String SecurityItemId { get; set; } public String FirstName { get; set; } public String LastName { get; set; } public String Email { get; set; } public String Code { get; set; } public String Password { get; set; } } //------------------------------------------------------------------- // Construction. public RepositoryInitController(SbmLocaliser localiser, ILogger logger) : base(localiser, logger) { } //------------------------------------------------------------------- // Get Repository Initialisation Info ajax request. //------------------------------------------------------------------- private class AjaxResponse_RepositoryInitInfo : AjaxResponse_Data { // Construction. public AjaxResponse_RepositoryInitInfo(SbmModel_Control model) : base(model) { } // Repository initialisation info. public RepositoryData Repository { get; } = new RepositoryData(); } //------------------------------------------------------------------- [HttpPost] [Route("Instance/Repository/Ajax/GetInitInfo")] public IActionResult Ajax_GetRepositoryInitInfo(Model_RepositoryInit model) { String messageTitle = Localiser["label.repository"]; AjaxResponse_RepositoryInitInfo responseData = new AjaxResponse_RepositoryInitInfo(model); // Validate session and referrer. if (!ValidReferer) return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); RefreshModel(model); // Record disposable items as they are created so all can be disposed when needed. using (DisposableCollection disposables = new DisposableCollection()) { // Validate Repository. SysId repositoryId = SysId.ToSysId(model.Repository.Id); if (!SysId.IsValid(repositoryId)) { SaLogger.Warn($"{SysUtil.Fn} Repository Id not supplied."); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"])); } SbmcRepository repository = ControlInstanceMgr.GetRepositoryById(repositoryId); disposables.Add(repository); if (repository == null) { SaLogger.Warn($"{SysUtil.Fn} Repository does not exist. Id: {repositoryId}."); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"])); } responseData.Repository.Id = $"{SysId.ToLong(repository.Id)}"; responseData.Repository.Context = repository.Context; // Owner. SbmcOwner owner = ControlInstanceMgr.GetOwnerById(repository.OwnerId); disposables.Add(owner); if (owner == null) { SaLogger.Warn($"{SysUtil.Fn} Owner does not exist. Id: {repository.OwnerId}."); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"])); } responseData.Repository.OwnerId = $"{SysId.ToLong(owner.Id)}"; responseData.Repository.OwnerName = owner.Name; // Repository Console. SbmCoreInstanceConsole_Control instanceConsole = new SbmCoreInstanceConsole_Control(repository); disposables.Add(instanceConsole); // Core internals. SbmInternals internals = instanceConsole.CreateCoreInternals(); disposables.Add(internals); // Core security console. SaSecurityConsole securityConsole = App.CreateSecurityConsole(internals.UserContext); disposables.Add(securityConsole); // Query Organisations. SbmAssociation.Params prm = new SbmAssociation.Params(); prm.AssociationType = Sbm.AssociationType.Internal; prm.StatusCat = SbmAssociation.StatusCat.Current; foreach (SbmAssociation association in internals.AccountMgr.GetAssociationList(prm)) { // Retrieve Organisation details. disposables.Add(association); SbmAffiliate affiliateOrganisation = internals.AccountMgr.GetAffiliateById(association.AffiliateIdOwner); disposables.Add(affiliateOrganisation); // Organisation details. RepositoryOrganisationData organisation = new RepositoryOrganisationData() { AssociationId = SysId.ToString(association.Id), AffiliateId = SysId.ToString(affiliateOrganisation.Id), Name = affiliateOrganisation.Name, Website = affiliateOrganisation.Website, CompanyNo = affiliateOrganisation.CompanyNo, VatReg = affiliateOrganisation.VatReg, }; // Retrieve user details. SbmAffiliate.Params prmAffiliateUser = new SbmAffiliate.Params(); prmAffiliateUser.AffiliateIdAssocOwner = affiliateOrganisation.Id; prmAffiliateUser.AssociationType = Sbm.AssociationType.Member; prmAffiliateUser.StatusCat = SbmAffiliate.StatusCat.CurrentOnly; foreach (SbmAffiliate affiliateUser in internals.AccountMgr.GetAffiliateList(prmAffiliateUser)) { disposables.Add(affiliateUser); // Lookup security details. if (!SysId.IsValid(affiliateUser.UserId)) continue; SaSecurityItem securityUser = securityConsole.GetSecurityItemById(SaSecurity.ItemType.User, affiliateUser.UserId); disposables.Add(securityUser); if (securityUser == null) continue; // Confirm security rights (SuperUser). SaSecurityProfile securityProfile = securityConsole.GetUserSecurityProfile(securityUser.Id); if (!securityProfile.Rights.Any(right => right.Code.EqualsCI(SaSecurityConsole.GroupCode_Super))) continue; // Add User to the Organisation. RepositoryUserData userData = new RepositoryUserData() { FirstName = affiliateUser.FirstName, LastName = affiliateUser.LastName, Email = StringUtil.OnBlank(securityUser.EmailAddress, affiliateUser.Email), Code = securityUser.Code, }; organisation.Users.Add(userData); } // Add this Organisation to the list. responseData.Repository.Organisations.Add(organisation); } // Complete response. responseData.Success = true; } return Json(responseData); } //------------------------------------------------------------------- // Initialise Repository ajax request. //------------------------------------------------------------------- private class AjaxResponse_RepositoryInitialise : AjaxResponse_Data { // Construction. public AjaxResponse_RepositoryInitialise(SbmModel_Control model) : base(model) { } } [HttpPost] [Route("Instance/Repository/Ajax/Initialise")] public IActionResult Ajax_StoreRepository(Model_RepositoryInit model) { String messageTitle = Localiser["label.repository"]; AjaxResponse_RepositoryInitialise responseData = new AjaxResponse_RepositoryInitialise(model); // Validate session and referrer. if (!ValidReferer) return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); RefreshModel(model); // Record disposable items as they are created so all can be disposed when needed. using (DisposableCollection disposables = new DisposableCollection()) { // Validate Repository. SysId repositoryId = SysId.ToSysId(model.Repository.Id); if (!SysId.IsValid(repositoryId)) { SaLogger.Warn($"{SysUtil.Fn} Repository Id not supplied."); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"])); } SbmcRepository repository = ControlInstanceMgr.GetRepositoryById(repositoryId); disposables.Add(repository); if (repository == null) { SaLogger.Warn($"{SysUtil.Fn} Repository does not exist. Id: {repositoryId}."); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"])); } // Validate item properties. model.ValidateRepositoryData(responseData, repository); if (responseData.HasControlErrors()) return Json(responseData); // Repository Console. SbmCoreInstanceConsole_Control repositoryConsole = new SbmCoreInstanceConsole_Control(repository); disposables.Add(repositoryConsole); SbmCoreInstanceConsole_Base.RepositoryInitialisationData repoInitData = new SbmCoreInstanceConsole_Base.RepositoryInitialisationData(); repoInitData.Organisation.AffiliateId = SysId.ToSysId(model.Organisation.AffiliateId); repoInitData.Organisation.AssociationId = SysId.ToSysId(model.Organisation.AssociationId); repoInitData.Organisation.Name = model.Organisation.Name; repoInitData.Organisation.VatReg = model.Organisation.VatReg; repoInitData.Organisation.CompanyNo = model.Organisation.CompanyNo; repoInitData.Organisation.Website = model.Organisation.Website; repoInitData.User.AffiliateId = SysId.ToSysId(model.User.AffiliateId); repoInitData.User.FirstName = model.User.FirstName; repoInitData.User.LastName = model.User.LastName; repoInitData.User.Email = model.User.Email; repoInitData.User.SecurityItemId = SysId.ToSysId(model.User.SecurityItemId); repoInitData.User.Code = model.User.Code; repoInitData.User.Password = model.User.Password; if (!repositoryConsole.InitialiseRepository(repoInitData)) return Json(responseData.SetMessage(messageTitle, repositoryConsole.ErrorStateMessage)); // Complete response. responseData.Success = true; } return Json(responseData); } //------------------------------------------------------------------- } //======================================================================= }