public static void Validate(BookItemStatus itemStatus, BookItemStatus newStatus) { switch (itemStatus) { case BookItemStatus.Read: if (newStatus == BookItemStatus.Read) { break; } throw new CannotChangeStatusException(itemStatus, newStatus); case BookItemStatus.Reading: case BookItemStatus.StartedButPostponed: if (newStatus == BookItemStatus.ToReading) { throw new CannotChangeStatusException(itemStatus, newStatus); } break; case BookItemStatus.ToReading: if (newStatus == BookItemStatus.Read || newStatus == BookItemStatus.StartedButPostponed) { throw new CannotChangeStatusException(itemStatus, newStatus); } break; default: throw new ArgumentOutOfRangeException(nameof(itemStatus), itemStatus.ToString("G"), null); } }
public static int Calculate(int previousTime, BookItemStatus previousStatus, DateTimeOffset previousDate, BookItemStatus newStatus) { var diff = default(int); if (previousStatus == newStatus) { return(previousTime + diff); } switch (newStatus) { case BookItemStatus.StartedButPostponed: case BookItemStatus.Read: diff = Convert.ToInt32(Math.Round((DateTime.UtcNow - previousDate).TotalSeconds, MidpointRounding.AwayFromZero)); break; case BookItemStatus.ToReading: case BookItemStatus.Reading: break; default: throw new ArgumentOutOfRangeException(nameof(newStatus), newStatus, null); } return(previousTime + diff); }
public static void Update(this PrivateBookListItem item, Dictionary <string, object> source, BookItemStatus newStatus) { var newReadingTime = ReadingTimeCalculator.Calculate(item.ReadingTimeInSeconds, item.Status, item.LastStatusUpdateDate, newStatus); source.Add(nameof(PrivateBookListItem.ReadingTimeInSeconds), newReadingTime); ObjectUpdater <PrivateBookListItem> .Update(item, source); }
public CannotChangeStatusException(BookItemStatus from, BookItemStatus to) : base(string.Format(ExceptionMessages.CannotChangeStatusFromTo, from.ToStringFromDescription(), to.ToStringFromDescription())) { }