Example #1
0
        protected override void PersistUpdatedItem(IMember entity)
        {
            var member = (Member)entity;

            // update
            member.UpdatingEntity();

            // ensure that strings don't contain characters that are invalid in xml
            // TODO: do we really want to keep doing this here?
            entity.SanitizeEntityPropertiesForXmlStorage();

            // if parent has changed, get path, level and sort order
            if (entity.IsPropertyDirty("ParentId"))
            {
                var parent = GetParentNodeDto(entity.ParentId);

                entity.Path      = string.Concat(parent.Path, ",", entity.Id);
                entity.Level     = parent.Level + 1;
                entity.SortOrder = GetNewChildSortOrder(entity.ParentId, 0);
            }

            // create the dto
            var dto = ContentBaseFactory.BuildDto(entity);

            // update the node dto
            var nodeDto = dto.ContentDto.NodeDto;

            Database.Update(nodeDto);

            // update the content dto
            Database.Update(dto.ContentDto);

            // update the content version dto
            Database.Update(dto.ContentVersionDto);

            // update the member dto
            // but only the changed columns, 'cos we cannot update password if empty
            var changedCols = new List <string>();

            if (entity.IsPropertyDirty("Email"))
            {
                changedCols.Add("Email");
            }

            if (entity.IsPropertyDirty("Username"))
            {
                changedCols.Add("LoginName");
            }

            // do NOT update the password if it has not changed or if it is null or empty
            if (entity.IsPropertyDirty("RawPasswordValue") && !string.IsNullOrWhiteSpace(entity.RawPasswordValue))
            {
                changedCols.Add("Password");
            }

            if (changedCols.Count > 0)
            {
                Database.Update(dto, changedCols);
            }

            // replace the property data
            var deletePropertyDataSql = SqlContext.Sql().Delete <PropertyDataDto>().Where <PropertyDataDto>(x => x.VersionId == member.VersionId);

            Database.Execute(deletePropertyDataSql);
            var propertyDataDtos = PropertyFactory.BuildDtos(member.ContentType.Variations, member.VersionId, 0, entity.Properties, LanguageRepository, out _, out _);

            foreach (var propertyDataDto in propertyDataDtos)
            {
                Database.Insert(propertyDataDto);
            }

            SetEntityTags(entity, _tagRepository);

            OnUowRefreshedEntity(new ScopedEntityEventArgs(AmbientScope, entity));

            entity.ResetDirtyProperties();
        }
