Exemplo n.º 1
0
        protected async Task MarkReuseLinksOutOfSync(IEnumerable <int> artifactIds, PublishEnvironment environment, IDbTransaction transaction = null)
        {
            var enumerable = artifactIds as int[] ?? artifactIds.ToArray();

            if (!enumerable.Any())
            {
                return;
            }
            var parameters       = new DynamicParameters();
            var artifactIdsTable = SqlConnectionWrapper.ToDataTable(enumerable);

            parameters.Add("@artifactIds", artifactIdsTable);
            parameters.Add("@revisionId", environment.RevisionId);

            if (transaction == null)
            {
                await ConnectionWrapper.ExecuteAsync
                (
                    "MarkReuseLinksOutOfSync",
                    parameters,
                    commandType : CommandType.StoredProcedure);

                return;
            }

            await transaction.Connection.ExecuteAsync
            (
                "MarkReuseLinksOutOfSync",
                parameters,
                transaction,
                commandType : CommandType.StoredProcedure);
        }
Exemplo n.º 2
0
        public async Task Execute(int revisionId, PublishParameters parameters, PublishEnvironment environment, IDbTransaction transaction = null)
        {
            var items = await GetDraftAndLatest <SqlDraftAndLatestItem>(parameters.UserId, parameters.AffectedArtifactIds, transaction);

            if (items.Count == 0)
            {
                return;
            }

            var hierarchyValidator = new ArtifactsHierarchyValidator(this);

            var deleteVersionsIds      = new HashSet <int>();
            var closeVersionIds        = new HashSet <int>();
            var markAsLatestVersionIds = new HashSet <int>();

            foreach (var item in items)
            {
                if (item.DraftDeleted)
                {
                    deleteVersionsIds.Add(item.DraftVersionId);

                    if (item.LatestVersionId.HasValue)
                    {
                        closeVersionIds.Add(item.LatestVersionId.Value);
                        RegisterItemModification(environment.SensitivityCollector, item);
                    }

                    environment.AddAffectedArtifact(item.ArtifactId);
                }
                else
                {
                    if (IsChanged(item))
                    {
                        markAsLatestVersionIds.Add(item.DraftVersionId);

                        if (item.LatestVersionId.HasValue)
                        {
                            closeVersionIds.Add(item.LatestVersionId.Value);
                        }

                        hierarchyValidator.ScheduleReparentAndReorderArtifactsCheck(item, parameters.AffectedArtifactIds);

                        environment.AddAffectedArtifact(item.ArtifactId);

                        RegisterItemModification(environment.SensitivityCollector, item);
                    }
                    else
                    {
                        deleteVersionsIds.Add(item.DraftVersionId);
                    }
                }
            }

            await hierarchyValidator.CheckAndFix(environment, transaction);

            await MarkAsLatest(markAsLatestVersionIds, environment.RevisionId, transaction);
            await DeleteVersions(deleteVersionsIds, transaction);
            await CloseVersions(closeVersionIds, environment.RevisionId, transaction);
        }
        public async Task Execute(int revisionId, PublishParameters parameters, PublishEnvironment environment, IDbTransaction transaction = null)
        {
            // await Task.Run(() => { });
            var artifactIds = parameters.ArtifactIds.ToHashSet();
            var items       = await GetDraftAndLatestAttachments(artifactIds, parameters.UserId, transaction);

            if (items.Count == 0)
            {
                return;
            }

            var deleteVersionsIds            = new HashSet <int>();
            var closeVersionIds              = new HashSet <int>();
            var closeButKeepLatestVersionIds = new HashSet <int>();
            var markAsLatestVersionIds       = new HashSet <int>();

            foreach (var item in items)
            {
                if (item.DraftDeleted)
                {
                    deleteVersionsIds.Add(item.DraftVersionId);

                    if (item.LatestVersionId.HasValue)
                    {
                        closeButKeepLatestVersionIds.Add(item.LatestVersionId.Value);
                        RegisterAttachmentModification(environment, item);
                    }

                    environment.AddAffectedArtifact(item.ArtifactId);
                }
                else
                {
                    if (IsChanged(item))
                    {
                        markAsLatestVersionIds.Add(item.DraftVersionId);

                        if (item.LatestVersionId.HasValue)
                        {
                            closeVersionIds.Add(item.LatestVersionId.Value);
                        }
                        environment.AddAffectedArtifact(item.ArtifactId);
                        RegisterAttachmentModification(environment, item);
                    }
                    else
                    {
                        deleteVersionsIds.Add(item.DraftVersionId);
                    }
                }
            }

            await CloseAttachmentVersions(closeButKeepLatestVersionIds, environment.RevisionId, keepLatest : true, transaction : transaction);
            await CloseAttachmentVersions(closeVersionIds, environment.RevisionId, keepLatest : false, transaction : transaction);
            await MarkAsLatest(markAsLatestVersionIds, environment.RevisionId, transaction);
            await DeleteVersions(deleteVersionsIds, transaction);
        }
        private void RegisterLinkModification(PublishEnvironment env, DraftAndLatestLink link)
        {
            // Parent/child links changes should be covered in ItemsRepo for sub-artifacts and ignored for artifacts
            if (link.Type == LinkType.ParentChild)
            {
                return;
            }

            var sensitivityCollector = env.SensitivityCollector;

            if (link.Type != LinkType.Manual && link.Type != LinkType.Reuse)
            {
                if (link.Type == LinkType.DocumentReference &&
                    link.Artifact1Id == link.Item1Id && IsArtifactInPublishScope(env, link.Item1Id))    // document reference from artifact
                {
                    sensitivityCollector.RegisterArtifactModification(link.Item1Id, ItemTypeReuseTemplateSetting.DocumentReferences);
                }

                if (link.Type == LinkType.ActorInheritsFrom &&
                    link.Artifact1Id == link.Item1Id && IsArtifactInPublishScope(env, link.Item1Id))    // actor inheritance from artifact
                {
                    sensitivityCollector.RegisterArtifactModification(link.Item1Id, ItemTypeReuseTemplateSetting.BaseActor);
                }

                if (link.Artifact1Id != link.Item1Id && // Sub-Artifact
                    IsArtifactInPublishScope(env, link.Artifact1Id))
                {
                    sensitivityCollector.RegisterArtifactModification(link.Artifact1Id, ItemTypeReuseTemplateSetting.Subartifacts);
                }

                return;
            }

            if (link.Type == LinkType.Manual)
            {
                if (!env.IsArtifactDeleted(link.Artifact1Id))
                {
                    var modification = link.Artifact1Id == link.Item1Id
                        ? ItemTypeReuseTemplateSetting.Relationships
                        : ItemTypeReuseTemplateSetting.Subartifacts;
                    sensitivityCollector.RegisterArtifactModification(link.Artifact1Id, modification);
                }

                if (!env.IsArtifactDeleted(link.Artifact2Id))
                {
                    var modification = link.Artifact2Id == link.Item2Id
                        ? ItemTypeReuseTemplateSetting.Relationships
                        : ItemTypeReuseTemplateSetting.Subartifacts;
                    sensitivityCollector.RegisterArtifactModification(link.Artifact2Id, modification);
                }
            }
        }
        private void RegisterAttachmentModification(PublishEnvironment env, DraftAndLatestAttachment attachment)
        {
            ReuseSensitivityCollector sensitivityCollector = env.SensitivityCollector;

            var affectedTemplateSetting = IsSubArtifactChange(attachment)
                        ? ItemTypeReuseTemplateSetting.Subartifacts
                        : (env.GetArtifactBaseType(attachment.ArtifactId) == ItemTypePredefined.Document
                           // for document artifact we have only document content as an attachment
                            ? ItemTypeReuseTemplateSetting.DocumentFile
                            : ItemTypeReuseTemplateSetting.Attachments);

            sensitivityCollector.RegisterArtifactModification(attachment.ArtifactId,
                                                              affectedTemplateSetting);
        }
        public async Task Execute(int revisionId, PublishParameters parameters, PublishEnvironment environment, IDbTransaction transaction = null)
        {
            await _repositoriesContainer.PublishItemsRepo.Execute(revisionId, parameters, environment, transaction);

            await _repositoriesContainer.PublishRelationshipsRepo.Execute(revisionId, parameters, environment, transaction);

            await _repositoriesContainer.PublishPropertiesRepo.Execute(revisionId, parameters, environment, transaction);

            await _repositoriesContainer.PublishAttachmentsRepo.Execute(revisionId, parameters, environment, transaction);

            await _repositoriesContainer.PublishReuseProcessingRepo.Execute(revisionId, parameters, environment, transaction);

            // TODO: DISCUSSIONS IS NOT IMPLEMENTED
            // TODO: Collection Assignment IS NOT IMPLEMENTED

            // await _repositoriesContainer.PublishCollectionAssignmentsRepo.Execute(revisionId, parameters, environment, transaction);
        }
        public async Task CheckAndFix(PublishEnvironment env, IDbTransaction transaction)
        {
            if (_checkParents.Count != 0)
            {
                var parentsToCheck   = _checkParents.Keys;
                var notLiveArtifacts = new List <int>();

                var deletedArtifacts = env.DeletedArtifactIds;
                if (deletedArtifacts != null && deletedArtifacts.Count != 0)
                {
                    notLiveArtifacts.AddRange(parentsToCheck.Intersect(deletedArtifacts));
                }

                var mayBeAlive = parentsToCheck.Except(notLiveArtifacts).ToHashSet();
                mayBeAlive.ExceptWith(await _publishRepository.GetLiveItemsOnly(mayBeAlive, transaction));

                notLiveArtifacts.AddRange(mayBeAlive);

                foreach (var parentId in notLiveArtifacts)
                {
                    ICollection <SqlDraftAndLatestItem> items;
                    if (_checkParents.TryGetValue(parentId, out items))
                    {
                        double?lastOrderIndex = null;
                        foreach (var item in items)
                        {
                            if (lastOrderIndex == null)
                            {
                                double?maxOrderIndex = await _publishRepository.GetMaxChildOrderIndex(item.DraftProjectId, transaction);

                                lastOrderIndex = !maxOrderIndex.HasValue || maxOrderIndex < 0d
                                    ? 0d
                                    : maxOrderIndex;
                            }

                            lastOrderIndex += 10.0;

                            if (env.GetArtifactBaseType(item.ArtifactId).IsRegularArtifactType())
                            {
                                await _publishRepository.SetParentAndOrderIndex(item.DraftVersionId, item.DraftProjectId, lastOrderIndex.Value);
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 8
0
        public async Task Execute(int revisionId, PublishParameters parameters, PublishEnvironment environment, IDbTransaction transaction = null)
        {
            var affectedArtifacts = environment.GetAffectedArtifacts().Where(a => {
                SqlItemInfo info;
                if (environment.ArtifactStates.TryGetValue(a, out info))
                {
                    return(info.PrimitiveItemTypePredefined.IsAvailableForSensitivityCalculations());
                }
                return(true);
            }).ToList();

            var affectedStandardArtifacts = await _sensitivityCommonHelper.FilterInsensitiveItems(affectedArtifacts,
                                                                                                  environment.SensitivityCollector,
                                                                                                  _reuseRepository);

            await MarkReuseLinksOutOfSync(affectedStandardArtifacts, environment, transaction);
        }
        public async Task AddArtifactChanges(PublishParameters parameters, PublishEnvironment environment, IDbTransaction transaction = null)
        {
            var affectedArtifacts = environment.GetAffectedArtifacts();

            foreach (var item in environment.ArtifactStates)
            {
                ActionType action;

                if (environment.DeletedArtifactIds.Contains(item.Key))
                {
                    action = ActionType.Removed;
                }
                else if (affectedArtifacts.Contains(item.Key))
                {
                    action = item.Value.HasNeverBeenPublished ? ActionType.Added : ActionType.Updated;
                }
                else
                {
                    // Skip not changed artifacts
                    continue;
                }

                try
                {
                    await AddEntry(
                        new SqlJournalEntry
                    {
                        RevisionID  = environment.RevisionId,
                        TimeStamp   = environment.Timestamp,
                        UserID      = parameters.UserId,
                        ItemID      = item.Value.ItemId,
                        ElementType = (int)ElementType.Artifact,
                        ActionType  = (int)action
                    });
                }
                catch (Exception)
                {
                    // swallow
                }
            }
        }
Exemplo n.º 10
0
 public async Task Execute(int revisionId, PublishParameters parameters, PublishEnvironment environment, IDbTransaction transaction = null)
 {
     await Task.Run(() => { });
 }
Exemplo n.º 11
0
        public async Task Execute(int revisionId, PublishParameters parameters, PublishEnvironment environment, IDbTransaction transaction = null)
        {
            var properties = await GetDraftAndLatest <SqlDraftAndLatestProperty>(parameters.UserId, parameters.AffectedArtifactIds, transaction);

            if (properties.Count == 0)
            {
                return;
            }

            var deleteVersionsIds      = new HashSet <int>();
            var closeVersionIds        = new HashSet <int>();
            var markAsLatestVersionIds = new HashSet <int>();

            foreach (var property in properties)
            {
                if (property.DraftDeleted)
                {
                    deleteVersionsIds.Add(property.DraftVersionId);

                    if (property.LatestVersionId.HasValue)
                    {
                        closeVersionIds.Add(property.LatestVersionId.Value);

                        // TODO: reviews are not handled currently
                        // _reviewProcessor.ProcessArtifactReviewPackageChanges(property, environment);

                        RegisterPropertyModification(environment.SensitivityCollector, property);
                    }

                    environment.AddAffectedArtifact(property.ArtifactId);
                }
                else
                {
                    if (IsChanged(property))
                    {
                        markAsLatestVersionIds.Add(property.DraftVersionId);

                        if (property.LatestVersionId.HasValue)
                        {
                            closeVersionIds.Add(property.LatestVersionId.Value);
                        }

                        // TODO: reviews are not handled currently
                        // _reviewProcessor.ProcessArtifactReviewPackageChanges(property, environment);

                        environment.AddAffectedArtifact(property.ArtifactId);
                        RegisterPropertyModification(environment.SensitivityCollector, property);
                    }
                    else
                    {
                        deleteVersionsIds.Add(property.DraftVersionId);
                    }
                }
            }

            await ClosePropertyVersions(closeVersionIds, environment.RevisionId, transaction);
            await CloseVersionsForCrossProjectMovedArtifacts(environment.GetArtifactsMovedAcrossProjects(parameters.AffectedArtifactIds),
                                                             environment.RevisionId,
                                                             transaction);
            await DeleteVersions(deleteVersionsIds, transaction);
            await MarkAsLatest(markAsLatestVersionIds, environment.RevisionId, transaction);
        }
Exemplo n.º 12
0
        private ArtifactResultSet ToNovaArtifactResultSet(ICollection <SqlDiscardPublishDetails> discardPublishDetails, PublishEnvironment environment, IDictionary <int, string> projectsNames)
        {
            var artifactResultSet = new ArtifactResultSet();

            if (discardPublishDetails != null)
            {
                artifactResultSet.Artifacts.Clear();
                foreach (var dpd in discardPublishDetails)
                {
                    var artifact = new Artifact
                    {
                        Id             = dpd.ItemId,
                        Name           = dpd.Name,
                        ParentId       = dpd.ParentId,
                        OrderIndex     = dpd.OrderIndex,
                        ItemTypeId     = dpd.ItemType_ItemTypeId,
                        Prefix         = dpd.Prefix,
                        ItemTypeIconId = dpd.Icon_ImageId,
                        PredefinedType = dpd.PrimitiveItemTypePredefined,
                        ProjectId      = dpd.VersionProjectId,
                        Version        = dpd.VersionsCount == 0 ? -1 : dpd.VersionsCount,
                        IsStandard     = dpd.InstanceItemTypeTypeId.HasValue
                    };
                    if (environment != null && environment.SensitivityCollector.ArtifactModifications != null)
                    {
                        ReuseSensitivityCollector.ArtifactModification artifactModification;
                        if (environment.SensitivityCollector.ArtifactModifications.TryGetValue(artifact.Id, out artifactModification) &&
                            artifactModification?.ModifiedPropertyTypes != null)
                        {
                            artifactResultSet.ModifiedProperties.Add(artifact.Id, new List <Property>());
                            artifactResultSet.ModifiedProperties[artifact.Id].AddRange(
                                artifactModification.ModifiedPropertyTypes.Select(p => new Property
                            {
                                PropertyTypeId = p.Item1,
                                Predefined     = p.Item2
                            }));
                        }
                    }
                    artifactResultSet.Artifacts.Add(artifact);
                }
                SortArtifactsByProjectNameThenById(projectsNames, artifactResultSet);
            }
            if (projectsNames != null)
            {
                artifactResultSet.Projects.Clear();
                artifactResultSet.Projects.AddRange(projectsNames.Select(pn => new Item
                {
                    Id   = pn.Key,
                    Name = pn.Value
                }).ToList());
            }
            return(artifactResultSet);
        }
Exemplo n.º 13
0
        private async Task <PublishEnvironment> TransactionalPublishArtifact(PublishParameters parameters,
                                                                             IList <int> artifactIdsList,
                                                                             IDbTransaction transaction)
        {
            int publishRevision = parameters.RevisionId ?? await
                                  _sqlHelper.CreateRevisionInTransactionAsync(transaction, parameters.UserId,
                                                                              "New Publish: publishing artifacts.");

            parameters.RevisionId = publishRevision;
            parameters.AffectedArtifactIds.Clear();
            parameters.AffectedArtifactIds.AddRange(artifactIdsList);
            var publishResults = new List <SqlPublishResult>(parameters.AffectedArtifactIds.Count);
            var artifactStates =
                await _versionControlRepository.GetPublishStates(parameters.UserId, parameters.AffectedArtifactIds, transaction : transaction);

            var artifactsCannotBePublished = _versionControlRepository.CanPublish(artifactStates);

            parameters.AffectedArtifactIds.ExceptWith(artifactsCannotBePublished.Keys);

            // Notify about artifactsCannotBePublished - callback
            // if (onError != null && onError(new ReadOnlyDictionary<int, PublishErrors>(artifactsCannotBePublished)))
            // {
            //    throw new DataAccessException("Publish interrupted", BusinessLayerErrorCodes.RequiredArtifactHasNotBeenPublished);
            // }

            if (parameters.AffectedArtifactIds.Count == 0)
            {
                return(null);
            }

            var env = new PublishEnvironment
            {
                RevisionId           = publishRevision,
                Timestamp            = DateTime.UtcNow, // Need to get if from created revision - DB timestamp
                KeepLock             = false,
                ArtifactStates       = artifactStates.ToDictionary(s => s.ItemId),
                Repositories         = null,
                SensitivityCollector = new ReuseSensitivityCollector()
            };

            if (parameters.AffectedArtifactIds.Count <= 0)
            {
                return(env);
            }

            env.DeletedArtifactIds.Clear();
            env.DeletedArtifactIds.AddRange(
                await _versionControlRepository.DetectAndPublishDeletedArtifacts(parameters.UserId,
                                                                                 parameters.AffectedArtifactIds,
                                                                                 env, transaction));
            parameters.AffectedArtifactIds.ExceptWith(env.DeletedArtifactIds);

            // Release lock
            if (!env.KeepLock)
            {
                await _versionControlRepository.ReleaseLock(parameters.UserId, parameters.AffectedArtifactIds, transaction);
            }

            await _publishRepositoryComposer.Execute(publishRevision, parameters, env, transaction);

            // Add history
            await _revisionRepository.AddHistory(publishRevision, parameters.AffectedArtifactIds, transaction);

            // });

            publishResults.AddRange(env.GetChangeSqlPublishResults());

            return(env);
        }
        public async Task <ISet <int> > DetectAndPublishDeletedArtifacts(int userId, ISet <int> artifactIds, PublishEnvironment env, IDbTransaction transaction = null)
        {
            var deletedArtifactIds = (await GetDeletedArtifacts(userId, artifactIds, transaction)).ToHashSet();

            if (deletedArtifactIds.Any())
            {
                RemoveCollectionAssignments(userId, deletedArtifactIds, env, transaction);

                DeleteAndPublishArtifactsInSql(userId, deletedArtifactIds, env.RevisionId, transaction);
            }

            return(deletedArtifactIds);
        }
 public async Task Execute(int revisionId, PublishParameters parameters, PublishEnvironment environment, IDbTransaction transaction = null)
 {
     await AddArtifactChanges(parameters, environment, transaction);
 }
        public async Task Execute(int revisionId, PublishParameters parameters, PublishEnvironment environment, IDbTransaction transaction = null)
        {
            // await Task.Run(() =>
            // {
            var artifactIds         = parameters.ArtifactIds.ToHashSet();
            var draftAndLatestLinks = await GetDraftAndLatestLinks(artifactIds, parameters.UserId, transaction);

            if (!draftAndLatestLinks.Any())
            {
                return;
            }

            var deleteLinkVersionsIds      = new HashSet <int>();
            var closeLinkVersionIds        = new HashSet <int>();
            var markAsLatestLinkVersionIds = new HashSet <int>();

            foreach (var link in await FilterLinksThatCannotBePublished(draftAndLatestLinks, artifactIds))
            {
                if (link.DraftDeleted)
                {
                    deleteLinkVersionsIds.Add(link.DraftVersionId);

                    if (link.LatestVersionId.HasValue)
                    {
                        closeLinkVersionIds.Add(link.LatestVersionId.Value);

                        MarkArtifactsAsAffectedIfRequired(link, artifactIds, environment);

                        if (link.Type == LinkType.Reuse)
                        {
                            await DeleteReuseMapping(link.Item1Id, link.Item2Id, environment.RevisionId, transaction);
                        }

                        RegisterLinkModification(environment, link);
                    }
                }
                else
                {
                    if (IsChanged(link))
                    {
                        markAsLatestLinkVersionIds.Add(link.DraftVersionId);

                        if (link.LatestVersionId.HasValue)
                        {
                            closeLinkVersionIds.Add(link.LatestVersionId.Value);
                        }

                        MarkArtifactsAsAffectedIfRequired(link, artifactIds, environment);
                        RegisterLinkModification(environment, link);
                    }
                    else
                    {
                        // For unchanged link - delete the draft
                        deleteLinkVersionsIds.Add(link.DraftVersionId);
                    }
                }
            }

            await DeleteLinkVersions(deleteLinkVersionsIds, transaction);
            await CloseVersions(closeLinkVersionIds, environment.RevisionId, transaction);
            await MarkAsLatest(markAsLatestLinkVersionIds, environment.RevisionId, transaction);

            // });
        }
 private bool IsArtifactInPublishScope(PublishEnvironment env, int artifactId)
 {
     return(env.ArtifactStates.ContainsKey(artifactId) && !env.IsArtifactDeleted(artifactId));
 }
        private void MarkArtifactsAsAffectedIfRequired(DraftAndLatestLink link, HashSet <int> artifactIds, PublishEnvironment env)
        {
            // For manual traces and reuse links we adding history for live artifacts on both ends
            if (link.Type == LinkType.Manual || link.Type == LinkType.Reuse)
            {
                if (!env.IsArtifactDeleted(link.Artifact1Id))
                {
                    env.AddAffectedArtifact(link.Artifact1Id);
                }

                if (!env.IsArtifactDeleted(link.Artifact2Id))
                {
                    env.AddAffectedArtifact(link.Artifact2Id);
                }
            }
            else
            {
                if (artifactIds.Contains(link.Artifact1Id))
                {
                    env.AddAffectedArtifact(link.Artifact1Id);
                }
            }
        }
Exemplo n.º 19
0
        bool SendEmail()
        {
            try
            {
                ValidateParameters();
                using (MailMessage mailMessage = new MailMessage())
                {
                    using (SmtpClient client = new SmtpClient(Host, int.Parse(Port)))
                    {
                        client.UseDefaultCredentials = false;
                        client.EnableSsl             = EnableSsl;
                        if (string.IsNullOrEmpty(CredentialUserName))
                        {
                            client.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
                        }
                        else if (string.IsNullOrEmpty(CredentialDomain))
                        {
                            client.Credentials = new NetworkCredential(CredentialUserName, CredentialPassword);
                        }
                        else
                        {
                            client.Credentials = new NetworkCredential(CredentialUserName, CredentialPassword, CredentialDomain);
                        }

                        mailMessage.From = new MailAddress(From);
                        RefineReceiver(To, r => mailMessage.To.Add(r));
                        RefineReceiver(Cc, r => mailMessage.CC.Add(r));
                        RefineReceiver(Bcc, r => mailMessage.Bcc.Add(r));

                        AddAttachment(mailMessage, AttachFilePathList);

                        //AddAttachment(mailMessage, AttachFileStreamList);
                        foreach (Attachment item in AttachFileList)
                        {
                            mailMessage.Attachments.Add(item);
                        }

                        if (!PublishEnvironment.Equals("Dev", StringComparison.OrdinalIgnoreCase))
                        {
                            mailMessage.Subject = Subject;
                            mailMessage.Body    = Body;
                        }
                        else
                        {
                            mailMessage.Body    = "*** This email is being sent as a test. If you receive this e-mail, please safely ignore and sorry for the inconvenience! ***\r\n\r\n<br/>" + Body;
                            mailMessage.Subject = Subject + " (Test - please ignore)";
                        }

                        mailMessage.BodyEncoding = Encoding.UTF8;
                        mailMessage.IsBodyHtml   = true;
                        mailMessage.Priority     = MailPriority.Normal;
                        //#if !DEBUG
                        client.Send(mailMessage);
                        client.SendCompleted += SmtpClient_SendCompleted;
                        //#endif

                        LogFactory.BusinessLog.Info("Send Email [To:" + mailMessage.To.ToString() + "] [Subject: " + mailMessage.Subject.ToString() + "] [Body: " + mailMessage.Body.ToString() + "]");
                    }
                }
                return(true);
            }
            catch (Exception ex)
            {
                //throw ex;
                LogFactory.ExceptionLog.Error("Send Email", ex);
                return(false);
            }
        }
        private void RemoveCollectionAssignments(int userId, IEnumerable <int> deletedArtifactIds, PublishEnvironment env, IDbTransaction transaction)
        {
            // Create stored procedure for removing collection assignments
            // bool hasChanges = false;
            // foreach (var artifactId in env.FilterByBaseType(deletedArtifactIds, ItemTypePredefined.ArtifactCollection))
            // {
            //    ACollectionAssignment.RemoveAllAsPublishMarkedForDeletion(env.RevisionId, artifactId, ctx);
            //    hasChanges = true;
            // }

            // if (hasChanges)
            // {
            //    ctx.SaveChanges();
            // }
        }