Skip to content

Data Models

All models live in apps/backend/src/models/. Every model uses Mongoose with { timestamps: true } which automatically adds created_at and updated_at fields.


User — users collection

File: models/userModel.js

FieldTypeRequiredNotes
emailStringUnique, indexed
passwordStringbcrypt hash (pre-save hook)
full_nameString
phoneString
organizationString
addressString
languageString
has_preferences_setupBooleanDefault: false
preferencesObjectDefault: {}
typeStringEnum: ['user', 'admin'], default 'user'
featuresObjectDefault: {}
email_verifiedBooleanDefault: false
email_verified_dateDate

Indexes: { email: 1 } (unique)


Device — devices collection

File: models/deviceModel.js

FieldTypeRequiredNotes
nameString
codeStringUnique device identifier, indexed
settingsObjectDefault: {}
recent_sensor_dataObjectLatest sensor reading (cached)
recent_network_dataObjectLatest network reading (cached)
last_communicated_atDateIndexed
unit_idObjectIdRef: Unit
user_idObjectIdRef: User

Indexes: { code: 1 } (unique), { code: "text" }


Unit — units collection

File: models/unitModel.js

FieldTypeRequiredNotes
nameStringZone display name
statusString
min_temperatureNumberLower threshold for temperature
max_temperatureNumberUpper threshold for temperature
min_humidityNumberLower threshold for humidity
max_humidityNumberUpper threshold for humidity
min_voltNumberLower threshold for voltage
max_voltNumberUpper threshold for voltage
device_idObjectIdRef: Device, indexed
recent_sensor_dataObjectDefault: {}
recent_network_dataObjectDefault: {}
live_alerts[Object]Default: [] — computed on every reading
last_communicated_atDateIndexed
user_idObjectIdRef: User, indexed
email_recipient_ids[ObjectId]Ref: Recipient array
sms_recipient_ids[ObjectId]Ref: Recipient array
email_alertBooleanDefault: false
sms_alertBooleanDefault: false

SensorData — sensor_data collection

File: models/deviceSensorDataModel.js

FieldTypeRequiredNotes
device_idObjectIdRef: Device
dateDateReading timestamp
temperatureNumber
humidityNumber
voltNumber
seq_noNumberSequence number from device

Indexes: { device_id: 1, date: -1 }


DiagnosticData — diagnostic_data collection

File: models/deviceDiagnosticDataModel.js

FieldTypeRequiredNotes
device_idObjectIdRef: Device
dateDate
os_verStringOS version of device firmware
sw_verStringSoftware version
hw_verStringHardware version
dev_logStringDevice log output

Indexes: { device_id: 1, date: -1 }


NetworkData — network_data collection

File: models/deviceNetworkDataModel.js

FieldTypeRequiredNotes
device_idObjectIdIndexed
dateDate
operatorNumberMobile network operator
mncNumberMobile Network Code
sinrNumberSignal-to-noise ratio
mccNumberMobile Country Code
lacNumber
rssiNumberReceived signal strength
channelNumber
rsrpNumber
rsrqNumber
ciNumberCell ID
techStringRadio technology (4G etc)
bandStringFrequency band

RawSensorData — raw_sensor_data collection

File: models/rawDeviceSensorDataModel.js

FieldTypeRequiredNotes
device_idObjectIdRef: Device
dateDate

Indexes: { device_id: 1, date: -1 }


Recipient — recipients collection

File: models/recipientModel.js

FieldTypeRequiredNotes
nameString
phoneString
emailString
user_idObjectIdRef: User
statusStringEnum: ['active', 'deleted'], default 'active'
is_defaultBooleanDefault: false — created on signup

Default Recipient

Every user gets a default recipient created automatically during signup (using the same _id as the user). This recipient has is_default: true and pre-populates new units' notification lists.


UserToken — user_tokens collection

File: models/userTokenModel.js

FieldTypeRequiredNotes
userIdObjectIdRef: User
tokenString
createdAtDateDefault: now; TTL: 7 days

The TTL index on createdAt auto-purges expired tokens. This is the server-side session store for JWT revocation.


Verification — verifications collection

File: models/verificationModel.js

FieldTypeRequiredNotes
user_identificationStringEmail address
verification_typeStringEnum: ['signup', 'reset_password']
tokenString32-byte hex random token

Indexes:

  • Compound: { user_identification, verification_type } — ensures one active token per type per email
  • TTL on user_identification: expires after 1800 seconds (30 minutes)

UnitAndDeviceLog — unit_and_device_logs collection

File: models/unitAndDeviceLogModel.js

Audit trail for device↔unit assignments.

FieldTypeRequired
unit_idObjectId
device_idObjectId
user_idObjectId
added_dateDate
removed_dateDate
added_byObjectId
removed_byObjectId

UserAndDeviceLog — user_and_device_logs collection

File: models/userAndDeviceLogsModel.js

Audit trail for device↔user assignments.

FieldTypeRequired
user_idObjectId
device_idObjectId
added_dateDate
removed_dateDate
added_byObjectId
removed_byObjectId

NotificationReceiver — notification_receivers collection

File: models/notificationReceiver.js

FieldTypeRequired
unit_idObjectId
email_recipient_ids[ObjectId]
sms_recipient_ids[ObjectId]
email_alertBoolean
sms_alertBoolean

Intecog Logistech IoT Monitoring Platform