public static void AddCustomDataContext(
            this IServiceCollection services,
            IConfiguration configuration)
        {
            services.AddScoped(provider =>
            {
                var httpContextAccessor = provider.GetService <IHttpContextAccessor>();
                var httpContext         = httpContextAccessor.HttpContext;

                string tenantRoute = httpContext.GetTenantRoute();

                //Validate tenant has access
                var masterContext = provider.GetService <AdminDataContext>();
                if (masterContext.Tenants.Where(x => x.TenantRoute == tenantRoute).FirstOrDefault() == null)
                {
                    throw new UnauthorizedAccessException("Tenant invalid");
                }

                var connString = configuration.GetTenantConnectionString(tenantRoute);
                var opts       = new DbContextOptionsBuilder <TenantDataContext>();
                opts.UseNpgsql(connString,
                               s => s
                               .EnableRetryOnFailure()
                               .MigrationsAssembly(typeof(Program).Assembly.FullName)
                               );
                opts.EnableSensitiveDataLogging();

                var tenantDataContext = new TenantDataContext(opts.Options);
                tenantDataContext.Database.Migrate();

                return(tenantDataContext);
            });
        }
Example #2
0
        private static async void CreateAndMigrateDatabases(IHost host)
        {
            using (var scope = host.Services.CreateScope())
            {
                var tenantService = scope.ServiceProvider.GetService <TenantService>();
                var tenants       = await tenantService.GetAllTenantsAsync();

                foreach (var tenant in tenants)
                {
                    try
                    {
                        Console.WriteLine($"checking db for {tenant.Id} : {tenant.Name}");

                        var optionsBuilder = new DbContextOptionsBuilder <TenantDataContext>();
                        optionsBuilder.UseMySql(tenant.ConnectionString());

                        var dbContext = new TenantDataContext(optionsBuilder.Options);
                        TenantDataContextSeed.SeedAsync(dbContext, new CreateTenant()
                        {
                            UserId = Guid.Parse("08d84f75-8698-4cf5-82a3-094415fcd132"),
                            Tenant = tenant
                        }).Wait();
                    }
                    catch (Exception exception)
                    {
                        Console.WriteLine(exception);
                    }
                }
            }
        }
