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