public void Update(NotificationPerson model)
 {
     _context.NotificationPerson.Update(model);
 }
 public void RemoveAsync(NotificationPerson model)
 {
     throw new System.NotImplementedException();
 }
        public async Task <IActionResult> CreateAsync(
            [FromBody] CreateContactViewModel createContactViewModel
            )
        {
            try
            {
                if (createContactViewModel.IdLibraryBook <= 0)
                {
                    return(BadRequest(new ResponseErrorViewModel
                    {
                        Status = Constants.Error,
                        Errors = new List <object>
                        {
                            new { Message = Constants.LibraryNotFound }
                        }
                    }));
                }

                // buscar do usuario autenticado
                var login = Util.GetClaim(_httpContext,
                                          Constants.UserClaimIdentifier);

                var userDbRequest = await _userMananger
                                    .GetByLogin(login);

                if (userDbRequest == null)
                {
                    return(BadRequest(new ResponseErrorViewModel
                    {
                        Status = Constants.Error,
                        Errors = new List <object>
                        {
                            new { Message = Constants.UserNotFound }
                        }
                    }));
                }

                // verificar se existe contado de usuario logado
                var contactDbRequest = await _contactMananger
                                       .GetByEmail(userDbRequest.Login);

                // criar contato caso não exista
                if (contactDbRequest == null)
                {
                    contactDbRequest = new Contact
                    {
                        Email = userDbRequest.Login,
                        Name  = userDbRequest.Person.Name,
                        Phone = userDbRequest.Person.Phones
                                .SingleOrDefault(x => x.Master == true).Number,
                        Active    = true,
                        CreatedAt = Util.CurrentDateTime()
                    };
                }
                else
                {
                    // verifica se já solicitou contato para o mesmo livro
                    var contactDb = await _contactMananger
                                    .GetByIdLiraryAndContactRequest(
                        createContactViewModel.IdLibraryBook,
                        contactDbRequest.Id);

                    if (contactDb != null)
                    {
                        return(Conflict(new ResponseErrorViewModel
                        {
                            Errors = new List <object>
                            {
                                new { Message = Constants.ContactConflict }
                            },
                            Status = Constants.Error
                        }));
                    }
                }

                contactDbRequest.UpdatedAt = Util.CurrentDateTime();

                if (contactDbRequest.Id > 0)
                {
                    _contactMananger.Update(contactDbRequest);
                }
                else
                {
                    await _contactMananger.CreateAsync(contactDbRequest);
                }

                // buscar livro da biblioteca
                var libraryBook = await _libraryBookMananger
                                  .GetByIdAsync(createContactViewModel.IdLibraryBook);

                if (libraryBook == null)
                {
                    return(BadRequest(new ResponseErrorViewModel
                    {
                        Status = Constants.Error,
                        Errors = new List <object>
                        {
                            new { Message = Constants.BooksNotFound }
                        }
                    }));
                }

                // buscar o login do usuario dono da biblioteca para criar cadastro
                var userOwner = await _userMananger
                                .GetByIdAsyncNoTracking(libraryBook.Library.Person.Id);

                // verifica se o livro requisitado não é do mesmo usuario
                if (userOwner.Login.Equals(userDbRequest.Login))
                {
                    return(BadRequest(new ResponseErrorViewModel
                    {
                        Status = Constants.Error,
                        Errors = new List <object>
                        {
                            new { Message = Constants.BookInvalid }
                        }
                    }));
                }

                if (userOwner == null)
                {
                    return(BadRequest(new ResponseErrorViewModel
                    {
                        Status = Constants.Error,
                        Errors = new List <object>
                        {
                            new { Message = Constants.UserNotFound }
                        }
                    }));
                }

                var contactDbOwner = await _contactMananger
                                     .GetByEmail(userOwner.Login);

                if (contactDbOwner == null)
                {
                    contactDbOwner = new Contact
                    {
                        Name  = userOwner.Person.Name,
                        Email = userOwner.Login,
                        Phone = userOwner.Person.Phones
                                .SingleOrDefault(x => x.Master == true).Number,
                        ContactBooksOwner = new List <ContactBook>(),
                        Active            = true,
                        CreatedAt         = Util.CurrentDateTime()
                    };
                }

                contactDbOwner.UpdatedAt = Util.CurrentDateTime();

                var contactBook = new ContactBook
                {
                    ContactOwner   = contactDbOwner,
                    ContactRequest = contactDbRequest,
                    LibraryBook    = libraryBook,
                    Approved       = libraryBook.LibraryBookTypes.Any(x => x.Type.Id == 5),
                    Denied         = false,
                    CreatedAt      = Util.CurrentDateTime()
                };

                contactDbOwner.ContactBooksOwner.Add(contactBook);

                if (contactDbOwner.Id > 0)
                {
                    _contactMananger.Update(contactDbOwner);
                }
                else
                {
                    await _contactMananger.CreateAsync(contactDbOwner);
                }

                // gerar notificação
                var notification = new Notification
                {
                    Name        = "Você tem uma solicitação de contado!",
                    Description = "Entre em seu perfil e verifique os contatos!",
                    CreatedAt   = Util.CurrentDateTime()
                };

                await _notificationMananger.CreateAsync(notification);

                var personNotification = new NotificationPerson
                {
                    Notification = notification,
                    Person       = libraryBook.Library.Person,
                    Active       = true,
                    CreatedAt    = Util.CurrentDateTime()
                };

                await _notificationPersonMananger
                .CreateAsync(personNotification);

                _uow.Commit();

                return(Created(
                           new Uri(Url.ActionLink("Create", "Contact")), new ResponseViewModel
                {
                    Result = null,
                    Status = Constants.Sucess
                }));
            }
            catch (Exception ex)
            {
                // gerar log
                return(BadRequest(new ResponseErrorViewModel
                {
                    Status = Constants.Error,
                    Errors = new List <object> {
                        Util.ReturnException(ex)
                    }
                }));
            }
        }
 public Task CreateAsync(NotificationPerson model)
 {
     return(Task.Run(() => _context
                     .NotificationPerson.AddAsync(model)));
 }
        public async Task <IActionResult> CreatePublicAsync(
            [FromBody] CreateContactPublicViewModel contact
            )
        {
            try
            {
                var errors = new List <object>();

                var libraryBookDb = new LibraryBook();

                // validar os dados
                if (string.IsNullOrEmpty(contact.Email))
                {
                    errors.Add(new { Message = Constants.UserLoginInvalid });
                }

                if (string.IsNullOrEmpty(contact.Name))
                {
                    errors.Add(new { Message = Constants.UserNameInvalid });
                }

                if (string.IsNullOrEmpty(contact.Phone))
                {
                    errors.Add(new { Message = Constants.UserPhoneInvalid });
                }

                if (contact.IdBook <= 0)
                {
                    errors.Add(new { Message = "Livro inválido!" });
                }
                else
                {
                    // buscar biblioteca com livro
                    libraryBookDb = await _libraryBookMananger
                                    .GetByIdAsync(contact.IdBook);

                    if (libraryBookDb == null)
                    {
                        errors.Add(new { Message = Constants.BooksNotFound });
                    }
                }

                if (errors.Count > 0)
                {
                    return(NotFound(new ResponseErrorViewModel
                    {
                        Result = Constants.Error,
                        Errors = errors
                    }));
                }

                var contactDbRequest = await _contactMananger
                                       .GetByEmail(contact.Email);

                // criar contato caso não exista
                if (contactDbRequest == null)
                {
                    contactDbRequest = new Contact
                    {
                        Email = contact.Email,
                        Name  = contact.Name,
                        Phone = contact.Phone
                                .Replace("(", "")
                                .Replace(")", "")
                                .Replace("-", "")
                                .Replace(" ", "")
                                .Trim(),
                        Active    = true,
                        CreatedAt = Util.CurrentDateTime()
                    };
                }
                else
                {
                    // atualiza ultima alteração
                    contactDbRequest.UpdatedAt = Util.CurrentDateTime();
                }

                var userDb = await _userMananger
                             .GetByIdAsync(libraryBookDb.Library.Person.Id);

                var contactDbOwner = await _contactMananger
                                     .GetByEmail(userDb.Login);

                if (contactDbOwner == null)
                {
                    contactDbOwner = new Contact
                    {
                        Email = userDb.Login,
                        Name  = userDb.Person.Name,
                        Phone = userDb.Person.Phones
                                .Single(x => x.Master == true).Number,
                        ContactBooksOwner = new List <ContactBook>(),
                        Active            = true,
                        CreatedAt         = Util.CurrentDateTime()
                    };
                }
                else
                {
                    // atualiza ultima alteração
                    contactDbOwner.UpdatedAt = Util.CurrentDateTime();
                }

                // cria novo registro de contato
                var contactBook = new ContactBook
                {
                    ContactOwner   = contactDbOwner,
                    ContactRequest = contactDbRequest,
                    LibraryBook    = libraryBookDb,
                    Approved       = libraryBookDb.LibraryBookTypes.Any(x => x.Type.Id == 5),
                    Denied         = false
                };

                contactDbOwner
                .ContactBooksOwner.Add(contactBook);

                if (contactDbOwner.Id > 0)
                {
                    _contactMananger.Update(contactDbOwner);
                }
                else
                {
                    await _contactMananger
                    .CreateAsync(contactDbOwner);
                }

                // gerar notificação
                var notification = new Notification
                {
                    Name        = "Você tem uma solicitação de contado!",
                    Description = "Entre em seu perfil e verifique os contatos!",
                    CreatedAt   = Util.CurrentDateTime()
                };

                await _notificationMananger.CreateAsync(notification);

                var personNotification = new NotificationPerson
                {
                    Notification = notification,
                    Person       = libraryBookDb.Library.Person,
                    Active       = true,
                    CreatedAt    = Util.CurrentDateTime()
                };

                await _notificationPersonMananger
                .CreateAsync(personNotification);

                _uow.Commit();

                return(Created(
                           new Uri(Url.ActionLink("CreatePublic", "Contact")),
                           new ResponseViewModel
                {
                    Result = null,
                    Status = Constants.Sucess
                }));
            }
            catch (Exception ex)
            {
                // gerar log
                return(BadRequest(new
                {
                    Status = Constants.Error,
                    Errors = new List <object>
                    {
                        Util.ReturnException(ex)
                    }
                }));
            }
        }