コード例 #1
0
ファイル: MultiInviteWorkflow.cs プロジェクト: xplot/damascus
        private string InviteAttendees(IStepInput input)
        {
            var inviteAttendees = (InviteAttendeesInput)input;

            if (!this.Data.ContainsKey("invite_unique_id"))
            {
                return("<response>The invite with id " + inviteAttendees.InviteId + " doesnt exists, please create the invite first</response>");
            }

            if (!IsCallRepeated(inviteAttendees))
            {
                EnsureCallIsNotRepeated(inviteAttendees);
            }
            else
            {
                return("<response>Contacts notified already</response>");
            }

            var invite = InviteInput.FromDict(this.Data);

            foreach (var contact in inviteAttendees.Attendees)
            {
                InviteAttendee(invite, contact);
            }

            return("<response>Contacts notified succesfully</response>");
        }
コード例 #2
0
ファイル: InviteController.cs プロジェクト: xplot/damascus
        public string CreateInvite(InviteInput input)
        {
            if (input == null)
            {
                this.InternalServerError();
            }

            Trace.WriteLine("New invite is posted: " + input.InviteId);

            var previous_invite = DataSerializer.DeserializeData(
                WorkflowEngine.GetDataKey("multi_invite", input.InviteId)
                );

            if (previous_invite != null)
            {
                return("This invitation has been already sent");
            }

            var workflowContext = new WorkflowContext()
            {
                WorkflowStep = "create",
                DataKey      = input.InviteId,
                WorkflowType = "multi_invite",
                WorkflowId   = input.InviteId,
                Parameters   = input,
            };

            return(WorkflowEngine.Process(workflowContext));
        }
コード例 #3
0
ファイル: InviteWorkflow.cs プロジェクト: xplot/damascus
        private string InviteCallReply(IStepInput input)
        {
            if (Data["invite_unique_id"] != null)
            {
                var invite  = InviteInput.FromDict(this.Data);
                var contact = Contact.FromDict(this.Data);

                var message = "Hello {0}, You have been invited to {1} on {2}. Please press 1 if you want to come, 2 if not.";

                message = string.Format(
                    message,
                    contact.Name,
                    invite.Title,
                    invite.Start.ToString()
                    );

                XmlWriter.EnterNumber(
                    message,
                    new Dictionary <string, string>()
                {
                    { "step", "callreply" },
                    { "type", "invite" }
                }
                    );
            }
            else
            {
                XmlWriter.SayMessage("You have not been invited to this event, hang up");
            }

            return(XmlWriter.ToString());
        }
コード例 #4
0
ファイル: MultiInviteWorkflow.cs プロジェクト: xplot/damascus
        private string CancelInvite(IStepInput input)
        {
            var CancelAttendees = (InviteAttendeesInput)input;
            var invite          = InviteInput.FromDict(this.Data);

            if (!IsCallRepeated(invite))
            {
                EnsureCallIsNotRepeated(invite);
            }
            else
            {
                return("<response>Invite cancelled already</response>");
            }

            //This is how we ensure we dont contact the same people over the same message again
            //Think duplicate calls to the API
            if (DataSerializer.DeserializeData(WorkflowEngine.GetDataKey("multi_invite", CancelAttendees.UniqueCallId)) != null)
            {
                return("<response>Contacts have been notified already</response>");
            }
            else
            {
                DataSerializer.SerializeData(WorkflowEngine.GetDataKey("multi_invite", CancelAttendees.UniqueCallId), new DataStorage());
            }

            foreach (var contact in CancelAttendees.Attendees)
            {
                CancelAttendee(invite, contact);
            }

            return("<response>Event cancelled succesfully</response>");
        }
