|
|
using System;
|
|
|
using System.Linq;
|
|
|
using System.Security.Claims;
|
|
|
using System.Threading.Tasks;
|
|
|
using Microsoft.AspNet.Authorization;
|
|
|
using Microsoft.AspNet.Identity;
|
|
|
using Microsoft.AspNet.Mvc;
|
|
|
using Microsoft.Data.Entity;
|
|
|
using Microsoft.Extensions.Localization;
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
using Microsoft.Extensions.OptionsModel;
|
|
|
|
|
|
namespace Yavsc.Controllers
|
|
|
{
|
|
|
using Yavsc.Helpers;
|
|
|
using Yavsc.Models;
|
|
|
using Yavsc.Models.Google.Messaging;
|
|
|
using Yavsc.Models.Relationship;
|
|
|
using Yavsc.Services;
|
|
|
using Newtonsoft.Json;
|
|
|
using Microsoft.AspNet.Http;
|
|
|
using Yavsc.Extensions;
|
|
|
using Yavsc.Models.Haircut;
|
|
|
using System.Globalization;
|
|
|
|
|
|
public class HairCutCommandController : CommandController
|
|
|
{
|
|
|
public HairCutCommandController(ApplicationDbContext context,
|
|
|
IOptions<GoogleAuthSettings> googleSettings,
|
|
|
IGoogleCloudMessageSender GCMSender,
|
|
|
UserManager<ApplicationUser> userManager,
|
|
|
IStringLocalizer<Yavsc.Resources.YavscLocalisation> localizer,
|
|
|
IEmailSender emailSender,
|
|
|
IOptions<SmtpSettings> smtpSettings,
|
|
|
IOptions<SiteSettings> siteSettings,
|
|
|
ILoggerFactory loggerFactory) : base(context,googleSettings,GCMSender,userManager,
|
|
|
localizer,emailSender,smtpSettings,siteSettings,loggerFactory)
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
[HttpPost, Authorize]
|
|
|
[ValidateAntiForgeryToken]
|
|
|
public async Task<IActionResult> CreateHairCutQuery(HairCutQuery model)
|
|
|
{
|
|
|
var uid = User.GetUserId();
|
|
|
var prid = model.PerformerId;
|
|
|
if (string.IsNullOrWhiteSpace(uid)
|
|
|
|| string.IsNullOrWhiteSpace(prid))
|
|
|
throw new InvalidOperationException(
|
|
|
"This method needs a PerformerId"
|
|
|
);
|
|
|
var pro = _context.Performers.Include(
|
|
|
u => u.Performer
|
|
|
).Include(u => u.Performer.Devices)
|
|
|
.FirstOrDefault(
|
|
|
x => x.PerformerId == model.PerformerId
|
|
|
);
|
|
|
model.PerformerProfile = pro;
|
|
|
// FIXME Why!!
|
|
|
// ModelState.ClearValidationState("PerformerProfile.Avatar");
|
|
|
// ModelState.ClearValidationState("Client.Avatar");
|
|
|
// ModelState.ClearValidationState("ClientId");
|
|
|
|
|
|
if (ModelState.IsValid)
|
|
|
{
|
|
|
if (model.Location!=null) {
|
|
|
var existingLocation = await _context.Locations.FirstOrDefaultAsync( x=>x.Address == model.Location.Address
|
|
|
&& x.Longitude == model.Location.Longitude && x.Latitude == model.Location.Latitude );
|
|
|
|
|
|
if (existingLocation!=null) {
|
|
|
model.Location=existingLocation;
|
|
|
}
|
|
|
else _context.Attach<Location>(model.Location);
|
|
|
}
|
|
|
var existingPrestation = await _context.HairPrestation.FirstOrDefaultAsync( x=> model.PrestationId == x.Id );
|
|
|
|
|
|
if (existingPrestation!=null) {
|
|
|
model.Prestation = existingPrestation;
|
|
|
}
|
|
|
else _context.Attach<HairPrestation>(model.Prestation);
|
|
|
|
|
|
_context.HairCutQueries.Add(model);
|
|
|
await _context.SaveChangesAsync(User.GetUserId());
|
|
|
var brusherProfile = await _context.BrusherProfile.SingleAsync(p=>p.UserId == pro.PerformerId);
|
|
|
var yaev = model.CreateEvent(_localizer);
|
|
|
MessageWithPayloadResponse grep = null;
|
|
|
|
|
|
if (pro.AcceptPublicContact)
|
|
|
{
|
|
|
if (pro.AcceptNotifications) {
|
|
|
if (pro.Performer.Devices.Count > 0) {
|
|
|
var regids = model.PerformerProfile.Performer
|
|
|
.Devices.Select(d => d.GCMRegistrationId);
|
|
|
grep = await _GCMSender.NotifyHairCutQueryAsync(_googleSettings,regids,yaev);
|
|
|
}
|
|
|
// TODO setup a profile choice to allow notifications
|
|
|
// both on mailbox and mobile
|
|
|
// if (grep==null || grep.success<=0 || grep.failure>0)
|
|
|
ViewBag.GooglePayload=grep;
|
|
|
if (grep!=null)
|
|
|
_logger.LogWarning($"Performer: {model.PerformerProfile.Performer.UserName} success: {grep.success} failure: {grep.failure}");
|
|
|
}
|
|
|
|
|
|
await _emailSender.SendEmailAsync(
|
|
|
_siteSettings, _smtpSettings,
|
|
|
model.PerformerProfile.Performer.Email,
|
|
|
yaev.Topic+" "+yaev.Sender,
|
|
|
$"{yaev.Message}\r\n-- \r\n{yaev.Previsional}\r\n{yaev.EventDate}\r\n"
|
|
|
);
|
|
|
}
|
|
|
else {
|
|
|
// TODO if (AcceptProContact) try & find a bookmaker to send him this query
|
|
|
}
|
|
|
ViewBag.Activity = _context.Activities.FirstOrDefault(a=>a.Code == model.ActivityCode);
|
|
|
ViewBag.GoogleSettings = _googleSettings;
|
|
|
var addition = model.Prestation.Addition(brusherProfile);
|
|
|
ViewBag.Addition = addition.ToString("C",CultureInfo.CurrentUICulture);
|
|
|
return View("CommandConfirmation",model);
|
|
|
}
|
|
|
ViewBag.Activity = _context.Activities.FirstOrDefault(a=>a.Code == model.ActivityCode);
|
|
|
ViewBag.GoogleSettings = _googleSettings;
|
|
|
SetViewData(model.ActivityCode,model.PerformerId,model.Prestation);
|
|
|
return View("HairCut",model);
|
|
|
}
|
|
|
|
|
|
public async Task<ActionResult> HairCut(string performerId, string activityCode)
|
|
|
{
|
|
|
HairPrestation pPrestation=null;
|
|
|
var prestaJson = HttpContext.Session.GetString("HairCutPresta") ;
|
|
|
if (prestaJson!=null) {
|
|
|
pPrestation = JsonConvert.DeserializeObject<HairPrestation>(prestaJson);
|
|
|
}
|
|
|
else pPrestation = new HairPrestation {};
|
|
|
|
|
|
var uid = User.GetUserId();
|
|
|
var user = await _userManager.FindByIdAsync(uid);
|
|
|
|
|
|
SetViewData(activityCode,performerId,pPrestation);
|
|
|
|
|
|
var perfer = _context.Performers.Include(
|
|
|
p=>p.Performer
|
|
|
).Single(p=>p.PerformerId == performerId);
|
|
|
var result = new HairCutQuery {
|
|
|
PerformerProfile = perfer,
|
|
|
PerformerId = perfer.PerformerId,
|
|
|
ClientId = uid,
|
|
|
Prestation = pPrestation,
|
|
|
Client = user
|
|
|
};
|
|
|
|
|
|
return View(result);
|
|
|
}
|
|
|
private void SetViewData (string activityCode, string performerId, HairPrestation pPrestation )
|
|
|
{
|
|
|
ViewBag.HairTaints = _context.HairTaint.Include(t=>t.Color);
|
|
|
ViewBag.HairTechnos = EnumExtensions.GetSelectList(typeof(HairTechnos),_localizer);
|
|
|
ViewBag.HairLength = EnumExtensions.GetSelectList(typeof(HairLength),_localizer);
|
|
|
ViewBag.Activity = _context.Activities.First(a => a.Code == activityCode);
|
|
|
ViewBag.Gender = EnumExtensions.GetSelectList(typeof(HairCutGenders),_localizer);
|
|
|
ViewBag.HairDressings = EnumExtensions.GetSelectList(typeof(HairDressings),_localizer);
|
|
|
ViewBag.ColorsClass = ( pPrestation.Tech == HairTechnos.Color
|
|
|
|| pPrestation.Tech == HairTechnos.Mech ) ? "":"hidden";
|
|
|
ViewBag.TechClass = ( pPrestation.Gender == HairCutGenders.Women ) ? "":"hidden";
|
|
|
ViewData["PerfPrefs"] = _context.BrusherProfile.Single(p=>p.UserId == performerId);
|
|
|
}
|
|
|
|
|
|
[HttpPost, Authorize]
|
|
|
[ValidateAntiForgeryToken]
|
|
|
public async Task<IActionResult> CreateHairMultiCutQuery(HairMultiCutQuery command)
|
|
|
{
|
|
|
|
|
|
var uid = User.GetUserId();
|
|
|
var prid = command.PerformerId;
|
|
|
if (string.IsNullOrWhiteSpace(uid)
|
|
|
|| string.IsNullOrWhiteSpace(prid))
|
|
|
throw new InvalidOperationException(
|
|
|
"This method needs a PerformerId"
|
|
|
);
|
|
|
var pro = _context.Performers.Include(
|
|
|
u => u.Performer
|
|
|
).Include(u => u.Performer.Devices)
|
|
|
.FirstOrDefault(
|
|
|
x => x.PerformerId == command.PerformerId
|
|
|
);
|
|
|
var user = await _userManager.FindByIdAsync(uid);
|
|
|
command.Client = user;
|
|
|
command.ClientId = uid;
|
|
|
command.PerformerProfile = pro;
|
|
|
// FIXME Why!!
|
|
|
// ModelState.ClearValidationState("PerformerProfile.Avatar");
|
|
|
// ModelState.ClearValidationState("Client.Avatar");
|
|
|
// ModelState.ClearValidationState("ClientId");
|
|
|
ModelState.MarkFieldSkipped("ClientId");
|
|
|
|
|
|
if (ModelState.IsValid)
|
|
|
{
|
|
|
var existingLocation = _context.Locations.FirstOrDefault( x=>x.Address == command.Location.Address
|
|
|
&& x.Longitude == command.Location.Longitude && x.Latitude == command.Location.Latitude );
|
|
|
|
|
|
if (existingLocation!=null) {
|
|
|
command.Location=existingLocation;
|
|
|
}
|
|
|
else _context.Attach<Location>(command.Location);
|
|
|
|
|
|
_context.HairMultiCutQueries.Add(command, GraphBehavior.IncludeDependents);
|
|
|
_context.SaveChanges(User.GetUserId());
|
|
|
|
|
|
var yaev = command.CreateEvent(_localizer);
|
|
|
MessageWithPayloadResponse grep = null;
|
|
|
|
|
|
if (pro.AcceptNotifications
|
|
|
&& pro.AcceptPublicContact)
|
|
|
{
|
|
|
if (pro.Performer.Devices.Count > 0) {
|
|
|
var regids = command.PerformerProfile.Performer
|
|
|
.Devices.Select(d => d.GCMRegistrationId);
|
|
|
grep = await _GCMSender.NotifyHairCutQueryAsync(_googleSettings,regids,yaev);
|
|
|
}
|
|
|
// TODO setup a profile choice to allow notifications
|
|
|
// both on mailbox and mobile
|
|
|
// if (grep==null || grep.success<=0 || grep.failure>0)
|
|
|
ViewBag.GooglePayload=grep;
|
|
|
if (grep!=null)
|
|
|
_logger.LogWarning($"Performer: {command.PerformerProfile.Performer.UserName} success: {grep.success} failure: {grep.failure}");
|
|
|
|
|
|
await _emailSender.SendEmailAsync(
|
|
|
_siteSettings, _smtpSettings,
|
|
|
command.PerformerProfile.Performer.Email,
|
|
|
yaev.Topic+" "+yaev.Sender,
|
|
|
$"{yaev.Message}\r\n-- \r\n{yaev.Previsional}\r\n{yaev.EventDate}\r\n"
|
|
|
);
|
|
|
}
|
|
|
ViewBag.Activity = _context.Activities.FirstOrDefault(a=>a.Code == command.ActivityCode);
|
|
|
ViewBag.GoogleSettings = _googleSettings;
|
|
|
return View("CommandConfirmation",command);
|
|
|
}
|
|
|
ViewBag.Activity = _context.Activities.FirstOrDefault(a=>a.Code == command.ActivityCode);
|
|
|
ViewBag.GoogleSettings = _googleSettings;
|
|
|
return View("HairCut",command);
|
|
|
}
|
|
|
}
|
|
|
}
|