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); } }
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); }