コード例 #5
0
ファイル: InviteWorkflow.cs プロジェクト: xplot/damascus
        private string InviteEmailReply(IStepInput input)
        {
            if (Data["invite_unique_id"] != null)
            {
                var invite  = InviteInput.FromDict(this.Data);
                var contact = Contact.FromDict(this.Data);

                Bus.Send(new CreateEmailMessage()
                {
                    Id           = Guid.NewGuid().ToString(),
                    Address      = contact.Email,
                    Sender       = "*****@*****.**",
                    Subject      = "Thanks for your Reply",
                    BodyTemplate = invite.ResponseEmailTemplate
                });

                Bus.Send(GetApiCall("email", "yes"));

                if (invite.ResponseEmailTemplate != null && !string.IsNullOrEmpty(invite.ResponseEmailTemplate.RedirectUrl))
                {
                    var templateManager = new MemoryTemplateManager();
                    return(templateManager.Fill(invite.ResponseEmailTemplate.RedirectUrl, this.Data));
                }
                else
                {
                    return("<Response>Thank you for your response</Response>");
                }
            }
            else
            {
                return("<Response>You havent been invited</Response>");
            }
        }
コード例 #6
0
ファイル: MultiInviteWorkflow.cs プロジェクト: xplot/damascus
        public Dictionary <string, string> GetTemplateContextData(InviteInput invite, Contact contact)
        {
            var template_data = invite.ToDict().Merge(contact.ToDict());

            template_data["ACKNOWLEDGE_LINK"] = TwillioConfig.EmailCallbackUrl + "?email=" + contact.Email +
                                                "&type=invite&step=emailin&contactId=" + contact.ContactId;
            template_data["fullname"] = (string.IsNullOrEmpty(contact.Name)) ? " there" : contact.Name;

            return(template_data);
        }
コード例 #7
0
ファイル: MultiInviteWorkflow.cs プロジェクト: xplot/damascus
 private void CancelAttendeeSms(InviteInput invite, Contact contact)
 {
     if (string.IsNullOrEmpty(contact.Phone))
     {
         return;
     }
     Bus.Send(new CreateSmsMessage()
     {
         PhoneNumber = contact.Phone,
         Message     = string.Format("The event {0} on {1}, have been cancelled by the host", invite.Title, invite.Start.ToString()),
         Id          = Guid.NewGuid().ToString()
     });
 }
コード例 #8
0
        public async Task <ActionResult <ChatRoomViewModel> > Invite([FromBody] InviteInput input)
        {
            ChatRoomDto room = await this.chatService.InviteToRoomAsync(input.UserId, input.ChatRoomId);

            if (room == null)
            {
                return(BadRequest());
            }

            ChatRoomViewModel model = mapper.Map <ChatRoomDto, ChatRoomViewModel>(room);

            return(model);
        }
コード例 #9
0
        public async Task <IActionResult> Post([FromBody] InviteInput inviteInput)
        {
            try
            {
                var invite = await _inviteAppService
                             .InsertAsync(inviteInput)
                             .ConfigureAwait(false);

                return(Created("", invite));
            }
            catch (ArgumentException arg)
            {
                return(BadRequest(arg.Message));
            }
        }
コード例 #10
0
ファイル: MultiInviteWorkflow.cs プロジェクト: xplot/damascus
        private void CancelAttendee(InviteInput invite, Contact contact)
        {
            var workflowData = new DataStorage(invite.ToDict().Merge(contact.ToDict()));

            CancelAttendeeEmail(invite, contact);
            DataSerializer.SerializeData(WorkflowEngine.GetDataKey("invite", contact.Email), workflowData);

            if (!string.IsNullOrEmpty(contact.Phone))
            {
                contact.Phone = contact.Phone.NormalizePhone();

                CancelAttendeeSms(invite, contact);
                CancelAttendeePhone(invite, contact);

                DataSerializer.SerializeData(WorkflowEngine.GetDataKey("invite", contact.Phone), workflowData);
            }
        }
コード例 #11
0
ファイル: MultiInviteWorkflow.cs プロジェクト: xplot/damascus
        private void CancelAttendeePhone(InviteInput invite, Contact contact)
        {
            if (string.IsNullOrEmpty(contact.Phone))
            {
                return;
            }

            Bus.Send(new CreateCallMessage()
            {
                PhoneNumber = contact.Phone,
                Id          = Guid.NewGuid().ToString(),
                Parameters  = new Dictionary <string, string>()
                {
                    { "step", "cancel" },
                    { "type", "invite" },
                }
            });
        }
