304 lines
12 KiB
C#
304 lines
12 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
|
|
{
|
|
public long Id { get; set; }
|
|
public long SportId { get; set; }
|
|
public String SportName { get; set; }
|
|
public String SportParticipation { get; set; }
|
|
public String SportOfficiating { get; set; }
|
|
public String StatusCode { get; set; }
|
|
public String StatusDesc { get; set; }
|
|
}
|
|
private class ProfileSportResponseData_Item : ProfileSportResponseData_List
|
|
{
|
|
public String SportParticipationCode { get; set; }
|
|
public String SportOfficiatingCode { get; set; }
|
|
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.SportParticipationCode = SportParticipationCodes.GetCodeForType(userSport.Participation);
|
|
data.SportParticipation = Localiser.GetSportParticipationTypeCaption(userSport.Participation);
|
|
data.SportOfficiatingCode = SportOfficiatingCodes.GetCodeForType(userSport.Officiating);
|
|
data.SportOfficiating = Localiser.GetSportOfficiatingTypeCaption(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);
|
|
|
|
// 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();
|
|
ProfileSportResponseData_List userSportData = new ProfileSportResponseData_List()
|
|
{
|
|
Id = values.GetLong(colId.DataName),
|
|
SportId = values.GetLong(colSportId.DataName),
|
|
SportName = values.GetString(colSportName.DataName),
|
|
SportParticipation = Localiser.GetSportParticipationTypeCaption((Sax.SportParticipation)values.GetLong(colParticipation.DataName)),
|
|
SportOfficiating = Localiser.GetSportOfficiatingTypeCaption((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);
|
|
|
|
// 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(model);
|
|
|
|
// 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"]));
|
|
}
|
|
}
|
|
|
|
// 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)
|
|
{
|
|
SaLogger.Info(fn + " Resurrecting User Sport with status: " + userSport.StatusDesc + ". Id: " + SysId.ToString(userSport.Id));
|
|
userSport.Status = SaxUserSport.DefaultStatus;
|
|
}
|
|
else
|
|
userSport = AccountMgr.CreateUserSport(SessionData.User.UserAccountId, sportId);
|
|
}
|
|
|
|
// Populate item properties.
|
|
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"] + "\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));
|
|
}
|
|
}
|
|
|
|
// Refresh list of profile sports for Activity Index.
|
|
RefreshSessionProfileSports();
|
|
|
|
// Construct response.
|
|
PopulateProfileSportResponseData(model, userSport, sport, responseData.Sport);
|
|
responseData.Success = true;
|
|
return Json(responseData);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|