public void SavePageTags(PageProperties page, IList<string> tags, out IList<Tag> newCreatedTags)
{
var trimmedTags = new List<string>();
if (tags != null)
{
foreach (var tag in tags)
{
trimmedTags.Add(tag.Trim());
}
}
// remove tags who are equal (tags are case insensitive)
for (int i = 0; i < trimmedTags.Count; i++)
{
for (int j = i + 1; j < trimmedTags.Count; j++)
{
if (i != j && trimmedTags[i].ToLowerInvariant() == trimmedTags[j].ToLowerInvariant())
{
trimmedTags.RemoveAt(j);
--j;
}
}
}
newCreatedTags = new List<Tag>();
Tag tagAlias = null;
// Tags merge:
IList<PageTag> pageTags = unitOfWork.Session
.QueryOver<PageTag>()
.Where(t => !t.IsDeleted && t.Page.Id == page.Id)
.JoinQueryOver<Tag>(t => t.Tag, JoinType.InnerJoin)
.Where(t => !t.IsDeleted)
.List<PageTag>();
// All page tag list
var finalTagList = new List<PageTag>();
// Remove deleted tags:
for (int i = pageTags.Count - 1; i >= 0; i--)
{
string tag = null;
tag = trimmedTags.FirstOrDefault(s => s.ToLower() == pageTags[i].Tag.Name.ToLower());
if (tag == null)
{
var tagToRemove = pageTags[i];
UpdateModifiedInformation(tagToRemove);
unitOfWork.Session.Delete(tagToRemove);
finalTagList.Add(tagToRemove);
}
}
// Add new tags:
var tagsInsert = new List<string>();
foreach (string tag in trimmedTags)
{
PageTag existPageTag = pageTags.FirstOrDefault(pageTag => pageTag.Tag.Name.ToLower() == tag.ToLower());
if (existPageTag == null)
{
tagsInsert.Add(tag);
}
}
if (tagsInsert.Count > 0)
{
// Get existing tags:
IList<Tag> existingTags = unitOfWork.Session.QueryOver(() => tagAlias)
.Where(t => !t.IsDeleted)
.Where(Restrictions.In(Projections.Property(() => tagAlias.Name), tagsInsert))
.List<Tag>();
foreach (string tag in tagsInsert)
{
var pageTag = new PageTag();
pageTag.Page = page;
Tag existTag = existingTags.FirstOrDefault(t => t.Name.ToLower() == tag.ToLower());
if (existTag != null)
{
pageTag.Tag = existTag;
}
else
{
var newTag = new Tag();
newTag.Name = tag;
unitOfWork.Session.SaveOrUpdate(newTag);
newCreatedTags.Add(newTag);
pageTag.Tag = newTag;
}
UpdateModifiedInformation(pageTag);
unitOfWork.Session.SaveOrUpdate(pageTag);
finalTagList.Add(pageTag);
}
}
page.PageTags = finalTagList;
}