Example #3
0
        public static async Task SeedAsync(TenantDataContext dataContext, CreateTenant createTenant)
        {
            try
            {
                if (!dataContext.Projects.Any())
                {
                    Console.WriteLine("Adding data");

                    if (createTenant == null)
                    {
                        createTenant = new CreateTenant()
                        {
                            UserId = Guid.Parse("08d8419b-2bcb-4390-8b99-50960f9a3c59"),
                            Tenant =
                            {
                                Name = "Hello"
                            }
                        };
                    }

                    await AddData(dataContext, createTenant);
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }
        public async Task <IActionResult> GetContacts(
            [FromRoute] string tenantRoute, [FromServices] TenantDataContext context)
        {
            var customers = await context.Customers.ToListAsync();

            return(Ok(customers));
        }
 public async Task ReturnsListOfJobs()
 {
     using (var context = new TenantDataContext(_dbOptions))
     {
         var jobService = new Warehouse.Services.JobService(context);
         Assert.AreEqual(10, (await jobService.GetAllJobsAsync()).Count);
     }
 }
        public async Task ReturnsCorrectJob()
        {
            using (var context = new TenantDataContext(_dbOptions))
            {
                var jobService = new Warehouse.Services.JobService(context);
                var id         = new Guid("0C8EBA6A-9765-43FB-A80D-A8C06D46AA2F");
                var job        = await jobService.GetJobAsync(id);

                job.Id.Should().Be(id);
            }
        }
        public async Task ReturnsListOfValidJobs()
        {
            using (var context = new TenantDataContext(_dbOptions))
            {
                var jobService = new Warehouse.Services.JobService(context);
                var jobs       = await jobService.GetAllJobsAsync();

                foreach (var job in jobs)
                {
                    Assert.IsNotNull(job);
                }
            }
        }
        public async Task <TenantConfig> CreateTenantAsync(CreateTenant createTenant)
        {
            var tenant = new TenantConfig()
            {
                Name        = createTenant.Tenant.Name,
                DbName      = $"warehousedb{createTenant.Tenant.Name}",
                DbServer    = "localhost",
                DbUser      = "******",
                DbPassword  = "******",
                Accent      = createTenant.Tenant.Accent,
                Avatar      = createTenant.Tenant.Avatar,
                Description = createTenant.Tenant.Description
            };

            if ((await _multiTenantContext.TenantConfigs.FirstOrDefaultAsync(x => x.Name == tenant.Name)) != null)
            {
                return(null);
            }

            await _multiTenantContext.TenantConfigs.AddAsync(tenant);

            var employment = new Employment()
            {
                TenantId = tenant.Id,
                UserId   = createTenant.UserId
            };
            await _multiTenantContext.Employments.AddAsync(employment);

            try
            {
                await _multiTenantContext.SaveChangesAsync();

                var optionsBuilder = new DbContextOptionsBuilder <TenantDataContext>();
                optionsBuilder.UseMySql(tenant.ConnectionString());

                var dbContext = new TenantDataContext(optionsBuilder.Options);
                await TenantDataContextSeed.SeedAsync(dbContext, createTenant);

                return(tenant);
            }
            catch
            {
                return(null);
            }
        }
Example #9
0
        public async Task Setup()
        {
            _dbOptions = new DbContextOptionsBuilder <TenantDataContext>()
                         .UseInMemoryDatabase(databaseName: "tenantdb").Options;

            using (var context = new TenantDataContext(_dbOptions))
            {
                Console.WriteLine("Starting data seed");
                await TenantDataContextTestSeed.SeedAsync(context, new CreateTenant()
                {
                    Tenant = new TenantConfig()
                    {
                        Name = "Test"
                    },
                    UserId = Guid.NewGuid()
                });
            }
        }
Example #10
0
        public IList <T> GetDataFromStoredProcedure <T>(string connectionString, string storeName, IQueryInfo queryInfo, ref int totalRowCount) where T : new()
        {
            var context = new TenantDataContext(connectionString);
            var data    =
                context.Database.QueryStore <T>
                (
                    storeName, ref totalRowCount,
                    CommandType.StoredProcedure,
                    queryInfo != null?
                    new[]
            {
                new SqlParameter("@SearchString", queryInfo.SearchString),
                new SqlParameter("@Skip", queryInfo.Skip),
                new SqlParameter("@Take", queryInfo.Take)
            }:null
                );

            return(data ?? new List <T>());
        }
Example #11
0
        public ActionResult SeedEmailTemplates(Tenant tenant)
        {
            var selectedTenant = db.Tenants.Find(tenant.Id);

            if (selectedTenant != null)
            {
                var connectionString = selectedTenant.ConnectionString;
                if (!string.IsNullOrEmpty(connectionString))
                {
                    using (var tenantContext = new TenantDataContext())
                    {
                        var emailTemplates = tenantContext.EmailTemplates.ToList();

                        using (var context = new GridDataContext(connectionString))
                        {
                            // Select Admin as the Creator
                            var selectedUser = context.Users.FirstOrDefault(u => u.Username == selectedTenant.Email);

                            if (selectedUser != null)
                            {
                                foreach (var emailTemplate in emailTemplates)
                                {
                                    context.EmailTemplates.Add(new Entities.Company.EmailTemplate
                                    {
                                        Name            = emailTemplate.Name,
                                        Content         = emailTemplate.Content,
                                        CreatedOn       = DateTime.UtcNow,
                                        CreatedByUserId = selectedUser.Id
                                    });
                                }
                            }

                            context.SaveChanges();

                            return(RedirectToAction("Index"));
                        }
                    }
                }
            }

            return(View(tenant));
        }
Example #12
0
 public ModuleService(TenantDataContext tenantDataContext)
 {
     _tenantDataContext = tenantDataContext;
 }
Example #13
0
 public JobExtrasService(TenantDataContext tenantDataContext)
 {
     _tenantDataContext = tenantDataContext;
 }
Example #14
0
 public RoomService(TenantDataContext tenantDataContext)
 {
     _tenantDataContext = tenantDataContext;
 }
Example #15
0
        private static async Task AddData(TenantDataContext dataContext, CreateTenant createTenant)
        {
            var projectId = Guid.NewGuid();
            var listId    = Guid.NewGuid();
            var userId    = createTenant.UserId;
            var roomId    = Guid.NewGuid();

            var jobIds         = new List <Guid>();
            var jobEmployments = new List <JobEmployment>();

            for (int i = 0; i < 10; i++)
            {
                var id = Guid.NewGuid();
                jobIds.Add(id);
                jobEmployments.Add(new JobEmployment()
                {
                    JobId  = id,
                    UserId = userId
                });
            }

            jobIds[0] = new Guid("0C8EBA6A-9765-43FB-A80D-A8C06D46AA2F");

            var user = new UserId()
            {
                Id              = userId,
                JobEmployments  = jobEmployments,
                ListEmployments = new List <ListEmployment>()
                {
                    new ListEmployment()
                    {
                        ListId = listId,
                        UserId = userId
                    }
                },
                ProjectEmployments = new List <ProjectEmployment>()
                {
                    new ProjectEmployment()
                    {
                        ProjectId = projectId,
                        UserId    = userId
                    }
                },
                RoomMemberships = new List <RoomMembership>()
                {
                    new RoomMembership()
                    {
                        RoomId = roomId, UserId = userId
                    }
                }
            };

            var statuses = new List <JobStatus>()
            {
                new JobStatus()
                {
                    Id       = Guid.NewGuid(),
                    Colour   = "#fec128",
                    Name     = "Todo",
                    Finished = false
                },
                new JobStatus()
                {
                    Id       = Guid.NewGuid(),
                    Colour   = "#f77d16",
                    Name     = "In progress",
                    Finished = false
                },
                new JobStatus()
                {
                    Id       = Guid.NewGuid(),
                    Colour   = "#03bbd3",
                    Name     = "Verify",
                    Finished = false
                },
                new JobStatus()
                {
                    Id       = Guid.NewGuid(),
                    Colour   = "#68B642",
                    Name     = "Completed",
                    Finished = true
                },
            };

            var types = new List <JobType>
            {
                new JobType()
                {
                    Id     = Guid.NewGuid(),
                    Colour = "#009688",
                    Name   = "Bug"
                },
                new JobType()
                {
                    Id     = Guid.NewGuid(),
                    Colour = "#9e9e9e",
                    Name   = "Feature"
                }
            };

            var priorities = new List <JobPriority>()
            {
                new JobPriority()
                {
                    Id     = Guid.NewGuid(),
                    Colour = "#ff5722",
                    Name   = "DEFCON 1"
                },
                new JobPriority()
                {
                    Id     = Guid.NewGuid(),
                    Colour = "#ff9800",
                    Name   = "DEFCON 2"
                },
                new JobPriority()
                {
                    Id     = Guid.NewGuid(),
                    Colour = "#ffc107",
                    Name   = "DEFCON 3"
                },
                new JobPriority()
                {
                    Id     = Guid.NewGuid(),
                    Colour = "#8bc34a",
                    Name   = "DEFCON 4"
                },
                new JobPriority()
                {
                    Id     = Guid.NewGuid(),
                    Colour = "#4caf50",
                    Name   = "DEFCON 5"
                }
            };

            var project = new Project()
            {
                Created     = DateTime.Now,
                Description = "Development project for development",
                Id          = projectId,
                Name        = "Development",
                Repo        = "",
                Accent      = "#1ad960",
                Avatar      = "https://pbs.twimg.com/profile_images/1292028907101671425/pp02tz90_400x400.jpg"
            };

            var list = new List()
            {
                Created     = DateTime.Now,
                Description = "Phase-1 list",
                Id          = listId,
                Name        = "Phase-1",
                Project     = project
            };

            var jobs  = new List <Job>();
            var count = 0;

            foreach (var id in jobIds)
            {
                jobs.Add(new Job()
                {
                    Created     = DateTime.Now,
                    Description =
                        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
                    Id            = id,
                    Title         = $"job #{count}",
                    Project       = project,
                    List          = list,
                    Link          = $"{createTenant.Tenant.Name}-{count}",
                    AssociatedUrl = "harrisonbarker.co.uk",
                    JobStatus     = statuses[new Random().Next(0, statuses.Count)],
                    JobPriority   = priorities[new Random().Next(0, priorities.Count)],
                    JobType       = types[new Random().Next(0, types.Count)]
                });
                count++;
            }

            var room = new Room()
            {
                Id      = roomId,
                Chats   = new List <Chat>(),
                Name    = "General",
                Project = project
            };

            var creationEvent = new Event()
            {
                Id          = Guid.NewGuid(),
                Description = "Created new project",
                Name        = "Creation",
                Project     = project,
                Time        = DateTime.Now
            };

            dataContext.Events.Add(creationEvent);
            dataContext.UserIds.Add(user);
            dataContext.Projects.Add(project);
            dataContext.Lists.Add(list);
            dataContext.Jobs.AddRange(jobs);
            dataContext.Rooms.Add(room);
            dataContext.JobStatuses.AddRange(statuses);
            dataContext.JobTypes.AddRange(types);
            dataContext.JobPriorities.AddRange(priorities);

            await dataContext.SaveChangesAsync();
        }
Example #16
0
 public TenantUserService(TenantDataContext tenantDataContext)
 {
     _tenantDataContext = tenantDataContext;
 }
 public ProjectService(TenantDataContext tenantDataContext)
 {
     _tenantDataContext = tenantDataContext;
 }
Example #18
0
        public override bool CheckConnectionString(string connectionString)
        {
            var context = new TenantDataContext(connectionString);

            return(context.Database.Exists());
        }
Example #19
0
 public ListService(TenantDataContext tenantDataContext)
 {
     _tenantDataContext = tenantDataContext;
 }
 public EventService(TenantDataContext tenantDataContext)
 {
     _tenantDataContext = tenantDataContext;
 }