using Microsoft.AspNetCore.Mvc; using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control; using Sarand.BusinessMgr.Web.Control.Components; using Sarand.BusinessMgr.Web.Control.Consoles; 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 Repositories { get; } = new List(); // Reference data. public List Statuses { get; } = new List(); public List StatusesCreate { get; } = new List(); 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(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status))); if (status != SaStatus.Deleted) responseData.StatusesCreate.Add(new AjaxResponse_Data.ItemCodeDesc(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 columns = new List() { 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 disposables = new DisposableCollection()) { // 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; } /// Tooltip text if database uninitialised. public String Uninitialised { get; set; } /// Tooltip text if database unavailable. 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 disposables = new DisposableCollection()) { // 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 disposables = new DisposableCollection()) { // 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); } //------------------------------------------------------------------- } //======================================================================= }