Files
GreenHomeBack/src/GreenHome.Application/Dtos.cs
2025-12-19 11:07:31 +03:30

380 lines
13 KiB
C#

using Domain = GreenHome.Domain;
namespace GreenHome.Application;
// DTOs
public sealed class DeviceDto
{
public int Id { get; set; }
public string DeviceName { get; set; } = string.Empty;
public int UserId { get; set; }
public string UserName { get; set; } = string.Empty;
public string UserFamily { get; set; } = string.Empty;
public string UserMobile { get; set; } = string.Empty;
public string Location { get; set; } = string.Empty;
public string NeshanLocation { get; set; } = string.Empty;
}
public sealed class TelemetryDto
{
public int Id { get; set; }
public int DeviceId { get; set; }
public string DeviceName { get; set; }
public DateTime TimestampUtc { get; set; }
public decimal TemperatureC { get; set; }
public decimal HumidityPercent { get; set; }
public decimal SoilPercent { get; set; }
public int GasPPM { get; set; }
public decimal Lux { get; set; }
public int PersianYear { get; set; }
public int PersianMonth { get; set; }
public string PersianDate { get; set; } = string.Empty;
public DateTime ServerTimestampUtc { get; set; }
}
public sealed class TelemetryFilter
{
public int? DeviceId { get; set; }
public DateTime? StartDateUtc { get; set; }
public DateTime? EndDateUtc { get; set; }
public int Page { get; set; } = 1;
public int PageSize { get; set; } = 20;
}
public sealed class PagedResult<T>
{
public required IReadOnlyList<T> Items { get; init; }
public required int TotalCount { get; init; }
public required int Page { get; init; }
public required int PageSize { get; init; }
}
public sealed class TelemetryMinMax
{
public decimal MinTemperatureC { get; set; }
public decimal MaxTemperatureC { get; set; }
public decimal MinHumidityPercent { get; set; }
public decimal MaxHumidityPercent { get; set; }
public decimal MinSoilPercent { get; set; }
public decimal MaxSoilPercent { get; set; }
public int MinGasPPM { get; set; }
public int MaxGasPPM { get; set; }
public decimal MinLux { get; set; }
public decimal MaxLux { get; set; }
}
public sealed class DayCount
{
public string PersianDate { get; set; } = string.Empty;
public int Count { get; set; }
}
public sealed class SendCodeRequest
{
public required string Mobile { get; set; }
}
public sealed class SendCodeResponse
{
public bool Success { get; set; }
public string? Message { get; set; }
public int ResendAfterSeconds { get; set; } = 120;
}
public sealed class VerifyCodeRequest
{
public required string Mobile { get; set; }
public required string Code { get; set; }
}
public sealed class VerifyCodeResponse
{
public bool Success { get; set; }
public string? Message { get; set; }
public string? Token { get; set; }
public UserDto? User { get; set; }
}
public sealed class UserDto
{
public int Id { get; set; }
public string Mobile { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public string Family { get; set; } = string.Empty;
public Domain.UserRole Role { get; set; }
}
public sealed class DeviceFilter
{
public int? UserId { get; set; }
public string? Search { get; set; } // جستجو در نام دستگاه، نام صاحب، نام خانوادگی صاحب، Location
public int Page { get; set; } = 1;
public int PageSize { get; set; } = 10;
}
public sealed class DeviceSettingsDto
{
public int Id { get; set; }
public int DeviceId { get; set; }
public string DeviceName { get; set; } = string.Empty;
public string Province { get; set; } = string.Empty;
public string City { get; set; } = string.Empty;
public decimal? Latitude { get; set; }
public decimal? Longitude { get; set; }
public string ProductType { get; set; } = string.Empty;
public int MinimumSmsIntervalMinutes { get; set; } = 15;
public int MinimumCallIntervalMinutes { get; set; } = 60;
public decimal? AreaSquareMeters { get; set; }
public int UploadIntervalMin { get; set; } = 5;
public string DevicePhoneNumber { get; set; } = string.Empty;
public Domain.SimCardType? SimCardType { get; set; }
public string? TokenCode { get; set; }
public string? VerificationCode { get; set; }
public DateTime? TokenExpiresAt { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
}
public sealed class AlertConditionDto
{
public int Id { get; set; }
public int DeviceId { get; set; }
public string DeviceName { get; set; } = string.Empty;
public Domain.AlertNotificationType NotificationType { get; set; }
public Domain.AlertTimeType TimeType { get; set; }
public int CallCooldownMinutes { get; set; } = 60;
public int SmsCooldownMinutes { get; set; } = 15;
public bool IsEnabled { get; set; } = true;
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
public List<AlertRuleDto> Rules { get; set; } = new();
}
public sealed class AlertRuleDto
{
public int Id { get; set; }
public int AlertConditionId { get; set; }
public Domain.SensorType SensorType { get; set; }
public Domain.ComparisonType ComparisonType { get; set; }
public decimal Value1 { get; set; }
public decimal? Value2 { get; set; }
public int Order { get; set; }
}
public sealed class CreateAlertConditionRequest
{
public required int DeviceId { get; set; }
public required Domain.AlertNotificationType NotificationType { get; set; }
public required Domain.AlertTimeType TimeType { get; set; }
public int CallCooldownMinutes { get; set; } = 60;
public int SmsCooldownMinutes { get; set; } = 15;
public bool IsEnabled { get; set; } = true;
public required List<CreateAlertRuleRequest> Rules { get; set; }
}
public sealed class CreateAlertRuleRequest
{
public required Domain.SensorType SensorType { get; set; }
public required Domain.ComparisonType ComparisonType { get; set; }
public required decimal Value1 { get; set; }
public decimal? Value2 { get; set; }
public int Order { get; set; }
}
public sealed class UpdateAlertConditionRequest
{
public required int Id { get; set; }
public required Domain.AlertNotificationType NotificationType { get; set; }
public required Domain.AlertTimeType TimeType { get; set; }
public int CallCooldownMinutes { get; set; } = 60;
public int SmsCooldownMinutes { get; set; } = 15;
public bool IsEnabled { get; set; } = true;
public required List<CreateAlertRuleRequest> Rules { get; set; }
}
public sealed class DailyReportRequest
{
public required int DeviceId { get; set; }
public required string PersianDate { get; set; } // yyyy/MM/dd
}
public sealed class DailyReportResponse
{
public int Id { get; set; }
public int DeviceId { get; set; }
public string DeviceName { get; set; } = string.Empty;
public string PersianDate { get; set; } = string.Empty;
public string Analysis { get; set; } = string.Empty;
public int RecordCount { get; set; }
public int SampledRecordCount { get; set; }
public int TotalTokens { get; set; }
public DateTime CreatedAt { get; set; }
public bool FromCache { get; set; }
}
public sealed class WeeklyAnalysisRequest
{
public required int DeviceId { get; set; }
public required string StartDate { get; set; } // yyyy/MM/dd
public required string EndDate { get; set; } // yyyy/MM/dd
}
public sealed class MonthlyAnalysisRequest
{
public required int DeviceId { get; set; }
public required int Year { get; set; }
public required int Month { get; set; }
}
public sealed class AlertLogDto
{
public int Id { get; set; }
public int DeviceId { get; set; }
public string DeviceName { get; set; } = string.Empty;
public int UserId { get; set; }
public string UserName { get; set; } = string.Empty;
public string UserMobile { get; set; } = string.Empty;
public int? AlertConditionId { get; set; }
public Domain.AlertType AlertType { get; set; }
public Domain.AlertNotificationType NotificationType { get; set; }
public string Message { get; set; } = string.Empty;
public Domain.AlertStatus Status { get; set; }
public string? ErrorMessage { get; set; }
public string PhoneNumber { get; set; } = string.Empty;
public DateTime SentAt { get; set; }
public long ProcessingTimeMs { get; set; }
}
public sealed class AlertLogFilter
{
public int? DeviceId { get; set; }
public int? UserId { get; set; }
public Domain.AlertType? AlertType { get; set; }
public Domain.AlertStatus? Status { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public int Page { get; set; } = 1;
public int PageSize { get; set; } = 20;
}
public sealed class UserDailyReportDto
{
public int Id { get; set; }
public int DeviceId { get; set; }
public string DeviceName { get; set; } = string.Empty;
public int UserId { get; set; }
public string UserName { get; set; } = string.Empty;
public string UserFamily { get; set; } = string.Empty;
public string PersianDate { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string Observations { get; set; } = string.Empty;
public string Operations { get; set; } = string.Empty;
public string? Notes { get; set; }
public List<ReportImageDto> Images { get; set; } = new();
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
}
public sealed class ReportImageDto
{
public int Id { get; set; }
public string FileName { get; set; } = string.Empty;
public string FilePath { get; set; } = string.Empty;
public string ContentType { get; set; } = string.Empty;
public long FileSize { get; set; }
public string? Description { get; set; }
public DateTime UploadedAt { get; set; }
}
public sealed class CreateUserDailyReportRequest
{
public required int DeviceId { get; set; }
public required int UserId { get; set; }
public required string PersianDate { get; set; }
public required string Title { get; set; }
public required string Observations { get; set; }
public required string Operations { get; set; }
public string? Notes { get; set; }
}
public sealed class UpdateUserDailyReportRequest
{
public required int Id { get; set; }
public required string Title { get; set; }
public required string Observations { get; set; }
public required string Operations { get; set; }
public string? Notes { get; set; }
}
public sealed class UserDailyReportFilter
{
public int? DeviceId { get; set; }
public int? UserId { get; set; }
public string? PersianDate { get; set; }
public int? Year { get; set; }
public int? Month { get; set; }
public int Page { get; set; } = 1;
public int PageSize { get; set; } = 20;
}
// DTOs برای مدیریت توکن دستگاه
/// <summary>
/// درخواست دریافت فاصله زمانی آپلود
/// </summary>
public sealed class GetUploadIntervalRequest
{
public int? DeviceId { get; set; }
public string? DevicePhoneNumber { get; set; }
}
/// <summary>
/// پاسخ دریافت فاصله زمانی آپلود
/// </summary>
public sealed class GetUploadIntervalResponse
{
public bool Success { get; set; }
public string? Message { get; set; }
public int? UploadIntervalMin { get; set; }
}
/// <summary>
/// درخواست دریافت توکن دستگاه
/// </summary>
public sealed class RequestDeviceTokenRequest
{
public required string DevicePhoneNumber { get; set; }
}
/// <summary>
/// پاسخ دریافت توکن دستگاه
/// </summary>
public sealed class RequestDeviceTokenResponse
{
public bool Success { get; set; }
public string? Message { get; set; }
public string? TokenCode { get; set; }
}
/// <summary>
/// درخواست تایید توکن دستگاه
/// </summary>
public sealed class VerifyDeviceTokenRequest
{
public required string DevicePhoneNumber { get; set; }
public required string VerificationCode { get; set; }
}
/// <summary>
/// پاسخ تایید توکن دستگاه
/// </summary>
public sealed class VerifyDeviceTokenResponse
{
public bool Success { get; set; }
public string? Message { get; set; }
public string? EncodedSettings { get; set; }
}