using System;
using SiberTek.Xenta.Data;
using SiberTek.Xenta.Data.Providers;
using SiberTek.Xenta.Entities;
using SiberTek.Xenta.Entities.Collections;
using SiberTek.Xenta.Enums;
using SiberTek.Xenta.Events;
using SiberTek.Xenta.Exceptions;
using SiberTek.Xenta.Utils;
namespace SiberTek.Xenta.Managers
{
/// <summary>
/// Contains methods to manage forum subscriptions
/// </summary>
public class ForumSubscriptionManager : IManager
{
#region Fields
private static ForumSubscriptionManager _instance = null;
private IForumSubscriptionDataProvider _dataProvider;
private bool _initialized;
#endregion
#region Constructors
private ForumSubscriptionManager()
{
_dataProvider = null;
_initialized = false;
}
#endregion
#region Events
public event EntityEventHandler ForumSubscriptionCreated;
public event EntityEventHandler ForumSubscriptionUpdated;
public event EntityEventHandler ForumSubscriptionDeleted;
#endregion
#region Properties
public static ForumSubscriptionManager Instance
{
get
{
if(_instance == null)
{
_instance = new ForumSubscriptionManager();
}
return _instance;
}
}
private IForumSubscriptionDataProvider DataProvider
{
get
{
return _dataProvider;
}
}
#endregion
#region Methods
public void Initialize()
{
if(!_initialized)
{
_dataProvider = DataAccessManager.GetProviderInstance<IForumSubscriptionDataProvider>("ForumSubscriptionDataProvider");
ForumProfileManager.Instance.ProfileDeleted += OnForumProfileDeleted;
ForumManager.Instance.ForumDeleted += OnForumDeleted;
ForumTopicManager.Instance.TopicDeleted += OnTopicDeleted;
_initialized = true;
}
}
public ForumSubscriptionInfo CreateForumSubscription(ForumSubscriptionType type, int forumEntityID, int userID)
{
if(UserManager.Instance.GetUser(userID) == null)
{
throw new XentaException("User does not exist", (int)CoreError.UserDoesNotExist);
}
switch(type)
{
case ForumSubscriptionType.Forum:
if(ForumManager.Instance.GetForum(forumEntityID) == null)
{
throw new XentaException("Forum does not exist", (int)ForumError.ForumDoesNotExist);
}
break;
case ForumSubscriptionType.Topic:
if(ForumTopicManager.Instance.GetForumTopic(forumEntityID) == null)
{
throw new XentaException("Forum topic does not exist", (int)ForumError.TopicDoesNotExist);
}
break;
}
if(GetForumSubscriptionByForumEntityIDAndUserID(type, forumEntityID, userID) != null)
{
throw new XentaException("Forum subscription already exists", (int)ForumError.DuplicateSubscription);
}
ForumSubscriptionInfo subscription = null;
int subscriptionID;
if(DataProvider.InsertForumSubscription(type, forumEntityID, userID, DateTime.UtcNow, DateTime.UtcNow, out subscriptionID))
{
subscription = GetForumSubscription(subscriptionID);
FireSubscriptionCreated(subscription);
}
return subscription;
}
public ForumSubscriptionInfo GetForumSubscription(int subscriptionID)
{
return DataMapper.Map(DataProvider.GetForumSubscription(subscriptionID));
}
public ForumSubscriptionInfo GetForumSubscriptionByForumEntityIDAndUserID(ForumSubscriptionType type, int forumEntityID, int userID)
{
return DataMapper.Map(DataProvider.GetForumSubscriptionByForumEntityIDAndUserID(type, forumEntityID, userID));
}
public ForumSubscriptionInfoCollection GetForumSubscriptionsByUserID(int userID)
{
return GetAllForumSubscriptions(null, null, userID, null, null);
}
public ForumSubscriptionInfoCollection GetForumSubscriptionsByForumEntityID(ForumSubscriptionType type, int forumEntityID)
{
return GetAllForumSubscriptions(type, forumEntityID, null, null, null);
}
public ForumSubscriptionInfoCollection GetAllForumSubscriptions(ForumSubscriptionType? type, int? forumEntityID, int? userID, DateTime? createdOnStart, DateTime? createdOnEnd)
{
int totalCount = 0;
return GetAllForumSubscriptions(type, forumEntityID, userID, createdOnStart, createdOnEnd, 0, Int32.MaxValue, out totalCount);
}
public ForumSubscriptionInfoCollection GetAllForumSubscriptions(ForumSubscriptionType? type, int? forumEntityID, int? userID, DateTime? createdOnStart, DateTime? createdOnEnd, int startIndex, int count, out int totalCount)
{
return DataMapper.Map(DataProvider.GetAllForumSubscriptions(type, forumEntityID, userID, createdOnStart, createdOnEnd, startIndex, count, out totalCount));
}
public ForumSubscriptionInfo UpdateForumSubscription(int subscriptionID, ForumSubscriptionType type, int forumEntityID, int userID)
{
if(UserManager.Instance.GetUser(userID) == null)
{
throw new XentaException("User does not exist", (int)CoreError.UserDoesNotExist);
}
switch(type)
{
case ForumSubscriptionType.Forum:
if(ForumManager.Instance.GetForum(forumEntityID) == null)
{
throw new XentaException("Forum does not exist", (int)ForumError.ForumDoesNotExist);
}
break;
case ForumSubscriptionType.Topic:
if(ForumTopicManager.Instance.GetForumTopic(forumEntityID) == null)
{
throw new XentaException("Forum topic does not exist", (int)ForumError.TopicDoesNotExist);
}
break;
}
ForumSubscriptionInfo subscription = GetForumSubscription(subscriptionID);
if(subscription == null)
{
throw new XentaException("Forum subscription does not exist", (int)ForumError.SubscriptionDoesNotExist);
}
if((subscription.ForumEntityID != forumEntityID || subscription.Type != type || subscription.UserID != userID) && GetForumSubscriptionByForumEntityIDAndUserID(type, forumEntityID, userID) != null)
{
throw new XentaException("Forum subscription already exists", (int)ForumError.DuplicateSubscription);
}
if(DataProvider.UpdateForumSubscription(subscriptionID, type, forumEntityID, userID, subscription.CreatedOn, DateTime.UtcNow))
{
subscription = GetForumSubscription(subscriptionID);
FireSubscriptionUpdated(subscription);
}
return subscription;
}
public void DeleteForumSubscription(int subscriptionID)
{
ForumSubscriptionInfo subscription = GetForumSubscription(subscriptionID);
if(subscription != null)
{
FireSubscriptionDeleted(subscription);
DataProvider.DeleteForumSubscription(subscriptionID);
}
}
#endregion
#region Handlers
private void OnForumProfileDeleted(object sender, EntityEventArgs e)
{
ForumProfileInfo profile = e.Entity as ForumProfileInfo;
if(profile != null)
{
foreach(ForumSubscriptionInfo subscription in GetForumSubscriptionsByUserID(profile.UserID))
{
DeleteForumSubscription(subscription.SubscriptionID);
}
}
}
private void OnForumDeleted(object sender, EntityEventArgs e)
{
ForumInfo forum = e.Entity as ForumInfo;
if(forum != null)
{
foreach(ForumSubscriptionInfo subscription in GetForumSubscriptionsByForumEntityID(ForumSubscriptionType.Forum, forum.ForumID))
{
DeleteForumSubscription(subscription.SubscriptionID);
}
}
}
private void OnTopicDeleted(object sender, EntityEventArgs e)
{
ForumTopicInfo topic = e.Entity as ForumTopicInfo;
if(topic != null)
{
foreach(ForumSubscriptionInfo subscription in GetForumSubscriptionsByForumEntityID(ForumSubscriptionType.Topic, topic.TopicID))
{
DeleteForumSubscription(subscription.SubscriptionID);
}
}
}
#endregion
#region Utilties
private void FireSubscriptionCreated(ForumSubscriptionInfo subscription)
{
if(ForumSubscriptionCreated != null)
{
ForumSubscriptionCreated(this, new EntityEventArgs(subscription));
}
}
private void FireSubscriptionUpdated(ForumSubscriptionInfo subscription)
{
if(ForumSubscriptionUpdated != null)
{
ForumSubscriptionUpdated(this, new EntityEventArgs(subscription));
}
}
private void FireSubscriptionDeleted(ForumSubscriptionInfo subscription)
{
if(ForumSubscriptionDeleted != null)
{
ForumSubscriptionDeleted(this, new EntityEventArgs(subscription));
}
}
#endregion
}
}