Beispiel #1
0
        public ProjectWork GetProjectWorkById(int projectWorkID)
        {
            db = new DbConnect();

            command = new MySqlCommand("GetProjectWorkByID", db.GetConnection());
            command.Parameters.Add("@p_ProjectWorkID", MySqlDbType.Int32).Value = projectWorkID;
            command.CommandType = System.Data.CommandType.StoredProcedure;

            reader = command.ExecuteReader();

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    projectWork = new ProjectWork
                    {
                        ProjectWorkEntityID = reader.GetInt32("ProjectEntityID"),
                        Title              = reader.GetString("Title"),
                        SubTitle           = reader.GetString("SubTitle"),
                        ProjectDescription = reader.GetString("ProjectDescription"),
                        ImagePath          = reader.GetString("ImagePath"),
                        ImageDescription   = reader.GetString("ImageDescription"),
                        ExternalUrl        = reader.GetString("ExternalUrl"),
                        CreatedDate        = reader.GetDateTime("CreatedDate"),
                        ModifiedDate       = reader.GetDateTime("ModifiedDate")
                    };
                }
            }

            reader.Close();
            reader.Dispose();

            return(projectWork);
        }
 protected JobItemBase(ILogger logger, string projectId, ProjectWork projectWork)
 {
     ProjectId   = projectId;
     Id          = Guid.NewGuid().ToString();
     ProjectWork = projectWork;
     Logger      = logger;
 }
        public override async Task ProcessJobAsync(IResultSender resultSender)
        {
            using var scope = Logger.BeginScope("Export Drawing PDF ({Id})");
            Logger.LogInformation($"ProcessJob (ExportDrawingPDF) {Id} for project {ProjectId} started.");

            (FdaStatsDTO stats, int drawingIndex) = await ProjectWork.ExportDrawingPdfAsync(ProjectId, _hash, _drawingKey);

            Logger.LogInformation($"ProcessJob (ExportDrawingPDF) {Id} for project {ProjectId} completed.");

            string url = "";

            if (stats != null)
            {
                url = _linkGenerator.GetPathByAction(controller: "Download",
                                                     action: "DrawingPdf",
                                                     values: new { projectName = ProjectId, hash = _hash, index = drawingIndex });

                // when local url starts with slash, it does not work, because it is doubled in url
                if (url.StartsWith('/'))
                {
                    url = url.Substring(1);
                }
            }

            await resultSender.SendSuccessAsync(url, stats);
        }
 public MigrationJob(MigrationBucketKeyProvider bucketProvider, UserResolver userResolver, ProjectWork projectWork, ILogger <MigrationJob> logger, ProjectService projectService)
 {
     _bucketProvider = bucketProvider;
     _userResolver   = userResolver;
     _projectWork    = projectWork;
     _logger         = logger;
     _projectService = projectService;
 }
    public void AddToEnd(ProjectWork data)
    {
        var myFullName = data.FullName;
        var Lesson     = data.Lesson;
        var Credits    = data.Credits;

        //
    }
Beispiel #6
0
        public void AddWorkLoad(int projectWorkId, int workLoad)
        {
            ProjectWork projectWork = db.ProjectWorks.Find(projectWorkId);

            if (projectWork == null)
            {
                throw new NotFoundException();
            }
            projectWork.WorkLoad = workLoad;
        }
Beispiel #7
0
        public void DeleteWorkLoad(int projectWorkId)
        {
            ProjectWork projectWork = db.ProjectWorks.Find(projectWorkId);

            if (projectWork == null)
            {
                throw new NotFoundException();
            }
            projectWork.WorkLoad = null;
        }
Beispiel #8
0
        public void DeleteProjectWorkById(int id)
        {
            ProjectWork projectwork = db.ProjectWorks.Find(id);

            if (projectwork == null)
            {
                throw new NotFoundException();
            }
            db.ProjectWorks.Remove(projectwork);
        }
