using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Threading.Tasks; using Timeline.Entities; using Timeline.Models; namespace Timeline.Services { [Serializable] public class TimelineMemberOperationException : Exception { public TimelineMemberOperationException() : base(Resources.Services.Exception.TimelineMemberOperationException) { } public TimelineMemberOperationException(string message) : base(message) { } public TimelineMemberOperationException(string message, Exception inner) : base(message, inner) { } protected TimelineMemberOperationException( System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } public TimelineMemberOperationException(int index, Exception inner) : base(MakeIndexMessage(index), inner) { Index = index; } private static string MakeIndexMessage(int index) => string.Format(CultureInfo.CurrentCulture, Resources.Services.Exception.TimelineMemberOperationExceptionIndex, index); public int? Index { get; set; } } /// /// This define the common interface of both personal timeline /// and normal timeline. /// /// /// The "name" parameter in method means name of timeline in /// while username of the owner /// of the personal timeline in . /// public interface IBaseTimelineService { /// /// Get all the posts in the timeline. /// /// Username or the timeline name. See remarks of . /// A list of all posts. /// Thrown when is null. /// /// Thrown when timeline name is of bad format. /// For normal timeline, it means name is an empty string. /// For personal timeline, it means the username is of bad format, /// the inner exception should be a . /// /// /// Thrown when timeline does not exist. /// For normal timeline, it means the name does not exist. /// For personal timeline, it means the user of that username does not exist /// and the inner exception should be a . /// Task> GetPosts(string name); /// /// Create a new post in timeline. /// /// Username or the timeline name. See remarks of . /// The author's username. /// The content. /// The time of the post. If null, then use current time. /// /// Thrown when or or is null. /// /// Thrown when timeline name is of bad format. /// For normal timeline, it means name is an empty string. /// For personal timeline, it means the username is of bad format, /// the inner exception should be a . /// /// /// Thrown when timeline does not exist. /// For normal timeline, it means the name does not exist. /// For personal timeline, it means the user of that username does not exist /// and the inner exception should be a . /// /// Thrown if is of bad format. /// Thrown if does not exist. Task Post(string name, string author, string content, DateTime? time); /// /// Set the visibility permission of a timeline. /// /// Username or the timeline name. See remarks of . /// The new visibility. /// Thrown when is null. /// /// Thrown when timeline name is of bad format. /// For normal timeline, it means name is an empty string. /// For personal timeline, it means the username is of bad format, /// the inner exception should be a . /// /// /// Thrown when timeline does not exist. /// For normal timeline, it means the name does not exist. /// For personal timeline, it means the user of that username does not exist /// and the inner exception should be a . /// Task SetVisibility(string name, TimelineVisibility visibility); /// /// Set the description of a timeline. /// /// Username or the timeline name. See remarks of . /// The new description. /// Thrown when or is null. /// /// Thrown when timeline name is of bad format. /// For normal timeline, it means name is an empty string. /// For personal timeline, it means the username is of bad format, /// the inner exception should be a . /// /// /// Thrown when timeline does not exist. /// For normal timeline, it means the name does not exist. /// For personal timeline, it means the user of that username does not exist /// and the inner exception should be a . /// Task SetDescription(string name, string description); /// /// Add members to a timeline. /// /// Username or the timeline name. See remarks of . /// A list of new members' usernames /// Thrown when or is null. /// /// Thrown when timeline name is of bad format. /// For normal timeline, it means name is an empty string. /// For personal timeline, it means the username is of bad format, /// the inner exception should be a . /// /// /// Thrown when timeline does not exist. /// For normal timeline, it means the name does not exist. /// For personal timeline, it means the user of that username does not exist /// and the inner exception should be a . /// /// /// TODO! complete this documents. /// Task AddMember(string name, IList usernames); /// /// Remove members to a timeline. /// /// Username or the timeline name. See remarks of . /// A list of members' usernames /// Thrown when is null. /// /// Thrown when timeline name is of bad format. /// For normal timeline, it means name is an empty string. /// For personal timeline, it means the username is of bad format, /// the inner exception should be a . /// /// /// Thrown when timeline does not exist. /// For normal timeline, it means the name does not exist. /// For personal timeline, it means the user of that username does not exist /// and the inner exception should be a . /// Task RemoveMember(string name, IList usernames); } /// /// Service for normal timeline. /// public interface ITimelineService : IBaseTimelineService { /// /// Get the timeline info. /// /// The name of the timeline. /// The timeline info. Task GetTimeline(string name); /// /// Create a timeline. /// /// The name of the timeline. /// The owner of the timeline. Task CreateTimeline(string name, string owner); } public interface IPersonalTimelineService : IBaseTimelineService { /// /// Get the timeline info. /// /// The username of the owner of the personal timeline. /// The timeline info. Task GetTimeline(string username); } }