Example #2
0
        protected override void PersistNewItem(IMember entity)
        {
            if (entity.ProviderUserKey == null)
            {
                entity.ProviderUserKey = entity.Key;
            }
            entity.AddingEntity();

            var member = (Member)entity;

            // ensure that strings don't contain characters that are invalid in xml
            // TODO: do we really want to keep doing this here?
            entity.SanitizeEntityPropertiesForXmlStorage();

            // create the dto
            var dto = ContentBaseFactory.BuildDto(entity);

            // derive path and level from parent
            var parent = GetParentNodeDto(entity.ParentId);
            var level  = parent.Level + 1;

            // get sort order
            var sortOrder = GetNewChildSortOrder(entity.ParentId, 0);

            // persist the node dto
            var nodeDto = dto.ContentDto.NodeDto;

            nodeDto.Path      = parent.Path;
            nodeDto.Level     = Convert.ToInt16(level);
            nodeDto.SortOrder = sortOrder;

            // see if there's a reserved identifier for this unique id
            // and then either update or insert the node dto
            var id = GetReservedId(nodeDto.UniqueId);

            if (id > 0)
            {
                nodeDto.NodeId = id;
                nodeDto.Path   = string.Concat(parent.Path, ",", nodeDto.NodeId);
                nodeDto.ValidatePathWithException();
                Database.Update(nodeDto);
            }
            else
            {
                Database.Insert(nodeDto);

                // update path, now that we have an id
                nodeDto.Path = string.Concat(parent.Path, ",", nodeDto.NodeId);
                nodeDto.ValidatePathWithException();
                Database.Update(nodeDto);
            }

            // update entity
            entity.Id        = nodeDto.NodeId;
            entity.Path      = nodeDto.Path;
            entity.SortOrder = sortOrder;
            entity.Level     = level;

            // persist the content dto
            var contentDto = dto.ContentDto;

            contentDto.NodeId = nodeDto.NodeId;
            Database.Insert(contentDto);

            // persist the content version dto
            // assumes a new version id and version date (modified date) has been set
            var contentVersionDto = dto.ContentVersionDto;

            contentVersionDto.NodeId  = nodeDto.NodeId;
            contentVersionDto.Current = true;
            Database.Insert(contentVersionDto);
            member.VersionId = contentVersionDto.Id;

            // persist the member dto
            dto.NodeId = nodeDto.NodeId;

            // if the password is empty, generate one with the special prefix
            // this will hash the guid with a salt so should be nicely random
            if (entity.RawPasswordValue.IsNullOrWhiteSpace())
            {
                var aspHasher = new PasswordHasher();
                dto.Password            = Constants.Security.EmptyPasswordPrefix + aspHasher.HashPassword(Guid.NewGuid().ToString("N"));
                entity.RawPasswordValue = dto.Password;
            }

            Database.Insert(dto);

            // persist the property data
            var propertyDataDtos = PropertyFactory.BuildDtos(member.ContentType.Variations, member.VersionId, 0, entity.Properties, LanguageRepository, out _, out _);

            foreach (var propertyDataDto in propertyDataDtos)
            {
                Database.Insert(propertyDataDto);
            }

            SetEntityTags(entity, _tagRepository);

            OnUowRefreshedEntity(new ScopedEntityEventArgs(AmbientScope, entity));

            entity.ResetDirtyProperties();
        }
        protected override void PersistUpdatedItem(IMedia entity)
        {
            var media = (Models.Media)entity;

            // update
            media.UpdatingEntity();

            // ensure unique name on the same level
            entity.Name = EnsureUniqueNodeName(entity.ParentId, entity.Name, entity.Id);

            // ensure that strings don't contain characters that are invalid in xml
            // TODO: do we really want to keep doing this here?
            entity.SanitizeEntityPropertiesForXmlStorage();

            // if parent has changed, get path, level and sort order
            if (entity.IsPropertyDirty("ParentId"))
            {
                var parent = GetParentNodeDto(entity.ParentId);

                entity.Path      = string.Concat(parent.Path, ",", entity.Id);
                entity.Level     = parent.Level + 1;
                entity.SortOrder = GetNewChildSortOrder(entity.ParentId, 0);
            }

            // create the dto
            var dto = ContentBaseFactory.BuildDto(entity);

            // update the node dto
            var nodeDto = dto.ContentDto.NodeDto;

            nodeDto.ValidatePathWithException();
            Database.Update(nodeDto);

            // update the content dto
            Database.Update(dto.ContentDto);

            // update the content & media version dtos
            var contentVersionDto = dto.MediaVersionDto.ContentVersionDto;
            var mediaVersionDto   = dto.MediaVersionDto;

            contentVersionDto.Current = true;
            Database.Update(contentVersionDto);
            Database.Update(mediaVersionDto);

            // replace the property data
            var deletePropertyDataSql = SqlContext.Sql().Delete <PropertyDataDto>().Where <PropertyDataDto>(x => x.VersionId == media.VersionId);

            Database.Execute(deletePropertyDataSql);
            var propertyDataDtos = PropertyFactory.BuildDtos(media.ContentType.Variations, media.VersionId, 0, entity.Properties, LanguageRepository, out _, out _);

            foreach (var propertyDataDto in propertyDataDtos)
            {
                Database.Insert(propertyDataDto);
            }

            SetEntityTags(entity, _tagRepository);

            OnUowRefreshedEntity(new ScopedEntityEventArgs(AmbientScope, entity));

            entity.ResetDirtyProperties();
        }
        protected override void PersistNewItem(IMedia entity)
        {
            var media = (Models.Media)entity;

            media.AddingEntity();

            // ensure unique name on the same level
            entity.Name = EnsureUniqueNodeName(entity.ParentId, entity.Name);

            // ensure that strings don't contain characters that are invalid in xml
            // TODO: do we really want to keep doing this here?
            entity.SanitizeEntityPropertiesForXmlStorage();

            // create the dto
            var dto = ContentBaseFactory.BuildDto(entity);

            // derive path and level from parent
            var parent = GetParentNodeDto(entity.ParentId);
            var level  = parent.Level + 1;

            // get sort order
            var sortOrder = GetNewChildSortOrder(entity.ParentId, 0);

            // persist the node dto
            var nodeDto = dto.ContentDto.NodeDto;

            nodeDto.Path      = parent.Path;
            nodeDto.Level     = Convert.ToInt16(level);
            nodeDto.SortOrder = sortOrder;

            // see if there's a reserved identifier for this unique id
            // and then either update or insert the node dto
            var id = GetReservedId(nodeDto.UniqueId);

            if (id > 0)
            {
                nodeDto.NodeId = id;
            }
            else
            {
                Database.Insert(nodeDto);
            }

            nodeDto.Path = string.Concat(parent.Path, ",", nodeDto.NodeId);
            nodeDto.ValidatePathWithException();
            Database.Update(nodeDto);

            // update entity
            entity.Id        = nodeDto.NodeId;
            entity.Path      = nodeDto.Path;
            entity.SortOrder = sortOrder;
            entity.Level     = level;

            // persist the content dto
            var contentDto = dto.ContentDto;

            contentDto.NodeId = nodeDto.NodeId;
            Database.Insert(contentDto);

            // persist the content version dto
            // assumes a new version id and version date (modified date) has been set
            var contentVersionDto = dto.MediaVersionDto.ContentVersionDto;

            contentVersionDto.NodeId  = nodeDto.NodeId;
            contentVersionDto.Current = true;
            Database.Insert(contentVersionDto);
            media.VersionId = contentVersionDto.Id;

            // persist the media version dto
            var mediaVersionDto = dto.MediaVersionDto;

            mediaVersionDto.Id = media.VersionId;
            Database.Insert(mediaVersionDto);

            // persist the property data
            var propertyDataDtos = PropertyFactory.BuildDtos(media.ContentType.Variations, media.VersionId, 0, entity.Properties, LanguageRepository, out _, out _);

            foreach (var propertyDataDto in propertyDataDtos)
            {
                Database.Insert(propertyDataDto);
            }

            // set tags
            SetEntityTags(entity, _tagRepository);

            OnUowRefreshedEntity(new ScopedEntityEventArgs(AmbientScope, entity));

            entity.ResetDirtyProperties();
        }