Beispiel #9
0
 public DataMigrationController(ILogger <DataMigrationController> logger, IOptions <DefaultProjectsConfiguration> optionsAccessor,
                                ProjectWork projectWork, UserResolver userResolver, IForgeOSS forgeOSS, LocalCache localCache)
 {
     _logger       = logger;
     _userResolver = userResolver;
     _bucket       = _userResolver.AnonymousBucket;
     _projectWork  = projectWork;
     _defaultProjectsConfiguration = optionsAccessor.Value;
     _forgeOSS   = forgeOSS;
     _localCache = localCache;
 }
Beispiel #10
0
        public JobsHub(ILogger <JobsHub> logger, ProjectWork projectWork, LinkGenerator linkGenerator, UserResolver userResolver, Uploads uploads, DtoGenerator dtoGenerator)
        {
            _logger        = logger;
            _projectWork   = projectWork;
            _linkGenerator = linkGenerator;
            _userResolver  = userResolver;
            _uploads       = uploads;
            _dtoGenerator  = dtoGenerator;

            _sender = new Sender(this);
        }
        public override async Task ProcessJobAsync(IResultSender resultSender)
        {
            using var scope = Logger.BeginScope("Project Adoption ({Id})");

            Logger.LogInformation($"ProcessJob (Adopt) {Id} for project {_projectInfo.Name} started.");

            // Check for valid project and root names (where applicable)
            if ((!string.IsNullOrEmpty(_projectInfo.TopLevelAssembly) && Regex.Match(_projectInfo.TopLevelAssembly, @"[\uFFF0-\uFFFF]").Success) ||
                Regex.Match(_projectInfo.Name, @"[\uFFF0-\uFFFF]").Success)
            {
                Logger.LogInformation($"Replacement charcters found in project name or top level assembly name for job {Id}.");

                throw new ProcessingException("Project name or assembly contains unsupported characters",
                                              new[] { "Please refer to https://github.com/Autodesk-Forge/forge-configurator-inventor/blob/master/README.md#project-file-zip-encoding" });
            }

            // upload the file to OSS
            var bucket = await _userResolver.GetBucketAsync(tryToCreate : true);

            ProjectStorage projectStorage = await _userResolver.GetProjectStorageAsync(_projectInfo.Name);

            string ossSourceModel = projectStorage.Project.OSSSourceModel;

            await bucket.SmartUploadAsync(_fileName, ossSourceModel);

            // cleanup before adoption
            File.Delete(_fileName);

            // adopt the project
            bool        adopted = false;
            FdaStatsDTO stats;
            string      reportUrl = null;

            try
            {
                string signedUploadedUrl = await bucket.CreateSignedUrlAsync(ossSourceModel);

                (stats, reportUrl) = await ProjectWork.AdoptAsync(_projectInfo, signedUploadedUrl);

                adopted = true;
            }
            finally
            {
                // on any failure during adoption we consider that project adoption failed and it's not usable
                if (!adopted)
                {
                    Logger.LogInformation($"Adoption failed. Removing '{ossSourceModel}' OSS object.");
                    await bucket.DeleteObjectAsync(ossSourceModel);
                }
            }

            Logger.LogInformation($"ProcessJob (Adopt) {Id} for project {_projectInfo.Name} completed.");
            await resultSender.SendSuccessAsync(_dtoGenerator.ToDTO(projectStorage), stats, reportUrl);
        }
Beispiel #12
0
        public void ChangeProject(int projectWorkId, int newProjectId)
        {
            Project     project     = db.Projects.Find(newProjectId);
            ProjectWork projectWork = db.ProjectWorks.Find(projectWorkId);

            if (projectWork == null)
            {
                throw new NotFoundException();
            }
            projectWork.ProjectId = newProjectId;
            projectWork.Project   = project;
        }
