public async Task UpdateDataModelProperty(ProjectDataModelProperty editedProperty, CancellationToken cancellationToken = default(CancellationToken))
        {
            cancellationToken.ThrowIfCancellationRequested();

            var propertyByNameSpec = new ProjectDataModelPropertyFilterSpecification(editedProperty.Name, editedProperty.ProjectDataModelId, editedProperty.Id);

            if (await _dataModelPropertyRepository.CountBySpec(propertyByNameSpec, cancellationToken) > 0)
            {
                throw new DuplicateProjectDataModelPropertyException(editedProperty.Name);
            }

            var property = await _dataModelPropertyRepository.GetById(editedProperty.Id, cancellationToken);

            if (property != null)
            {
                property.Name        = editedProperty.Name;
                property.DataType    = editedProperty.DataType;
                property.Label       = editedProperty.Label;
                property.IsRequired  = editedProperty.IsRequired;
                property.ControlType = editedProperty.ControlType;
                property.RelatedProjectDataModelId = editedProperty.RelatedProjectDataModelId;
                property.RelationalType            = editedProperty.RelationalType;
                property.IsManaged = editedProperty.IsManaged;
                await _dataModelPropertyRepository.Update(property, cancellationToken);
            }
        }
Exemple #2
0
        public async Task <Project> CloneProject(int sourceProjectId, string newProjectName, string newDisplayName, string newClient, int ownerUserId, bool includeMembers = false,
                                                 bool includeJobDefinitions = false, CancellationToken cancellationToken = default(CancellationToken))
        {
            cancellationToken.ThrowIfCancellationRequested();

            newProjectName = GetNormalizedProjectName(newProjectName);

            // set default display name
            newDisplayName = !string.IsNullOrEmpty(newDisplayName) ? newDisplayName : newProjectName;

            var projectByNameSpec = new ProjectFilterSpecification(newProjectName);
            var duplicateProjects = await _projectRepository.GetBySpec(projectByNameSpec, cancellationToken);

            if (duplicateProjects.Any())
            {
                throw new DuplicateProjectException(newProjectName);
            }

            var projectByIdSpec = new ProjectFilterSpecification(sourceProjectId);

            projectByIdSpec.IncludeStrings.Add("Models.Properties.RelatedProjectDataModel");
            projectByIdSpec.IncludeStrings.Add("Jobs.Tasks");
            projectByIdSpec.IncludeStrings.Add("Members");
            var sourceProject = await _projectRepository.GetSingleBySpec(projectByIdSpec, cancellationToken);

            if (sourceProject == null)
            {
                throw new ProjectNotFoundException(sourceProjectId);
            }

            var newProject = new Project
            {
                Name        = newProjectName,
                DisplayName = newDisplayName,
                Client      = newClient ?? sourceProject.Client,
                Models      = sourceProject.Models?.Select(m => new ProjectDataModel
                {
                    Name              = m.Name,
                    Description       = m.Description,
                    Label             = m.Label,
                    DatabaseTableName = m.DatabaseTableName,
                    Properties        = m.Properties?.Select(p => new ProjectDataModelProperty
                    {
                        Name           = p.Name,
                        Label          = p.Label,
                        DataType       = p.DataType,
                        ControlType    = p.ControlType,
                        RelationalType = p.RelationalType,
                        RelatedProjectDataModelName = p.RelatedProjectDataModel?.Name,
                        IsRequired         = p.IsRequired,
                        IsManaged          = p.IsManaged,
                        IsKey              = p.IsKey,
                        DatabaseColumnName = p.DatabaseColumnName,
                        Sequence           = p.Sequence,
                        Created            = DateTime.UtcNow
                    }).ToList(),
                    Created = DateTime.UtcNow
                }).ToList()
            };

            var propertiesWithRelational = newProject.Models.SelectMany(m => m.Properties).Where(p => !string.IsNullOrEmpty(p.RelatedProjectDataModelName)).ToList();

            if (includeJobDefinitions)
            {
                newProject.Jobs = sourceProject?.Jobs.Select(j => new JobDefinition
                {
                    Name  = j.Name,
                    Tasks = j.Tasks?.Select(sourceTask => new JobTaskDefinition
                    {
                        Name         = sourceTask.Name,
                        Type         = sourceTask.Type,
                        Provider     = sourceTask.Provider,
                        Sequence     = sourceTask.Sequence,
                        ConfigString = sourceTask.ConfigString,
                        Created      = DateTime.UtcNow
                    }).ToList(),
                    Created = DateTime.UtcNow
                }).ToList();
            }

            if (includeMembers)
            {
                newProject.Members = sourceProject?.Members?.Select(m => new ProjectMember
                {
                    UserId = m.UserId,
                    ProjectMemberRoleId = m.ProjectMemberRoleId,
                    Created             = DateTime.UtcNow
                }).ToList();
            }
            else
            {
                newProject.Members = new List <ProjectMember>
                {
                    new ProjectMember
                    {
                        UserId = ownerUserId,
                        ProjectMemberRoleId = MemberRole.OwnerId,
                        Created             = DateTime.UtcNow
                    }
                };
            }

            var newProjectId = await _projectRepository.Create(newProject, cancellationToken);

            // map the relational property from RelatedProjectDataModelName
            if (propertiesWithRelational != null)
            {
                foreach (var property in propertiesWithRelational)
                {
                    property.RelatedProjectDataModelId = newProject.Models.FirstOrDefault(m => m.Name == property.RelatedProjectDataModelName)?.Id;
                    await _projectDataModelPropertyRepository.Update(property);
                }
            }

            return(newProject);
        }