Example #5
0
        protected override void PersistUpdatedItem(IMedia entity)
        {
            // update
            entity.UpdatingEntity();

            // Check if this entity is being moved as a descendant as part of a bulk moving operations.
            // In this case we can bypass a lot of the below operations which will make this whole operation go much faster.
            // When moving we don't need to create new versions, etc... because we cannot roll this operation back anyways.
            var isMoving = entity.IsMoving();

            if (!isMoving)
            {
                // ensure unique name on the same level
                entity.Name = EnsureUniqueNodeName(entity.ParentId, entity.Name, entity.Id);

                // ensure that strings don't contain characters that are invalid in xml
                // TODO: do we really want to keep doing this here?
                entity.SanitizeEntityPropertiesForXmlStorage();

                // if parent has changed, get path, level and sort order
                if (entity.IsPropertyDirty(nameof(entity.ParentId)))
                {
                    var parent = GetParentNodeDto(entity.ParentId);

                    entity.Path      = string.Concat(parent.Path, ",", entity.Id);
                    entity.Level     = parent.Level + 1;
                    entity.SortOrder = GetNewChildSortOrder(entity.ParentId, 0);
                }
            }

            // create the dto
            var dto = ContentBaseFactory.BuildDto(PropertyEditors, entity);

            // update the node dto
            var nodeDto = dto.ContentDto.NodeDto;

            nodeDto.ValidatePathWithException();
            Database.Update(nodeDto);

            if (!isMoving)
            {
                // update the content dto
                Database.Update(dto.ContentDto);

                // update the content & media version dtos
                var contentVersionDto = dto.MediaVersionDto.ContentVersionDto;
                var mediaVersionDto   = dto.MediaVersionDto;
                contentVersionDto.Current = true;
                Database.Update(contentVersionDto);
                Database.Update(mediaVersionDto);

                // replace the property data
                var deletePropertyDataSql = SqlContext.Sql().Delete <PropertyDataDto>().Where <PropertyDataDto>(x => x.VersionId == entity.VersionId);
                Database.Execute(deletePropertyDataSql);
                var propertyDataDtos = PropertyFactory.BuildDtos(entity.ContentType.Variations, entity.VersionId, 0, entity.Properties, LanguageRepository, out _, out _);
                foreach (var propertyDataDto in propertyDataDtos)
                {
                    Database.Insert(propertyDataDto);
                }

                SetEntityTags(entity, _tagRepository);

                PersistRelations(entity);
            }

            OnUowRefreshedEntity(new ScopedEntityEventArgs(AmbientScope, entity));

            entity.ResetDirtyProperties();
        }
