Files
Saxonite/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs
T
2021-10-17 13:12:05 +01:00

313 lines
13 KiB
C#

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;
using Saxonite.Net.Standard.Base.App;
namespace Saxonite.Net.Core.Web.Online.Controllers
{
//=======================================================================
// Online Account Controller - Sports - Ajax actions.
//=======================================================================
partial class AccountController
{
//-------------------------------------------------------------------
// Data definitions.
private class ProfileSportResponseData_List : AjaxResponse_Data.ItemData_Base
{
public String SportId { get; set; }
public String SportName { get; set; }
public String SportSpecialityLabel { get; set; }
public String SportParticipation { get; set; }
public String SportOfficiating { get; set; }
}
private class ProfileSportResponseData_Item : ProfileSportResponseData_List
{
public String SportAbout { get; set; }
public String SportParticipationCode { get; set; }
public String SportOfficiatingCode { get; set; }
}
private void PopulateProfileSportResponseData(Model_Account model, SaxUserSport userSport, SaxSport sport, ProfileSportResponseData_Item data)
{
data.Id = SysId.ToString(userSport.Id);
data.SportId = model.GetEncryptedSportId(userSport.SportId);
data.SportName = sport.Name;
data.SportSpecialityLabel = model.GetSportSpecialityLabel(userSport.SportId);
data.SportAbout = userSport.About;
data.SportParticipationCode = SportParticipationCodes.GetCodeForType(userSport.Participation);
data.SportParticipation = Localiser.GetSportParticipationCaption(userSport.Participation);
data.SportOfficiatingCode = SportOfficiatingCodes.GetCodeForType(userSport.Officiating);
data.SportOfficiating = Localiser.GetSportOfficiatingCaption(userSport.Officiating);
data.CreatedOnFmt = DateUtil.Format(userSport.CreateStamp.On, "d-MMM-yyyy");
data.StatusCode = userSport.StatusCode;
data.StatusDesc = userSport.StatusDesc;
}
//-------------------------------------------------------------------
// Account - Get Profile Sports.
//-------------------------------------------------------------------
private class AjaxResponse_ProfileSportsData : AjaxResponse_Data
{
// Construction.
public AjaxResponse_ProfileSportsData(SaxModel_Online model) : base(model) { }
// Sport list.
public List<ProfileSportResponseData_List> Sports { get; } = new List<ProfileSportResponseData_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(model);
String messageTitle = Localiser["account.caption.profile.sports"];
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Item filter.
SaxUserSport.Params prmUserSport = new SaxUserSport.Params();
prmUserSport.UserAccountIdsIncluded.Add(SessionData.User.UserAccountId);
prmUserSport.StatusCat = SaxUserSport.StatusCat.NotDeleted;
model.Paging.ItemTotal = (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 colParticipation = AccountMgr.GetUserSportColumnDfn(SaxUserSport.Column.SportParticipation);
ColumnDfn colOfficiating = AccountMgr.GetUserSportColumnDfn(SaxUserSport.Column.SportOfficiating);
ColumnDfn colStatus = AccountMgr.GetUserSportColumnDfn(SaxUserSport.Column.Status);
List<ColumnDfn> columns = new List<ColumnDfn>()
{
colId,
colSportId, colSportName,
colParticipation, colOfficiating,
colStatus,
};
// Sort columns.
prmUserSport.SortColumns.Add(colSportName);
// Query items.
using (DbResultSet resultSet = AccountMgr.ExecuteUserSportQuery(columns, prmUserSport))
{
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
{
NamedValue.Map values = resultSet.GetRecordValues();
SysId sportId = new SysId(values.GetLong(colSportId.DataName));
ProfileSportResponseData_List userSportData = new ProfileSportResponseData_List()
{
Id = values.GetLong(colId.DataName).ToString(),
SportId = model.GetEncryptedSportId(sportId),
SportName = values.GetString(colSportName.DataName),
SportSpecialityLabel = model.GetSportSpecialityLabel(sportId),
SportParticipation = Localiser.GetSportParticipationCaption((Sax.SportParticipation)values.GetLong(colParticipation.DataName)),
SportOfficiating = Localiser.GetSportOfficiatingCaption((Sax.SportOfficiating)values.GetLong(colOfficiating.DataName)),
StatusCode = values.GetString(colStatus.DataName),
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
};
responseData.Sports.Add(userSportData);
}
}
if (model.Paging.IsPaged)
model.Paging.ItemCount = (ushort)responseData.Sports.Count;
// Complete response.
responseData.SetPaging(model);
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
// Get Profile Sport ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_ProfileSport : AjaxResponse_Data
{
// Construction.
public AjaxResponse_ProfileSport(SaxModel_Online model) : base(model) { }
// Sport details.
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(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Identify item.
SysId userSportId = model.ExtractSysId(model.UserSportId);
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(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Validate item properties.
model.ValidateProfileSportData(responseData);
if (responseData.HasControlErrors())
return Json(responseData);
// Validate Profile Sport Id against 'Exists' flag.
SysId userSportId = model.ExtractSysId(model.UserSportId);
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.ExtractSysId(model.ProfileSportId);
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"]));
}
}
// If sport doesn't exist for the user, it may have been previously deleted.
if (userSport == null)
{
SaxUserSport.Params prmUserSport = new SaxUserSport.Params();
prmUserSport.UserAccountIdsIncluded.Add(SessionData.User.UserAccountId);
prmUserSport.SportIdsIncluded.Add(sportId);
prmUserSport.StatusCat = SaxUserSport.StatusCat.Any;
userSport = AccountMgr.GetUserSport(prmUserSport);
if (userSport != null)
{
if (userSport.Status == SaStatus.Deleted)
{
SaLogger.Info(fn + " Resurrecting User Sport with status: " + userSport.StatusDesc + ". Id: " + SysId.ToString(userSport.Id));
userSport.Status = SaxUserSport.DefaultStatus;
}
else
{
responseData.SetControlError(nameof(model.ProfileSportId), Localiser["msg.validation.duplicate.value"]);
return Json(responseData);
}
}
else
userSport = AccountMgr.CreateUserSport(SessionData.User.UserAccountId, sportId);
}
// Populate item properties.
if (model.ProfileSportAbout != null)
userSport.About = model.ProfileSportAbout;
if (model.ProfileSportParticipationCode != null)
userSport.Participation = model.ProfileSportParticipation;
if (model.ProfileSportOfficiatingCode != null)
userSport.Officiating = model.ProfileSportOfficiating;
// 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"]));
}
}
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"]));
}
}
// Refresh list of profile sports for Activity Index.
RefreshSessionProfileSports();
// Construct response.
PopulateProfileSportResponseData(model, userSport, sport, responseData.Sport);
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
}
//=======================================================================
}