diff --git a/api/src/gateway/gateway.dto.ts b/api/src/gateway/gateway.dto.ts index 63df517..9659e63 100644 --- a/api/src/gateway/gateway.dto.ts +++ b/api/src/gateway/gateway.dto.ts @@ -468,6 +468,13 @@ export class HeartbeatInputDTO { }) receiveSMSEnabled?: boolean + @ApiProperty({ + type: Number, + required: false, + description: 'SMS send delay in seconds (0-3600), used by device queue', + }) + smsSendDelaySeconds?: number + @ApiProperty({ type: SimInfoCollectionDTO, required: false }) simInfo?: SimInfoCollectionDTO } diff --git a/api/src/gateway/gateway.service.ts b/api/src/gateway/gateway.service.ts index 32467ec..98c3fa7 100644 --- a/api/src/gateway/gateway.service.ts +++ b/api/src/gateway/gateway.service.ts @@ -1089,6 +1089,15 @@ const updatedSms = await this.smsModel.findByIdAndUpdate( updateData.receiveSMSEnabled = input.receiveSMSEnabled } + // Update smsSendDelaySeconds if provided (clamp 0-3600) + if (input.smsSendDelaySeconds !== undefined) { + const clamped = Math.min( + 3600, + Math.max(0, Math.floor(Number(input.smsSendDelaySeconds))), + ) + updateData.smsSendDelaySeconds = clamped + } + // Update batteryInfo if provided if (input.batteryPercentage !== undefined || input.isCharging !== undefined) { if (input.batteryPercentage !== undefined) { diff --git a/api/src/gateway/schemas/device.schema.ts b/api/src/gateway/schemas/device.schema.ts index 7bdb2d2..d6657e6 100644 --- a/api/src/gateway/schemas/device.schema.ts +++ b/api/src/gateway/schemas/device.schema.ts @@ -4,6 +4,9 @@ import { User } from '../../users/schemas/user.schema' export type DeviceDocument = Device & Document +/** Default delay between SMS sends (seconds). 5s helps avoid carrier/device throttling. */ +export const DEFAULT_SMS_SEND_DELAY_SECONDS = 5 + @Schema({ timestamps: true }) export class Device { _id?: Types.ObjectId @@ -62,6 +65,9 @@ export class Device { @Prop({ type: Boolean, default: false }) receiveSMSEnabled: boolean + @Prop({ type: Number, default: DEFAULT_SMS_SEND_DELAY_SECONDS }) + smsSendDelaySeconds: number + @Prop({ type: Date }) lastHeartbeat: Date