Exemple #1
0
        private MessengerUserDetailsViewModel GenerateAnonymousUser(MessengerRequestViewModel request)
        {
            defaultName = Context.ConnectionId;

            var user = new MessengerUserDetailsViewModel()
            {
                Name         = request.UserName ?? defaultName,
                Avatar       = request.Avatar ?? defaultAvatar,
                ConnectionId = Context.ConnectionId,
                CreatedDate  = DateTime.UtcNow,
                MyRooms      = new List <MessengerRoomViewModel>(),
                MyTeams      = new List <MessengerTeamViewModel>()
            };

            return(user);
        }
Exemple #2
0
        public async Task HubConnect(MessengerRequestViewModel request)
        {
            string errorMsg = string.Empty;

            request.ConnectionId = Context.ConnectionId;
            RepositoryResponse <MessengerUserDetailsViewModel> result = new RepositoryResponse <MessengerUserDetailsViewModel>();

            if (string.IsNullOrEmpty(request.UserName))
            {
                var user = GenerateAnonymousUser(request);
                result.Data      = user;
                result.IsSucceed = true;
            }
            else
            {
                result = await MessengerUserDetailsViewModel.JoinChatAsync(request);
            }

            string action = Enum.GetName(typeof(MessageReponseKey), MessageReponseKey.Connect);

            result.Status = result.IsSucceed ? 1 : 0;
            if (result.IsSucceed)
            {
                result.ResponseKey = action;
                var user = result.Data;
                //Users.Add(new Swastika.Domain.Core.Models.SignalRClient()
                //{
                //    UserId = user.Id,
                //    NickName = user.Name,
                //    ConnectionId = user.ConnectionId,
                //    JoinedDate = DateTime.UtcNow
                //}
                //    );
                await Clients.Client(Context.ConnectionId).SendAsync(receiveMethod, result);
                await UpdateOnlineStatus(user.MyRooms, user.Id, true);
            }
            else
            {
                await Clients.Client(Context.ConnectionId).SendAsync(receiveMethod, result);
            }
        }
        public static async Task <RepositoryResponse <MessengerUserDetailsViewModel> > JoinChatAsync(MessengerRequestViewModel request)
        {
            var context     = new MessengerContext();
            var transaction = context.Database.BeginTransaction();

            RepositoryResponse <MessengerUserDetailsViewModel> result = new RepositoryResponse <MessengerUserDetailsViewModel>();
            string action = Enum.GetName(typeof(MessageReponseKey), MessageReponseKey.Connect);

            try
            {
                var getUser = await Repository.GetSingleModelAsync(
                    u => u.Name == request.UserName
                    , context, transaction
                    );

                if (getUser.IsSucceed)
                {
                    var user = getUser.Data;
                    //Update ConnectionId if changed
                    user.Avatar       = request.Avatar ?? user.Avatar;
                    user.ConnectionId = request.ConnectionId;
                    result            = await user.SaveModelAsync(false, context, transaction);
                }
                else
                {
                    var user = new MessengerUserDetailsViewModel()
                    {
                        Id           = !string.IsNullOrEmpty(request.UserId) ? request.UserId : Guid.NewGuid().ToString(),
                        Name         = request.UserName,
                        Avatar       = request.Avatar,
                        ConnectionId = request.ConnectionId,
                        CreatedDate  = DateTime.UtcNow,
                        MyRooms      = new List <MessengerRoomViewModel>(),
                        MyTeams      = new List <MessengerTeamViewModel>()
                    };
                    result = await user.SaveModelAsync(false, context, transaction);
                }

                if (result.IsSucceed)
                {
                    transaction.Commit();
                    return(result);
                }
                else
                {
                    return(result);
                }
            }
            catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only
            {
                transaction.Rollback();
                result.Exception = ex;
                result.IsSucceed = false;
                return(result);
            }
            finally
            {
                transaction.Dispose();
                context.Dispose();
            }
        }