Ejemplo n.º 1
0
        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
            });
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 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);
     }
 }