diff --git a/src/GreenHome.Application/Dtos.cs b/src/GreenHome.Application/Dtos.cs deleted file mode 100644 index c7e05bb..0000000 --- a/src/GreenHome.Application/Dtos.cs +++ /dev/null @@ -1,409 +0,0 @@ -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? Voltage { get; set; } - public decimal? BatteryVoltage { get; set; } - public decimal? BatteryPercent { get; set; } - public byte? Power { get; set; } - public byte? OldPower { 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 -{ - public required IReadOnlyList 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 int RelayCount { get; set; } = 4; - public string SmsRecievers { get; set; } = string.Empty; - 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 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; } -} - -/// -/// DTO for relay alert conditions (notificationType > 0) -/// -public sealed class RelayConditionDto -{ - public int Enabled { get; set; } - public int TimeType { get; set; } - public string Relay { get; set; } = string.Empty; - public List Rules { get; set; } = new(); -} - -/// -/// DTO for relay condition rules -/// -public sealed class RelayRuleDto -{ - public string Sensor { get; set; } = string.Empty; - public string Op { get; set; } = string.Empty; - public decimal V1 { get; set; } - public decimal? V2 { 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 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 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 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 برای مدیریت توکن دستگاه - -/// -/// درخواست دریافت فاصله زمانی آپلود -/// -public sealed class GetUploadIntervalRequest -{ - public int? DeviceId { get; set; } - public string? DevicePhoneNumber { get; set; } -} - -/// -/// پاسخ دریافت فاصله زمانی آپلود -/// -public sealed class GetUploadIntervalResponse -{ - public bool Success { get; set; } - public string? Message { get; set; } - public int? UploadIntervalMin { get; set; } -} - -/// -/// درخواست دریافت توکن دستگاه -/// -public sealed class RequestDeviceTokenRequest -{ - public required string DevicePhoneNumber { get; set; } -} - -/// -/// پاسخ دریافت توکن دستگاه -/// -public sealed class RequestDeviceTokenResponse -{ - public bool Success { get; set; } - public string? Message { get; set; } - public string? TokenCode { get; set; } -} - -/// -/// درخواست تایید توکن دستگاه -/// -public sealed class VerifyDeviceTokenRequest -{ - public required string DevicePhoneNumber { get; set; } - public required string VerificationCode { get; set; } -} - -/// -/// پاسخ تایید توکن دستگاه -/// -public sealed class VerifyDeviceTokenResponse -{ - public bool Success { get; set; } - public string? Message { get; set; } - public string? EncodedSettings { get; set; } -} \ No newline at end of file diff --git a/src/GreenHome.Application/Dtos/AI/AIQueryStats.cs b/src/GreenHome.Application/Dtos/AI/AIQueryStats.cs new file mode 100644 index 0000000..4e0904e --- /dev/null +++ b/src/GreenHome.Application/Dtos/AI/AIQueryStats.cs @@ -0,0 +1,42 @@ +namespace GreenHome.Application; + +/// +/// Statistics about AI query usage +/// +public sealed class AIQueryStats +{ + /// + /// Total number of queries made + /// + public int TotalQueries { get; set; } + + /// + /// Total tokens used across all queries + /// + public int TotalTokensUsed { get; set; } + + /// + /// Total prompt tokens used + /// + public int TotalPromptTokens { get; set; } + + /// + /// Total completion tokens used + /// + public int TotalCompletionTokens { get; set; } + + /// + /// Average response time in milliseconds + /// + public double AverageResponseTimeMs { get; set; } + + /// + /// Number of queries made today + /// + public int TodayQueries { get; set; } + + /// + /// Total tokens used today + /// + public int TodayTokens { get; set; } +} diff --git a/src/GreenHome.Application/Dtos/Alert/AlertConditionDto.cs b/src/GreenHome.Application/Dtos/Alert/AlertConditionDto.cs new file mode 100644 index 0000000..2dd27e8 --- /dev/null +++ b/src/GreenHome.Application/Dtos/Alert/AlertConditionDto.cs @@ -0,0 +1,29 @@ +using Domain = GreenHome.Domain; + +namespace GreenHome.Application; + +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 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; } +} diff --git a/src/GreenHome.Application/Dtos/Alert/AlertLogDto.cs b/src/GreenHome.Application/Dtos/Alert/AlertLogDto.cs new file mode 100644 index 0000000..27d0fd4 --- /dev/null +++ b/src/GreenHome.Application/Dtos/Alert/AlertLogDto.cs @@ -0,0 +1,22 @@ +using Domain = GreenHome.Domain; + +namespace GreenHome.Application; + +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; } +} diff --git a/src/GreenHome.Application/Dtos/Alert/AlertLogFilter.cs b/src/GreenHome.Application/Dtos/Alert/AlertLogFilter.cs new file mode 100644 index 0000000..365480c --- /dev/null +++ b/src/GreenHome.Application/Dtos/Alert/AlertLogFilter.cs @@ -0,0 +1,15 @@ +using Domain = GreenHome.Domain; + +namespace GreenHome.Application; + +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; +} diff --git a/src/GreenHome.Application/Dtos/Alert/CreateAlertConditionRequest.cs b/src/GreenHome.Application/Dtos/Alert/CreateAlertConditionRequest.cs new file mode 100644 index 0000000..a167e6e --- /dev/null +++ b/src/GreenHome.Application/Dtos/Alert/CreateAlertConditionRequest.cs @@ -0,0 +1,34 @@ +using Domain = GreenHome.Domain; + +namespace GreenHome.Application; + +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 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 Rules { get; set; } +} diff --git a/src/GreenHome.Application/Dtos/Alert/RelayConditionDto.cs b/src/GreenHome.Application/Dtos/Alert/RelayConditionDto.cs new file mode 100644 index 0000000..73d3f0f --- /dev/null +++ b/src/GreenHome.Application/Dtos/Alert/RelayConditionDto.cs @@ -0,0 +1,23 @@ +namespace GreenHome.Application; + +/// +/// DTO for relay alert conditions (notificationType > 0) +/// +public sealed class RelayConditionDto +{ + public int Enabled { get; set; } + public int TimeType { get; set; } + public string Relay { get; set; } = string.Empty; + public List Rules { get; set; } = new(); +} + +/// +/// DTO for relay condition rules +/// +public sealed class RelayRuleDto +{ + public string Sensor { get; set; } = string.Empty; + public string Op { get; set; } = string.Empty; + public decimal V1 { get; set; } + public decimal? V2 { get; set; } +} diff --git a/src/GreenHome.Application/Dtos/Auth/SendCodeRequest.cs b/src/GreenHome.Application/Dtos/Auth/SendCodeRequest.cs new file mode 100644 index 0000000..490a38f --- /dev/null +++ b/src/GreenHome.Application/Dtos/Auth/SendCodeRequest.cs @@ -0,0 +1,6 @@ +namespace GreenHome.Application; + +public sealed class SendCodeRequest +{ + public required string Mobile { get; set; } +} diff --git a/src/GreenHome.Application/Dtos/Auth/SendCodeResponse.cs b/src/GreenHome.Application/Dtos/Auth/SendCodeResponse.cs new file mode 100644 index 0000000..79d5503 --- /dev/null +++ b/src/GreenHome.Application/Dtos/Auth/SendCodeResponse.cs @@ -0,0 +1,8 @@ +namespace GreenHome.Application; + +public sealed class SendCodeResponse +{ + public bool Success { get; set; } + public string? Message { get; set; } + public int ResendAfterSeconds { get; set; } = 120; +} diff --git a/src/GreenHome.Application/Dtos/Auth/UserDto.cs b/src/GreenHome.Application/Dtos/Auth/UserDto.cs new file mode 100644 index 0000000..bc7c529 --- /dev/null +++ b/src/GreenHome.Application/Dtos/Auth/UserDto.cs @@ -0,0 +1,12 @@ +using Domain = GreenHome.Domain; + +namespace GreenHome.Application; + +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; } +} diff --git a/src/GreenHome.Application/Dtos/Auth/VerifyCodeRequest.cs b/src/GreenHome.Application/Dtos/Auth/VerifyCodeRequest.cs new file mode 100644 index 0000000..7509a38 --- /dev/null +++ b/src/GreenHome.Application/Dtos/Auth/VerifyCodeRequest.cs @@ -0,0 +1,7 @@ +namespace GreenHome.Application; + +public sealed class VerifyCodeRequest +{ + public required string Mobile { get; set; } + public required string Code { get; set; } +} diff --git a/src/GreenHome.Application/Dtos/Auth/VerifyCodeResponse.cs b/src/GreenHome.Application/Dtos/Auth/VerifyCodeResponse.cs new file mode 100644 index 0000000..19c4b6e --- /dev/null +++ b/src/GreenHome.Application/Dtos/Auth/VerifyCodeResponse.cs @@ -0,0 +1,9 @@ +namespace GreenHome.Application; + +public sealed class VerifyCodeResponse +{ + public bool Success { get; set; } + public string? Message { get; set; } + public string? Token { get; set; } + public UserDto? User { get; set; } +} diff --git a/src/GreenHome.Application/ChecklistDtos.cs b/src/GreenHome.Application/Dtos/Checklist/ChecklistDto.cs similarity index 99% rename from src/GreenHome.Application/ChecklistDtos.cs rename to src/GreenHome.Application/Dtos/Checklist/ChecklistDto.cs index ffa3739..8e48d67 100644 --- a/src/GreenHome.Application/ChecklistDtos.cs +++ b/src/GreenHome.Application/Dtos/Checklist/ChecklistDto.cs @@ -77,4 +77,3 @@ public sealed class CompleteChecklistItemRequest public bool IsChecked { get; set; } public string? Note { get; set; } } - diff --git a/src/GreenHome.Application/Dtos/Common/AlertCheckResult.cs b/src/GreenHome.Application/Dtos/Common/AlertCheckResult.cs new file mode 100644 index 0000000..b060eac --- /dev/null +++ b/src/GreenHome.Application/Dtos/Common/AlertCheckResult.cs @@ -0,0 +1,16 @@ +namespace GreenHome.Application; + +/// +/// Result of alert checking, used by TelemetryController.Create to build the line-protocol response +/// +public sealed class AlertCheckResult +{ + /// List of alert messages (condition alerts + power status) + public List Messages { get; set; } = new(); + + /// Comma-separated recipient phone numbers + public string? Recipients { get; set; } + + /// Power status: "connected", "disconnected", or null if unchanged + public string? PowerStatus { get; set; } +} diff --git a/src/GreenHome.Application/Dtos/Common/PagedResult.cs b/src/GreenHome.Application/Dtos/Common/PagedResult.cs new file mode 100644 index 0000000..79f0e9d --- /dev/null +++ b/src/GreenHome.Application/Dtos/Common/PagedResult.cs @@ -0,0 +1,9 @@ +namespace GreenHome.Application; + +public sealed class PagedResult +{ + public required IReadOnlyList Items { get; init; } + public required int TotalCount { get; init; } + public required int Page { get; init; } + public required int PageSize { get; init; } +} diff --git a/src/GreenHome.Application/Dtos/DailyReport/DailyReportRequest.cs b/src/GreenHome.Application/Dtos/DailyReport/DailyReportRequest.cs new file mode 100644 index 0000000..e1b84e1 --- /dev/null +++ b/src/GreenHome.Application/Dtos/DailyReport/DailyReportRequest.cs @@ -0,0 +1,21 @@ +namespace GreenHome.Application; + +public sealed class DailyReportRequest +{ + public required int DeviceId { get; set; } + public required string PersianDate { get; set; } // yyyy/MM/dd +} + +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; } +} diff --git a/src/GreenHome.Application/Dtos/DailyReport/DailyReportResponse.cs b/src/GreenHome.Application/Dtos/DailyReport/DailyReportResponse.cs new file mode 100644 index 0000000..89a79ad --- /dev/null +++ b/src/GreenHome.Application/Dtos/DailyReport/DailyReportResponse.cs @@ -0,0 +1,15 @@ +namespace GreenHome.Application; + +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; } +} diff --git a/src/GreenHome.Application/Dtos/Device/DeviceDto.cs b/src/GreenHome.Application/Dtos/Device/DeviceDto.cs new file mode 100644 index 0000000..08fae3f --- /dev/null +++ b/src/GreenHome.Application/Dtos/Device/DeviceDto.cs @@ -0,0 +1,13 @@ +namespace GreenHome.Application; + +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; +} diff --git a/src/GreenHome.Application/Dtos/Device/DeviceFilter.cs b/src/GreenHome.Application/Dtos/Device/DeviceFilter.cs new file mode 100644 index 0000000..b48e11a --- /dev/null +++ b/src/GreenHome.Application/Dtos/Device/DeviceFilter.cs @@ -0,0 +1,9 @@ +namespace GreenHome.Application; + +public sealed class DeviceFilter +{ + public int? UserId { get; set; } + public string? Search { get; set; } + public int Page { get; set; } = 1; + public int PageSize { get; set; } = 10; +} diff --git a/src/GreenHome.Application/Dtos/Device/DeviceSettingsDto.cs b/src/GreenHome.Application/Dtos/Device/DeviceSettingsDto.cs new file mode 100644 index 0000000..e2d5483 --- /dev/null +++ b/src/GreenHome.Application/Dtos/Device/DeviceSettingsDto.cs @@ -0,0 +1,30 @@ +namespace GreenHome.Application; + +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 int RelayCount { get; set; } = 4; + public string SmsRecievers { get; set; } = string.Empty; + 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; } +} diff --git a/src/GreenHome.Application/DevicePostDtos.cs b/src/GreenHome.Application/Dtos/DevicePost/DevicePostDto.cs similarity index 99% rename from src/GreenHome.Application/DevicePostDtos.cs rename to src/GreenHome.Application/Dtos/DevicePost/DevicePostDto.cs index 6fe21fb..922ae42 100644 --- a/src/GreenHome.Application/DevicePostDtos.cs +++ b/src/GreenHome.Application/Dtos/DevicePost/DevicePostDto.cs @@ -43,4 +43,3 @@ public sealed class DevicePostFilter public int Page { get; set; } = 1; public int PageSize { get; set; } = 20; } - diff --git a/src/GreenHome.Application/Dtos/DeviceToken/GetUploadIntervalRequest.cs b/src/GreenHome.Application/Dtos/DeviceToken/GetUploadIntervalRequest.cs new file mode 100644 index 0000000..7a7d411 --- /dev/null +++ b/src/GreenHome.Application/Dtos/DeviceToken/GetUploadIntervalRequest.cs @@ -0,0 +1,20 @@ +namespace GreenHome.Application; + +/// +/// درخواست دریافت فاصله زمانی آپلود +/// +public sealed class GetUploadIntervalRequest +{ + public int? DeviceId { get; set; } + public string? DevicePhoneNumber { get; set; } +} + +/// +/// پاسخ دریافت فاصله زمانی آپلود +/// +public sealed class GetUploadIntervalResponse +{ + public bool Success { get; set; } + public string? Message { get; set; } + public int? UploadIntervalMin { get; set; } +} diff --git a/src/GreenHome.Application/Dtos/DeviceToken/RequestDeviceTokenRequest.cs b/src/GreenHome.Application/Dtos/DeviceToken/RequestDeviceTokenRequest.cs new file mode 100644 index 0000000..7993ebb --- /dev/null +++ b/src/GreenHome.Application/Dtos/DeviceToken/RequestDeviceTokenRequest.cs @@ -0,0 +1,19 @@ +namespace GreenHome.Application; + +/// +/// درخواست دریافت توکن دستگاه +/// +public sealed class RequestDeviceTokenRequest +{ + public required string DevicePhoneNumber { get; set; } +} + +/// +/// پاسخ دریافت توکن دستگاه +/// +public sealed class RequestDeviceTokenResponse +{ + public bool Success { get; set; } + public string? Message { get; set; } + public string? TokenCode { get; set; } +} diff --git a/src/GreenHome.Application/Dtos/DeviceToken/VerifyDeviceTokenRequest.cs b/src/GreenHome.Application/Dtos/DeviceToken/VerifyDeviceTokenRequest.cs new file mode 100644 index 0000000..5ded6a1 --- /dev/null +++ b/src/GreenHome.Application/Dtos/DeviceToken/VerifyDeviceTokenRequest.cs @@ -0,0 +1,20 @@ +namespace GreenHome.Application; + +/// +/// درخواست تایید توکن دستگاه +/// +public sealed class VerifyDeviceTokenRequest +{ + public required string DevicePhoneNumber { get; set; } + public required string VerificationCode { get; set; } +} + +/// +/// پاسخ تایید توکن دستگاه +/// +public sealed class VerifyDeviceTokenResponse +{ + public bool Success { get; set; } + public string? Message { get; set; } + public string? EncodedSettings { get; set; } +} diff --git a/src/GreenHome.Application/IMonthlyReportService.cs b/src/GreenHome.Application/Dtos/MonthlyReport/MonthlyReportDto.cs similarity index 89% rename from src/GreenHome.Application/IMonthlyReportService.cs rename to src/GreenHome.Application/Dtos/MonthlyReport/MonthlyReportDto.cs index 16911a5..6d29ad4 100644 --- a/src/GreenHome.Application/IMonthlyReportService.cs +++ b/src/GreenHome.Application/Dtos/MonthlyReport/MonthlyReportDto.cs @@ -1,10 +1,5 @@ namespace GreenHome.Application; -public interface IMonthlyReportService -{ - Task GetMonthlyReportAsync(int deviceId, int year, int month, CancellationToken cancellationToken); -} - public sealed class MonthlyReportDto { public int DeviceId { get; set; } @@ -42,4 +37,3 @@ public sealed class MonthlyReportDto public DateTime GeneratedAt { get; set; } } - diff --git a/src/GreenHome.Application/Dtos/PowerOutage/PowerOutageLogDto.cs b/src/GreenHome.Application/Dtos/PowerOutage/PowerOutageLogDto.cs new file mode 100644 index 0000000..1437276 --- /dev/null +++ b/src/GreenHome.Application/Dtos/PowerOutage/PowerOutageLogDto.cs @@ -0,0 +1,26 @@ +namespace GreenHome.Application; + +public sealed class PowerOutageLogDto +{ + public int Id { get; set; } + public int DeviceId { get; set; } + public string DeviceName { get; set; } = string.Empty; + public byte PreviousPower { get; set; } + public byte CurrentPower { get; set; } + public string EventType { get; set; } = string.Empty; // "Connected" or "Disconnected" + public string EventTypePersian { get; set; } = string.Empty; // "وصل" or "قطع" + public DateTime TimestampUtc { get; set; } + public DateTime ServerTimestampUtc { get; set; } + public string PersianDate { get; set; } = string.Empty; +} + +public sealed class PowerOutageFilter +{ + public int? EventType { get; set; } // 1 = Connected, 2 = Disconnected + public DateTime? StartDateUtc { get; set; } + public DateTime? EndDateUtc { get; set; } + public int? PersianYear { get; set; } + public int? PersianMonth { get; set; } + public int Page { get; set; } = 1; + public int PageSize { get; set; } = 20; +} diff --git a/src/GreenHome.Application/Dtos/PowerOutage/PowerOutageSummaryDto.cs b/src/GreenHome.Application/Dtos/PowerOutage/PowerOutageSummaryDto.cs new file mode 100644 index 0000000..0209d84 --- /dev/null +++ b/src/GreenHome.Application/Dtos/PowerOutage/PowerOutageSummaryDto.cs @@ -0,0 +1,24 @@ +namespace GreenHome.Application; + +/// +/// خلاصه قطعی‌های برق یک دستگاه در یک بازه زمانی +/// +public sealed class PowerOutageSummaryDto +{ + public int DeviceId { get; set; } + public int TotalOutageCount { get; set; } + public long TotalDowntimeSeconds { get; set; } + public DateTime? StartDateUtc { get; set; } + public DateTime? EndDateUtc { get; set; } + public List Outages { get; set; } = new(); +} + +/// +/// یک جفت قطع و وصل برق (مدت زمان قطعی) +/// +public sealed class PowerOutagePairDto +{ + public DateTime DisconnectedAt { get; set; } + public DateTime? ConnectedAt { get; set; } + public long? DurationSeconds { get; set; } +} diff --git a/src/GreenHome.Application/Dtos/Telemetry/DayCount.cs b/src/GreenHome.Application/Dtos/Telemetry/DayCount.cs new file mode 100644 index 0000000..27119dc --- /dev/null +++ b/src/GreenHome.Application/Dtos/Telemetry/DayCount.cs @@ -0,0 +1,7 @@ +namespace GreenHome.Application; + +public sealed class DayCount +{ + public string PersianDate { get; set; } = string.Empty; + public int Count { get; set; } +} diff --git a/src/GreenHome.Application/Dtos/Telemetry/TelemetryDto.cs b/src/GreenHome.Application/Dtos/Telemetry/TelemetryDto.cs new file mode 100644 index 0000000..83b3b19 --- /dev/null +++ b/src/GreenHome.Application/Dtos/Telemetry/TelemetryDto.cs @@ -0,0 +1,23 @@ +namespace GreenHome.Application; + +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? Voltage { get; set; } + public decimal? BatteryVoltage { get; set; } + public decimal? BatteryPercent { get; set; } + public byte? Power { get; set; } + public byte? OldPower { 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; } +} diff --git a/src/GreenHome.Application/Dtos/Telemetry/TelemetryFilter.cs b/src/GreenHome.Application/Dtos/Telemetry/TelemetryFilter.cs new file mode 100644 index 0000000..0da8e27 --- /dev/null +++ b/src/GreenHome.Application/Dtos/Telemetry/TelemetryFilter.cs @@ -0,0 +1,10 @@ +namespace GreenHome.Application; + +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; +} diff --git a/src/GreenHome.Application/Dtos/Telemetry/TelemetryMinMax.cs b/src/GreenHome.Application/Dtos/Telemetry/TelemetryMinMax.cs new file mode 100644 index 0000000..4d9707d --- /dev/null +++ b/src/GreenHome.Application/Dtos/Telemetry/TelemetryMinMax.cs @@ -0,0 +1,15 @@ +namespace GreenHome.Application; + +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; } +} diff --git a/src/GreenHome.Application/Dtos/UserDailyReport/CreateUserDailyReportRequest.cs b/src/GreenHome.Application/Dtos/UserDailyReport/CreateUserDailyReportRequest.cs new file mode 100644 index 0000000..0dc9379 --- /dev/null +++ b/src/GreenHome.Application/Dtos/UserDailyReport/CreateUserDailyReportRequest.cs @@ -0,0 +1,32 @@ +namespace GreenHome.Application; + +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; +} diff --git a/src/GreenHome.Application/Dtos/UserDailyReport/UserDailyReportDto.cs b/src/GreenHome.Application/Dtos/UserDailyReport/UserDailyReportDto.cs new file mode 100644 index 0000000..e6cb2b6 --- /dev/null +++ b/src/GreenHome.Application/Dtos/UserDailyReport/UserDailyReportDto.cs @@ -0,0 +1,30 @@ +namespace GreenHome.Application; + +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 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; } +} diff --git a/src/GreenHome.Application/IAIQueryService.cs b/src/GreenHome.Application/Interfaces/IAIQueryService.cs similarity index 66% rename from src/GreenHome.Application/IAIQueryService.cs rename to src/GreenHome.Application/Interfaces/IAIQueryService.cs index 6ddfd19..789fdd3 100644 --- a/src/GreenHome.Application/IAIQueryService.cs +++ b/src/GreenHome.Application/Interfaces/IAIQueryService.cs @@ -33,27 +33,7 @@ public interface IAIQueryService Task GetUserTotalTokensAsync(int userId, CancellationToken cancellationToken = default); /// - /// Gets recent queries (all) - /// - Task> GetRecentQueriesAsync(int take = 20, CancellationToken cancellationToken = default); - - /// - /// Gets query statistics + /// Gets AI query statistics (totals, averages, today's usage) /// Task GetStatsAsync(CancellationToken cancellationToken = default); } - -/// -/// Statistics about AI queries -/// -public class AIQueryStats -{ - public int TotalQueries { get; set; } - public int TotalTokensUsed { get; set; } - public int TotalPromptTokens { get; set; } - public int TotalCompletionTokens { get; set; } - public double AverageResponseTimeMs { get; set; } - public int TodayQueries { get; set; } - public int TodayTokens { get; set; } -} - diff --git a/src/GreenHome.Application/IAlertConditionService.cs b/src/GreenHome.Application/Interfaces/IAlertConditionService.cs similarity index 99% rename from src/GreenHome.Application/IAlertConditionService.cs rename to src/GreenHome.Application/Interfaces/IAlertConditionService.cs index c532eda..ea60e48 100644 --- a/src/GreenHome.Application/IAlertConditionService.cs +++ b/src/GreenHome.Application/Interfaces/IAlertConditionService.cs @@ -22,4 +22,3 @@ public interface IAlertConditionService Task HasUpdatedConditionsAsync(int deviceId, DateTime? lastUpdateDate, CancellationToken cancellationToken); } - diff --git a/src/GreenHome.Application/IAlertLogService.cs b/src/GreenHome.Application/Interfaces/IAlertLogService.cs similarity index 99% rename from src/GreenHome.Application/IAlertLogService.cs rename to src/GreenHome.Application/Interfaces/IAlertLogService.cs index ee065ed..244d387 100644 --- a/src/GreenHome.Application/IAlertLogService.cs +++ b/src/GreenHome.Application/Interfaces/IAlertLogService.cs @@ -6,4 +6,3 @@ public interface IAlertLogService Task GetAlertLogByIdAsync(int id, CancellationToken cancellationToken); Task CreateAlertLogAsync(AlertLogDto dto, CancellationToken cancellationToken); } - diff --git a/src/GreenHome.Application/IAlertService.cs b/src/GreenHome.Application/Interfaces/IAlertService.cs similarity index 54% rename from src/GreenHome.Application/IAlertService.cs rename to src/GreenHome.Application/Interfaces/IAlertService.cs index fd6b55a..f1f1368 100644 --- a/src/GreenHome.Application/IAlertService.cs +++ b/src/GreenHome.Application/Interfaces/IAlertService.cs @@ -2,7 +2,6 @@ namespace GreenHome.Application; public interface IAlertService { - Task CheckAndSendAlertsAsync(int deviceId, TelemetryDto telemetry, CancellationToken cancellationToken); + Task CheckAndSendAlertsAsync(int deviceId, TelemetryDto telemetry, CancellationToken cancellationToken); Task SendPowerOutageAlertAsync(int deviceId, CancellationToken cancellationToken); } - diff --git a/src/GreenHome.Application/IAuthService.cs b/src/GreenHome.Application/Interfaces/IAuthService.cs similarity index 99% rename from src/GreenHome.Application/IAuthService.cs rename to src/GreenHome.Application/Interfaces/IAuthService.cs index b4c4ff4..fb7962a 100644 --- a/src/GreenHome.Application/IAuthService.cs +++ b/src/GreenHome.Application/Interfaces/IAuthService.cs @@ -6,4 +6,3 @@ public interface IAuthService Task VerifyCodeAsync(VerifyCodeRequest request, CancellationToken cancellationToken); Task CanResendCodeAsync(string mobile, CancellationToken cancellationToken); } - diff --git a/src/GreenHome.Application/IChecklistService.cs b/src/GreenHome.Application/Interfaces/IChecklistService.cs similarity index 99% rename from src/GreenHome.Application/IChecklistService.cs rename to src/GreenHome.Application/Interfaces/IChecklistService.cs index e05fe61..26443e6 100644 --- a/src/GreenHome.Application/IChecklistService.cs +++ b/src/GreenHome.Application/Interfaces/IChecklistService.cs @@ -9,4 +9,3 @@ public interface IChecklistService Task> GetCompletionsByChecklistIdAsync(int checklistId, CancellationToken cancellationToken); Task CompleteChecklistAsync(CompleteChecklistRequest request, CancellationToken cancellationToken); } - diff --git a/src/GreenHome.Application/IDailyReportService.cs b/src/GreenHome.Application/Interfaces/IDailyReportService.cs similarity index 99% rename from src/GreenHome.Application/IDailyReportService.cs rename to src/GreenHome.Application/Interfaces/IDailyReportService.cs index c2b7a14..02971b8 100644 --- a/src/GreenHome.Application/IDailyReportService.cs +++ b/src/GreenHome.Application/Interfaces/IDailyReportService.cs @@ -14,4 +14,3 @@ public interface IDailyReportService Task GetMonthlyAnalysisAsync(MonthlyAnalysisRequest request, CancellationToken cancellationToken); } - diff --git a/src/GreenHome.Application/IDevicePostService.cs b/src/GreenHome.Application/Interfaces/IDevicePostService.cs similarity index 99% rename from src/GreenHome.Application/IDevicePostService.cs rename to src/GreenHome.Application/Interfaces/IDevicePostService.cs index 1349a72..f79320c 100644 --- a/src/GreenHome.Application/IDevicePostService.cs +++ b/src/GreenHome.Application/Interfaces/IDevicePostService.cs @@ -11,4 +11,3 @@ public interface IDevicePostService Task DeleteImageAsync(int imageId, CancellationToken cancellationToken); Task CanUserAccessDeviceAsync(int userId, int deviceId, CancellationToken cancellationToken); } - diff --git a/src/GreenHome.Application/IDeviceService.cs b/src/GreenHome.Application/Interfaces/IDeviceService.cs similarity index 89% rename from src/GreenHome.Application/IDeviceService.cs rename to src/GreenHome.Application/Interfaces/IDeviceService.cs index 334ad17..879dc94 100644 --- a/src/GreenHome.Application/IDeviceService.cs +++ b/src/GreenHome.Application/Interfaces/IDeviceService.cs @@ -1,11 +1,10 @@ -namespace GreenHome.Application; - -// Services -public interface IDeviceService -{ - Task AddDeviceAsync(DeviceDto dto, CancellationToken cancellationToken); - Task> ListAsync(CancellationToken cancellationToken); - Task GetDeviceId(string deviceName, CancellationToken cancellationToken); - Task> GetUserDevicesAsync(int userId, CancellationToken cancellationToken); - Task> GetDevicesAsync(DeviceFilter filter, CancellationToken cancellationToken); -} +namespace GreenHome.Application; + +public interface IDeviceService +{ + Task AddDeviceAsync(DeviceDto dto, CancellationToken cancellationToken); + Task> ListAsync(CancellationToken cancellationToken); + Task GetDeviceId(string deviceName, CancellationToken cancellationToken); + Task> GetUserDevicesAsync(int userId, CancellationToken cancellationToken); + Task> GetDevicesAsync(DeviceFilter filter, CancellationToken cancellationToken); +} diff --git a/src/GreenHome.Application/IDeviceSettingsService.cs b/src/GreenHome.Application/Interfaces/IDeviceSettingsService.cs similarity index 87% rename from src/GreenHome.Application/IDeviceSettingsService.cs rename to src/GreenHome.Application/Interfaces/IDeviceSettingsService.cs index dc3718b..a38ae66 100644 --- a/src/GreenHome.Application/IDeviceSettingsService.cs +++ b/src/GreenHome.Application/Interfaces/IDeviceSettingsService.cs @@ -1,8 +1,8 @@ -namespace GreenHome.Application; - -public interface IDeviceSettingsService -{ - Task GetByDeviceIdAsync(int deviceId, CancellationToken cancellationToken); - Task CreateAsync(DeviceSettingsDto dto, CancellationToken cancellationToken); - Task UpdateAsync(DeviceSettingsDto dto, CancellationToken cancellationToken); -} +namespace GreenHome.Application; + +public interface IDeviceSettingsService +{ + Task GetByDeviceIdAsync(int deviceId, CancellationToken cancellationToken); + Task CreateAsync(DeviceSettingsDto dto, CancellationToken cancellationToken); + Task UpdateAsync(DeviceSettingsDto dto, CancellationToken cancellationToken); +} diff --git a/src/GreenHome.Application/IDeviceTokenService.cs b/src/GreenHome.Application/Interfaces/IDeviceTokenService.cs similarity index 99% rename from src/GreenHome.Application/IDeviceTokenService.cs rename to src/GreenHome.Application/Interfaces/IDeviceTokenService.cs index f98d892..77513ed 100644 --- a/src/GreenHome.Application/IDeviceTokenService.cs +++ b/src/GreenHome.Application/Interfaces/IDeviceTokenService.cs @@ -20,4 +20,3 @@ public interface IDeviceTokenService /// Task VerifyDeviceTokenAsync(VerifyDeviceTokenRequest request, CancellationToken cancellationToken); } - diff --git a/src/GreenHome.Application/Interfaces/IMonthlyReportService.cs b/src/GreenHome.Application/Interfaces/IMonthlyReportService.cs new file mode 100644 index 0000000..dea49c6 --- /dev/null +++ b/src/GreenHome.Application/Interfaces/IMonthlyReportService.cs @@ -0,0 +1,6 @@ +namespace GreenHome.Application; + +public interface IMonthlyReportService +{ + Task GetMonthlyReportAsync(int deviceId, int year, int month, CancellationToken cancellationToken); +} diff --git a/src/GreenHome.Application/Interfaces/IPowerOutageLogService.cs b/src/GreenHome.Application/Interfaces/IPowerOutageLogService.cs new file mode 100644 index 0000000..be10f3c --- /dev/null +++ b/src/GreenHome.Application/Interfaces/IPowerOutageLogService.cs @@ -0,0 +1,23 @@ +namespace GreenHome.Application; + +/// +/// سرویس لاگ قطع و وصل برق دستگاه +/// +public interface IPowerOutageLogService +{ + /// + /// ثبت یک رویداد قطع یا وصل برق + /// + Task LogPowerChangeAsync(int deviceId, byte previousPower, byte currentPower, DateTime timestampUtc, CancellationToken cancellationToken); + + /// + /// دریافت لیست رویدادهای برق یک دستگاه + /// + Task> ListAsync(int deviceId, PowerOutageFilter filter, CancellationToken cancellationToken); + + /// + /// مهاجرت داده‌های قدیمی از جدول Telemetry به PowerOutageLogs + /// تشخیص تغییرات Power در رکوردهای متوالی هر دستگاه + /// + Task MigrateFromTelemetryAsync(int? deviceId, CancellationToken cancellationToken); +} diff --git a/src/GreenHome.Application/ISunCalculatorService.cs b/src/GreenHome.Application/Interfaces/ISunCalculatorService.cs similarity index 99% rename from src/GreenHome.Application/ISunCalculatorService.cs rename to src/GreenHome.Application/Interfaces/ISunCalculatorService.cs index 888a095..ed1e2f6 100644 --- a/src/GreenHome.Application/ISunCalculatorService.cs +++ b/src/GreenHome.Application/Interfaces/ISunCalculatorService.cs @@ -11,4 +11,3 @@ public interface ISunCalculatorService /// true اگر روز باشد، false اگر شب باشد bool IsDaytime(DateTime dateTime, decimal latitude, decimal longitude); } - diff --git a/src/GreenHome.Application/ITelemetryService.cs b/src/GreenHome.Application/Interfaces/ITelemetryService.cs similarity index 93% rename from src/GreenHome.Application/ITelemetryService.cs rename to src/GreenHome.Application/Interfaces/ITelemetryService.cs index 7136dd5..1e16150 100644 --- a/src/GreenHome.Application/ITelemetryService.cs +++ b/src/GreenHome.Application/Interfaces/ITelemetryService.cs @@ -1,10 +1,10 @@ -namespace GreenHome.Application; - -public interface ITelemetryService -{ - Task AddAsync(TelemetryDto dto, CancellationToken cancellationToken); - Task> ListAsync(TelemetryFilter filter, CancellationToken cancellationToken); - Task GetMinMaxAsync(int deviceId, DateTime? startUtc, DateTime? endUtc, CancellationToken cancellationToken); - Task> GetMonthDaysAsync(int deviceId, int persianYear, int persianMonth, CancellationToken cancellationToken); - Task> GetActiveMonthsAsync(int deviceId, int persianYear, CancellationToken cancellationToken); -} +namespace GreenHome.Application; + +public interface ITelemetryService +{ + Task AddAsync(TelemetryDto dto, CancellationToken cancellationToken); + Task> ListAsync(TelemetryFilter filter, CancellationToken cancellationToken); + Task GetMinMaxAsync(int deviceId, DateTime? startUtc, DateTime? endUtc, CancellationToken cancellationToken); + Task> GetMonthDaysAsync(int deviceId, int persianYear, int persianMonth, CancellationToken cancellationToken); + Task> GetActiveMonthsAsync(int deviceId, int persianYear, CancellationToken cancellationToken); +} diff --git a/src/GreenHome.Application/IUserDailyReportService.cs b/src/GreenHome.Application/Interfaces/IUserDailyReportService.cs similarity index 99% rename from src/GreenHome.Application/IUserDailyReportService.cs rename to src/GreenHome.Application/Interfaces/IUserDailyReportService.cs index 512a271..47bb644 100644 --- a/src/GreenHome.Application/IUserDailyReportService.cs +++ b/src/GreenHome.Application/Interfaces/IUserDailyReportService.cs @@ -10,4 +10,3 @@ public interface IUserDailyReportService Task AddImageToReportAsync(int reportId, string fileName, string filePath, string contentType, long fileSize, string? description, CancellationToken cancellationToken); Task DeleteImageAsync(int imageId, CancellationToken cancellationToken); } - diff --git a/src/GreenHome.Application/DeviceDtoValidator.cs b/src/GreenHome.Application/Validators/DeviceDtoValidator.cs similarity index 85% rename from src/GreenHome.Application/DeviceDtoValidator.cs rename to src/GreenHome.Application/Validators/DeviceDtoValidator.cs index 630bc3b..0b455ce 100644 --- a/src/GreenHome.Application/DeviceDtoValidator.cs +++ b/src/GreenHome.Application/Validators/DeviceDtoValidator.cs @@ -1,14 +1,13 @@ -using FluentValidation; - -namespace GreenHome.Application; - -// Validation -public sealed class DeviceDtoValidator : AbstractValidator -{ - public DeviceDtoValidator() - { - RuleFor(x => x.DeviceName).NotEmpty().MaximumLength(10); - RuleFor(x => x.Location).MaximumLength(250); - RuleFor(x => x.NeshanLocation).MaximumLength(80); - } -} +using FluentValidation; + +namespace GreenHome.Application; + +public sealed class DeviceDtoValidator : AbstractValidator +{ + public DeviceDtoValidator() + { + RuleFor(x => x.DeviceName).NotEmpty().MaximumLength(10); + RuleFor(x => x.Location).MaximumLength(250); + RuleFor(x => x.NeshanLocation).MaximumLength(80); + } +}