Files
BusinessMgr-2019/SaBusinessMgrCoreWebControl/Control/Controllers/Instance/RepositoryController-Ajax.cs
T
2025-01-27 10:01:32 +00:00

386 lines
16 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
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.Utils;
using System;
using System.Collections.Generic;
namespace Sarand.BusinessMgr.Web.Control.Controllers.Instance
{
//=======================================================================
partial class RepositoryController
{
//-------------------------------------------------------------------
// Definitions.
// Repository data.
private class RepositoryListData : AjaxResponse_Data.ItemData_Base
{
public String OwnerName { get; set; }
public String Context { get; set; }
public String ServerName { get; set; }
public String InstanceName { get; set; }
public String DatabaseName { get; set; }
}
private class RepositoryItemData : RepositoryListData
{
public String OwnerId { get; set; }
public String UserName { get; set; }
}
private void PopulateRepositoryResponseListData(SbmModel_Control model, RepositoryListData data, SbmcOwner owner, SbmcRepository repository)
{
data.Id = SysId.ToString(repository.Id);
data.OwnerName = owner.Name;
data.Context = repository.Context;
data.ServerName = repository.ServerName;
data.InstanceName = repository.InstanceName;
data.DatabaseName = repository.DatabaseName;
data.StatusCode = repository.StatusCode;
data.StatusDesc = repository.StatusDesc;
}
private void PopulateRepositoryResponseItemData(SbmModel_Control model, RepositoryItemData data, SbmcOwner owner, SbmcRepository repository)
{
PopulateRepositoryResponseListData(model, data, owner, repository);
data.OwnerId = SysId.ToString(repository.OwnerId);
data.UserName = repository.UserName;
}
//-------------------------------------------------------------------
// Get Repository List ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_RepositoryList : AjaxResponse_Data
{
// Construction.
public AjaxResponse_RepositoryList(SbmModel_Control model) : base(model) { }
// Repository list.
public List<RepositoryListData> Repositories { get; } = new List<RepositoryListData>();
// Reference data.
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
public List<CodeDesc> StatusesCreate { get; } = new List<CodeDesc>();
public String StatusCodeDefault { get; set; }
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Instance/Repository/Ajax/GetList")]
[Route("Instance/Repository/Ajax/GetRepositories")]
[Route("Instance/Repository/Ajax/GetRepositoryList")]
public IActionResult Ajax_GetRepositoryList(Model_Repository model)
{
String messageTitle = Localiser["label.repositories"];
AjaxResponse_RepositoryList responseData = new AjaxResponse_RepositoryList(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Reference data - statuses.
foreach (SaStatus status in SbmcRepository.ValidStatuses)
{
responseData.Statuses.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
if (status != SaStatus.Deleted)
responseData.StatusesCreate.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
}
responseData.StatusCodeDefault = SacsSystem.GetStatusCode(SbmcRepository.DefaultStatus);
// Item filter.
SbmcRepository.Params prmRepository = new SbmcRepository.Params();
prmRepository.Search = model.Filter.Search;
prmRepository.StatusCat = model.Filter.GetStatusCat();
model.Paging.ItemTotal = (ulong)ControlInstanceMgr.GetRepositoryCount(prmRepository);
model.PopulatePagingTo(prmRepository.ResultsPaging);
// Item columns.
ColumnDfn colId = ControlInstanceMgr.GetRepositoryColumnDfn(SbmcRepository.Column.Id);
ColumnDfn colOwnerName = ControlInstanceMgr.GetRepositoryColumnDfn(SbmcRepository.Column.OwnerName);
ColumnDfn colContext = ControlInstanceMgr.GetRepositoryColumnDfn(SbmcRepository.Column.Context);
ColumnDfn colServerName = ControlInstanceMgr.GetRepositoryColumnDfn(SbmcRepository.Column.ServerName);
ColumnDfn colInstanceName = ControlInstanceMgr.GetRepositoryColumnDfn(SbmcRepository.Column.InstanceName);
ColumnDfn colDatabaseName = ControlInstanceMgr.GetRepositoryColumnDfn(SbmcRepository.Column.DatabaseName);
ColumnDfn colStatus = ControlInstanceMgr.GetRepositoryColumnDfn(SbmcRepository.Column.Status);
List<ColumnDfn> columns = new List<ColumnDfn>()
{
colId, colOwnerName, colContext, colServerName, colInstanceName,
colDatabaseName, colStatus
};
// Query items.
using (DbResultSet resultSet = ControlInstanceMgr.ExecuteRepositoryQuery(columns, prmRepository))
{
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
{
NamedValue.Map values = resultSet.GetRecordValues();
RepositoryListData repositoryData = new RepositoryListData()
{
Id = values.GetString(colId.DataName),
OwnerName = values.GetString(colOwnerName.DataName),
Context = values.GetString(colContext.DataName),
ServerName = values.GetString(colServerName.DataName),
InstanceName = values.GetString(colInstanceName.DataName),
DatabaseName = values.GetString(colDatabaseName.DataName),
StatusCode = values.GetString(colStatus.DataName),
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
};
responseData.Repositories.Add(repositoryData);
}
}
if (model.Paging.IsPaged)
model.Paging.ItemCount = (ushort)responseData.Repositories.Count;
// Complete response.
responseData.SetPaging(model);
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
// Get Repository ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_Repository : AjaxResponse_Data
{
// Construction.
public AjaxResponse_Repository(SbmModel_Control model) : base(model) { }
// Repository details.
public RepositoryItemData repository { get; } = new RepositoryItemData();
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Instance/Repository/Ajax/GetItem")]
[Route("Instance/Repository/Ajax/GetRepository")]
public IActionResult Ajax_GetRepository(Model_Repository model)
{
String messageTitle = Localiser["label.repository"];
AjaxResponse_Repository responseData = new AjaxResponse_Repository(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<SacsHierarchyItem> disposables = new DisposableCollection<SacsHierarchyItem>())
{
// Identify item.
SysId repositoryId = SysId.ToSysId(model.Repository.Id);
if (!SysId.IsValid(repositoryId))
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
// Retrieve item.
SbmcRepository repository = ControlInstanceMgr.GetRepositoryById(repositoryId);
disposables.Add(repository);
if (repository == null)
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve repository for Id: '" + repositoryId + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// Owner.
SbmcOwner owner = ControlInstanceMgr.GetOwnerById(repository.OwnerId);
disposables.Add(owner);
if (owner == null)
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve owner for Id: '" + repository.OwnerId + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
}
// Construct response.
PopulateRepositoryResponseItemData(model, responseData.repository, owner, repository);
responseData.Success = true;
}
return Json(responseData);
}
//-------------------------------------------------------------------
// Get Repository ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_RepositoryInfo : AjaxResponse_Data
{
// Construction.
public AjaxResponse_RepositoryInfo(SbmModel_Control model) : base(model) { }
// Repository details.
public class RepositoryInfoData : AjaxResponse_Data.ItemData_Base
{
public byte? Initialised { get; set; }
/// <summary>Tooltip text if database uninitialised.</summary>
public String Uninitialised { get; set; }
/// <summary>Tooltip text if database unavailable.</summary>
public String Unavailable { get; set; }
}
public RepositoryInfoData repository { get; } = new RepositoryInfoData();
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Instance/Repository/Ajax/GetItemInfo")]
[Route("Instance/Repository/Ajax/GetRepositoryInfo")]
[Route("Instance/Repository/Ajax/GetRepoInfo")]
public IActionResult Ajax_GetRepositoryInfo(Model_Repository model)
{
String messageTitle = Localiser["label.repository"];
AjaxResponse_RepositoryInfo responseData = new AjaxResponse_RepositoryInfo(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>())
{
// Identify item.
SysId repositoryId = SysId.ToSysId(model.Repository.Id);
if (!SysId.IsValid(repositoryId))
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
// Retrieve item.
SbmcRepository repository = ControlInstanceMgr.GetRepositoryById(repositoryId);
disposables.Add(repository);
if (repository == null)
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve repository for Id: '" + repositoryId + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
responseData.repository.Id = SysId.ToString(repository.Id);
// Repository console.
SbmCoreInstanceConsole_Control instanceConsole = new SbmCoreInstanceConsole_Control(SessionData_Control, repository);
disposables.Add(instanceConsole);
if (!instanceConsole.HasErrorState())
{
// Validate database.
if (instanceConsole.IsRepositoryValid())
{
// Check whether repository is initialised.
if (instanceConsole.IsRepositoryInitialised())
{
responseData.repository.Initialised = 1;
}
else responseData.repository.Uninitialised = instanceConsole.ErrorStateMessage;
}
else responseData.repository.Unavailable = instanceConsole.ErrorStateMessage;
}
else responseData.repository.Unavailable = instanceConsole.ErrorStateMessage;
// Complete response.
responseData.Success = true;
}
return Json(responseData);
}
//-------------------------------------------------------------------
// Store Repository ajax request.
//-------------------------------------------------------------------
[HttpPost]
[Route("Instance/Repository/Ajax/StoreItem")]
[Route("Instance/Repository/Ajax/StoreRepository")]
public IActionResult Ajax_StoreRepository(Model_Repository model)
{
String messageTitle = Localiser["label.repository"];
AjaxResponse_Repository responseData = new AjaxResponse_Repository(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Validate item Id.
SysId repositoryId = SysId.ToSysId(model.Repository.Id);
if (StringUtil.ToBool(model.Repository.Exists) && !SysId.IsValid(repositoryId))
{
SaLogger.Warn($"{SysUtil.Fn} Repository Id not supplied for existing item.");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
}
if (!StringUtil.ToBool(model.Repository.Exists) && SysId.IsValid(repositoryId))
{
SaLogger.Warn($"{SysUtil.Fn} Repository Id supplied for new item.");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
}
// Validate item properties.
model.ValidateRepositoryData(responseData);
if (responseData.HasControlErrors())
return Json(responseData);
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposables = new DisposableCollection<SacsHierarchyItem>())
{
// Retrieve existing item.
SbmcRepository repository = ControlInstanceMgr.GetRepositoryById(repositoryId);
disposables.Add(repository);
if (repository == null && SysId.IsValid(repositoryId))
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve repository for Id: '" + model.Repository.Id + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// Owner.
SysId ownerId = repository?.OwnerId ?? SysId.ToSysId(model.Repository.OwnerId);
SbmcOwner owner = ControlInstanceMgr.GetOwnerById(ownerId);
disposables.Add(owner);
if (owner == null)
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve owner for Id: '" + ownerId + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
}
// Create new item if required.
if (repository == null)
{
repository = ControlInstanceMgr.CreateRepository();
}
// Populate item properties.
repository.OwnerId = owner.Id;
if (model.Repository.Context != null)
repository.Context = model.Repository.Context;
if (model.Repository.ServerName != null)
repository.ServerName = model.Repository.ServerName;
if (model.Repository.InstanceName != null)
repository.InstanceName = model.Repository.InstanceName;
if (model.Repository.DatabaseName != null)
repository.DatabaseName = model.Repository.DatabaseName;
if (model.Repository.UserName != null)
repository.UserName = model.Repository.UserName;
if (model.Repository.Password != null && StringUtil.ToBool(model.Repository.PasswordChanged))
repository.Password = model.Repository.Password;
if (model.Repository.StatusCode != null)
repository.Status = model.Repository.GetStatus();
// Store item.
if (!SysId.IsValid(repository.Id))
{
if (!ControlInstanceMgr.InsertRepository(repository, DbUpdateInfo))
{
SaLogger.Warn($"{SysUtil.Fn} Failed to insert repository: " + ControlInstanceMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + ControlInstanceMgr.ErrorStateMessage));
}
}
else
{
if (!ControlInstanceMgr.UpdateRepository(repository, DbUpdateInfo))
{
SaLogger.Warn($"{SysUtil.Fn} Failed to update repository [Id:" + SysId.ToString(repository.Id) + "]: " + ControlInstanceMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + ControlInstanceMgr.ErrorStateMessage));
}
}
// Construct response.
PopulateRepositoryResponseItemData(model, responseData.repository, owner, repository);
responseData.Success = true;
}
return Json(responseData);
}
//-------------------------------------------------------------------
}
//=======================================================================
}