Beispiel #13
0
        public void ChangeEmployee(int projectWorkId, int newEmployeeId)
        {
            Employee    employee    = db.Employees.Find(newEmployeeId);
            ProjectWork projectWork = db.ProjectWorks.Find(projectWorkId);

            if (projectWork == null)
            {
                throw new NotFoundException();
            }
            projectWork.EmployeeId = newEmployeeId;
            projectWork.Employee   = employee;
        }
Beispiel #14
0
        public void ChangeEmployeesProjectRole(int projectWorkId, int newProjectRoleId)
        {
            ProjectRole projectRole = db.ProjectRoles.Find(newProjectRoleId);
            ProjectWork projectWork = db.ProjectWorks.Find(projectWorkId);

            if (projectWork == null)
            {
                throw new NotFoundException();
            }
            projectWork.ProjectRoleId = newProjectRoleId;
            projectWork.ProjectRole   = projectRole;
        }
 public Migration(IConfiguration configuration, BucketPrefixProvider bucketPrefix, IForgeOSS forgeOSS, MigrationBucketKeyProvider bucketProvider, UserResolver userResolver, ProjectWork projectWork, ILogger <Migration> logger, ResourceProvider resourceProvider, OssBucketFactory bucketFactory, ProjectService projectService)
 {
     _forgeOSS         = forgeOSS;
     _configuration    = configuration;
     _bucketPrefix     = bucketPrefix;
     _bucketProvider   = bucketProvider;
     _userResolver     = userResolver;
     _projectWork      = projectWork;
     _logger           = logger;
     _resourceProvider = resourceProvider;
     _bucketFactory    = bucketFactory;
     _projectService   = projectService;
 }
Beispiel #16
0
        public override async Task ProcessJobAsync(IResultSender resultSender)
        {
            using var scope = Logger.BeginScope("Update Model ({Id})");

            Logger.LogInformation($"ProcessJob (Update) {Id} for project {ProjectId} started.");

            ProjectStateDTO updatedState = await ProjectWork.DoSmartUpdateAsync(Parameters, ProjectId);

            Logger.LogInformation($"ProcessJob (Update) {Id} for project {ProjectId} completed.");

            // send that we are done to client
            await resultSender.SendSuccessAsync(updatedState);
        }
        /// <summary>
        /// Constructor.
        /// </summary>
        public Initializer(ILogger <Initializer> logger, FdaClient fdaClient, IOptions <DefaultProjectsConfiguration> optionsAccessor,
                           ProjectWork projectWork, UserResolver userResolver, LocalCache localCache)
        {
            _logger       = logger;
            _fdaClient    = fdaClient;
            _projectWork  = projectWork;
            _userResolver = userResolver;
            _localCache   = localCache;
            _defaultProjectsConfiguration = optionsAccessor.Value;

            // bucket for anonymous user
            _bucket = _userResolver.AnonymousBucket;
        }
