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:
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.
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.
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