Modelo de Dados
Introdução ao documento
Este documento registra entidades, relacionamentos e regras de integridade do modelo de dados do activity-delivery-api.
Versionamento
- Versão do documento: 1.0.0
- Última atualização: 2026-03-04
- Responsável: Time Dhedalos
Referencial teórico
Escopo e fontes
- Fonte principal: migrations em
database/migrations/, models emapp/Models/. - Banco de dados: MySQL 8.0 (dev) / PostgreSQL (produção).
Entidades principais
| Entidade | Fonte | Objetivo |
|---|---|---|
users | database/migrations/*_create_users_table.php, app/Models/User.php | Usuários do sistema (admin, facilitadores) |
deliverable_submissions | database/migrations/*_create_deliverable_submissions_table.php, app/Models/DeliverableSubmission.php | Submissões de atividades entregáveis |
submission_files | database/migrations/*_create_submission_files_table.php, app/Models/SubmissionFile.php | Arquivos anexos das submissões |
activity_template_files | database/migrations/*_create_activity_template_files_table.php, app/Models/ActivityTemplateFile.php | Arquivos modelo para atividades |
api_keys | database/migrations/*_create_api_keys_table.php, app/Models/ApiKey.php | Chaves de acesso à API |
novu_keys | database/migrations/*_create_novu_keys_table.php, app/Models/NovuKey.php | Chaves de workflow do Novu (notificações) |
roles | Spatie Permission migration, app/Models/Role.php | Papéis de usuário (admin, user) |
permissions | Spatie Permission migration, app/Models/Permission.php | Permissões granulares |
Relacionamentos
users→roles(N:M viamodel_has_roles) — Spatie Permission- Evidência:
app/Models/User.php:19(traitHasRoles)
- Evidência:
users→permissions(N:M viamodel_has_permissions) — Spatie Permission- Evidência:
app/Models/User.php:19(traitHasRoles)
- Evidência:
roles→permissions(N:M viarole_has_permissions) — Spatie Permission- Evidência: Spatie Permission migration
deliverable_submissions→submission_files(1:N)- Evidência:
app/Models/DeliverableSubmission.php:35—files()hasMany
- Evidência:
submission_files→deliverable_submissions(N:1)- Evidência:
app/Models/SubmissionFile.php:27—submission()belongsTo
- Evidência:
Campos relevantes
users
id: PK auto-incrementname: string, requiredemail: string, uniqueemail_verified_at: timestamp, nullablepassword: string, hashed (cast)remember_token: string, nullabletwo_factor_secret,two_factor_recovery_codes,two_factor_confirmed_at: Fortify 2FA- Evidência:
database/migrations/0001_01_01_000000_create_users_table.php:15
deliverable_submissions
id: PK auto-incrementparticipant_id: bigint, required — ID externo do participanteparticipant_email: string, nullableparticipant_name: string, nullableactivity_id: bigint, required — ID externo da atividadetitle: string, requiredclass_id: bigint, required — ID externo da turmaclass_name: string, nullablecourse_id: bigint, required — ID externo do cursocourse_name: string, nullablecycle_id: bigint, required — ID externo do ciclofacilitator_id: bigint, required — ID externo do facilitadorfacilitator_name: string, nullablefacilitator_email: string, nullablestatus: enum (pending,submitted,submitted_external,evaluated), defaultpendingscore: tinyint unsigned, default 0facilitator_comment: text, nullableevaluated_at: timestamp, nullabledeleted_at: soft delete- Unique constraint:
(participant_id, class_id, activity_id, cycle_id, deleted_at)—unique_submission - Evidência:
database/migrations/2025_05_27_161012_create_deliverable_submissions_table.php:15,database/migrations/2025_07_28_132021_add_unique_submission_constraint_to_deliverable_submissions.php:16
submission_files
id: PK auto-incrementdeliverable_submission_id: FK →deliverable_submissions.id(cascade delete)file_path: string, required — caminho no storage (S3/local)original_name: string, nullable — nome original do arquivofile_type: string, nullable — MIME type- Evidência:
database/migrations/2025_05_27_161012_create_submission_files_table.php:15
activity_template_files
id: PK auto-incrementcourse_id: integer, requiredactivity_id: integer, requiredcycle_id: integer, requiredclass_id: integer, requiredfile_path: string, requiredoriginal_name: string, requiredfile_type: string, nullabledescription: string, nullabledeleted_at: soft delete- Indexes:
(course_id, activity_id),(cycle_id, class_id) - Unique constraint:
(course_id, activity_id, cycle_id, class_id, original_name)—activity_template_unique - Evidência:
database/migrations/2025_12_15_201931_create_activity_template_files.php:11
api_keys
id: PK auto-incrementkey: string, unique — chave de acesso à API (64 caracteres aleatórios)description: string, nullable- Evidência:
database/migrations/2025_06_02_204124_create_api_keys_table.php:15
novu_keys
id: PK auto-incrementdescription: string, requirednovu_key: string, required — chave do workflow Novuapp_key: string, unique — identificador do workflow na aplicação- Evidência:
database/migrations/2025_07_28_190146_create_novu_keys_table.php:15
Regras de integridade
- Unicidade de submissão: A combinação
(participant_id, class_id, activity_id, cycle_id)é única (soft delete considerado), garantindo uma submissão por participante/atividade/turma/ciclo.- Evidência:
database/migrations/2025_07_28_132021_add_unique_submission_constraint_to_deliverable_submissions.php:16
- Evidência:
- Cascade delete: Ao deletar uma
deliverable_submission, todos ossubmission_filesassociados são removidos automaticamente (cascade).- Evidência:
database/migrations/2025_05_27_161012_create_submission_files_table.php:23
- Evidência:
- Status enum: Validado por enum no banco:
pending,submitted,submitted_external,evaluated.- Evidência:
database/migrations/2025_06_10_000000_update_status_enum_in_deliverable_submissions_table.php:12
- Evidência:
- MIME types permitidos: Validação de upload via
MimeTypes::allowed()— imagens, vídeos, áudios, documentos.- Evidência:
app/Helpers/MimeTypes.php:7
- Evidência:
ERD (Mermaid)
Pendências
- ⚠️ PENDÊNCIA: Os campos
participant_id,activity_id,class_id,course_id,cycle_id,facilitator_idna tabeladeliverable_submissionssão IDs externos (não são FKs no banco local). Documentar a origem desses IDs (provavelmentedhedalos-app-backend-wordpressou sistema LMS externo). - ⚠️ PENDÊNCIA: Verificar se existe necessidade de índices adicionais para queries de filtro frequentes em
deliverable_submissions.