コード例 #12
0
ファイル: MultiInviteWorkflow.cs プロジェクト: xplot/damascus
        public void ShareToSocialNetworks(InviteInput invite)
        {
            if (invite.SharingOptions == null)
            {
                return;
            }

            var reducedInvite = Mapper.Map <InviteInput, ReducedInviteInput>(invite);

            if (!string.IsNullOrEmpty(invite.SharingOptions.FacebookAccessToken))
            {
                Trace.WriteLine("Sharing to Facebook");
                Bus.Send(new FacebookEventMessage()
                {
                    Invite      = reducedInvite,
                    AccessToken = invite.SharingOptions.FacebookAccessToken
                });
            }
        }
コード例 #13
0
ファイル: MultiInviteWorkflow.cs プロジェクト: xplot/damascus
        private void CancelAttendeeEmail(InviteInput invite, Contact contact)
        {
            if (string.IsNullOrEmpty(contact.Email))
            {
                return;
            }

            var templateManager = new MemoryTemplateManager();
            var bodyData        = GetTemplateContextData(invite, contact);

            Bus.Send(new CreateEmailMessage()
            {
                Id           = Guid.NewGuid().ToString(),
                Address      = contact.Email,
                Sender       = "*****@*****.**",
                Subject      = templateManager.Fill(invite.CancelEmailTemplate.Subject, bodyData),
                BodyTemplate = invite.CancelEmailTemplate,
                BodyData     = bodyData,
            });
        }
コード例 #14
0
ファイル: MultiInviteWorkflow.cs プロジェクト: xplot/damascus
        private void InviteAttendeeSms(InviteInput invite, Contact contact)
        {
            if (string.IsNullOrEmpty(contact.Phone))
            {
                return;
            }

            var date = invite.Start.ToString();

            if (invite.End != null)
            {
                date += "to " + invite.End.ToString();
            }

            Bus.Send(new CreateSmsMessage()
            {
                PhoneNumber = contact.Phone,
                Message     = string.Format("You are hereby invited to {0} event on {1}, want to go? YES/NO", invite.Title, date),
                Id          = Guid.NewGuid().ToString()
            });
        }
