Skip to content

Zod Schemas

The @neemias/schemas package contains all Zod schemas shared between frontend and backend. These schemas are the single source of truth for data validation, TypeScript types, and OpenAPI specification generation.

Primitives

PhoneEntry

Phone entry with number and qualifier (e.g., "Mobile", "WhatsApp").

FieldTypeConstraints
numberstringmin 1, max 20
qualifierstringmin 1, max 50

Address

Student residential address (LGPD data — PII).

FieldTypeConstraints
streetstringmax 255, default ""
numberstringmax 20, default ""
complementstringmax 255, default ""
neighborhoodstringmax 255, default ""
citystringmax 255, default ""
statestringmax 2, default ""
zipstringmax 10, default ""

Helper constant: EMPTY_ADDRESS — Address object with all fields empty.

EncryptedPayload

AES-GCM encrypted payload for sensitive data at rest.

FieldType
ciphertextstring
ivstring
keyVersionnumber (integer)

Core entities

Student

Student — central entity of the system. Contains PII (LGPD) and non-PII fields.

PII fields (LGPD): displayName, photoRef, guardianName, guardianNameAlt, birthDate, phones, address, allergies, specialNeeds

FieldTypeConstraints
studentIdstringUUID
displayNamestringmin 1, max 140 — PII
photoRefstringdefault "" — PII (biometric data)
statusStudentStatusenum
guardianNamestringmin 1, max 200 — PII
guardianNameAltstring (optional)max 200 — PII
birthDatestring (optional)— PII
phonesPhoneEntry[]default [] — PII
addressAddressdefault EMPTY_ADDRESS — PII
classIdstring (optional)UUID
nucleusParticipatesbooleandefault false
nucleusRegionNucleusRegion (optional)enum
nucleusNamestring (optional)max 200
allergiesstring (optional)max 1000 — PII
specialNeedsstring (optional)max 1000 — PII
familyMembershipStatusFamilyMembershipStatusdefault "DESCONHECIDO"
createdAtstringISO 8601 datetime
updatedAtstringISO 8601 datetime
createdBystringUUID
deletedAtstring (optional)
deletedBystring (optional)UUID

Class (Turma)

FieldTypeConstraints
classIdstringUUID
namestringmin 1, max 100
ageMinnumber (optional)integer, 0–99
ageMaxnumber (optional)integer, 0–99
statusenum"ACTIVE" | "DELETED"
createdAtstringISO 8601 datetime
updatedAtstringISO 8601 datetime

Nucleus (Núcleo)

FieldTypeConstraints
nucleusIdstringUUID
regionNucleusRegionenum
namestringmin 1, max 200
statusenum"ACTIVE" | "DELETED"
createdAtstringISO 8601 datetime
updatedAtstringISO 8601 datetime

ClassSlot

FieldTypeConstraints
slotIdstringUUID
dayOfWeeknumberinteger, 0–6
startTimestringregex HH:MM
labelstringmin 1, max 100
sessionDatestring (optional)
statusSlotStatusenum
createdAtstringISO 8601 datetime
updatedAtstringISO 8601 datetime

ClassSession

FieldTypeConstraints
sessionIdstringUUID
slotIdstringUUID
sessionDatestringregex YYYY-MM-DD
createdAtstringISO 8601 datetime

SessionOption (display helper)

FieldType
sessionIdstring (UUID)
slotIdstring (UUID)
labelstring
sessionDatestring
dayOfWeeknumber (0–6)
startTimestring

Events and audit

AttendanceEvent

Attendance record (present/absent).

FieldTypeConstraints
eventIdstringUUID
studentIdstringUUID
classSessionIdstringUUID
actionTypeAttendanceActionTypeenum
actorIdstringUUID
actorRolestring
timestampstringISO 8601 datetime
syncStateSyncStatedefault "SYNCED"
isConflictLoserbooleandefault false
conflictSupersededBystring (optional)UUID

StudentEvent

Audit event for student changes. Includes optional encryption for sensitive data.

FieldTypeConstraints
eventIdstringUUID
studentIdstringUUID
eventTypeStudentEventTypeenum
actorIdstringUUID
actorRolestring
timestampstringISO 8601 datetime
changePayloadRecord<string, unknown>default {}
justificationstring (optional)max 500
encryptedChangePayloadEncryptedPayload (optional)
encryptedJustificationEncryptedPayload (optional)
syncStateSyncStatedefault "SYNCED"
isConflictLoserbooleandefault false

UserEvent

Audit event for user changes.

FieldTypeConstraints
eventIdstringUUID
userIdstringUUID
eventTypeUserEventTypeenum
actorIdstringUUID
actorRolestring
timestampstringISO 8601 datetime
changePayloadRecord<string, unknown>default {}
encryptedChangePayloadEncryptedPayload (optional)
syncStateSyncStatedefault "SYNCED"
isConflictLoserbooleandefault false

Offline sync

SyncQueueEntry

Entry in the offline → online sync queue.

FieldTypeConstraints
queueIdstringUUID
eventIdstringUUID
entityTypeenum"ATTENDANCE_EVENT" | "STUDENT_EVENT" | "USER_EVENT"
actionTypestringmin 1
actorIdstringUUID
actorRolestring
enqueuedAtstringISO 8601 datetime
syncStateSyncStatedefault "PENDING"
retryCountnumberinteger ≥ 0, default 0
failureCodestring (optional)
failureReasonstring (optional)
lastAttemptAtstring (optional)ISO 8601 datetime

Authentication and session

Session

Authenticated user session.

FieldTypeConstraints
sessionIdstringUUID
userIdstringUUID
rolestring
issuedAtstringISO 8601 datetime
expiresAtstringISO 8601 datetime
stateenum"ACTIVE" | "EXPIRED" | "REVOKED"
lastValidatedAtstring (optional)ISO 8601 datetime
backendRefreshTokenstring (optional)
csrfTokenstring (optional)
encryptedSessionSecretsEncryptedPayload (optional)
backendAuthModeenum (optional)"bearer" | "cookie"

LocalUser

User stored locally (IndexedDB) for offline operation.

FieldTypeConstraints
userIdstringUUID
usernamestringmin 1, max 100
emailstring (optional)email
displayNamestringmin 1, max 140
passwordHashstring (optional)
encryptedCredentialsEncryptedPayload (optional)
cryptoKeyVersionnumber (optional)integer
keyRotatedAtstring (optional)ISO 8601 datetime
rolestring
statusUserStatusenum
createdAtstringISO 8601 datetime
createdBystring | nullUUID or null
updatedAtstringISO 8601 datetime
deactivatedAtstring (optional)ISO 8601 datetime
deactivatedBystring (optional)UUID

Other schemas

Role (dynamic role — v0.26.0+)

FieldTypeConstraints
namestringmin 1, max 50
displayNamestringmin 1, max 100
permissionsstring[]
isSystembooleandefault false
createdAtstringISO 8601 datetime
updatedAtstringISO 8601 datetime

LocaleResource

Internationalization (i18n) resource.

FieldTypeConstraints
localeCodestringmin 2, max 10
keystringmin 1
translatedTextstring

Source: packages/schemas/src/entities.ts

Distributed under MIT License.