public async Task <string> Curtir(int postagemId)
        {
            var postagens = await _postagemRepository
                            .ObterPostagens()
                            .ConfigureAwait(false);

            if (!postagens.Contains(postagemId))
            {
                throw new ArgumentException("Não existe publicação com esse ID");
            }

            var usuarioId = _logado.ObterUsuarioLogado();

            var curtida = await _curtidasRepository
                          .GetByUsuarioIdAndPostagemIdAsync(usuarioId, postagemId)
                          .ConfigureAwait(false);

            var usuarioPostagemId = await _postagemRepository
                                    .GetUsuarioIdByPostagemId(postagemId);

            var amigosId = await _amigosRepository
                           .ObterListaDeAmigos(usuarioId)
                           .ConfigureAwait(false);

            if (amigosId.Contains(usuarioPostagemId) || usuarioPostagemId == usuarioId)
            {
                if (curtida != null)
                {
                    var descurtiu = await _curtidasRepository
                                    .Descurtir(curtida.Id)
                                    .ConfigureAwait(false);

                    var resultado = ("Você descurtiu a postagem de número " + postagemId);
                    return(resultado);
                }
                else
                {
                    var novaCurtida = new Curtidas(usuarioId, postagemId);

                    var curtiu = await _curtidasRepository
                                 .Curtir(novaCurtida)
                                 .ConfigureAwait(false);

                    var resultado = ("Você curtiu a postagem de número " + postagemId);
                    return(resultado);
                }
            }
            else
            {
                throw new Exception("Você não pode curtir essa publicação, porque você não segue este usuário");
            }
        }
        public async Task <List <PostagemViewModel> > ObterLinhaDoTempo()
        {
            var idUsuarioLogado = _logado.ObterUsuarioLogado();

            var postagensDosAmigos = await _postagemRepository
                                     .ObterLinhaDoTempo(idUsuarioLogado)
                                     .ConfigureAwait(false);

            var postagensUsuario = await _postagemRepository
                                   .ObterPerfil(idUsuarioLogado)
                                   .ConfigureAwait(false);

            List <Postagem> listaTodasPostagens = new List <Postagem>();

            listaTodasPostagens.AddRange(postagensDosAmigos);
            listaTodasPostagens.AddRange(postagensUsuario);

            List <PostagemViewModel> listaPostagens = new List <PostagemViewModel>();

            foreach (Postagem postagem in listaTodasPostagens)
            {
                var usuarioId = await _postagemRepository
                                .GetUsuarioIdByPostagemId(postagem.Id)
                                .ConfigureAwait(false);

                var usuarioFotoNome = await _usuarioRepository
                                      .GetNomeFotoByIdUsuarioAsync(usuarioId)
                                      .ConfigureAwait(false);

                listaPostagens.Add(new PostagemViewModel()
                {
                    Id           = postagem.Id,
                    NomeUsuario  = usuarioFotoNome.Nome,
                    FotoUsuario  = usuarioFotoNome.FotoPerfil,
                    TextoPost    = postagem.Texto,
                    FotoPost     = postagem.FotoPost,
                    DataPostagem = postagem.DataPostagem
                });
            }

            List <PostagemViewModel> listaOrdenada = listaPostagens
                                                     .OrderBy(o => o.DataPostagem)
                                                     .ToList();

            return(listaOrdenada);
        }
        public async Task <Comentario> InserirComentario(int idPostagem, ComentarioInput input)
        {
            var postagens = await _postagemRepository
                            .ObterPostagens()
                            .ConfigureAwait(false);

            if (!postagens.Contains(idPostagem))
            {
                throw new Exception("Não existe publicação com esse ID");
            }

            var usuarioId = _logado.ObterUsuarioLogado();

            var usuarioPostagemId = await _postagemRepository
                                    .GetUsuarioIdByPostagemId(idPostagem);

            var amigosId = await _amigosRepository
                           .ObterListaDeAmigos(usuarioId)
                           .ConfigureAwait(false);


            if (amigosId.Contains(usuarioPostagemId) || usuarioPostagemId == usuarioId)
            {
                var comentario = new Comentario(idPostagem, usuarioId, input.Texto);

                if (!comentario.EhValido())
                {
                    throw new ArgumentException("Você não pode inserir um comentário vazio");
                }

                var id = await _comentarioRepository
                         .InserirComentario(comentario)
                         .ConfigureAwait(false);

                comentario.SetId(id);

                return(comentario);
            }
            else
            {
                throw new Exception("Você não pode comentar essa publicação, porque você não segue este usuário");
            }
        }