/// <summary>
        /// This method will create a new direct messaging entry.
        /// </summary>
        /// <param name="userId">The id of the requesting user</param>
        /// <param name="firstParticipantId">The user id of the first participant</param>
        /// <param name="secondParticipantId">The user id of the second participant</param>
        /// <returns>An either monad</returns>
        public Either <DirectMessaging, Error> Insert(long userId, long firstParticipantId, long secondParticipantId)
        {
            try
            {
                var isProperUser = firstParticipantId == userId ||
                                   secondParticipantId == userId;

                var directMessaging = _burstChatContext
                                      .DirectMessaging
                                      .FirstOrDefault(dm => (dm.FirstParticipantUserId == firstParticipantId && dm.SecondParticipantUserId == secondParticipantId) ||
                                                      (dm.FirstParticipantUserId == secondParticipantId && dm.SecondParticipantUserId == firstParticipantId));

                if (!isProperUser || directMessaging is not null)
                {
                    return(new Failure <DirectMessaging, Error>(DirectMessagingErrors.DirectMessagingAlreadyExists()));
                }

                var newDirectMessaging = new DirectMessaging
                {
                    FirstParticipantUserId  = firstParticipantId,
                    SecondParticipantUserId = secondParticipantId,
                };
                _burstChatContext
                .DirectMessaging
                .Add(newDirectMessaging);
                _burstChatContext.SaveChanges();

                return(new Success <DirectMessaging, Error>(newDirectMessaging));
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
                return(new Failure <DirectMessaging, Error>(SystemErrors.Exception()));
            }
        }
        /// <summary>
        /// Adds a new direct messaging entry, if it does not already exist, and also assings the callers
        /// connection id to a signalr group based on the resulting direct messaging id.
        /// </summary>
        /// <param name="firstParticipantId">The user id of the first participant</param>
        /// <param name="secondParticipantId">The user id of the second participant</param>
        /// <returns>A Task instance</returns>
        public async Task PostNewDirectMessaging(long firstParticipantId, long secondParticipantId)
        {
            // Trying to find an existing direct messaging entry based on the users provided.
            var httpContext = Context.GetHttpContext();
            var getMonad    = await _directMessagingService.GetAsync(httpContext, firstParticipantId, secondParticipantId);

            if (getMonad is Success <DirectMessaging, Error> success)
            {
                var signalGroup = DirectMessagingName(success.Value.Id);
                var payload     = new Payload <DirectMessaging>(signalGroup, success.Value);
                await Groups.AddToGroupAsync(Context.ConnectionId, signalGroup);

                await Clients.Caller.NewDirectMessaging(payload);
            }

            // Creates a new direct messaging entry between two users.
            var directMessaging = new DirectMessaging
            {
                FirstParticipantUserId  = firstParticipantId,
                SecondParticipantUserId = secondParticipantId
            };
            var monad = await _directMessagingService.PostAsync(httpContext, directMessaging);

            switch (monad)
            {
            case Success <DirectMessaging, Error> postSuccess:
                var signalGroup = DirectMessagingName(postSuccess.Value.Id);
                var payload     = new Payload <DirectMessaging>(signalGroup, postSuccess.Value);
                await Groups.AddToGroupAsync(Context.ConnectionId, signalGroup);

                await Clients.Caller.NewDirectMessaging(payload);

                break;

            case Failure <DirectMessaging, Error> failure:
                await Clients.Caller.NewDirectMessaging(failure.Value);

                break;

            default:
                await Clients.Caller.NewDirectMessaging(SystemErrors.Exception());

                break;
            }
        }
Example #3
0
        public MonadActionResult <DirectMessaging, Error> Get([FromQuery] long firstParticipantId, [FromQuery] long secondParticipantId)
        {
            var monad = HttpContext
                        .GetUserId()
                        .Bind(userId => _directMessagingService.Get(userId, firstParticipantId, secondParticipantId));

            if (monad is Failure <DirectMessaging, Error> )
            {
                var directMessaging = new DirectMessaging
                {
                    FirstParticipantUserId  = firstParticipantId,
                    SecondParticipantUserId = secondParticipantId
                };
                return(Post(directMessaging));
            }

            return(monad);
        }
Example #4
0
 public MonadActionResult <DirectMessaging, Error> Post([FromBody] DirectMessaging directMessaging) =>
 HttpContext.GetUserId()
 .Bind(userId => _directMessagingService.Insert(userId,
                                                directMessaging.FirstParticipantUserId,
                                                directMessaging.SecondParticipantUserId));
        /// <summary>
        /// Creates a new direct messaging entry between two users based on the provided user ids.
        /// </summary>
        /// <param name="context">The http context of the current request</param>
        /// <param name="directMessaging">The direct messaging instance to be added</param>
        /// <returns>An either monad</returns>
        public async Task <Either <DirectMessaging, Error> > PostAsync(HttpContext context, DirectMessaging directMessaging)
        {
            try
            {
                var method      = HttpMethod.Post;
                var url         = $"/api/direct";
                var jsonMessage = JsonSerializer.Serialize(directMessaging);
                var content     = new StringContent(jsonMessage, Encoding.UTF8, "application/json");

                return(await _apiInteropService.SendAsync <DirectMessaging>(context, method, url, content));
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
                return(new Failure <DirectMessaging, Error>(SystemErrors.Exception()));
            }
        }