# Modelo Lógico

# Modelo Lógico (MongoDB) - Projeto OBLIVION

Este documento descreve a estrutura das coleções e documentos para o banco de dados MongoDB do projeto OBLIVION. Ele serve como a "fonte da verdade" para a estrutura de dados que será implementada.

---

### Coleção: `usuarios`

Armazena os dados de cada usuário cadastrado no sistema.

<table class="code-line" data-line="12" dir="auto" id="bkmrk-campo-tipo-descri%C3%A7%C3%A3o"><thead class="code-line" data-line="12" dir="auto"><tr class="code-line" data-line="12" dir="auto"><th>Campo</th><th>Tipo</th><th>Descrição</th><th>Observações</th></tr></thead><tbody class="code-line" data-line="14" dir="auto"><tr class="code-line" data-line="14" dir="auto"><td>`_id`</td><td>ObjectId</td><td>Identificador único gerado pelo MongoDB.</td><td>Chave Primária.</td></tr><tr class="code-line" data-line="15" dir="auto"><td>`nome`</td><td>String</td><td>Nome completo do usuário.</td><td>Obrigatório.</td></tr><tr class="code-line" data-line="16" dir="auto"><td>`email`</td><td>String</td><td>Email do usuário para login e contato.</td><td>Obrigatório, **Índice Único**.</td></tr><tr class="code-line" data-line="17" dir="auto"><td>`dataCadastro`</td><td>ISODate</td><td>Data e hora do cadastro do usuário.</td><td>Obrigatório.</td></tr></tbody></table>

---

### Coleção: `midias`

Armazena os metadados de qualquer fonte de mídia enviada (vídeo, áudio ou URL), implementando a generalização através do campo `tipo`.

<table class="code-line" data-line="25" dir="auto" id="bkmrk-campo-tipo-descri%C3%A7%C3%A3o-1"><thead class="code-line" data-line="25" dir="auto"><tr class="code-line" data-line="25" dir="auto"><th>Campo</th><th>Tipo</th><th>Descrição</th><th>Observações</th></tr></thead><tbody class="code-line" data-line="27" dir="auto"><tr class="code-line" data-line="27" dir="auto"><td>`_id`</td><td>ObjectId</td><td>Identificador único da mídia.</td><td>Chave Primária.</td></tr><tr class="code-line" data-line="28" dir="auto"><td>`usuarioId`</td><td>ObjectId</td><td>Referência ao `_id` do usuário que fez o upload.</td><td>Chave Estrangeira (Obrigatório).</td></tr><tr class="code-line" data-line="29" dir="auto"><td>`hash`</td><td>String</td><td>Hash (ex: SHA-256) do conteúdo do arquivo.</td><td>**Índice Único**. Nulo se `tipo`="URL".</td></tr><tr class="code-line" data-line="30" dir="auto"><td>`urlNormalizada`</td><td>String</td><td>URL padronizada para evitar duplicidade de links.</td><td>**Índice Único**. Existe apenas se `tipo`="URL".</td></tr><tr class="code-line" data-line="31" dir="auto"><td>`tipo`</td><td>String</td><td>Tipo da mídia: "VIDEO", "AUDIO", ou "URL".</td><td>Obrigatório.</td></tr><tr class="code-line" data-line="32" dir="auto"><td>`nomeArquivo`</td><td>String</td><td>Nome original do arquivo enviado.</td><td>Não aplicável se `tipo`="URL".</td></tr><tr class="code-line" data-line="33" dir="auto"><td>`tamanhoBytes`</td><td>Number</td><td>Tamanho do arquivo em bytes.</td><td> </td></tr><tr class="code-line" data-line="34" dir="auto"><td>`tipoArquivo`</td><td>String</td><td>MIME type do arquivo (ex: "video/mp4").</td><td>Não aplicável se `tipo`="URL".</td></tr><tr class="code-line" data-line="35" dir="auto"><td>`duracaoMs`</td><td>Number</td><td>Duração do conteúdo em milissegundos.</td><td> </td></tr><tr class="code-line" data-line="36" dir="auto"><td>`dataUpload`</td><td>ISODate</td><td>Data e hora do envio.</td><td>Obrigatório.</td></tr><tr class="code-line" data-line="37" dir="auto"><td>`resolucao`</td><td>String</td><td>Resolução do vídeo (ex: "1920x1080").</td><td>Opcional (existe apenas se `tipo`="VIDEO").</td></tr><tr class="code-line" data-line="38" dir="auto"><td>`canais`</td><td>String</td><td>Canais do áudio (ex: "stereo").</td><td>Opcional (existe apenas se `tipo`="AUDIO").</td></tr><tr class="code-line" data-line="39" dir="auto"><td>`linkOriginal`</td><td>String</td><td>A URL original enviada pelo usuário.</td><td>Opcional (existe apenas se `tipo`="URL").</td></tr><tr class="code-line" data-line="40" dir="auto"><td>`plataforma`</td><td>String</td><td>Plataforma de origem da URL (ex: "YouTube").</td><td>Opcional (existe apenas se `tipo`="URL").</td></tr></tbody></table>

