using Quadarax.Foundation.Core.Business.Processor.Enums; using Quadarax.Foundation.Core.Business.Processor.Queue; using Quadarax.Foundation.Core.Logging; using Quadarax.Foundation.Core.Object; using Quadarax.Foundation.Core.Value.Extensions; namespace Quadarax.Foundation.Core.Business.Processor.Task { internal class TaskItem : ITaskItem { #region *** Properties *** /// /// /// public long Id { get; } /// /// /// public ProcessQueueTypeEnum QueueType { get; } /// /// /// public DateTime Created { get; } /// /// /// public DateTime? Changed { get; } /// /// /// public IAffinityToken AffinityToken { get; } /// /// /// public string Reference { get; } /// /// /// public ProcessStatusEnum Status { get; } /// /// /// public string ProviderClass { get; } /// /// /// public byte Priority { get; } /// /// /// public DateTime ProcessingValidFrom { get; } /// /// /// public DateTime? ProcessingValidTo { get; } /// /// /// public int AttemptsLeft { get; } /// /// /// public TimeSpan? AttemptTimeout { get; } /// /// /// public DateTime StatStarted { get; } /// /// /// public DateTime StatFinished { get; } /// /// /// public TimeSpan StatLastAttemptDuration { get; } /// /// /// public ITaskStatusLogItem[] StatusLog => _statusLog.ToArray(); public TypedArgument[] Arguments => _arguments.ToArray(); #endregion #region *** Private Fields *** private readonly List _statusLog = new(); private readonly List _arguments = new(); private ILog _log; private ProcessQueue _parent; #endregion #region *** Constructors *** private TaskItem(ProcessQueue parent, long id, ProcessStatusEnum initialStatus, string reference, string source, TypedArgument[] initialArguments, byte priority, int attepts, TimeSpan? attemptTimeout, DateTime validFrom, DateTime? validTo, ITaskStatusLogItem[]? initialStatusLog): this(parent, reference, source, initialArguments, priority, attepts, attemptTimeout, validFrom, validTo, initialStatusLog) { Id = id; Status = initialStatus; } public TaskItem(ProcessQueue parent, string reference, string providerClass, TypedArgument[] initialArguments, byte priority, int attepts, TimeSpan? attemptTimeout, DateTime validFrom, DateTime? validTo, ITaskStatusLogItem[]? initialStatusLog) { _parent = parent ?? throw new ArgumentNullException(nameof(parent)); _log = new ConsoleLogger().GetLogger(GetType()); Priority = priority; Reference = reference; ProviderClass = providerClass; Arguments.Setup(initialArguments); AttemptTimeout = attemptTimeout; AttemptsLeft = attepts; ProcessingValidFrom = validFrom; ProcessingValidTo = validTo; Created = DateTime.Now; if (initialStatusLog != null) _statusLog.Setup(initialStatusLog); Status = ProcessStatusEnum.Pending; Id = long.MinValue; } #endregion #region *** Public Operations *** public void Postpone(TimeSpan postponeInterval, string reason) { throw new NotImplementedException(); } public void Stop(string reason, bool willPause = true, bool willFail = false) { throw new NotImplementedException(); } public void Reset(string reason, TimeSpan postponeValid) { throw new NotImplementedException(); } public void Delete(string reason, bool immediate = false) { throw new NotImplementedException(); } #endregion } }