Exemplo n.º 1
0
        public async Task <IActionResult> Post([FromBody] InvitationModel model)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }

                var seekedInviter = _repo.GetUser(model.Inviter.Id);
                if (seekedInviter == null)
                {
                    _logger.LogWarning($"User which which wants to be inviter is not registered in the database");
                    return(Unauthorized());
                }

                var seekedInvitee = _repo.GetUser(model.Invitee.Id);
                if (seekedInvitee == null)
                {
                    return(BadRequest("Invitee does not exists"));
                }

                var seekedEvent = _repo.GetEvent(model.Event.Id);
                if (seekedEvent == null)
                {
                    return(BadRequest("Event does not exists"));
                }

                StringBuilder sb = new StringBuilder();

                sb.Append(model.Inviter.FirstName).Append(" ").Append(model.Inviter.LastName);
                string inviterName = sb.ToString();
                sb.Clear();

                sb.Append(model.Invitee.FirstName).Append(" ").Append(model.Invitee.LastName);
                string inviteeName = sb.ToString();
                sb.Clear();

                string eventName = model.Event.Name;

                var seeked = _repo.GetInvitationByIds(seekedInviter.Id, seekedInvitee.Id, seekedEvent.Id);
                if (seeked != null)
                {
                    _logger.LogWarning($"{inviteeName} has already been invited by {inviterName} for {eventName} ");
                    return(BadRequest("Could not create invitation"));
                }

                _logger.LogInformation($"Creating new invitation {inviterName} -> {inviteeName}. Event: {eventName}");

                var inv = Mapper.Map <Invitation>(model);
                inv.Id        = 0;
                inv.InviterId = seekedInviter.Id;
                inv.InviteeId = seekedInvitee.Id;
                inv.EventId   = seekedEvent.Id;

                _repo.Add(inv);
                if (await _repo.SaveAllAsync())
                {
                    var newUri = Url.Link("InvitationGet", new { id = inv.Id });

                    InvitationModel mapped = Mapper.Map <InvitationModel>(inv);
                    mapped.Inviter = Mapper.Map <UserModel>(seekedInviter);
                    mapped.Invitee = Mapper.Map <UserModel>(seekedInvitee);
                    mapped.Event   = GetEventModel(seekedEvent.Id);
                    return(Created(newUri, mapped));
                }
            }
            catch (Exception ex)
            {
                _logger.LogError($"Exception thrown while saving invitation: {ex}");
            }

            return(BadRequest("Could not create invitation"));
        }