public async Task <ArtifactHistoryResultSet> GetArtifactVersions(int artifactId, int limit, int offset, int?userId, bool asc, int sessionUserId, bool includeDrafts) { if (artifactId < 1) { throw new ArgumentOutOfRangeException(nameof(artifactId)); } if (limit < 1 || limit > 100) { throw new ArgumentOutOfRangeException(nameof(limit)); } if (offset < 0) { throw new ArgumentOutOfRangeException(nameof(offset)); } if (userId.HasValue && userId < 1) { throw new ArgumentOutOfRangeException(nameof(userId)); } if (!await DoesArtifactHavePublishedOrDraftVersions(artifactId)) { return(new ArtifactHistoryResultSet { ArtifactId = artifactId, ArtifactHistoryVersions = new List <ArtifactHistoryVersionWithUserInfo>() }); } var artifactVersions = (await GetPublishedArtifactHistory(artifactId, limit, offset, userId, asc)).ToList(); var distinctUserIds = artifactVersions.Select(a => a.UserId).Distinct(); var isDeleted = await IsItemDeleted(artifactId); if (isDeleted) { var deletedVersionInfo = await DeletedVersionInfo(artifactId); if (userId == null || userId.Value == deletedVersionInfo.UserId) { deletedVersionInfo.ArtifactState = ArtifactState.Deleted; distinctUserIds = distinctUserIds.Union(new[] { deletedVersionInfo.UserId }); InsertDraftOrDeletedVersion(limit, offset, asc, artifactVersions, deletedVersionInfo); } } else { var includeDraftVersion = await IncludeDraftVersion(userId, sessionUserId, artifactId, includeDrafts); if (includeDraftVersion) { distinctUserIds = distinctUserIds.Union(new[] { sessionUserId }); var draftItem = new ArtifactHistoryVersion { VersionId = int.MaxValue, UserId = sessionUserId, Timestamp = null, ArtifactState = ArtifactState.Draft }; InsertDraftOrDeletedVersion(limit, offset, asc, artifactVersions, draftItem); } } var userInfoDictionary = (await GetUserInfos(distinctUserIds)).ToDictionary(a => a.UserId); var artifactHistoryVersionWithUserInfos = new List <ArtifactHistoryVersionWithUserInfo>(); foreach (var artifactVersion in artifactVersions) { UserInfo userInfo; userInfoDictionary.TryGetValue(artifactVersion.UserId, out userInfo); artifactHistoryVersionWithUserInfos.Add( new ArtifactHistoryVersionWithUserInfo { VersionId = artifactVersion.VersionId, UserId = artifactVersion.UserId, Timestamp = DateTime.SpecifyKind(artifactVersion.Timestamp.GetValueOrDefault(), DateTimeKind.Utc), DisplayName = userInfo?.DisplayName, HasUserIcon = userInfo?.ImageId != null, ArtifactState = artifactVersion.ArtifactState }); } return(new ArtifactHistoryResultSet { ArtifactId = artifactId, ArtifactHistoryVersions = artifactHistoryVersionWithUserInfos }); }
public async Task GetArtifactVersions_WithDraftsAscending_Success() { // Arrange int artifactId = 1; int limit = 2; int offset = 0; int? userId = 1; bool asc = true; int sessionUserId = 1; var cxn = new SqlConnectionWrapperMock(); var repository = new SqlArtifactVersionsRepository(cxn.Object); var prm = new Dictionary <string, object> { { "artifactId", artifactId }, { "lim", limit }, { "offset", offset }, { "userId", userId.Value }, { "ascd", asc } }; cxn.SetupQueryAsync("DoesArtifactHavePublishedOrDraftVersion", new Dictionary <string, object> { { "artifactId", artifactId } }, new List <bool> { true }); cxn.SetupQueryAsync("IsArtifactDeleted", new Dictionary <string, object> { { "artifactId", artifactId } }, new List <bool> { false }); var testResult = new ArtifactHistoryVersion[] { new ArtifactHistoryVersion { VersionId = 1, UserId = 1, Timestamp = new DateTime() } }; cxn.SetupQueryAsync("GetArtifactVersions", prm, testResult); var artifactIdsTable = SqlConnectionWrapper.ToDataTable(new List <int> { artifactId }, "Int32Collection", "Int32Value"); var prm2 = new Dictionary <string, object> { { "userId", sessionUserId }, { "artifactIds", artifactIdsTable } }; cxn.SetupQueryAsync("GetArtifactsWithDraft", prm2, new int[] { artifactId }); var userIdsTable = SqlConnectionWrapper.ToDataTable(new List <int> { sessionUserId }, "Int32Collection", "Int32Value"); cxn.SetupQueryAsync("GetUserInfos", new Dictionary <string, object> { { "userIds", userIdsTable } }, new List <UserInfo> { new UserInfo { UserId = 1, DisplayName = "David", ImageId = 1 } }); // Act var actual = await repository.GetArtifactVersions(artifactId, limit, offset, userId, asc, sessionUserId, true); // Assert cxn.Verify(); Assert.AreEqual(actual.ArtifactId, 1); Assert.AreEqual(actual.ArtifactHistoryVersions.ToList().Count(), 2); Assert.AreEqual(actual.ArtifactHistoryVersions.ToList()[1].VersionId, int.MaxValue); Assert.AreEqual(actual.ArtifactHistoryVersions.ToList()[0].VersionId, 1); }
private static void InsertDraftOrDeletedVersion(int limit, int offset, bool asc, IList <ArtifactHistoryVersion> artifactVersions, ArtifactHistoryVersion deletedOrDraftEntry) { if (asc && artifactVersions.Count < limit) { artifactVersions.Insert(artifactVersions.Count, deletedOrDraftEntry); } else if (!asc && offset == 0) { artifactVersions.Insert(0, deletedOrDraftEntry); } }