public async Task <IActionResult> Send(int id)
        {
            Usuario user = await _userManager.GetUserAsync(HttpContext.User);

            Informativo info = _context.Informativo
                               .Include(q => q.Attachments)
                               .Include(q => q.Doadores)
                               .ThenInclude(q => q.Doador)
                               .Include(q => q.Usuario)
                               .Include(q => q.Usuarios)
                               .ThenInclude(q => q.Usuario)
                               .Include(q => q.Voluntarios)
                               .ThenInclude(q => q.Voluntario)
                               .SingleOrDefault(q => q.Id == id && q.IdUsuario == user.Id);

            if (info == null)
            {
                return(new BadRequestResult());
            }

            //envia
            List <string> emails = (info.Doadores.Select(q => q.Doador.Email)
                                    .Union(info.Usuarios.Select(q => q.Usuario.Email))
                                    .Union(info.Voluntarios.Select(q => q.Voluntario.Email))).ToList();


            List <MimePart> attachments = new List <MimePart>();

            foreach (var a in info.Attachments)
            {
                attachments.Add(a.GetMimePart(_environment.WebRootPath));
            }

            _emailSender.SendEmailAsync(emails, info.Subject, info.Body, attachments);


            //apaga tudo
            try
            {
                foreach (var a in attachments)
                {
                    a.ContentObject.Stream.Dispose();
                }



                var attachmentsPath = Path.Combine(_environment.WebRootPath, "attachment", id.ToString());
                System.IO.Directory.Delete(attachmentsPath, true);
            }
            catch { }
            _context.Informativo.Remove(info);
            _context.SaveChanges();

            //cria um novo
            info = new Informativo()
            {
                Subject     = "",
                Usuario     = user,
                Body        = "",
                Doadores    = new List <InformativoDoador>(),
                Usuarios    = new List <InformativoUsuario>(),
                Voluntarios = new List <InformativoVoluntario>()
            };
            _context.Informativo.Add(info);
            _context.SaveChanges();


            InformativoDTO infoDto = new InformativoDTO()
            {
                Id                = info.Id,
                Subject           = info.Subject,
                Body              = info.Body,
                DoadoresFisicos   = new List <DoadorDTO>(),
                DoadoresJuridicos = new List <DoadorDTO>(),
                Usuarios          = new List <UsuarioDTO>(),
                Voluntarios       = new List <VoluntarioDTO>()
            };

            return(new ObjectResult(infoDto));
        }
        public async Task <InformativoDTO> Get()
        {
            Usuario user = await _userManager.GetUserAsync(HttpContext.User);

            Informativo info = _context.Informativo
                               .Include(q => q.Attachments)
                               .Include(q => q.Doadores)
                               .ThenInclude(q => q.Doador)
                               .Include(q => q.Usuario)
                               .Include(q => q.Usuarios)
                               .ThenInclude(q => q.Usuario)
                               .Include(q => q.Voluntarios)
                               .ThenInclude(q => q.Voluntario)
                               .Where(q => q.IdUsuario == user.Id)
                               .SingleOrDefault();

            if (info == null)
            {
                info = new Informativo()
                {
                    Subject     = "",
                    Usuario     = user,
                    Body        = "",
                    Doadores    = new List <InformativoDoador>(),
                    Usuarios    = new List <InformativoUsuario>(),
                    Voluntarios = new List <InformativoVoluntario>(),
                    Attachments = new List <Attachment>()
                };
                _context.Informativo.Add(info);
                _context.SaveChanges();
            }

            InformativoDTO infoDto = new InformativoDTO()
            {
                Id                = info.Id,
                Subject           = info.Subject,
                Body              = info.Body,
                DoadoresFisicos   = new List <DoadorDTO>(),
                DoadoresJuridicos = new List <DoadorDTO>(),
                Usuarios          = info.Usuarios.Select(q => new UsuarioDTO()
                {
                    Id    = q.Usuario.Id,
                    Nome  = q.Usuario.Nome,
                    Email = q.Usuario.Email
                }).ToList(),
                Voluntarios = info.Voluntarios.Select(q => new VoluntarioDTO()
                {
                    Id    = q.Voluntario.Id,
                    Nome  = q.Voluntario.Nome,
                    Email = q.Voluntario.Email
                }).ToList(),
                Attachments = info.Attachments.Select(q => new AttachmentDTO()
                {
                    Id       = q.Id,
                    FileName = q.FileName
                }).ToList()
            };

            foreach (var d in info.Doadores)
            {
                if (d.Doador.GetType() == typeof(PessoaFisica))
                {
                    infoDto.DoadoresFisicos.Add(new DoadorDTO()
                    {
                        Id              = d.CodDoador,
                        Email           = d.Doador.Email,
                        NomeRazaoSocial = ((PessoaFisica)d.Doador).Nome
                    });
                }
                else
                {
                    infoDto.DoadoresJuridicos.Add(new DoadorDTO()
                    {
                        Id              = d.CodDoador,
                        Email           = d.Doador.Email,
                        NomeRazaoSocial = ((PessoaJuridica)d.Doador).RazaoSocial
                    });
                }
            }



            return(infoDto);
        }
        public async Task <IActionResult> Put(int id, [FromBody] InformativoDTO infoDTO)
        {
            if (id != infoDTO.Id)
            {
                return(new StatusCodeResult(StatusCodes.Status400BadRequest));
            }



            Usuario user = await _userManager.GetUserAsync(HttpContext.User);


            Informativo info = _context.Informativo
                               .Include(q => q.Attachments)
                               .Include(q => q.Doadores)
                               .ThenInclude(q => q.Doador)
                               .Include(q => q.Usuario)
                               .Include(q => q.Usuarios)
                               .ThenInclude(q => q.Usuario)
                               .Include(q => q.Voluntarios)
                               .ThenInclude(q => q.Voluntario)
                               .Where(q => q.IdUsuario == user.Id && q.Id == id)
                               .SingleOrDefault();

            if (info == null)
            {
                return(new BadRequestResult());
            }



            info.Subject = infoDTO.Subject;
            info.Body    = infoDTO.Body;

            if (infoDTO.Usuarios == null)
            {
                infoDTO.Usuarios = new List <UsuarioDTO>();
            }

            if (infoDTO.Voluntarios == null)
            {
                infoDTO.Voluntarios = new List <VoluntarioDTO>();
            }

            if (infoDTO.DoadoresFisicos == null)
            {
                infoDTO.DoadoresFisicos = new List <DoadorDTO>();
            }

            if (infoDTO.DoadoresJuridicos == null)
            {
                infoDTO.DoadoresJuridicos = new List <DoadorDTO>();
            }

            if (info.Usuarios == null)
            {
                info.Usuarios = new List <InformativoUsuario>();
            }

            if (info.Voluntarios == null)
            {
                info.Voluntarios = new List <InformativoVoluntario>();
            }

            if (info.Doadores == null)
            {
                info.Doadores = new List <InformativoDoador>();
            }

            var usersManter = from u in info.Usuarios
                              join d in infoDTO.Usuarios on u.IdUsuario equals d.Id
                              select u;

            //para remover
            foreach (var u in info.Usuarios.Except(usersManter).ToArray())
            {
                info.Usuarios.Remove(u);
            }

            var usersAdd = infoDTO.Usuarios.Where(q => !info.Usuarios.Any(u => u.IdUsuario == q.Id));

            //para adicionar
            foreach (var u in usersAdd)
            {
                InformativoUsuario iu = new InformativoUsuario()
                {
                    IdInformativo = info.Id, IdUsuario = u.Id
                };
                info.Usuarios.Add(iu);
            }

            var doadoresManter = (from u in info.Doadores
                                  join d in infoDTO.DoadoresFisicos on u.CodDoador equals d.Id
                                  select u).Union(
                from u in info.Doadores
                join d in infoDTO.DoadoresJuridicos on u.CodDoador equals d.Id
                select u);

            //para remover
            foreach (var u in info.Doadores.Except(doadoresManter).ToArray())
            {
                info.Doadores.Remove(u);
            }

            var DoadoresAdd = infoDTO.DoadoresFisicos.Where(q => !info.Doadores.Any(u => u.CodDoador == q.Id))
                              .Union(infoDTO.DoadoresJuridicos.Where(q => !info.Doadores.Any(u => u.CodDoador == q.Id)));

            //para adicionar
            foreach (var u in DoadoresAdd)
            {
                InformativoDoador ind = new InformativoDoador()
                {
                    IdInformativo = info.Id, CodDoador = u.Id
                };
                info.Doadores.Add(ind);
            }

            var voluntariosManter = from u in info.Voluntarios
                                    join d in infoDTO.Voluntarios on u.IdVoluntario equals d.Id
                                    select u;

            //para remover
            foreach (var u in info.Voluntarios.Except(voluntariosManter).ToArray())
            {
                info.Voluntarios.Remove(u);
            }

            //para adicionar
            var voluntarioAdd = infoDTO.Voluntarios.Where(q => !info.Voluntarios.Any(u => u.IdVoluntario == q.Id));

            foreach (var u in voluntarioAdd)
            {
                InformativoVoluntario iv = new InformativoVoluntario()
                {
                    IdInformativo = info.Id, IdVoluntario = u.Id
                };
                info.Voluntarios.Add(iv);
            }
            try
            {
                _context.SaveChanges();
            }
            catch {
            }

            return(new ObjectResult(infoDTO));
        }