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 Saxonite.Net.Standard.Base.App; using Microsoft.AspNetCore.Http; using Sarand.Net.Standard.Base.Helpers; using System.IO; using System.Drawing; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; namespace Saxonite.Net.Core.Web.Online.Controllers { //======================================================================= // Online Account Controller - User Sport Experience - Ajax actions. //======================================================================= partial class AccountController { //------------------------------------------------------------------- // Common response data. private class SportExperienceResponseListData : AjaxResponse_Data.ItemData_Base { public String UserSportId { get; set; } public String Period { get; set; } public String PeriodFrom { get; set; } public String PeriodTo { get; set; } public String OrganisationName { get; set; } public String Summary { get; set; } public String Team { get; set; } public String League { get; set; } public String Speciality { get; set; } // Regions. public String RegionCaptionNation { get; set; } public String RegionCaptionProvince { get; set; } public string RegionRepresentation { get; set; } } private class SportExperienceResponseItemData : SportExperienceResponseListData { public String PeriodFrom_YMD { get; set; } public String PeriodTo_YMD { get; set; } public String OrganisationId { get; set; } public String Awards { get; set; } public String RegionIdNation { get; set; } public String RegionIdProvince { get; set; } } private void PopulateSportExperienceResponseListData(Model_UserSportExperience model, SportExperienceResponseListData data, SaxUserSport userSport, SaxUserSportExperience userSportExperience) { data.Id = model.EncryptId(userSportExperience.Id); data.UserSportId = model.EncryptId(userSportExperience.UserSportId); data.PeriodFrom = model.FormatDateForForm(userSportExperience.PeriodFrom); data.PeriodTo = model.FormatDateForForm(userSportExperience.PeriodTo); data.OrganisationName = userSportExperience.OrganisationName; data.Summary = userSportExperience.Summary; data.Team = userSportExperience.Team; data.League = userSportExperience.League; data.Speciality = userSportExperience.Speciality; // Regions. data.RegionCaptionNation = Localiser.GetRegionName(Internals.GetRegion(userSportExperience.RegionIdNation)); data.RegionCaptionProvince = Localiser.GetRegionName(Internals.GetRegion(userSportExperience.RegionIdProvince)); List locations = new List() { data.RegionCaptionProvince, data.RegionCaptionNation }; data.RegionRepresentation = locations.Concat(", ", "", "", true, true); } private void PopulateSportExperienceResponseItemData(Model_UserSportExperience model, SportExperienceResponseItemData data, SaxUserSport userSport, SaxUserSportExperience userSportExperience) { PopulateSportExperienceResponseListData(model, data, userSport, userSportExperience); data.PeriodFrom_YMD = DateUtil.FormatDateForJavascript(userSportExperience.PeriodFrom); data.PeriodTo_YMD = DateUtil.FormatDateForJavascript(userSportExperience.PeriodTo); data.Period = data.PeriodFrom + " - " + data.PeriodTo; data.OrganisationId = model.EncryptId(userSportExperience.OrganisationId); data.Awards = userSportExperience.Awards; // Regions. data.RegionIdNation = model.GetEncryptedRegionId(userSportExperience.RegionIdNation); data.RegionIdProvince = model.GetEncryptedRegionId(userSportExperience.RegionIdProvince); } //------------------------------------------------------------------- // Utilites. //------------------------------------------------------------------- // User Sport - Get Experience list. //------------------------------------------------------------------- private class AjaxResponse_UserSportExperienceList : AjaxResponse_Data { // Construction. public AjaxResponse_UserSportExperienceList(SaxModel_Online model) : base(model) { } // Contact details. public List Experiences { get; } = new List(); // Sport details. public class SportData { public class SpecialityData { public bool? NotRelevant { get; set; } = null; public String Label { get; set; } } public SpecialityData Speciality { get; } = new SpecialityData(); } public SportData Sport { get; } = new SportData(); } // Ajax request. [HttpPost] [Route("UserSport/Ajax/GetExperienceList")] public IActionResult GetUserSportExperienceList(Model_UserSportExperience model) { String fn = GetType().Name + ".GetUserSportExperienceList"; AjaxResponse_UserSportExperienceList responseData = new AjaxResponse_UserSportExperienceList(model); String messageTitle = Localiser["account.caption.profile.sports"]; // 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 disposableItems = new DisposableCollection()) { // Validate User Sport Id against user account. SysId userSportId = model.ExtractSysId(model.UserSportId); SaxUserSport userSport = AccountMgr.GetUserSportById(userSportId); disposableItems.Add(userSport); if (userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId)) return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); // Sport details. if (model.SportSpecialityNotRelevant(userSport.SportId)) responseData.Sport.Speciality.NotRelevant = true; responseData.Sport.Speciality.Label = model.GetSportSpecialityLabel(userSport.SportId); // Columns. ColumnDfn colId = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Id); ColumnDfn colUserSportId = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.UserSportId); ColumnDfn colPeriodFrom = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.PeriodFrom); ColumnDfn colPeriodTo = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.PeriodTo); ColumnDfn colOrganisationId = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.OrganisationId); ColumnDfn colOrganisationName = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Organisation_Name); ColumnDfn colSummary = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Summary); ColumnDfn colTeam = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Team); ColumnDfn colLeague = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.League); ColumnDfn colSpeciality = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Speciality); ColumnDfn colNotes = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Notes); List columnsToQuery = new List() { colId, colUserSportId, colPeriodFrom, colPeriodTo, colOrganisationId, colOrganisationName, colSummary, colTeam, colLeague, colSpeciality, colNotes }; // Filter. SaxUserSportExperience.Params prmUserSportExperience = new SaxUserSportExperience.Params(); prmUserSportExperience.UserSportIdsIncluded.Add(model.ExtractSysId(model.UserSportId)); prmUserSportExperience.StatusCat = SaxUserSportExperience.StatusCat.NotDeleted; // Sort columns. colPeriodFrom.SortAscending = false; prmUserSportExperience.SortColumns.Add(colPeriodFrom); // Query items. using (DbResultSet resultSet = AccountMgr.ExecuteUserSportExperienceQuery(columnsToQuery, prmUserSportExperience)) { while (resultSet != null && resultSet.HasRows && resultSet.NextRecord()) { NamedValue.Map values = resultSet.GetRecordValues(); SportExperienceResponseListData itemData = new SportExperienceResponseListData() { Id = model.EncryptId(new SysId(values.GetLong(colId.DataName))), UserSportId = model.EncryptId(new SysId(values.GetLong(colUserSportId.DataName))), PeriodFrom = model.FormatDateForForm(values.GetDate(colPeriodFrom.DataName)), PeriodTo = model.FormatDateForForm(values.GetDate(colPeriodTo.DataName)), OrganisationName = AccountMgr.GetUserSportExperienceDataValue(colOrganisationName, values).AsString(), Summary = values.GetString(colSummary.DataName), Team = values.GetString(colTeam.DataName), League = values.GetString(colLeague.DataName), Speciality = values.GetString(colSpeciality.DataName), }; itemData.Period = itemData.PeriodFrom + " - " + itemData.PeriodTo; responseData.Experiences.Add(itemData); } } } // Complete response. responseData.Success = true; return Json(responseData); } //------------------------------------------------------------------- // User Sport - Get Experience. //------------------------------------------------------------------- private class AjaxResponse_UserSportExperienceData : AjaxResponse_Data { // Construction. public AjaxResponse_UserSportExperienceData(SaxModel_Online model) : base(model) { } // Contact details. public SportExperienceResponseItemData Experience { get; set; } } // Ajax request. [HttpPost] [Route("UserSport/Ajax/GetExperience")] public IActionResult GetUserSportExperience(Model_UserSportExperience model) { String fn = GetType().Name + ".GetUserSportExperience"; AjaxResponse_UserSportExperienceData responseData = new AjaxResponse_UserSportExperienceData(model); String messageTitle = Localiser["account.caption.profile.sports"]; // 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 disposableItems = new DisposableCollection()) { // Validate User Sport Experience Id against user account. SysId userSportExperienceId = model.ExtractSysId(model.UserSportExperienceId); SaxUserSportExperience userSportExperience = AccountMgr.GetUserSportExperienceById(userSportExperienceId); disposableItems.Add(userSportExperience); SaxUserSport userSport = AccountMgr.GetUserSportById(userSportExperience?.UserSportId ?? null); disposableItems.Add(userSport); if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId)) return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); // Populate data to response. responseData.Experience = new SportExperienceResponseItemData(); PopulateSportExperienceResponseItemData(model, responseData.Experience, userSport, userSportExperience); } // Complete response. responseData.Success = true; return Json(responseData); } //------------------------------------------------------------------- // Account - Store User Sport Experience. //------------------------------------------------------------------- private class AjaxResponse_StoreUserSportExperience : AjaxResponse_Data { // Construction. public AjaxResponse_StoreUserSportExperience(SaxModel_Online model) : base(model) { } // Contact details. public SportExperienceResponseItemData Experience { get; set; } } // Ajax request. [HttpPost] [Route("UserSport/Ajax/StoreExperience")] public IActionResult StoreUserSportExperience(Model_UserSportExperience model) { String fn = GetType().Name + ".StoreUserSportExperience"; AjaxResponse_StoreUserSportExperience responseData = new AjaxResponse_StoreUserSportExperience(model); String messageTitle = Localiser["account.caption.profile.sports"]; // 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 disposableItems = new DisposableCollection()) { // Validate data. model.ValidateProfileSportData(responseData); if (responseData.HasControlErrors()) return Json(responseData); // Validate User Sport Experience Id. SysId userSportExperienceId = model.ExtractSysId(model.UserSportExperienceId); if (SysId.IsValid(userSportExperienceId) != StringUtil.ToBool(model.UserSportExperienceExists)) return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); // Retrieve User Sport Experience. SaxUserSportExperience userSportExperience = null; SaxUserSport userSport = null; if (SysId.IsValid(userSportExperienceId)) { userSportExperience = AccountMgr.GetUserSportExperienceById(userSportExperienceId); disposableItems.Add(userSportExperience); userSport = AccountMgr.GetUserSportById(userSportExperience?.UserSportId ?? null); disposableItems.Add(userSport); if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId)) return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); } else { // Creating new User Sport Experience. // Retrieve User Sport and validate. SysId userSportId = model.ExtractSysId(model.UserSportId); userSport = AccountMgr.GetUserSportById(userSportId); disposableItems.Add(userSport); if (userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId)) return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); // Create User Sport Experience. userSportExperience = AccountMgr.CreateUserSportExperience(userSport.Id); disposableItems.Add(userSportExperience); } // Populate properties. userSportExperience.Changed = false; if (model.ExperiencePeriodFrom != null) userSportExperience.PeriodFrom = model.ParseDateFromForm(model.ExperiencePeriodFrom); if (model.ExperiencePeriodTo != null) userSportExperience.PeriodTo = model.ParseDateFromForm(model.ExperiencePeriodTo); if (model.ExperienceOrganisationId != null) userSportExperience.OrganisationId = model.ExtractSysId(model.ExperienceOrganisationId); if (model.ExperienceOrganisationName != null) userSportExperience.OrganisationName = model.ExperienceOrganisationName; if (model.ExperienceSummary != null) userSportExperience.Summary = model.ExperienceSummary; if (model.ExperienceTeam != null) userSportExperience.Team = model.ExperienceTeam; if (model.ExperienceLeague != null) userSportExperience.League = model.ExperienceLeague; if (model.ExperienceSpeciality != null) userSportExperience.Speciality = model.ExperienceSpeciality; if (model.ExperienceAwards != null) userSportExperience.Awards = model.ExperienceAwards; // Regions. if (model.ExperienceRegionIdNation != null) userSportExperience.RegionIdNation = model.ExtractSysId(model.ExperienceRegionIdNation); if (model.ExperienceRegionIdProvince != null) userSportExperience.RegionIdProvince = model.ExtractSysId(model.ExperienceRegionIdProvince); // Store Experience. if (!SysId.IsValid(userSportExperience.Id)) { if (AccountMgr.InsertUserSportExperience(userSportExperience, DbUpdateInfo)) { responseData.SetNotification(messageTitle, Localiser["msg.item.created"]); } else { SaLogger.Warn(fn + " Failed to insert user sport experience: " + AccountMgr.ErrorStateMessage); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"])); } } else { if (AccountMgr.UpdateUserSportExperience(userSportExperience, DbUpdateInfo)) { responseData.SetNotification(messageTitle, Localiser["msg.item.updated"]); } else { SaLogger.Warn(fn + " Failed to update user sport experience: " + AccountMgr.ErrorStateMessage); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"])); } } // Populate data to response. responseData.Experience = new SportExperienceResponseItemData(); PopulateSportExperienceResponseItemData(model, responseData.Experience, userSport, userSportExperience); } // Complete response. responseData.Success = true; return Json(responseData); } //------------------------------------------------------------------- } //======================================================================= }