public PrivateMessage Create(string subject, string fullText, User user, List<User> toUsers)
		{
			if (String.IsNullOrWhiteSpace(subject))
				throw new ArgumentNullException("subject");
			if (String.IsNullOrWhiteSpace(fullText))
				throw new ArgumentNullException("fullText");
			if (user == null)
				throw new ArgumentNullException("user");
			if (toUsers == null || toUsers.Count == 0)
				throw new ArgumentException("toUsers must include at least one user.", "toUsers");
			var names = user.Name;
			foreach (var toUser in toUsers)
				names += ", " + toUser.Name;
			var now = DateTime.UtcNow;
			var pm = new PrivateMessage
			         	{
			         		Subject = TextParsingService.EscapeHtmlAndCensor(subject),
							UserNames = names,
							LastPostTime = now
			         	};
			pm.PMID = PrivateMessageRepository.CreatePrivateMessage(pm);
			PrivateMessageRepository.AddUsers(pm.PMID, new List<int> {user.UserID}, now, true);
			PrivateMessageRepository.AddUsers(pm.PMID, toUsers.Select(u => u.UserID).ToList(), now.AddSeconds(-1), false);
			var post = new PrivateMessagePost
			           	{
			           		FullText = TextParsingService.ForumCodeToHtml(fullText),
							Name = user.Name,
							PMID = pm.PMID,
							PostTime = now,
							UserID = user.UserID
			           	};
			PrivateMessageRepository.AddPost(post);
			return pm;
		}
		public virtual int AddPost(PrivateMessagePost post)
		{
			var users = GetUsers(post.PMID);
			foreach (var user in users)
				_cacheHelper.RemoveCacheObject(CacheKeys.PMCount(user.UserID));
			_sqlObjectFactory.GetConnection().Using(connection => post.PMPostID = Convert.ToInt32(
				connection.Command("INSERT INTO pf_PrivateMessagePost (PMID, UserID, Name, PostTime, FullText) VALUES (@PMID, @UserID, @Name, @PostTime, @FullText)")
				.AddParameter("@PMID", post.PMID)
				.AddParameter("@UserID", post.UserID)
				.AddParameter("@Name", post.Name)
				.AddParameter("@PostTime", post.PostTime)
				.AddParameter("@FullText", post.FullText)
				.ExecuteAndReturnIdentity()));
			return post.PMPostID;
		}
		public void ReplyMapsAndPresistsPost()
		{
			var service = GetService();
			var post = new PrivateMessagePost();
			_mockPMRepo.Setup(p => p.AddPost(It.IsAny<PrivateMessagePost>())).Callback<PrivateMessagePost>(p => post = p);
			var user = new User(1, DateTime.MinValue) {Name = "jeff"};
			var pm = new PrivateMessage {PMID = 2};
			var text = "mah message";
			_mockTextParse.Setup(t => t.ForumCodeToHtml(text)).Returns(text);
			_mockPMRepo.Setup(p => p.GetUsers(pm.PMID)).Returns(new List<PrivateMessageUser> {new PrivateMessageUser {UserID = user.UserID}});
			service.Reply(pm, text, user);
			Assert.AreEqual(text, post.FullText);
			Assert.AreEqual(user.Name, post.Name);
			Assert.AreEqual(user.UserID, post.UserID);
			Assert.AreEqual(pm.PMID, post.PMID);
		}
		public void CreatePostPersist()
		{
			var user = new User(12, DateTime.MinValue) { Name = "jeff" };
			var to1 = new User(45, DateTime.MinValue);
			var to2 = new User(67, DateTime.MinValue);
			var service = GetService();
			_mockPMRepo.Setup(p => p.CreatePrivateMessage(It.IsAny<PrivateMessage>())).Returns(69);
			var post = new PrivateMessagePost();
			_mockPMRepo.Setup(p => p.AddPost(It.IsAny<PrivateMessagePost>())).Callback<PrivateMessagePost>(p => post = p);
			_mockTextParse.Setup(t => t.ForumCodeToHtml("oihefio")).Returns("oihefio");
			service.Create("ohqefwwf", "oihefio", user, new List<User> { to1, to2 });
			Assert.AreEqual("oihefio", post.FullText);
			Assert.AreEqual("jeff", post.Name);
			Assert.AreEqual(69, post.PMID);
			Assert.AreEqual(user.UserID, post.UserID);
		}
		public void Reply(PrivateMessage pm, string fullText, User user)
		{
			if (pm == null || pm.PMID == 0)
				throw new ArgumentException("Can't reply to a PM that hasn't been persisted.", "pm");
			if (String.IsNullOrWhiteSpace(fullText))
				throw new ArgumentNullException("fullText");
			if (user == null)
				throw new ArgumentNullException("user");
			if (!IsUserInPM(user, pm))
				throw new Exception("Can't add a PM reply for a user not part of the PM.");
			var post = new PrivateMessagePost
			           	{
			           		FullText = TextParsingService.ForumCodeToHtml(fullText),
			           		Name = user.Name,
			           		PMID = pm.PMID,
			           		PostTime = DateTime.UtcNow,
			           		UserID = user.UserID
			           	};
			PrivateMessageRepository.AddPost(post);
			var users = PrivateMessageRepository.GetUsers(pm.PMID);
			foreach (var u in users)
				PrivateMessageRepository.SetArchive(pm.PMID, u.UserID, false);
			var now = DateTime.UtcNow;
			PrivateMessageRepository.UpdateLastPostTime(pm.PMID, now);
			PrivateMessageRepository.SetLastViewTime(pm.PMID, user.UserID, now);
		}