280 lines
11 KiB
C#
280 lines
11 KiB
C#
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.
|
|
/// <summary>
|
|
/// Repository initialisation data.
|
|
/// <para>- May have multiple (internal) Organisations.</para>
|
|
/// <para>- Each Organisation may have multiple 'Superuser' users.</para>
|
|
/// </summary>
|
|
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<RepositoryOrganisationData> Organisations { get; } = new List<RepositoryOrganisationData>();
|
|
}
|
|
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<RepositoryUserData> Users { get; } = new List<RepositoryUserData>();
|
|
}
|
|
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<RepositoryController> 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<SacsDisposable> disposables = new DisposableCollection<SacsDisposable>())
|
|
{
|
|
|
|
// 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<SacsDisposable> disposables = new DisposableCollection<SacsDisposable>())
|
|
{
|
|
|
|
// 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);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|