Beispiel #18
0
 public ProjectWork GetProjectWorkById(int Id)
 {
     try
     {
         ProjectWorkDAL repository  = new ProjectWorkDAL();
         ProjectWork    projectWork = new ProjectWork();
         return(projectWork = repository.GetProjectWorkById(Id));
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
Beispiel #19
0
        public void DeleteEmployeeFromProject(int projectId, int employeeId)
        {
            List <ProjectWork> list = new List <ProjectWork>();

            list = db.ProjectWorks.Where(item => item.ProjectId == projectId && item.EmployeeId == employeeId).ToList();
            ProjectWork projectwork = list.First();

            if (projectwork == null)
            {
                throw new NotFoundException();
            }
            db.ProjectWorks.Remove(projectwork);
        }
Beispiel #20
0
        public ProjectService(ILogger <ProjectService> logger, UserResolver userResolver, ProjectWork projectWork)
        {
            _logger       = logger;
            _userResolver = userResolver;
            _projectWork  = projectWork;

            _waitForBucketPolicy = Policy
                                   .Handle <ApiException>(e => e.ErrorCode == StatusCodes.Status404NotFound)
                                   .WaitAndRetryAsync(
                retryCount: 4,
                retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
                (exception, timeSpan) => _logger.LogWarning("Cannot get fresh OSS bucket. Repeating")
                );
        }
        public override async Task ProcessJobAsync(IResultSender resultSender)
        {
            using var scope = Logger.BeginScope("Project Adoption ({Id})");

            Logger.LogInformation($"ProcessJob (Adopt) {Id} for project {_projectInfo.Name} started.");

            // upload the file to OSS
            var bucket = await _userResolver.GetBucketAsync(tryToCreate : true);

            ProjectStorage projectStorage = await _userResolver.GetProjectStorageAsync(_projectInfo.Name);

            string ossSourceModel = projectStorage.Project.OSSSourceModel;

            await bucket.SmartUploadAsync(_fileName, ossSourceModel);

            // cleanup before adoption
            File.Delete(_fileName);

            // adopt the project
            bool        adopted = false;
            FdaStatsDTO stats;

            try
            {
                string signedUploadedUrl = await bucket.CreateSignedUrlAsync(ossSourceModel);

                stats = await ProjectWork.AdoptAsync(_projectInfo, signedUploadedUrl);

                adopted = true;
            }
            catch (FdaProcessingException fpe)
            {
                await resultSender.SendErrorAsync(Id, fpe.ReportUrl);

                return;
            }
            finally
            {
                // on any failure during adoption we consider that project adoption failed and it's not usable
                if (!adopted)
                {
                    Logger.LogInformation($"Adoption failed. Removing '{ossSourceModel}' OSS object.");
                    await bucket.DeleteObjectAsync(ossSourceModel);
                }
            }

            Logger.LogInformation($"ProcessJob (Adopt) {Id} for project {_projectInfo.Name} completed.");
            await resultSender.SendSuccessAsync(_dtoGenerator.ToDTO(projectStorage), stats);
        }
Beispiel #22
0
 public JobsHub(ILogger <JobsHub> logger, ProjectWork projectWork, LinkGenerator linkGenerator, UserResolver userResolver,
                ProfileProvider profileProvider, Uploads uploads, DtoGenerator dtoGenerator, ProjectService projectService,
                AdoptProjectWithParametersPayloadProvider adoptProjectWithParametersPayloadProvider, IConfiguration configuration)
 {
     _logger          = logger;
     _projectWork     = projectWork;
     _linkGenerator   = linkGenerator;
     _profileProvider = profileProvider;
     _userResolver    = userResolver;
     _uploads         = uploads;
     _dtoGenerator    = dtoGenerator;
     _projectService  = projectService;
     _adoptProjectWithParametersPayloadProvider = adoptProjectWithParametersPayloadProvider;
     _configuration = configuration;
     _sender        = new Sender(this);
 }
Beispiel #23
0
        public ScheduleDTO CreateSchedule(ScheduleDTO item)
        {
            ProjectWork work     = Database.ProjectWorks.GetProjectWorkById(item.ProjectWorkId);
            ScheduleDay day      = Database.ScheduleDays.GetScheduleDayById(item.ScheduleDayId);
            Employee    employee = Database.Employees.GetEmployeeById(work.EmployeeId);
            ScheduleDTO result   = new ScheduleDTO();

            if (employee.PercentOrScheduleId == 3)
            {
                employee.PercentOrScheduleId = 2;
                employee.PercentOrSchedule   = Database.WorkLoads.GetTypeById(2);
                Schedule sch = new Schedule
                {
                    ProjectWorkId = item.ProjectWorkId,
                    ProjectWork   = work,
                    ScheduleDayId = item.ScheduleDayId,
                    ScheduleDay   = day
                };
                var sc = Database.Schedules.CreateSchedule(sch);
                Database.Save();
                result = Map.ObjectMap(sc);
                return(result);
            }
            if (employee.PercentOrScheduleId == 1)
            {
                throw new PercentOrScheduleException();
            }
            if (employee.PercentOrScheduleId == 2)
            {
                Schedule schedule = new Schedule
                {
                    ProjectWorkId = item.ProjectWorkId,
                    ProjectWork   = work,
                    ScheduleDayId = item.ScheduleDayId,
                    ScheduleDay   = day
                };

                var sc = Database.Schedules.CreateSchedule(schedule);
                Database.Save();
                result = Map.ObjectMap(sc);
                return(result);
            }
            return(result);
        }
Beispiel #24
0
        public List <ProjectWork> GetCollectionProjectWork()
        {
            try
            {
                db = new DbConnect();
                List <ProjectWork> projectWorks = new List <ProjectWork>();

                command             = new MySqlCommand("GetProjectWork", db.GetConnection());
                command.CommandType = System.Data.CommandType.StoredProcedure;

                reader = command.ExecuteReader();

                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        ProjectWork projectWork = new ProjectWork
                        {
                            ProjectWorkEntityID = reader.GetInt32("ProjectWorkEntityID"),
                            Title              = reader.GetString("Title"),
                            SubTitle           = reader.GetString("SubTitle"),
                            ProjectDescription = reader.GetString("ProjectDescription"),
                            ImagePath          = reader.GetString("ImagePath"),
                            ImageDescription   = reader.GetString("ImageDescription"),
                            ExternalUrl        = reader.GetString("ExternalUrl"),
                            CreatedDate        = reader.GetDateTime("CreatedDate"),
                            ModifiedDate       = reader.GetDateTime("ModifiedDate")
                        };

                        projectWorks.Add(projectWork);
                    }
                }

                reader.Close();
                reader.Dispose();

                return(projectWorks);
            }
            catch (MySqlException mysqlEx)
            {
                throw mysqlEx;
            }
        }
Beispiel #25
0
        public override async Task ProcessJobAsync(IResultSender resultSender)
        {
            using var scope = Logger.BeginScope("RFA generation ({Id})");

            Logger.LogInformation($"ProcessJob (RFA) {Id} for project {ProjectId} started.");

            (var stats, var reportUrl) = await ProjectWork.GenerateRfaAsync(ProjectId, _hash);

            Logger.LogInformation($"ProcessJob (RFA) {Id} for project {ProjectId} completed.");

            // TODO: this url can be generated right away... we can simply acknowledge that the OSS file is ready,
            // without generating a URL here
            string rfaUrl = _linkGenerator.GetPathByAction(controller: "Download",
                                                           action: "RFA",
                                                           values: new { projectName = ProjectId, hash = _hash });

            // send resulting URL to the client
            await resultSender.SendSuccessAsync(rfaUrl, stats, reportUrl);
        }
Beispiel #26
0
        public override async Task ProcessJobAsync(IResultSender resultSender)
        {
            using var scope = Logger.BeginScope("Drawing generation ({Id})");

            Logger.LogInformation($"ProcessJob (Drawing) {Id} for project {ProjectId} started.");

            FdaStatsDTO stats = await ProjectWork.GenerateDrawingAsync(ProjectId, _hash);

            Logger.LogInformation($"ProcessJob (Drawing) {Id} for project {ProjectId} completed.");

            // TODO: this url can be generated right away... we can simply acknowledge that OSS file is ready,
            // without generating URL here
            var drawingUrl = _linkGenerator.GetPathByAction(controller: "Download",
                                                            action: "Drawing",
                                                            values: new { projectName = ProjectId, hash = _hash });

            // send resulting URL to the client
            await resultSender.SendSuccessAsync(drawingUrl, stats);
        }
        public ParticipationHistoryDTO CreateHistory(ParticipationHistoryDTO historyDTO)
        {
            ProjectWork work = Database.ProjectWorks.GetProjectWorkById(historyDTO.ProjectWorkId);

            if (historyDTO.StartDate > historyDTO.EndDate)
            {
                throw new InvalidDateException();
            }
            ParticipationHistory history = new ParticipationHistory
            {
                ProjectWorkId = historyDTO.ProjectWorkId,
                ProjectWork   = work,
                StartDate     = historyDTO.StartDate,
                EndDate       = historyDTO.EndDate
            };

            var hist = Database.ParticipationHistories.CreateHistory(history);

            Database.Save();

            return(Map.ObjectMap(hist));
        }
Beispiel #28
0
        public ProjectWorkDTO CreateProjectWork(ProjectWorkDTO item)
        {
            Employee    employee    = Database.Employees.GetEmployeeById(item.EmployeeId);
            Project     project     = Database.Projects.GetProjectById(item.ProjectId);
            ProjectRole projectRole = Database.ProjectRoles.GetProjectRoleById(item.ProjectRoleId);

            Database.ProjectWorks.FindSameProjectWork(project.Id, employee.Id, projectRole.Id);
            ProjectWork projectWork = new ProjectWork
            {
                EmployeeId    = item.EmployeeId,
                Employee      = employee,
                ProjectId     = item.ProjectId,
                Project       = project,
                ProjectRoleId = item.ProjectRoleId,
                ProjectRole   = projectRole,
                WorkLoad      = null
            };

            var pw = Database.ProjectWorks.CreateProjectWork(projectWork);

            Database.Save();

            var empl = Database.Employees.GetEmployeeById(item.EmployeeId);

            if (empl.PercentOrScheduleId == 3)
            {
                Console.WriteLine("Добавьте процент загруженности или расписание");
            }
            if (empl.PercentOrScheduleId == 1)
            {
                Console.WriteLine("Добавьте процент загруженности");
            }
            if (empl.PercentOrScheduleId == 2)
            {
                Console.WriteLine("Добавьте расписание");
            }
            return(Map.ObjectMap(pw));
        }
        public override async Task ProcessJobAsync(IResultSender resultSender)
        {
            using var scope = Logger.BeginScope("Export Drawing ({Id})");

            Logger.LogInformation($"ProcessJob (ExportDrawing) {Id} for project {ProjectId} started.");

            bool generated = await ProjectWork.ExportDrawingViewablesAsync(ProjectId, _hash);

            Logger.LogInformation($"ProcessJob (ExportDrawing) {Id} for project {ProjectId} completed.");

            string url = "";

            if (generated)
            {
                url = _linkGenerator.GetPathByAction(controller: "Download",
                                                     action: "DrawingViewables",
                                                     values: new { projectName = ProjectId, fileName = "drawing.pdf", hash = _hash });

                // when local url starts with slash, it does not work, because it is doubled in url
                url = url.IndexOf("/") == 0 ? url.Substring(1) : url;
            }

            await resultSender.SendSuccessAsync(url);
        }