Example #6
0
        protected override void PersistUpdatedItem(IMember entity)
        {
            var member = (Member)entity;

            // update
            member.UpdatingEntity();

            // ensure that strings don't contain characters that are invalid in xml
            // TODO: do we really want to keep doing this here?
            entity.SanitizeEntityPropertiesForXmlStorage();

            // if parent has changed, get path, level and sort order
            if (entity.IsPropertyDirty("ParentId"))
            {
                var parent = GetParentNodeDto(entity.ParentId);

                entity.Path      = string.Concat(parent.Path, ",", entity.Id);
                entity.Level     = parent.Level + 1;
                entity.SortOrder = GetNewChildSortOrder(entity.ParentId, 0);
            }

            // create the dto
            var dto = ContentBaseFactory.BuildDto(entity);

            // update the node dto
            var nodeDto = dto.ContentDto.NodeDto;

            Database.Update(nodeDto);

            // update the content dto
            Database.Update(dto.ContentDto);

            // update the content version dto
            Database.Update(dto.ContentVersionDto);

            // update the member dto
            // but only the changed columns, 'cos we cannot update password if empty
            var changedCols = new List <string>();

            if (entity.IsPropertyDirty("Email"))
            {
                changedCols.Add("Email");
            }

            if (entity.IsPropertyDirty("Username"))
            {
                changedCols.Add("LoginName");
            }

            // do NOT update the password if it has not changed or if it is null or empty
            if (entity.IsPropertyDirty("RawPasswordValue") && !string.IsNullOrWhiteSpace(entity.RawPasswordValue))
            {
                changedCols.Add("Password");
            }

            if (changedCols.Count > 0)
            {
                Database.Update(dto, changedCols);
            }

            // Replace the property data
            // Lookup the data to update with a UPDLOCK (using ForUpdate()) this is because we have another method that doesn't take an explicit WriteLock
            // in SetLastLogin which is called very often and we want to avoid the lock timeout for the explicit lock table but we still need to ensure atomic
            // operations between that method and this one.

            var propDataSql      = SqlContext.Sql().Select("*").From <PropertyDataDto>().Where <PropertyDataDto>(x => x.VersionId == member.VersionId).ForUpdate();
            var existingPropData = Database.Fetch <PropertyDataDto>(propDataSql).ToDictionary(x => x.PropertyTypeId);
            var propertyDataDtos = PropertyFactory.BuildDtos(member.ContentType.Variations, member.VersionId, 0, entity.Properties, LanguageRepository, out _, out _);

            foreach (var propertyDataDto in propertyDataDtos)
            {
                // Check if this already exists and update, else insert a new one
                if (existingPropData.TryGetValue(propertyDataDto.PropertyTypeId, out var propData))
                {
                    propertyDataDto.Id = propData.Id;
                    Database.Update(propertyDataDto);
                }
                else
                {
                    Database.Insert(propertyDataDto);
                }
            }

            SetEntityTags(entity, _tagRepository);

            PersistRelations(entity);

            OnUowRefreshedEntity(new ScopedEntityEventArgs(AmbientScope, entity));

            entity.ResetDirtyProperties();
        }