コード例 #15
0
        public async Task <IActionResult> TeamUploadAsync([FromForm] TeamFile file)
        {
            // JSON file => string
            var stringBuilder = new StringBuilder();

            using (var reader = new StreamReader(file.File.OpenReadStream()))
            {
                while (reader.Peek() >= 0)
                {
                    stringBuilder.AppendLine(await reader.ReadLineAsync());
                }
            }
            string JSONString = stringBuilder.ToString();

            // Set file content to Team Object
            JObject jObjectTeam  = JObject.Parse(JSONString);
            Team    team         = jObjectTeam.ToObject <Team>();
            long    idTournamnet = file.IdTournament;

            return(DbOperation(conn =>
            {
                CheckAuthLevel(UserLevel.OrgAdmin);
                if (team == null)
                {
                    throw new NoDataException();
                }
                long idTeam = team.Id;

                // var existTeamQuery = conn.Query($"SELECT * FROM teams WHERE id = {team.Id} OR name = '{team.Name}' OR keyname = '{team.KeyName}';");

                // 🔎 External Org team can overrrite team.id values so will make query more restrictive
                var existTeamQuery = conn.Query($"SELECT * FROM teams WHERE id = {team.Id} AND name = '{team.Name}' AND keyname = '{team.KeyName}';");

                bool teamExitst = existTeamQuery.Count() > 0;

                if (!teamExitst)
                {
                    // Add team and add Team to Tournament
                    Audit.Information(this, "{0}: Teams.CreateInTournament {idTournament} -> {Name}", GetUserId(), team.Name, idTournamnet);
                    var teamId = conn.Insert(team);
                    idTeam = teamId;
                    conn.Insert(new TournamentTeam {
                        IdTournament = idTournamnet, IdTeam = teamId
                    });
                }
                else
                {
                    var existsTeamInTournamentQuery = conn.Query($"SELECT * FROM tournamentteams WHERE idtournament = {idTournamnet} AND idteam = '{idTeam}';");
                    bool existsTeamInTournament = existsTeamInTournamentQuery.Count() > 0;

                    if (!existsTeamInTournament)
                    {
                        // Add team just into tournamnet
                        Audit.Information(this, "{0}: Teams.AddToTournament {idTournament} -> {idTeam}", GetUserId(), idTournamnet, idTeam);

                        conn.Insert(new TournamentTeam {
                            IdTournament = idTournamnet, IdTeam = idTeam
                        });

                        // TODO: Notify team admin (if any) her team has been added to the competition.
                    }
                    if (existsTeamInTournament)
                    {
                        return new Exception("Error.Team_already_exitsts_in_tournament");
                    }
                }

                // 🚧🚧🚧 Add players to team
                foreach (var player in team.Players)
                {
                    if (player == null || player.UserData == null || player.TeamData == null)
                    {
                        throw new Exception("Malformed request");
                    }
                    Audit.Information(this, "{0}: Players.CreatePlayer {Name} {Surname}", GetUserId(), player.Name, player.Surname);

                    // User email should exists
                    bool userExists = PlayersController.CheckUserExistsInGlobalDirectory(Request, player.UserData.Id, player.UserData.Email);
                    if (!userExists)
                    {
                        throw new Exception($"{player.UserData.Email} does not exists in the global directory.");
                    }

                    var invite = new InviteInput {
                        IdPlayer = player.Id, IdTeam = idTeam, InviteText = "Hi, we want to invite you to join our team."
                    };                                                                                                                                  // 🚧 Lang

                    DbTransaction((c, t) =>
                    {
                        Audit.Information(this, "{0}: Players.Invite1: {IdTeam} {IdPlayer}", GetUserId(), invite.IdTeam, invite.IdPlayer);

                        if (!IsOrganizationAdmin() && !IsTeamAdmin(invite.IdTeam, c))
                        {
                            throw new UnauthorizedAccessException();
                        }

                        // Validate player is not already on the team.
                        var existingPlayer = c.ExecuteScalar <int>("SELECT COUNT(*) FROM teamplayers WHERE idteam = @idTeam AND idplayer = @idPlayer", invite, t);
                        if (existingPlayer > 0)
                        {
                            throw new Exception("Error.PlayerAlreadyInTeam");
                        }

                        invite.InviteText = mSanitizer.Sanitize(invite.InviteText);

                        var userOrg = c.QueryFirstOrDefault <User>($"SELECT * FROM users WHERE id = {player.IdUser}");
                        var notifData = new PlayerNotificationData {
                        };

                        if (userOrg == null)
                        {
                            // Insert player
                            var newPlayer = PlayersController.InsertPlayer(c, t, player, player.IdUser, GetUserId(), false, null, UserEventType.PlayerImported);
                            invite.IdPlayer = newPlayer.Id;

                            // Importing player that not exists in current org users
                            notifData = GetPlayerNotification(c, GetUserId(), invite.IdPlayer, invite.IdTeam, false, player.IdUser);
                        }
                        else
                        {
                            // Get current org player id becouse import Id can overlap
                            var playerOrg = c.QueryFirstOrDefault <Player>($"SELECT * FROM players WHERE iduser = {userOrg.Id}");
                            if (playerOrg == null)
                            {
                                throw new Exception("Error.PlayerNotFound");                   // Player should exist
                            }
                            invite.IdPlayer = playerOrg.Id;

                            notifData = GetPlayerNotification(c, GetUserId(), invite.IdPlayer, invite.IdTeam);
                        }

                        // Create the teamplayers record
                        var tp = new TeamPlayer
                        {
                            IdPlayer = invite.IdPlayer,
                            IdTeam = invite.IdTeam,
                            IsTeamAdmin = false,
                            Status = 1
                        };

                        c.Insert(tp, t);

                        // UserEvent

                        c.Insert(new UserEvent
                        {
                            IdCreator = GetUserId(),
                            IdUser = notifData.To.Id,
                            Type = (int)UserEventType.PlayerInvitedToTeam,
                            TimeStamp = DateTime.Now,
                            Description = notifData.Team.Name
                        }, t);

                        notifData.InviteMessage = invite.InviteText;

                        Audit.Information(this, "{0}: Players.Invite2: {1} {2}", GetUserId(), notifData.Team.Name, notifData.To.Name);

                        mNotifications.NotifyEmail(Request, c, t, TemplateKeys.EmailPlayerInviteHtml, notifData);

                        return true;
                    });
                }

                return true;
            }));
        }