---

### Coleção: `transcricoes`

Armazena o estado e o resultado de cada processo de transcrição.

<table class="code-line" data-line="48" dir="auto" id="bkmrk-campo-tipo-descri%C3%A7%C3%A3o-2"><thead class="code-line" data-line="48" dir="auto"><tr class="code-line" data-line="48" dir="auto"><th>Campo</th><th>Tipo</th><th>Descrição</th><th>Observações</th></tr></thead><tbody class="code-line" data-line="50" dir="auto"><tr class="code-line" data-line="50" dir="auto"><td>`_id`</td><td>ObjectId</td><td>Identificador único da transcrição.</td><td>Chave Primária.</td></tr><tr class="code-line" data-line="51" dir="auto"><td>`midiaId`</td><td>ObjectId</td><td>Referência à `_id` da mídia que está sendo transcrita.</td><td>Chave Estrangeira (Obrigatório). **Índice**.</td></tr><tr class="code-line" data-line="52" dir="auto"><td>`status`</td><td>String</td><td>Status do job: "pendente", "processando", "concluido", "erro".</td><td>Obrigatório. **Índice**.</td></tr><tr class="code-line" data-line="53" dir="auto"><td>`textoCompleto`</td><td>String</td><td>O texto final da transcrição.</td><td> </td></tr><tr class="code-line" data-line="54" dir="auto"><td>`dataCriacao`</td><td>ISODate</td><td>Data e hora do início do job.</td><td>Obrigatório.</td></tr><tr class="code-line" data-line="55" dir="auto"><td>`dataAtualizacao`</td><td>ISODate</td><td>Data e hora da última atualização de status.</td><td>Obrigatório.</td></tr><tr class="code-line" data-line="56" dir="auto"><td>`participantes`</td><td>Array de Objetos</td><td>Lista dos participantes identificados no texto.</td><td>Ver schema embutido abaixo.</td></tr></tbody></table>

#### Schema Embutido: `participantes`

O campo `participantes` é um array de objetos, onde cada objeto segue a estrutura:

<table class="code-line" data-line="62" dir="auto" id="bkmrk-campo-tipo-descri%C3%A7%C3%A3o-3"><thead class="code-line" data-line="62" dir="auto"><tr class="code-line" data-line="62" dir="auto"><th>Campo</th><th>Tipo</th><th>Descrição</th></tr></thead><tbody class="code-line" data-line="64" dir="auto"><tr class="code-line" data-line="64" dir="auto"><td>`individuoDetectado`</td><td>String</td><td>Nome/rótulo do locutor (ex: "Locutor A").</td></tr><tr class="code-line" data-line="65" dir="auto"><td>`trechosRelacionados`</td><td>Array de Objetos</td><td>Lista de trechos de fala daquele indivíduo.</td></tr></tbody></table>