Data Model
Introdução ao documento
Este documento descreve o modelo de dados real que pôde ser comprovado no repositório. A fonte principal solicitada para este tipo de inventário seria migrations/schema/models, mas esse workspace não contém migrations, ORM schema, DDL ou arquivos SQL. Por isso, o conteúdo abaixo registra um modelo lógico de runtime e integração, derivado de interfaces TypeScript, contratos HTTP e validações de formulário, sem promovê-lo a modelo físico persistente.
Leitura aplicada
Fato observado: campos e estruturas presentes em interfaces, handlers, adapters e validações.Inferência controlada: relacionamento lógico sugerido pelo uso em runtime, sem FK física comprovada.Divergência: diferença entre o modelo lógico observado no runtime e a ausência de schema físico local.
Evidências:
- A busca por
schema,models,migrations,prisma,*.sqle*.ddlno repositório não retornou nenhum artefato de schema físico, além do próprio documento atual. ../../src/features/api/external/wp/getUserByCpf/getUserByCpf.interface.ts#L1-L20../../src/features/api/external/registrations/getUserByCpf/getUserByCpf.interface.ts#L1-L23../../src/common/types/next-auth/next-auth.d.ts#L3-L20
Versionamento
Este documento deve ser atualizado quando:
- surgirem migrations, schema files ou models físicos no repositório;
- interfaces TypeScript e contratos HTTP alterarem o shape das entidades lógicas;
- validações de runtime mudarem constraints relevantes de domínio.
Inferência controlada
- Enquanto o schema físico permanecer fora deste repositório,
docs/data/model.mdcontinuará sendo uma fotografia do modelo lógico observado no código de integração e no runtime.
Evidências:
../api/openapi.yaml../../.github/workflows/docs-governance.yml#L22-L71../../src/features/components/SignupConfirmation/components/ProfileForm/ProfileForm.schema.ts#L5-L47
Referencial teórico
Este documento usa modelagem lógica orientada a contratos, priorizando:
- tipagem TypeScript para shape de entidades de integração;
- contratos HTTP para objetos trafegados em runtime;
- validações de formulário para constraints observáveis do domínio.
Inferência controlada
- Na ausência de schema físico, esse é o nível mais confiável de modelagem que o repositório permite hoje.
Evidências:
../api/openapi.yaml../../src/features/api/external/wp/getCourseStatus/getCourseStatus.interface.ts#L1-L33../../src/features/components/SignupConfirmation/components/ProfileForm/ProfileForm.schema.ts#L5-L47
Entidades/tabelas principais
1. Participant (runtime/frontend + WordPress)
Fato observado
- Campos comprovados:
ID?,id,cpf,name,email,phone,birthday,gender,race. - Este é o shape mais completo de participante usado no runtime do frontend.
Evidências:
../../src/features/components/SignupConfirmation/components/ProfileConfirmation/ProfileConfirmation.interface.ts#L8-L18../../src/features/api/getParticipantDetailsByCpf/getParticipantDetailsByCpf.interface.ts#L1-L10../../src/features/api/external/wp/getUserByCpf/getUserByCpf.interface.ts#L11-L20
2. RegistrationPerson (backend de registration)
Fato observado
- Campos comprovados no payload retornado:
id,name,has_cnpj,show_name,contactInfo[]. - O adapter converte esse payload para uma visão simplificada com
id,cpf,name,email,phone.
Evidências:
../../src/features/api/external/registrations/getUserByCpf/getUserByCpf.interface.ts#L1-L23../../src/features/api/external/registrations/getUserByCpf/getUserByCpf.ts#L30-L45
3. ContactInfo (aninhado em RegistrationPerson)
Fato observado
- Campos comprovados:
id?,contact_info_type,contact_info_content. - Essa estrutura aparece tanto em leitura quanto em escrita no backend de registration.
Evidências:
../../src/features/api/external/registrations/getUserByCpf/getUserByCpf.interface.ts#L11-L15../../src/features/api/external/registrations/createUser/createUser.interface.ts#L1-L9../../src/features/api/external/registrations/updateUserById/updateUserById.interface.ts#L1-L11
4. CourseCustomization
Fato observado
- Campos comprovados:
course_id,slug,title,presentation,logo.url,banner.url,total_users,flow_template_id,flow_template_header_image,tracking_id?, flags e textos de manutenção. - Essa entidade é obtida do endpoint WordPress
/course/{slug}e usada para montar a UI, o tracking e o envio de template.
Evidências:
../../src/features/api/external/wp/getCustomization/getCustomization.ts#L4-L21../../src/features/api/getCourseDetails/getCourseDetails.ts#L7-L19
5. CourseCycleStatus
Fato observado
- Campos comprovados:
availablee um objetocyclecomID,cicle,start_date,end_date,activities,activity_titles,collective_meeting_time_slot,collective_meetings,individual_meetings,enrollment_start_date,enrollment_end_date.
Divergência
- O campo
cicleaparece assim no contrato observado, e nãocycle. O documento mantém a grafia real do código.
Evidências:
../../src/features/api/external/wp/getCourseStatus/getCourseStatus.interface.ts#L1-L33../../src/features/api/external/wp/getCourseStatus/getCourseStatus.ts#L25-L30
6. EnrollmentSnapshot
Fato observado
- Campos comprovados:
enrollment_id,class_id,course_name,enrolled_in,cycle_id. - Essa estrutura aparece dentro de
enrolls[]no retorno do status de matrícula.
Evidências:
../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.interface.ts#L1-L18../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.ts#L27-L34
7. ConcurrentEnrollmentDetail
Fato observado
- Campos comprovados:
class_id,start_date,end_date,course_name,block. - Essa estrutura aparece dentro de
enrolled_in_concurrent_course_detail[].
Evidências:
../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.interface.ts#L12-L18../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.ts#L31-L33
8. SessionUser
Fato observado
- Campos comprovados:
id?,cpf,name?,email?,birthday?,gender?,race?,phone?,course_slug?,canceledEnrolls?. - A sessão é o principal snapshot local de identidade usado pelos handlers e componentes autenticados.
Evidências:
../../src/common/types/next-auth/next-auth.d.ts#L3-L20../../pages/api/auth/[...nextauth].ts#L9-L10../../pages/api/auth/[...nextauth].ts#L131-L151
9. GroupLink
Fato observado
- Campos comprovados:
ok,enroll_id?,group_link?. - O frontend usa
group_linkpara redirecionamento eenroll_idcomo identificador de entrada.
Evidências:
../../src/features/api/external/wp/getGroupLink/getGroupLink.interface.ts#L1-L10../../src/features/api/external/wp/getGroupLink/getGroupLink.ts#L25-L31../../app/grupo/[uid]/page.tsx#L12-L18
10. MaintenanceMode
Fato observado
- Campos comprovados:
active,fields.title?,fields.message?,fields.description?. - Essa estrutura governa o desvio de fluxo no middleware e na página de manutenção.
Evidências:
../../src/features/api/external/wp/getMaintenanceMode/getMaintenanceMode.ts#L4-L11../../middleware.ts#L8-L29../../app/maintenance/page.tsx#L24-L31
Relacionamentos e cardinalidade
RegistrationPerson 1:N ContactInfo
Fato observado
- O contrato do backend de registration expõe
contactInfo[]dentro da pessoa.
Evidências:
../../src/features/api/external/registrations/getUserByCpf/getUserByCpf.interface.ts#L1-L15../../src/features/api/external/registrations/createUser/createUser.interface.ts#L1-L9
Participant 1:1 SessionUser
Inferência controlada
- A sessão armazena um snapshot do participante, enriquecido com
course_slugecanceledEnrolls.
Evidências:
../../src/common/types/next-auth/next-auth.d.ts#L4-L15../../pages/api/auth/[...nextauth].ts#L105-L106../../pages/api/auth/[...nextauth].ts#L145-L149
Participant 1:N EnrollmentSnapshot
Inferência controlada
- O status de matrícula é buscado por
(course_slug, id)do usuário e retornaenrolls[], o que sugere múltiplas matrículas históricas ou relacionadas ao participante.
Evidências:
../../pages/api/auth/[...nextauth].ts#L65-L70../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.interface.ts#L1-L18
CourseCycleStatus 1:N EnrollmentSnapshot
Inferência controlada
EnrollmentSnapshotcarregacycle_id, enquantoCourseCycleStatus.cycleexpõeID. O vínculo é lógico por nomenclatura, não físico.
Evidências:
../../src/features/api/external/wp/getCourseStatus/getCourseStatus.interface.ts#L3-L15../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.interface.ts#L3-L9
CourseCustomization 1:1 CourseCycleStatus
Inferência controlada
- Ambos são buscados a partir do mesmo
slugde curso em runtime.
Evidências:
../../app/[slug]/page.tsx#L23-L25../../src/features/api/external/wp/getCustomization/getCustomization.ts#L4-L21../../src/features/api/external/wp/getCourseStatus/getCourseStatus.ts#L5-L20
EnrollmentSnapshot 0..1:1 GroupLink
Inferência controlada
GroupLinkrecebeenroll_id, enquanto a matrícula expõeenrollment_id. A proximidade semântica sugere ligação, mas há divergência de nomenclatura e nenhuma FK explícita.
Evidências:
../../src/features/api/external/wp/getGroupLink/getGroupLink.interface.ts#L1-L10../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.interface.ts#L3-L9../../app/grupo/[uid]/page.tsx#L12-L18
Campos críticos (PK, FK, unique, status, timestamps)
Timestamps e datas
Fato observado
- Não há
created_at,updated_at,deleted_atou campos equivalentes de auditoria no modelo local observado. - Há campos de data e período de domínio:
birthday,start_date,end_date,enrollment_start_date,enrollment_end_date,enrolled_in.
Evidências:
../../src/features/components/SignupConfirmation/components/ProfileConfirmation/ProfileConfirmation.interface.ts#L14-L17../../src/features/api/external/wp/getCourseStatus/getCourseStatus.interface.ts#L3-L15../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.interface.ts#L3-L18
Unique e chaves físicas
Divergência
- O código sugere que
cpffunciona como identificador de negócio, mas o repositório não contém constraintUNIQUEfísica para comprovar isso no storage. - O mesmo vale para
id,course_id,cycle.ID,enrollment_ideenroll_id: há uso como identificadores, mas não há PK/FK/UNIQUE físicos versionados aqui.
Evidências:
../../pages/api/v1/participantes/[cpf].ts#L17-L24../../src/features/api/external/wp/getCustomization/getCustomization.ts#L9-L15../../src/features/api/external/wp/getCourseStatus/getCourseStatus.interface.ts#L3-L15../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.interface.ts#L3-L18
Constraints e enums
Constraints de runtime comprovadas
Fato observado
cpfé obrigatório, com mínimo e máximo de 11 dígitos, e passa porvalidateCpf.nameé obrigatório, trimado e deve parecer nome completo.emailé obrigatório e validado como e-mail.phoneé obrigatório e deve ter pelo menos 8 caracteres.birthdayé obrigatória, deve ter pelo menos 10 caracteres e representar data válida no passado.gendereracesão obrigatórios.
Evidências:
../../src/features/components/SignupConfirmation/components/ProfileForm/ProfileForm.schema.ts#L5-L47../../src/features/components/CourseRegistration/CourseRegistration.schema.ts#L4-L10
Enums/catálogos observados em runtime
Fato observado
genderpossui opções de UI:Feminino,Masculino,Prefiro não informar.racepossui opções de UI:Preta,Parda,Branca,Amarela,Indigena,Prefiro não informar.MaintenanceMode.active,CourseCycleStatus.available,GetUserEnrollsResponse.enrolled,enrolled_in_same_category,enrolled_in_concurrent_coursesão booleanos observados.
Divergência
- Essas listas são
catálogos de interface/runtime, não enums físicos comprovados em banco.
Evidências:
../../src/features/components/SignupConfirmation/components/ProfileForm/ProfileForm.component.tsx#L209-L240../../src/features/api/external/wp/getMaintenanceMode/getMaintenanceMode.ts#L4-L11../../src/features/api/external/wp/getCourseStatus/getCourseStatus.interface.ts#L1-L15../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.interface.ts#L1-L18
Divergências entre modelo e código de runtime
Ausência de schema físico local
Divergência
- O runtime trabalha com entidades relativamente claras (
Participant,CourseCustomization,EnrollmentSnapshot,SessionUser), mas não há migrations, models persistentes ou DDL que permitam afirmar o desenho físico real.
Evidências:
- A busca por
schema,models,migrations,prisma,*.sqle*.ddlno repositório não retornou schema físico versionado. ../../src/features/api/external/wp/../../src/features/api/external/registrations/
Divergência de nomes entre contratos
Divergência
GroupLink.enroll_ideEnrollmentSnapshot.enrollment_idparecem referir o mesmo conceito, mas com nomes diferentes.CourseCycleStatus.cycle.cicleestá grafado dessa forma no contrato observado.Participantno frontend usaID?eid, enquantoSessionUseraceitaid?.
Evidências:
../../src/features/api/external/wp/getGroupLink/getGroupLink.interface.ts#L1-L10../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.interface.ts#L3-L9../../src/features/api/external/wp/getCourseStatus/getCourseStatus.interface.ts#L3-L15../../src/features/components/SignupConfirmation/components/ProfileConfirmation/ProfileConfirmation.interface.ts#L8-L18../../src/common/types/next-auth/next-auth.d.ts#L4-L15
Pendências
- Identificar se o modelo físico real vive em outro repositório ou serviço.
- Confirmar se o backend canônico de pessoa/participante é WordPress, Registration backend ou ambos.
- Confirmar a semântica exata do vínculo entre
enroll_ideenrollment_id. - Confirmar se
course_idecycle.IDsão chaves estáveis ou apenas identificadores de payload externo. - Confirmar se os catálogos de
gendereracesão realmente enums de domínio ou apenas opções atuais de UI.
Evidências:
../../src/features/api/external/wp/index.ts#L1-L6../../src/features/api/external/registrations/index.ts#L1-L3../../src/features/api/external/wp/getGroupLink/getGroupLink.interface.ts#L1-L10../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.interface.ts#L3-L18../../src/features/components/SignupConfirmation/components/ProfileForm/ProfileForm.component.tsx#L209-L240
ERD Mermaid
Evidências:
../../src/features/api/external/registrations/getUserByCpf/getUserByCpf.interface.ts#L1-L15../../src/common/types/next-auth/next-auth.d.ts#L4-L19../../src/features/api/external/wp/getCustomization/getCustomization.ts#L4-L21../../src/features/api/external/wp/getCourseStatus/getCourseStatus.interface.ts#L1-L33../../src/features/api/external/wp/getUserEnrollStatus/getUserEnrollStatus.interface.ts#L1-L39../../src/features/api/external/wp/getGroupLink/getGroupLink.interface.ts#L1-L10../../src/features/api/external/wp/getMaintenanceMode/getMaintenanceMode.ts#L4-L11