3
respostas

[Projeto] AluraFlix

Olá, Time da Alura.

Recentemente iniciei o challenge AluraFlix, o desafio da primeira semana deu um pouco de dor de cabeça, mas consegui fazer, já o da segunda semana está sendo mais complicado, dei uma travada. Mesmo utilizando ajuda IA, começa a ficar muito trabalhoso ter que fazer o prompt de toda a estrutura do projeto e chegar numa resposta acertiva. Gostaria que alguém pudesse me dar um norte de como seguir, pois estou fazendo o desafio sozinho.

https://github.com/Dias-Gabriel-Dev/AluraFlix/tree/Feature-do-CRUD-de-categorias

3 respostas

Olá, Gabriel! Tudo bem com você?

Parabéns por estar se dedicando ao Challenge, estou aqui para te ajudar, mas, não foi possível compreender totalmente o seu cenário. Para que eu possa te orientar melhor, me responda o seguinte:

  • Confirme por favor: o Challenge que você está fazendo é esse?
  • Em qual parte da semana 2 você está travado? O que você está tentando fazer?
  • Está tendo algum erro específico no código? Se sim, qual é a mensagem de erro?

Fico no aguardo! Conte com nosso apoio!

Tudo ótimo, Rafaela.

É o challenge da semana 1, AluraFlix. Estou travado na regra de negócio onde é pedido para que a coleção categorias fosse semeada de acordo com o que é colocado no campo "categoria" numa requisição POST de videos por exemplo, porém eu estou utilizando o mongoDB já que ainda não sei utilizar muito bem bancos SQL.

Um dos pedidos da regra de negócio é a atribuição de ID para categoria = 1, eu entendi que ao inves de usar mongoose.Schema.Types.ObjectId, eu devo criar um objeto ID para categoria e fazer uma função com uma lógica condicional onde ela abstenha de gerar um ID hexadecimal e vá gerando ID com números inteiros simples 1, 2, 3, 4... na medida que esses nome/tipos de categorias forem colocados na requisição POST e ao mesmo tempo semear a coleção com isso. Meus neurônios já deram nó, tô até sonhando com código. Estou gostando, mas a frustração de travar nisso tá começando a incomodar.

Busquei algum engajamento no discord, porém, sem sucesso. Não sei se é pelo fato de ser um desafio antigo(porém, é um ótimo exercício para novos alunos) ou se simplesmente o feudos foram formados desencorajando os novos a se enturmarem.

Oi Gabriel! Que bom que você está bem e que voltou com mais informações.

Você está indo super bem pensando em como relacionar vídeos com categorias, mas teve uma confusão bem comum (e natural) ao trabalhar com o MongoDB. Vamos por partes.

O que você entendeu corretamente:

  • Que cada vídeo precisa ter uma categoria associada.
  • Que, se a categoria não for informada, o vídeo deve ser vinculado à categoria "Livre" (com ID = 1).
  • Que seria preciso criar essa categoria automaticamente se não existir.

Ótimo trabalho até aqui.

Onde houve confusão:

Você comentou que estava tentando evitar usar o ObjectId do MongoDB e criar seus próprios IDs numéricos (1, 2, 3...). Isso é desnecessário (e até desaconselhado) no MongoDB. A principal vantagem do Mongo é justamente que ele já cuida da geração de identificadores únicos (_id) de forma automática com os ObjectId. Não precisamos substituir isso. Mesmo que o enunciado do desafio fale em "ID = 1", isso é uma abstração. O importante mesmo é garantir que:

  • A categoria com nome "Livre" exista.
  • Todos os vídeos sem categoria explícita sejam relacionados com ela.

Passos pra seguir no seu projeto:

  1. Use o campo _id padrão do Mongo para identificar categorias e vídeos. Isso vai evitar muitos problemas e segue a prática recomendada.

  2. Garanta que a categoria "Livre" esteja criada quando iniciar o projeto. Podemos fazer isso com um script de semente e vou mostrar o código mais a frente.

  3. No controller de vídeos, implemente a lógica para:

    • Verificar se o campo categoria foi enviado no req.body.
    • Se não foi: associar o vídeo à categoria "Livre".
    • Se foi: procurar pela categoria. Se não existir, criar automaticamente com uma cor padrão.
    • Por fim, criar o vídeo com o campo categoria referenciando o _id dessa categoria.

Adaptando o controller:

Com essas mudanças o método criarVideo deve ficar assim:

static async criarVideo(req, res) {
  const { titulo, descricao, url, categoria: categoriaInput } = req.body;

  if (!titulo || !descricao || !url) {
    return res.status(400).json({ erro: "Todos os campos são obrigatórios." });
  }

  let categoriaId;

  if (!categoriaInput) {
    const categoriaLivre = await categoria.findOne({ titulo: "Livre" });
    if (!categoriaLivre) return res.status(500).json({ erro: "Categoria 'Livre' não encontrada." });
    categoriaId = categoriaLivre._id;
  } else {
    const categoriaExistente = await categoria.findOne({ titulo: categoriaInput });
    if (categoriaExistente) {
      categoriaId = categoriaExistente._id;
    } else {
      const novaCategoria = await categoria.create({ titulo: categoriaInput, cor: "#CCCCCC" });
      categoriaId = novaCategoria._id;
    }
  }

  const novoVideo = await video.create({ titulo, descricao, url, categoria: categoriaId });
  res.status(201).json({ message: "Vídeo postado com sucesso", video: novoVideo });
}

Dica extra: se você quiser criar a categoria "Livre" automaticamente

Crie um arquivo seed.js para rodar quando o app iniciar e garantir que a categoria "Livre" está no banco:

import Categoria from "./src/models/Categoria.js";

const seedCategoriaLivre = async () => {
  const existe = await Categoria.findOne({ titulo: "Livre" });
  if (!existe) {
    await Categoria.create({ titulo: "Livre", cor: "#000000" });
    console.log("Categoria 'Livre' criada.");
  }
};

export default seedCategoriaLivre;

E no server.js:

import seedCategoriaLivre from "./seed.js";
await seedCategoriaLivre();

Sei que pode ser frustrante travar nesses detalhes, mas isso é parte do processo de aprendizado principalmente por estar lidando com várias coisas ao mesmo tempo. Você está indo super bem.

Conta comigo e continue firme nos estudos. Se ainda ficar alguma dúvida estou aqui para ajudar.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado