@@ -4,19 +4,97 @@ import (
44 "context"
55 "database/sql"
66 "errors"
7+ "os"
78 "sync"
89
9- internal_api_data "github.com/dxta-dev/app/internal/internal-api/data "
10+ "github.com/dxta-dev/app/internal/otel "
1011)
1112
1213var tenantDBConnections = sync.Map {}
1314
15+ type CreateTenantConfig struct {
16+ TursoApiURL string
17+ TursoOrganizationSlug string
18+ TursoDBGroupName string
19+ TursoAuthToken string
20+ TenantSeedDBURL string
21+ OrganizationsTenantMapDBURL string
22+ }
23+
24+ func LoadCreateTenantConfig () (* CreateTenantConfig , error ) {
25+ var tursoAuthToken , tenantSeedDBURL , organizationsTenantMapDBURL , tursoApiUrl , tursoOrganizationSlug , tursoDBGroupName string
26+
27+ if tursoAuthToken = os .Getenv ("TURSO_AUTH_TOKEN" ); tursoAuthToken == "" {
28+ return nil , errors .New ("turso auth token not defined" )
29+ }
30+
31+ if tenantSeedDBURL = os .Getenv ("TENANT_SEED_DB_NAME" ); tenantSeedDBURL == "" {
32+ return nil , errors .New ("seed db url not defined" )
33+ }
34+
35+ if organizationsTenantMapDBURL = os .Getenv ("ORGANIZATIONS_TENANT_MAP_DB_URL" ); organizationsTenantMapDBURL == "" {
36+ return nil , errors .New ("organizations tenant map db url not defined" )
37+ }
38+
39+ if tursoApiUrl = os .Getenv ("TURSO_API_URL" ); tursoApiUrl == "" {
40+ return nil , errors .New ("turso api url not defined" )
41+ }
42+
43+ if tursoOrganizationSlug = os .Getenv ("TURSO_ORGANIZATION_SLUG" ); tursoOrganizationSlug == "" {
44+ return nil , errors .New ("turso organization slug not defined" )
45+ }
46+
47+ if tursoDBGroupName = os .Getenv ("TURSO_DB_GROUP_NAME" ); tursoDBGroupName == "" {
48+ return nil , errors .New ("turso db group name not defined" )
49+ }
50+
51+ return & CreateTenantConfig {
52+ TursoApiURL : tursoApiUrl ,
53+ TursoOrganizationSlug : tursoOrganizationSlug ,
54+ TursoDBGroupName : tursoDBGroupName ,
55+ TursoAuthToken : tursoAuthToken ,
56+ TenantSeedDBURL : tenantSeedDBURL ,
57+ OrganizationsTenantMapDBURL : organizationsTenantMapDBURL ,
58+ }, nil
59+
60+ }
61+
62+ type DB struct {
63+ DB * sql.DB
64+ }
65+
66+ func NewDB (DBURL string , ctx context.Context ) (DB , error ) {
67+ driverName := otel .GetDriverName ()
68+ devToken := os .Getenv ("DXTA_DEV_GROUP_TOKEN" )
69+
70+ if devToken == "" {
71+ return DB {}, errors .New ("no dev group token provided" )
72+ }
73+
74+ tenantDB , err := sql .Open (
75+ driverName ,
76+ DBURL + "?authToken=" + devToken ,
77+ )
78+
79+ if err != nil {
80+ return DB {}, errors .New ("failed to open db connection " + err .Error ())
81+ }
82+
83+ if err := tenantDB .PingContext (ctx ); err != nil {
84+ return DB {}, errors .New ("failed to verify db connection " + err .Error ())
85+ }
86+
87+ return DB {
88+ DB : tenantDB ,
89+ }, nil
90+ }
91+
1492func GetCachedTenantDB (DBURL string , ctx context.Context ) (* sql.DB , error ) {
1593 if cachedDB , ok := tenantDBConnections .Load (DBURL ); ok {
1694 return cachedDB .(* sql.DB ), nil
1795 }
1896
19- db , err := internal_api_data . NewDB (DBURL , ctx )
97+ db , err := NewDB (DBURL , ctx )
2098
2199 if err != nil {
22100 return nil , errors .New ("failed to create tenant db connection: " + err .Error ())
@@ -26,3 +104,13 @@ func GetCachedTenantDB(DBURL string, ctx context.Context) (*sql.DB, error) {
26104
27105 return db .DB , nil
28106}
107+
108+ func GetDB (ctx context.Context , DBURL string ) (* sql.DB , error ) {
109+ db , err := NewDB (DBURL , ctx )
110+
111+ if err != nil {
112+ return nil , errors .New ("failed to create db connection: " + err .Error ())
113+ }
114+
115+ return db .DB , nil
116+ }
0 commit comments