using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Saxonite.Net.Core.Web.Online.Models; using Saxonite.Net.Core.Web.Base.App; using Saxonite.Net.Core.Web.Base.Controllers; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Saxonite.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; namespace Saxonite.Net.Core.Web.Online.Controllers { //======================================================================= // Online Account Controller - Sports - Ajax actions. //======================================================================= partial class AccountController { //------------------------------------------------------------------- // Data definitions. public class ProfileSportResponseData_List { public long Id { get; set; } public long SportId { get; set; } public String SportName { get; set; } public String StatusCode { get; set; } public String StatusDesc { get; set; } } public class ProfileSportResponseData_Item : ProfileSportResponseData_List { public String CreatedOnFmt { get; set; } } private void PopulateProfileSportResponseData(Model_Account model, SaxUserSport userSport, SaxSport sport, ProfileSportResponseData_Item data) { data.Id = SysId.ToLong(userSport.Id); data.SportId = SysId.ToLong(userSport.SportId); data.SportName = sport.Name; data.CreatedOnFmt = DateUtil.Format(userSport.CreateStamp.On, "d-MMM-yyyy"); data.StatusCode = userSport.StatusCode; data.StatusDesc = userSport.StatusDesc; } //------------------------------------------------------------------- // Account - Get Profile Sports. //------------------------------------------------------------------- public class AjaxResponse_ProfileSportsData : AjaxResponse_Data { public List Sports { get; } = new List(); } // Ajax request. [HttpPost] [Route("Account/Ajax/GetProfileSports")] public IActionResult GetProfileSports(Model_Account model) { String fn = GetType().Name + ".GetProfileSports"; AjaxResponse_ProfileSportsData responseData = new AjaxResponse_ProfileSportsData(); String messageTitle = Localiser["account.caption.profile.sports"]; // Validate session and referrer. if (!ValidReferer) return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); // Item filter. SaxUserSport.Params prmUserSport = new SaxUserSport.Params(); prmUserSport.UserAccountIdsIncluded.Add(SessionData.User.UserAccountId); prmUserSport.StatusCat = SaxUserSport.StatusCat.NotDeleted; model.DataItemTotal = (ulong)AccountMgr.GetUserSportCount(prmUserSport); model.PopulatePagingTo(prmUserSport.ResultsPaging); // Item columns. ColumnDfn colId = AccountMgr.GetUserSportColumnDfn(SaxUserSport.Column.Id); ColumnDfn colSportId = AccountMgr.GetUserSportColumnDfn(SaxUserSport.Column.SportId); ColumnDfn colSportName = AccountMgr.GetUserSportColumnDfn(SaxUserSport.Column.Sport_Name); ColumnDfn colStatus = AccountMgr.GetUserSportColumnDfn(SaxUserSport.Column.Status); List columns = new List() { colId, colSportId, colSportName, colStatus, }; // Sort columns. prmUserSport.SortColumns.Add(colSportName); // Query items. model.DataItemCount = 0; using (DbResultSet resultSet = AccountMgr.ExecuteUserSportQuery(columns, prmUserSport)) { while (resultSet != null && resultSet.HasRows && resultSet.NextRecord()) { model.DataItemCount++; NamedValue.Map values = resultSet.GetRecordValues(); ProfileSportResponseData_List userSportData = new ProfileSportResponseData_List() { Id = values.GetLong(colId.DataName), SportId = values.GetLong(colSportId.DataName), SportName = values.GetString(colSportName.DataName), StatusCode = values.GetString(colStatus.DataName), StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)) }; responseData.Sports.Add(userSportData); } } // Complete response. responseData.SetPaging(model); responseData.Success = true; return Json(responseData); } //------------------------------------------------------------------- // Get Profile Sport ajax request. //------------------------------------------------------------------- public class AjaxResponse_ProfileSport : AjaxResponse_Data { public ProfileSportResponseData_Item Sport { get; } = new ProfileSportResponseData_Item(); } //------------------------------------------------------------------- [HttpPost] [Route("Account/Ajax/GetProfileSport")] public IActionResult Ajax_GetProfileSport(Model_Account model) { String fn = GetType().Name + ".Ajax_GetProfileSport"; String messageTitle = Localiser["account.caption.profile.sport"]; AjaxResponse_ProfileSport responseData = new AjaxResponse_ProfileSport(); // Validate session and referrer. if (!ValidReferer) return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); // Identify item. SysId userSportId = model.UserSportId.ToSysId(); if (!SysId.IsValid(userSportId)) return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"])); // Retrieve item. SaxUserSport userSport = AccountMgr.GetUserSportById(userSportId); if (userSport == null) { SaLogger.Warn(fn + " Failed to retrieve User Sport for Id: '" + model.UserSportId + "'"); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"])); } // Retrieve sport. SaxSport sport = ReferenceMgr.GetSportById(userSport.SportId); if (sport == null) { SaLogger.Warn(fn + " Failed to retrieve Sport for Id: '" + userSport.SportId + "'"); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"])); } // Construct response. PopulateProfileSportResponseData(model, userSport, sport, responseData.Sport); responseData.Success = true; return Json(responseData); } //------------------------------------------------------------------- // Store ProfileSport ajax request. //------------------------------------------------------------------- [HttpPost] [Route("Account/Ajax/StoreProfileSport")] public IActionResult Ajax_StoreProfileSport(Model_Account model) { String fn = GetType().Name + ".Ajax_StoreProfileSport"; String messageTitle = Localiser["account.caption.profile.sport"]; AjaxResponse_ProfileSport responseData = new AjaxResponse_ProfileSport(); // Validate session and referrer. if (!ValidReferer) return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); // Validate item properties. model.ValidateProfileSportData(responseData); if (responseData.HasControlErrors()) return Json(responseData); // Validate Profile Sport Id against 'Exists' flag. SysId userSportId = model.UserSportId.ToSysId(); bool profileSportExists = StringUtil.ToBool(model.ProfileSportExists); if (profileSportExists && !SysId.IsValid(userSportId)) { SaLogger.Warn(fn + " Id not specified for existing Profile Sport."); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); } if (!profileSportExists && SysId.IsValid(userSportId)) { SaLogger.Warn(fn + " Id specified for new Profile Sport: '" + model.UserSportId + "'"); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); } // Retrieve the sport. SysId sportId = model.ProfileSportId.ToSysId(); SaxSport sport = ReferenceMgr.GetSportById(sportId); if (sport == null) { SaLogger.Warn(fn + " Failed to retrieve Sport for Id: " + sportId); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); } // Retrieve existing item. SaxUserSport userSport = AccountMgr.GetUserSportById(userSportId); if (userSport == null && SysId.IsValid(userSportId)) { SaLogger.Warn(fn + " Failed to retrieve User Sport for Id: '" + model.UserSportId + "'"); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"])); } // Validate user sport properties. if (userSport != null) { if (!userSport.SportId.Equals(sportId)) { SaLogger.Warn(fn + " Inconsistent Sport Id specified for User Sport. Expected: " + userSport.SportId + ". Found: " + sportId); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); } } // Create new item if required. if (userSport == null) userSport = AccountMgr.CreateUserSport(SessionData.User.UserAccountId, sportId); // Populate item properties. // Store item. if (!SysId.IsValid(userSport.Id)) { if (!AccountMgr.InsertUserSport(userSport, DbUpdateInfo)) { SaLogger.Warn(fn + " Failed to insert user sport: " + AccountMgr.ErrorStateMessage); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + AccountMgr.ErrorStateMessage)); } } else { if (!AccountMgr.UpdateUserSport(userSport, DbUpdateInfo)) { SaLogger.Warn(fn + " Failed to update user sport [Id:" + SysId.ToString(userSport.Id) + "]: " + AccountMgr.ErrorStateMessage); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + AccountMgr.ErrorStateMessage)); } } // Construct response. PopulateProfileSportResponseData(model, userSport, sport, responseData.Sport); responseData.Success = true; return Json(responseData); } //------------------------------------------------------------------- } //======================================================================= }