< Summary

Information
Class: OzonDomains.Models.OzonPushNotification
Assembly: OzonDomains
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonDomains/Models/OzonPushNotification.cs
Line coverage
33%
Covered lines: 4
Uncovered lines: 8
Coverable lines: 12
Total lines: 94
Line coverage: 33.3%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Id()100%210%
get_MessageType()100%11100%
get_PostingNumber()100%210%
get_SellerId()100%210%
get_WarehouseId()100%210%
get_RawPayload()100%11100%
get_ProcessingStatus()100%11100%
get_ErrorMessage()100%210%
get_ActionDetails()100%210%
get_SourceIpAddress()100%210%
get_ReceivedAt()100%11100%
get_ProcessedAt()100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonDomains/Models/OzonPushNotification.cs

#LineLine coverage
 1using System;
 2using System.ComponentModel.DataAnnotations;
 3using System.ComponentModel.DataAnnotations.Schema;
 4using OzonDomains.Models.OzonWebhook;
 5
 6namespace OzonDomains.Models
 7{
 8    /// <summary>
 9    /// Запись о входящем push-уведомлении от Ozon.
 10    /// Хранит исходный (сырой) JSON-payload и метаданные обработки.
 11    /// Намеренно не имеет FK на Order/OzonClient — уведомление может прийти
 12    /// раньше, чем заказ будет создан в системе.
 13    /// </summary>
 14    [Table("OzonPushNotifications")]
 15    public class OzonPushNotification
 16    {
 17        [Key]
 18        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
 019        public long Id { get; set; }
 20
 21        /// <summary>
 22        /// Тип уведомления в виде строки (например, "TYPE_NEW_POSTING").
 23        /// Хранится как строка для устойчивости к будущим типам от Ozon.
 24        /// </summary>
 25        [Required]
 26        [MaxLength(50)]
 427        public string MessageType { get; set; } = string.Empty;
 28
 29        /// <summary>
 30        /// Номер отправления Ozon (posting_number), если применимо к данному типу.
 31        /// Null для типов, не связанных с отправлениями (TYPE_PING, TYPE_NEW_MESSAGE и т.д.).
 32        /// </summary>
 33        [MaxLength(100)]
 034        public string? PostingNumber { get; set; }
 35
 36        /// <summary>
 37        /// Идентификатор продавца (seller_id) из уведомления.
 38        /// </summary>
 039        public long? SellerId { get; set; }
 40
 41        /// <summary>
 42        /// Идентификатор склада (warehouse_id) из уведомления.
 43        /// </summary>
 044        public long? WarehouseId { get; set; }
 45
 46        /// <summary>
 47        /// Исходный JSON-payload уведомления в полном неизменённом виде.
 48        /// </summary>
 49        [Required]
 50        [Column(TypeName = "longtext")]
 451        public string RawPayload { get; set; } = string.Empty;
 52
 53        /// <summary>
 54        /// Статус обработки уведомления. Хранится как строка для читаемости в БД.
 55        /// </summary>
 56        [Required]
 57        [MaxLength(20)]
 358        public string ProcessingStatus { get; set; } = nameof(OzonNotificationStatus.Received);
 59
 60        /// <summary>
 61        /// Сообщение об ошибке при обработке. Заполняется только при ProcessingStatus = Error.
 62        /// </summary>
 63        [Column(TypeName = "text")]
 064        public string? ErrorMessage { get; set; }
 65
 66        /// <summary>
 67        /// Описание действий, выполненных обработчиком уведомления (IWebhookNotificationHandler).
 68        /// Заполняется фоновым заданием Hangfire после завершения бизнес-логики.
 69        /// Примеры: "Обновлено 2 заказа. Новый статус: 'Доставлено'.",
 70        ///          "Заказы с номером отправления '...' не найдены."
 71        /// Null для TYPE_PING, UNKNOWN или до завершения фонового задания.
 72        /// </summary>
 73        [Column(TypeName = "text")]
 074        public string? ActionDetails { get; set; }
 75
 76        /// <summary>
 77        /// IP-адрес, с которого пришло уведомление (RemoteIpAddress из Connection).
 78        /// </summary>
 79        [MaxLength(50)]
 080        public string? SourceIpAddress { get; set; }
 81
 82        /// <summary>
 83        /// Дата и время получения уведомления (UTC).
 84        /// </summary>
 85        [Required]
 486        public DateTime ReceivedAt { get; set; } = DateTime.UtcNow;
 87
 88        /// <summary>
 89        /// Дата и время завершения обработки уведомления (UTC).
 90        /// Null, если обработка ещё не завершена или произошла ошибка.
 91        /// </summary>
 092        public DateTime? ProcessedAt { get; set; }
 93    }
 94}