我滴个乖乖
This commit is contained in:
279
ZelWiki.Repository/PageFileRepository.cs
Normal file
279
ZelWiki.Repository/PageFileRepository.cs
Normal file
@@ -0,0 +1,279 @@
|
||||
using NTDLS.SqliteDapperWrapper;
|
||||
using ZelWiki.Caching;
|
||||
using ZelWiki.Models.DataModels;
|
||||
|
||||
namespace ZelWiki.Repository
|
||||
{
|
||||
public static class PageFileRepository
|
||||
{
|
||||
public static void DetachPageRevisionAttachment(string pageNavigation, string fileNavigation, int pageRevision)
|
||||
{
|
||||
var param = new
|
||||
{
|
||||
PageNavigation = pageNavigation,
|
||||
FileNavigation = fileNavigation,
|
||||
PageRevision = pageRevision
|
||||
};
|
||||
|
||||
ManagedDataStorage.Pages.Execute("DetachPageRevisionAttachment.sql", param);
|
||||
}
|
||||
|
||||
public static List<OrphanedPageAttachment> GetOrphanedPageAttachmentsPaged(
|
||||
int pageNumber, string? orderBy = null, string? orderByDirection = null)
|
||||
{
|
||||
int pageSize = ConfigurationRepository.Get<int>("Customization", "Pagination Size");
|
||||
|
||||
var param = new
|
||||
{
|
||||
PageNumber = pageNumber,
|
||||
PageSize = pageSize
|
||||
};
|
||||
|
||||
var query = RepositoryHelper.TransposeOrderby("GetOrphanedPageAttachments.sql", orderBy, orderByDirection);
|
||||
return ManagedDataStorage.Pages.Query<OrphanedPageAttachment>(query, param).ToList();
|
||||
}
|
||||
|
||||
public static void PurgeOrphanedPageAttachments()
|
||||
=> ManagedDataStorage.Pages.Execute("PurgeOrphanedPageAttachments.sql");
|
||||
|
||||
public static void PurgeOrphanedPageAttachment(int pageFileId, int revision)
|
||||
{
|
||||
var param = new
|
||||
{
|
||||
PageFileId = pageFileId,
|
||||
Revision = revision
|
||||
};
|
||||
ManagedDataStorage.Pages.Execute("PurgeOrphanedPageAttachment.sql", param);
|
||||
}
|
||||
|
||||
public static List<PageFileAttachmentInfo> GetPageFilesInfoByPageNavigationAndPageRevisionPaged(string pageNavigation, int pageNumber, int? pageSize = null, int? pageRevision = null)
|
||||
{
|
||||
pageSize ??= ConfigurationRepository.Get<int>("Customization", "Pagination Size");
|
||||
|
||||
var param = new
|
||||
{
|
||||
PageNumber = pageNumber,
|
||||
PageSize = pageSize,
|
||||
PageNavigation = pageNavigation,
|
||||
PageRevision = pageRevision
|
||||
};
|
||||
return ManagedDataStorage.Pages.Query<PageFileAttachmentInfo>("GetPageFilesInfoByPageNavigationAndPageRevisionPaged.sql", param).ToList();
|
||||
}
|
||||
|
||||
public static PageFileAttachmentInfo? GetPageFileAttachmentInfoByPageNavigationPageRevisionAndFileNavigation(string pageNavigation, string fileNavigation, int? pageRevision = null)
|
||||
{
|
||||
var param = new
|
||||
{
|
||||
PageNavigation = pageNavigation,
|
||||
FileNavigation = fileNavigation,
|
||||
PageRevision = pageRevision
|
||||
};
|
||||
|
||||
return ManagedDataStorage.Pages.QuerySingleOrDefault<PageFileAttachmentInfo>("GetPageFileAttachmentInfoByPageNavigationPageRevisionAndFileNavigation.sql", param);
|
||||
}
|
||||
|
||||
public static PageFileAttachment? GetPageFileAttachmentByPageNavigationFileRevisionAndFileNavigation(string pageNavigation, string fileNavigation, int? fileRevision = null)
|
||||
{
|
||||
var param = new
|
||||
{
|
||||
PageNavigation = pageNavigation,
|
||||
FileNavigation = fileNavigation,
|
||||
FileRevision = fileRevision
|
||||
};
|
||||
|
||||
return ManagedDataStorage.Pages.QuerySingleOrDefault<PageFileAttachment>("GetPageFileAttachmentByPageNavigationFileRevisionAndFileNavigation.sql", param);
|
||||
}
|
||||
|
||||
public static PageFileAttachment? GetPageFileAttachmentByPageNavigationPageRevisionAndFileNavigation(string pageNavigation, string fileNavigation, int? pageRevision = null, bool allowCache = true)
|
||||
{
|
||||
if (allowCache)
|
||||
{
|
||||
var cacheKey = WikiCacheKeyFunction.Build(WikiCache.Category.Page, [pageNavigation, fileNavigation, pageRevision]);
|
||||
if (!WikiCache.TryGet<PageFileAttachment>(cacheKey, out var result))
|
||||
{
|
||||
if ((result = GetPageFileAttachmentByPageNavigationPageRevisionAndFileNavigation(pageNavigation, fileNavigation, pageRevision, false)) != null)
|
||||
{
|
||||
WikiCache.Put(cacheKey, result);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
var param = new
|
||||
{
|
||||
PageNavigation = pageNavigation,
|
||||
FileNavigation = fileNavigation,
|
||||
PageRevision = pageRevision
|
||||
};
|
||||
|
||||
return ManagedDataStorage.Pages.QuerySingleOrDefault<PageFileAttachment>(
|
||||
"GetPageFileAttachmentByPageNavigationPageRevisionAndFileNavigation.sql", param);
|
||||
}
|
||||
|
||||
public static List<PageFileAttachmentInfo> GetPageFileAttachmentRevisionsByPageAndFileNavigationPaged(string pageNavigation, string fileNavigation, int pageNumber)
|
||||
{
|
||||
int pageSize = ConfigurationRepository.Get<int>("Customization", "Pagination Size");
|
||||
|
||||
var param = new
|
||||
{
|
||||
PageNavigation = pageNavigation,
|
||||
FileNavigation = fileNavigation,
|
||||
PageNumber = pageNumber,
|
||||
PageSize = pageSize
|
||||
};
|
||||
|
||||
return ManagedDataStorage.Pages.Ephemeral(o =>
|
||||
{
|
||||
using var users_db = o.Attach("users.db", "users_db");
|
||||
|
||||
var result = o.Query<PageFileAttachmentInfo>(
|
||||
"GetPageFileAttachmentRevisionsByPageAndFileNavigationPaged.sql", param).ToList();
|
||||
|
||||
return result;
|
||||
});
|
||||
}
|
||||
|
||||
public static List<PageFileAttachmentInfo> GetPageFilesInfoByPageId(int pageId)
|
||||
{
|
||||
var param = new
|
||||
{
|
||||
PageId = pageId
|
||||
};
|
||||
|
||||
return ManagedDataStorage.Pages.Query<PageFileAttachmentInfo>("GetPageFilesInfoByPageId.sql", param).ToList();
|
||||
}
|
||||
|
||||
public static PageFileRevisionAttachmentInfo? GetPageFileInfoByFileNavigation(ManagedDataStorageInstance connection, int pageId, string fileNavigation)
|
||||
{
|
||||
var param = new
|
||||
{
|
||||
PageId = pageId,
|
||||
Navigation = fileNavigation,
|
||||
};
|
||||
|
||||
return connection.QuerySingleOrDefault<PageFileRevisionAttachmentInfo>("GetPageFileInfoByFileNavigation.sql", param);
|
||||
}
|
||||
|
||||
public static PageFileRevisionAttachmentInfo? GetPageCurrentRevisionAttachmentByFileNavigation(ManagedDataStorageInstance connection, int pageId, string fileNavigation)
|
||||
{
|
||||
var param = new
|
||||
{
|
||||
PageId = pageId,
|
||||
Navigation = fileNavigation,
|
||||
};
|
||||
|
||||
return connection.QuerySingleOrDefault<PageFileRevisionAttachmentInfo>("GetPageCurrentRevisionAttachmentByFileNavigation.sql", param);
|
||||
}
|
||||
|
||||
public static void UpsertPageFile(PageFileAttachment item, Guid userId)
|
||||
{
|
||||
bool hasFileChanged = false;
|
||||
|
||||
ManagedDataStorage.Pages.Ephemeral(o =>
|
||||
{
|
||||
var transaction = o.BeginTransaction();
|
||||
|
||||
try
|
||||
{
|
||||
var pageFileInfo = GetPageFileInfoByFileNavigation(o, item.PageId, item.FileNavigation);
|
||||
if (pageFileInfo == null)
|
||||
{
|
||||
//If the page file does not exist, then insert it.
|
||||
|
||||
var InsertPageFileParam = new
|
||||
{
|
||||
PageId = item.PageId,
|
||||
Name = item.Name,
|
||||
FileNavigation = item.FileNavigation,
|
||||
ContentType = item.ContentType,
|
||||
Size = item.Size,
|
||||
CreatedDate = item.CreatedDate,
|
||||
Data = item.Data
|
||||
};
|
||||
|
||||
o.Execute("InsertPageFile.sql", InsertPageFileParam);
|
||||
|
||||
//Get the id of the newly inserted page file.
|
||||
pageFileInfo = GetPageFileInfoByFileNavigation(o, item.PageId, item.FileNavigation)
|
||||
?? throw new Exception("Failed find newly inserted page attachment.");
|
||||
|
||||
hasFileChanged = true;
|
||||
}
|
||||
|
||||
|
||||
int currentFileRevision = 0;
|
||||
var newDataHash = Security.Helpers.Crc32(item.Data);
|
||||
|
||||
var currentlyAttachedFile = GetPageCurrentRevisionAttachmentByFileNavigation(o, item.PageId, item.FileNavigation);
|
||||
if (currentlyAttachedFile != null)
|
||||
{
|
||||
//The PageFile exists and a revision of it is attached to this page revision.
|
||||
//Keep track of the file revision, and determine if the file has changed (via the file hash).
|
||||
|
||||
currentFileRevision = currentlyAttachedFile.Revision;
|
||||
hasFileChanged = currentlyAttachedFile.DataHash != newDataHash;
|
||||
}
|
||||
else
|
||||
{
|
||||
//The file either does not exist or is not attached to the current page revision.
|
||||
hasFileChanged = true;
|
||||
|
||||
//We determined earlier that the PageFile does exist, so keep track of the file revision.
|
||||
currentFileRevision = pageFileInfo.Revision;
|
||||
}
|
||||
|
||||
if (hasFileChanged)
|
||||
{
|
||||
currentFileRevision++;
|
||||
|
||||
//Get the current page revision so that we can associate the page file attachment with the current page revision.
|
||||
int currentPageRevision = PageRepository.GetCurrentPageRevision(o, item.PageId);
|
||||
|
||||
var updatePageFileRevisionParam = new
|
||||
{
|
||||
PageFileId = pageFileInfo.PageFileId,
|
||||
FileRevision = currentFileRevision
|
||||
};
|
||||
//The file has changed (or is newly inserted), bump the file revision.
|
||||
o.Execute("UpdatePageFileRevision.sql", updatePageFileRevisionParam);
|
||||
|
||||
var insertPageFileRevisionParam = new
|
||||
{
|
||||
PageFileId = pageFileInfo.PageFileId,
|
||||
ContentType = item.ContentType,
|
||||
Size = item.Size,
|
||||
CreatedDate = item.CreatedDate,
|
||||
CreatedByUserId = userId,
|
||||
Data = item.Data,
|
||||
FileRevision = currentFileRevision,
|
||||
DataHash = newDataHash,
|
||||
};
|
||||
|
||||
//Insert the actual file data.
|
||||
o.Execute("InsertPageFileRevision.sql", insertPageFileRevisionParam);
|
||||
|
||||
var associatePageFileAttachmentWithPageRevisionParam = new
|
||||
{
|
||||
PageId = item.PageId,
|
||||
PageFileId = pageFileInfo.PageFileId,
|
||||
PageRevision = currentPageRevision,
|
||||
FileRevision = currentFileRevision,
|
||||
PreviousFileRevision = currentlyAttachedFile?.Revision //This is so we can disassociate the previous file revision.
|
||||
};
|
||||
|
||||
//Associate the latest version of the file with the latest version of the page.
|
||||
o.Execute("AssociatePageFileAttachmentWithPageRevision.sql", associatePageFileAttachmentWithPageRevisionParam);
|
||||
}
|
||||
|
||||
transaction.Commit();
|
||||
}
|
||||
catch
|
||||
{
|
||||
transaction.Rollback();
|
||||
throw;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user