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); }
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(); } }