Beispiel #30
0
        public InitializerTestBase(DefaultProjectsConfiguration defaultProjectsConfiguration)
        {
            var configuration = new ConfigurationBuilder()
                                .SetBasePath(Directory.GetCurrentDirectory())
                                .AddJsonFile("appsettings.json", false)
                                .AddJsonFile("appsettings.Local.json", optional: true, reloadOnChange: true)
                                .AddEnvironmentVariables()
                                .AddForgeAlternativeEnvironmentVariables()
                                .Build();

            IServiceCollection services = new ServiceCollection();

            services.AddHttpClient();
            var serviceProvider = services.BuildServiceProvider();

            ForgeConfiguration            forgeConfiguration = configuration.GetSection("Forge").Get <ForgeConfiguration>();
            IOptions <ForgeConfiguration> forgeConfigOptions = Options.Create(forgeConfiguration);

            var httpClientFactory = serviceProvider.GetRequiredService <IHttpClientFactory>();

            forgeOSS = new ForgeOSS(httpClientFactory, forgeConfigOptions, new NullLogger <ForgeOSS>());

            var httpMessageHandler = new ForgeHandler(Options.Create(forgeConfiguration))
            {
                InnerHandler = new HttpClientHandler()
            };
            var forgeService           = new ForgeService(new HttpClient(httpMessageHandler));
            var designAutomationClient = new DesignAutomationClient(forgeService);

            projectsBucketKey = Guid.NewGuid().ToString();

            localCache = new LocalCache();
            var bucketPrefixProvider = new BucketPrefixProvider(forgeConfigOptions, configuration);
            var resourceProvider     = new ResourceProvider(forgeConfigOptions, designAutomationClient, configuration, bucketPrefixProvider, projectsBucketKey);
            var postProcessing       = new PostProcessing(httpClientFactory, new NullLogger <PostProcessing>(), localCache, Options.Create(new ProcessingOptions()));
            var publisher            = new Publisher(designAutomationClient, new NullLogger <Publisher>(), resourceProvider,
                                                     postProcessing, Options.Create(new PublisherConfiguration()),
                                                     new WorkItemsApi(forgeService), null, new TaskUtil());

            var appBundleZipPathsConfiguration = new AppBundleZipPaths
            {
                EmptyExe          = "../../../../WebApplication/AppBundles/EmptyExePlugin.bundle.zip",
                DataChecker       = "../../../../WebApplication/AppBundles/DataCheckerPlugin.bundle.zip",
                CreateSVF         = "../../../../WebApplication/AppBundles/CreateSVFPlugin.bundle.zip",
                CreateThumbnail   = "../../../../WebApplication/AppBundles/CreateThumbnailPlugin.bundle.zip",
                ExtractParameters = "../../../../WebApplication/AppBundles/ExtractParametersPlugin.bundle.zip",
                UpdateParameters  = "../../../../WebApplication/AppBundles/UpdateParametersPlugin.bundle.zip",
                CreateRFA         = "../../../../WebApplication/AppBundles/RFAExportRCEPlugin.bundle.zip",
                CreateBOM         = "../../../../WebApplication/AppBundles/ExportBOMPlugin.bundle.zip",
                ExportDrawing     = "../../../../WebApplication/AppBundles/ExportDrawingAsPdfPlugin.bundle.zip",
                UpdateDrawings    = "../../../../WebApplication/AppBundles/UpdateDrawingsPlugin.bundle.zip"
            };
            IOptions <AppBundleZipPaths> appBundleZipPathsOptions = Options.Create(appBundleZipPathsConfiguration);

            var fdaClient = new FdaClient(publisher, appBundleZipPathsOptions);
            IOptions <DefaultProjectsConfiguration> defaultProjectsOptions = Options.Create(defaultProjectsConfiguration);
            var profileProvider   = new ProfileProvider(forgeOSS);
            var bucketKeyProvider = new LoggedInUserBucketKeyProvider(profileProvider, resourceProvider);
            var userResolver      = new UserResolver(forgeOSS, bucketKeyProvider, localCache, NullLogger <UserResolver> .Instance, profileProvider);
            var arranger          = new Arranger(httpClientFactory, userResolver);

            // TODO: linkGenerator should be mocked
            var dtoGenerator = new DtoGenerator(linkGenerator: null, localCache);
            var projectWork  = new ProjectWork(new NullLogger <ProjectWork>(), arranger, fdaClient, dtoGenerator, userResolver);

            var projectService = new ProjectService(new NullLogger <ProjectService>(), userResolver, projectWork, dtoGenerator);

            initializer = new Initializer(new NullLogger <Initializer>(), fdaClient,
                                          defaultProjectsOptions, projectWork, userResolver, localCache,
                                          projectService, bucketPrefixProvider);

            testFileDirectory = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()));
            httpClient        = new HttpClient();
        }