diff --git a/ee/sqlschema/postgressqlschema/formatter.go b/ee/sqlschema/postgressqlschema/formatter.go index e51fd7ac951c..8197f78ff04e 100644 --- a/ee/sqlschema/postgressqlschema/formatter.go +++ b/ee/sqlschema/postgressqlschema/formatter.go @@ -29,7 +29,7 @@ func (formatter Formatter) DataTypeOf(dataType string) sqlschema.DataType { case "BOOL", "BOOLEAN": return sqlschema.DataTypeBoolean case "VARCHAR", "CHARACTER VARYING", "CHARACTER": - return sqlschema.DataTypeText + return sqlschema.DataTypeVarchar } return formatter.Formatter.DataTypeOf(dataType) diff --git a/ee/sqlschema/postgressqlschema/provider.go b/ee/sqlschema/postgressqlschema/provider.go index af06994b45b3..251575da0815 100644 --- a/ee/sqlschema/postgressqlschema/provider.go +++ b/ee/sqlschema/postgressqlschema/provider.go @@ -3,6 +3,7 @@ package postgressqlschema import ( "context" + "github.com/SigNoz/signoz/pkg/errors" "github.com/SigNoz/signoz/pkg/factory" "github.com/SigNoz/signoz/pkg/sqlschema" "github.com/SigNoz/signoz/pkg/sqlstore" @@ -31,9 +32,12 @@ func New(ctx context.Context, providerSettings factory.ProviderSettings, config fmter: fmter, settings: settings, operator: sqlschema.NewOperator(fmter, sqlschema.OperatorSupport{ + CreateConstraint: true, DropConstraint: true, ColumnIfNotExistsExists: true, AlterColumnSetNotNull: true, + AlterColumnSetDefault: true, + AlterColumnSetDataType: true, }), }, nil } @@ -61,7 +65,7 @@ FROM WHERE c.table_name = ?`, string(tableName)) if err != nil { - return nil, nil, err + return nil, nil, provider.sqlstore.WrapNotFoundErrf(err, errors.CodeNotFound, "table (%s) not found", tableName) } defer func() { diff --git a/pkg/query-service/utils/testutils.go b/pkg/query-service/utils/testutils.go index 54bb34e813db..2769b13ebb4d 100644 --- a/pkg/query-service/utils/testutils.go +++ b/pkg/query-service/utils/testutils.go @@ -8,7 +8,10 @@ import ( "github.com/SigNoz/signoz/pkg/factory" "github.com/SigNoz/signoz/pkg/factory/factorytest" "github.com/SigNoz/signoz/pkg/sqlmigration" + "github.com/SigNoz/signoz/pkg/sqlmigration/s100sqlmigration" "github.com/SigNoz/signoz/pkg/sqlmigrator" + "github.com/SigNoz/signoz/pkg/sqlschema" + "github.com/SigNoz/signoz/pkg/sqlschema/sqlitesqlschema" "github.com/SigNoz/signoz/pkg/sqlstore" "github.com/SigNoz/signoz/pkg/sqlstore/sqlitesqlstore" "github.com/SigNoz/signoz/pkg/types" @@ -30,48 +33,17 @@ func NewTestSqliteDB(t *testing.T) (sqlStore sqlstore.SQLStore, testDBFilePath s t.Fatalf("could not create test db sqlite store: %v", err) } + sqlSchema, err := sqlitesqlschema.New(context.Background(), factorytest.NewSettings(), sqlschema.Config{}, sqlStore) + if err != nil { + t.Fatalf("could not create test db sqlite schema: %v", err) + } + sqlmigrations, err := sqlmigration.New( context.Background(), factorytest.NewSettings(), sqlmigration.Config{}, factory.MustNewNamedMap( - sqlmigration.NewAddDataMigrationsFactory(), - sqlmigration.NewAddOrganizationFactory(), - sqlmigration.NewAddPreferencesFactory(), - sqlmigration.NewAddDashboardsFactory(), - sqlmigration.NewAddSavedViewsFactory(), - sqlmigration.NewAddAgentsFactory(), - sqlmigration.NewAddPipelinesFactory(), - sqlmigration.NewAddIntegrationsFactory(), - sqlmigration.NewAddLicensesFactory(), - sqlmigration.NewAddPatsFactory(), - sqlmigration.NewModifyDatetimeFactory(), - sqlmigration.NewModifyOrgDomainFactory(), - sqlmigration.NewUpdateOrganizationFactory(sqlStore), - sqlmigration.NewAddAlertmanagerFactory(sqlStore), - sqlmigration.NewUpdateDashboardAndSavedViewsFactory(sqlStore), - sqlmigration.NewUpdatePatAndOrgDomainsFactory(sqlStore), - sqlmigration.NewUpdatePipelines(sqlStore), - sqlmigration.NewDropLicensesSitesFactory(sqlStore), - sqlmigration.NewUpdateInvitesFactory(sqlStore), - sqlmigration.NewUpdatePatFactory(sqlStore), - sqlmigration.NewUpdateAlertmanagerFactory(sqlStore), - sqlmigration.NewUpdatePreferencesFactory(sqlStore), - sqlmigration.NewUpdateApdexTtlFactory(sqlStore), - sqlmigration.NewUpdateResetPasswordFactory(sqlStore), - sqlmigration.NewUpdateRulesFactory(sqlStore), - sqlmigration.NewAddVirtualFieldsFactory(), - sqlmigration.NewUpdateIntegrationsFactory(sqlStore), - sqlmigration.NewUpdateOrganizationsFactory(sqlStore), - sqlmigration.NewDropGroupsFactory(sqlStore), - sqlmigration.NewCreateQuickFiltersFactory(sqlStore), - sqlmigration.NewUpdateQuickFiltersFactory(sqlStore), - sqlmigration.NewAuthRefactorFactory(sqlStore), - sqlmigration.NewMigratePATToFactorAPIKey(sqlStore), - sqlmigration.NewUpdateApiMonitoringFiltersFactory(sqlStore), - sqlmigration.NewAddKeyOrganizationFactory(sqlStore), - sqlmigration.NewUpdateDashboardFactory(sqlStore), - sqlmigration.NewUpdateAgentsFactory(sqlStore), + s100sqlmigration.NewV100Factory(sqlStore, sqlSchema), ), ) if err != nil { diff --git a/pkg/signoz/provider.go b/pkg/signoz/provider.go index af589abe4e12..78129ddcde43 100644 --- a/pkg/signoz/provider.go +++ b/pkg/signoz/provider.go @@ -26,6 +26,7 @@ import ( "github.com/SigNoz/signoz/pkg/sharder/noopsharder" "github.com/SigNoz/signoz/pkg/sharder/singlesharder" "github.com/SigNoz/signoz/pkg/sqlmigration" + "github.com/SigNoz/signoz/pkg/sqlmigration/s100sqlmigration" "github.com/SigNoz/signoz/pkg/sqlschema" "github.com/SigNoz/signoz/pkg/sqlschema/sqlitesqlschema" "github.com/SigNoz/signoz/pkg/sqlstore" @@ -79,51 +80,7 @@ func NewSQLSchemaProviderFactories(sqlstore sqlstore.SQLStore) factory.NamedMap[ func NewSQLMigrationProviderFactories(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.NamedMap[factory.ProviderFactory[sqlmigration.SQLMigration, sqlmigration.Config]] { return factory.MustNewNamedMap( - sqlmigration.NewAddDataMigrationsFactory(), - sqlmigration.NewAddOrganizationFactory(), - sqlmigration.NewAddPreferencesFactory(), - sqlmigration.NewAddDashboardsFactory(), - sqlmigration.NewAddSavedViewsFactory(), - sqlmigration.NewAddAgentsFactory(), - sqlmigration.NewAddPipelinesFactory(), - sqlmigration.NewAddIntegrationsFactory(), - sqlmigration.NewAddLicensesFactory(), - sqlmigration.NewAddPatsFactory(), - sqlmigration.NewModifyDatetimeFactory(), - sqlmigration.NewModifyOrgDomainFactory(), - sqlmigration.NewUpdateOrganizationFactory(sqlstore), - sqlmigration.NewAddAlertmanagerFactory(sqlstore), - sqlmigration.NewUpdateDashboardAndSavedViewsFactory(sqlstore), - sqlmigration.NewUpdatePatAndOrgDomainsFactory(sqlstore), - sqlmigration.NewUpdatePipelines(sqlstore), - sqlmigration.NewDropLicensesSitesFactory(sqlstore), - sqlmigration.NewUpdateInvitesFactory(sqlstore), - sqlmigration.NewUpdatePatFactory(sqlstore), - sqlmigration.NewUpdateAlertmanagerFactory(sqlstore), - sqlmigration.NewUpdatePreferencesFactory(sqlstore), - sqlmigration.NewUpdateApdexTtlFactory(sqlstore), - sqlmigration.NewUpdateResetPasswordFactory(sqlstore), - sqlmigration.NewUpdateRulesFactory(sqlstore), - sqlmigration.NewAddVirtualFieldsFactory(), - sqlmigration.NewUpdateIntegrationsFactory(sqlstore), - sqlmigration.NewUpdateOrganizationsFactory(sqlstore), - sqlmigration.NewDropGroupsFactory(sqlstore), - sqlmigration.NewCreateQuickFiltersFactory(sqlstore), - sqlmigration.NewUpdateQuickFiltersFactory(sqlstore), - sqlmigration.NewAuthRefactorFactory(sqlstore), - sqlmigration.NewUpdateLicenseFactory(sqlstore), - sqlmigration.NewMigratePATToFactorAPIKey(sqlstore), - sqlmigration.NewUpdateApiMonitoringFiltersFactory(sqlstore), - sqlmigration.NewAddKeyOrganizationFactory(sqlstore), - sqlmigration.NewAddTraceFunnelsFactory(sqlstore), - sqlmigration.NewUpdateDashboardFactory(sqlstore), - sqlmigration.NewDropFeatureSetFactory(), - sqlmigration.NewDropDeprecatedTablesFactory(), - sqlmigration.NewUpdateAgentsFactory(sqlstore), - sqlmigration.NewUpdateUsersFactory(sqlstore, sqlschema), - sqlmigration.NewUpdateUserInviteFactory(sqlstore, sqlschema), - sqlmigration.NewUpdateOrgDomainFactory(sqlstore, sqlschema), - sqlmigration.NewAddFactorIndexesFactory(sqlstore, sqlschema), + s100sqlmigration.NewV100Factory(sqlstore, sqlschema), ) } diff --git a/pkg/sqlmigration/000_add_data_migrations.go b/pkg/sqlmigration/000_add_data_migrations.go deleted file mode 100644 index 9cbfe9e6cfc1..000000000000 --- a/pkg/sqlmigration/000_add_data_migrations.go +++ /dev/null @@ -1,49 +0,0 @@ -package sqlmigration - -import ( - "context" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addDataMigrations struct{} - -func NewAddDataMigrationsFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_data_migrations"), newAddDataMigrations) -} - -func newAddDataMigrations(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &addDataMigrations{}, nil -} - -func (migration *addDataMigrations) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - return nil -} - -func (migration *addDataMigrations) Up(ctx context.Context, db *bun.DB) error { - // table:data_migrations - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:data_migrations"` - ID int `bun:"id,pk,autoincrement"` - Version string `bun:"version,unique,notnull,type:VARCHAR(255)"` - CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"` - Succeeded bool `bun:"succeeded,notnull,default:false"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addDataMigrations) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/001_add_organization.go b/pkg/sqlmigration/001_add_organization.go deleted file mode 100644 index 496b033f9383..000000000000 --- a/pkg/sqlmigration/001_add_organization.go +++ /dev/null @@ -1,158 +0,0 @@ -package sqlmigration - -import ( - "context" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addOrganization struct{} - -func NewAddOrganizationFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_organization"), newAddOrganization) -} - -func newAddOrganization(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &addOrganization{}, nil -} - -func (migration *addOrganization) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addOrganization) Up(ctx context.Context, db *bun.DB) error { - - // table:organizations - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:organizations"` - ID string `bun:"id,pk,type:text"` - Name string `bun:"name,type:text,notnull"` - CreatedAt int `bun:"created_at,notnull"` - IsAnonymous int `bun:"is_anonymous,notnull,default:0"` - HasOptedUpdates int `bun:"has_opted_updates,notnull,default:1"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // table:groups - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:groups"` - ID string `bun:"id,pk,type:text"` - Name string `bun:"name,type:text,notnull,unique"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // table:users - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:users"` - ID string `bun:"id,pk,type:text"` - Name string `bun:"name,type:text,notnull"` - Email string `bun:"email,type:text,notnull,unique"` - Password string `bun:"password,type:text,notnull"` - CreatedAt int `bun:"created_at,notnull"` - ProfilePictureURL string `bun:"profile_picture_url,type:text"` - GroupID string `bun:"group_id,type:text,notnull"` - OrgID string `bun:"org_id,type:text,notnull"` - }{}). - ForeignKey(`("org_id") REFERENCES "organizations" ("id")`). - ForeignKey(`("group_id") REFERENCES "groups" ("id")`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // table:invites - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:invites"` - ID int `bun:"id,pk,autoincrement"` - Name string `bun:"name,type:text,notnull"` - Email string `bun:"email,type:text,notnull,unique"` - Token string `bun:"token,type:text,notnull"` - CreatedAt int `bun:"created_at,notnull"` - Role string `bun:"role,type:text,notnull"` - OrgID string `bun:"org_id,type:text,notnull"` - }{}). - ForeignKey(`("org_id") REFERENCES "organizations" ("id")`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // table:reset_password_request - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:reset_password_request"` - ID int `bun:"id,pk,autoincrement"` - Token string `bun:"token,type:text,notnull"` - UserID string `bun:"user_id,type:text,notnull"` - }{}). - ForeignKey(`("user_id") REFERENCES "users" ("id")`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // table:user_flags - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:user_flags"` - UserID string `bun:"user_id,pk,type:text,notnull"` - Flags string `bun:"flags,type:text"` - }{}). - ForeignKey(`("user_id") REFERENCES "users" ("id")`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // table:apdex_settings - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:apdex_settings"` - ServiceName string `bun:"service_name,pk,type:text"` - Threshold float64 `bun:"threshold,type:float,notnull"` - ExcludeStatusCodes string `bun:"exclude_status_codes,type:text,notnull"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // table:ingestion_keys - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:ingestion_keys"` - KeyId string `bun:"key_id,pk,type:text"` - Name string `bun:"name,type:text"` - CreatedAt time.Time `bun:"created_at,default:current_timestamp"` - IngestionKey string `bun:"ingestion_key,type:text,notnull"` - IngestionURL string `bun:"ingestion_url,type:text,notnull"` - DataRegion string `bun:"data_region,type:text,notnull"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addOrganization) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/002_add_preferences.go b/pkg/sqlmigration/002_add_preferences.go deleted file mode 100644 index 0cd8a1763cfa..000000000000 --- a/pkg/sqlmigration/002_add_preferences.go +++ /dev/null @@ -1,63 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addPreferences struct{} - -func NewAddPreferencesFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_preferences"), newAddPreferences) -} - -func newAddPreferences(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &addPreferences{}, nil -} - -func (migration *addPreferences) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addPreferences) Up(ctx context.Context, db *bun.DB) error { - // table:user_preference - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:user_preference"` - PreferenceID string `bun:"preference_id,type:text,pk"` - PreferenceValue string `bun:"preference_value,type:text"` - UserID string `bun:"user_id,type:text,pk"` - }{}). - IfNotExists(). - ForeignKey(`("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE`). - Exec(ctx); err != nil { - return err - } - - // table:org_preference - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:org_preference"` - PreferenceID string `bun:"preference_id,pk,type:text,notnull"` - PreferenceValue string `bun:"preference_value,type:text,notnull"` - OrgID string `bun:"org_id,pk,type:text,notnull"` - }{}). - ForeignKey(`("org_id") REFERENCES "organizations" ("id") ON DELETE CASCADE ON UPDATE CASCADE`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addPreferences) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/003_add_dashboards.go b/pkg/sqlmigration/003_add_dashboards.go deleted file mode 100644 index bbdc89a1b1a0..000000000000 --- a/pkg/sqlmigration/003_add_dashboards.go +++ /dev/null @@ -1,125 +0,0 @@ -package sqlmigration - -import ( - "context" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addDashboards struct{} - -func NewAddDashboardsFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_dashboards"), newAddDashboards) -} - -func newAddDashboards(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &addDashboards{}, nil -} - -func (migration *addDashboards) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addDashboards) Up(ctx context.Context, db *bun.DB) error { - // table:dashboards - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:dashboards"` - ID int `bun:"id,pk,autoincrement"` - UUID string `bun:"uuid,type:text,notnull,unique"` - CreatedAt time.Time `bun:"created_at,notnull"` - CreatedBy string `bun:"created_by,type:text,notnull"` - UpdatedAt time.Time `bun:"updated_at,notnull"` - UpdatedBy string `bun:"updated_by,type:text,notnull"` - Data string `bun:"data,type:text,notnull"` - Locked int `bun:"locked,notnull,default:0"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // table:rules - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:rules"` - ID int `bun:"id,pk,autoincrement"` - CreatedAt time.Time `bun:"created_at,notnull"` - CreatedBy string `bun:"created_by,type:text,notnull"` - UpdatedAt time.Time `bun:"updated_at,notnull"` - UpdatedBy string `bun:"updated_by,type:text,notnull"` - Deleted int `bun:"deleted,notnull,default:0"` - Data string `bun:"data,type:text,notnull"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // table:notification_channels - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:notification_channels"` - ID int `bun:"id,pk,autoincrement"` - CreatedAt time.Time `bun:"created_at,notnull"` - UpdatedAt time.Time `bun:"updated_at,notnull"` - Name string `bun:"name,type:text,notnull,unique"` - Type string `bun:"type,type:text,notnull"` - Deleted int `bun:"deleted,notnull,default:0"` - Data string `bun:"data,type:text,notnull"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // table:planned_maintenance - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:planned_maintenance"` - ID int `bun:"id,pk,autoincrement"` - Name string `bun:"name,type:text,notnull"` - Description string `bun:"description,type:text"` - AlertIDs string `bun:"alert_ids,type:text"` - Schedule string `bun:"schedule,type:text,notnull"` - CreatedAt time.Time `bun:"created_at,notnull"` - CreatedBy string `bun:"created_by,type:text,notnull"` - UpdatedAt time.Time `bun:"updated_at,notnull"` - UpdatedBy string `bun:"updated_by,type:text,notnull"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // table:ttl_status - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:ttl_status"` - ID int `bun:"id,pk,autoincrement"` - TransactionID string `bun:"transaction_id,type:text,notnull"` - CreatedAt time.Time `bun:"created_at,notnull"` - UpdatedAt time.Time `bun:"updated_at,notnull"` - TableName string `bun:"table_name,type:text,notnull"` - TTL int `bun:"ttl,notnull,default:0"` - ColdStorageTTL int `bun:"cold_storage_ttl,notnull,default:0"` - Status string `bun:"status,type:text,notnull"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addDashboards) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/004_add_saved_views.go b/pkg/sqlmigration/004_add_saved_views.go deleted file mode 100644 index 1f5ad27748b9..000000000000 --- a/pkg/sqlmigration/004_add_saved_views.go +++ /dev/null @@ -1,57 +0,0 @@ -package sqlmigration - -import ( - "context" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addSavedViews struct{} - -func NewAddSavedViewsFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_saved_views"), newAddSavedViews) -} - -func newAddSavedViews(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &addSavedViews{}, nil -} - -func (migration *addSavedViews) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addSavedViews) Up(ctx context.Context, db *bun.DB) error { - // table:saved_views op:create - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:saved_views"` - UUID string `bun:"uuid,pk,type:text"` - Name string `bun:"name,type:text,notnull"` - Category string `bun:"category,type:text,notnull"` - CreatedAt time.Time `bun:"created_at,notnull"` - CreatedBy string `bun:"created_by,type:text"` - UpdatedAt time.Time `bun:"updated_at,notnull"` - UpdatedBy string `bun:"updated_by,type:text"` - SourcePage string `bun:"source_page,type:text,notnull"` - Tags string `bun:"tags,type:text"` - Data string `bun:"data,type:text,notnull"` - ExtraData string `bun:"extra_data,type:text"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addSavedViews) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/005_add_agents.go b/pkg/sqlmigration/005_add_agents.go deleted file mode 100644 index e9accba359e2..000000000000 --- a/pkg/sqlmigration/005_add_agents.go +++ /dev/null @@ -1,102 +0,0 @@ -package sqlmigration - -import ( - "context" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addAgents struct{} - -func NewAddAgentsFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_agents"), newAddAgents) -} - -func newAddAgents(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &addAgents{}, nil -} - -func (migration *addAgents) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addAgents) Up(ctx context.Context, db *bun.DB) error { - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:agents"` - AgentID string `bun:"agent_id,pk,type:text,unique"` - StartedAt time.Time `bun:"started_at,notnull"` - TerminatedAt time.Time `bun:"terminated_at"` - CurrentStatus string `bun:"current_status,type:text,notnull"` - EffectiveConfig string `bun:"effective_config,type:text,notnull"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:agent_config_versions"` - ID string `bun:"id,pk,type:text"` - CreatedBy string `bun:"created_by,type:text"` - CreatedAt time.Time `bun:"created_at,default:CURRENT_TIMESTAMP"` - UpdatedBy string `bun:"updated_by,type:text"` - UpdatedAt time.Time `bun:"updated_at,default:CURRENT_TIMESTAMP"` - Version int `bun:"version,default:1,unique:element_version_idx"` - Active int `bun:"active"` - IsValid int `bun:"is_valid"` - Disabled int `bun:"disabled"` - ElementType string `bun:"element_type,notnull,type:varchar(120),unique:element_version_idx"` - DeployStatus string `bun:"deploy_status,notnull,type:varchar(80),default:'DIRTY'"` - DeploySequence int `bun:"deploy_sequence"` - DeployResult string `bun:"deploy_result,type:text"` - LastHash string `bun:"last_hash,type:text"` - LastConfig string `bun:"last_config,type:text"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // add an index on the last_hash column - if _, err := db.NewCreateIndex(). - Table("agent_config_versions"). - Column("last_hash"). - Index("idx_agent_config_versions_last_hash"). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:agent_config_elements"` - - ID string `bun:"id,pk,type:text"` - CreatedBy string `bun:"created_by,type:text"` - CreatedAt time.Time `bun:"created_at,default:CURRENT_TIMESTAMP"` - UpdatedBy string `bun:"updated_by,type:text"` - UpdatedAt time.Time `bun:"updated_at,default:CURRENT_TIMESTAMP"` - ElementID string `bun:"element_id,type:text,notnull,unique:agent_config_elements_u1"` - ElementType string `bun:"element_type,type:varchar(120),notnull,unique:agent_config_elements_u1"` - VersionID string `bun:"version_id,type:text,notnull,unique:agent_config_elements_u1"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addAgents) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/006_add_pipelines.go b/pkg/sqlmigration/006_add_pipelines.go deleted file mode 100644 index 8aa3ed62fe87..000000000000 --- a/pkg/sqlmigration/006_add_pipelines.go +++ /dev/null @@ -1,55 +0,0 @@ -package sqlmigration - -import ( - "context" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addPipelines struct{} - -func NewAddPipelinesFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_pipelines"), newAddPipelines) -} - -func newAddPipelines(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &addPipelines{}, nil -} - -func (migration *addPipelines) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addPipelines) Up(ctx context.Context, db *bun.DB) error { - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:pipelines"` - ID string `bun:"id,pk,type:text"` - OrderID int `bun:"order_id"` - Enabled bool `bun:"enabled"` - CreatedBy string `bun:"created_by,type:text"` - CreatedAt time.Time `bun:"created_at,default:current_timestamp"` - Name string `bun:"name,type:varchar(400),notnull"` - Alias string `bun:"alias,type:varchar(20),notnull"` - Description string `bun:"description,type:text"` - Filter string `bun:"filter,type:text,notnull"` - ConfigJSON string `bun:"config_json,type:text"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addPipelines) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/007_add_integrations.go b/pkg/sqlmigration/007_add_integrations.go deleted file mode 100644 index 7cf0c3fc8185..000000000000 --- a/pkg/sqlmigration/007_add_integrations.go +++ /dev/null @@ -1,79 +0,0 @@ -package sqlmigration - -import ( - "context" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addIntegrations struct{} - -func NewAddIntegrationsFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_integrations"), newAddIntegrations) -} - -func newAddIntegrations(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &addIntegrations{}, nil -} - -func (migration *addIntegrations) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addIntegrations) Up(ctx context.Context, db *bun.DB) error { - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:integrations_installed"` - - IntegrationID string `bun:"integration_id,pk,type:text"` - ConfigJSON string `bun:"config_json,type:text"` - InstalledAt time.Time `bun:"installed_at,default:current_timestamp"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:cloud_integrations_accounts"` - CloudProvider string `bun:"cloud_provider,type:text,unique:cloud_provider_id"` - ID string `bun:"id,type:text,notnull,unique:cloud_provider_id"` - ConfigJSON string `bun:"config_json,type:text"` - CloudAccountID string `bun:"cloud_account_id,type:text"` - LastAgentReportJSON string `bun:"last_agent_report_json,type:text"` - CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"` - RemovedAt time.Time `bun:"removed_at,type:timestamp"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:cloud_integrations_service_configs"` - CloudProvider string `bun:"cloud_provider,type:text,notnull,unique:service_cloud_provider_account"` - CloudAccountID string `bun:"cloud_account_id,type:text,notnull,unique:service_cloud_provider_account"` - ServiceID string `bun:"service_id,type:text,notnull,unique:service_cloud_provider_account"` - ConfigJSON string `bun:"config_json,type:text"` - CreatedAt time.Time `bun:"created_at,default:current_timestamp"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addIntegrations) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/008_add_licenses.go b/pkg/sqlmigration/008_add_licenses.go deleted file mode 100644 index c4574c945571..000000000000 --- a/pkg/sqlmigration/008_add_licenses.go +++ /dev/null @@ -1,92 +0,0 @@ -package sqlmigration - -import ( - "context" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addLicenses struct{} - -func NewAddLicensesFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_licenses"), newAddLicenses) -} - -func newAddLicenses(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &addLicenses{}, nil -} - -func (migration *addLicenses) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addLicenses) Up(ctx context.Context, db *bun.DB) error { - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:licenses"` - Key string `bun:"key,pk,type:text"` - CreatedAt time.Time `bun:"createdAt,default:current_timestamp"` - UpdatedAt time.Time `bun:"updatedAt,default:current_timestamp"` - PlanDetails string `bun:"planDetails,type:text"` - ActivationID string `bun:"activationId,type:text"` - ValidationMessage string `bun:"validationMessage,type:text"` - LastValidated time.Time `bun:"lastValidated,default:current_timestamp"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:sites"` - - UUID string `bun:"uuid,pk,type:text"` - Alias string `bun:"alias,type:varchar(180),default:'PROD'"` - URL string `bun:"url,type:varchar(300)"` - CreatedAt time.Time `bun:"createdAt,default:current_timestamp"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:feature_status"` - Name string `bun:"name,pk,type:text"` - Active bool `bun:"active"` - Usage int `bun:"usage,default:0"` - UsageLimit int `bun:"usage_limit,default:0"` - Route string `bun:"route,type:text"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:licenses_v3"` - ID string `bun:"id,pk,type:text"` - Key string `bun:"key,type:text,notnull,unique"` - Data string `bun:"data,type:text"` - }{}). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addLicenses) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/009_add_pats.go b/pkg/sqlmigration/009_add_pats.go deleted file mode 100644 index 7bbd49913cdd..000000000000 --- a/pkg/sqlmigration/009_add_pats.go +++ /dev/null @@ -1,74 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addPats struct{} - -func NewAddPatsFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_pats"), newAddPats) -} - -func newAddPats(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &addPats{}, nil -} - -func (migration *addPats) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addPats) Up(ctx context.Context, db *bun.DB) error { - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:org_domains"` - - ID string `bun:"id,pk,type:text"` - OrgID string `bun:"org_id,type:text,notnull"` - Name string `bun:"name,type:varchar(50),notnull,unique"` - CreatedAt int `bun:"created_at,notnull"` - UpdatedAt int `bun:"updated_at"` - Data string `bun:"data,type:text,notnull"` - }{}). - ForeignKey(`("org_id") REFERENCES "organizations" ("id")`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:personal_access_tokens"` - - ID int `bun:"id,pk,autoincrement"` - Role string `bun:"role,type:text,notnull,default:'ADMIN'"` - UserID string `bun:"user_id,type:text,notnull"` - Token string `bun:"token,type:text,notnull,unique"` - Name string `bun:"name,type:text,notnull"` - CreatedAt int `bun:"created_at,notnull,default:0"` - ExpiresAt int `bun:"expires_at,notnull,default:0"` - UpdatedAt int `bun:"updated_at,notnull,default:0"` - LastUsed int `bun:"last_used,notnull,default:0"` - Revoked bool `bun:"revoked,notnull,default:false"` - UpdatedByUserID string `bun:"updated_by_user_id,type:text,notnull,default:''"` - }{}). - ForeignKey(`("user_id") REFERENCES "users" ("id")`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addPats) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/011_modify_datetime.go b/pkg/sqlmigration/011_modify_datetime.go deleted file mode 100644 index e8eee4c371fa..000000000000 --- a/pkg/sqlmigration/011_modify_datetime.go +++ /dev/null @@ -1,93 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type modifyDatetime struct{} - -func NewModifyDatetimeFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("modify_datetime"), newModifyDatetime) -} - -func newModifyDatetime(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &modifyDatetime{}, nil -} - -func (migration *modifyDatetime) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *modifyDatetime) Up(ctx context.Context, db *bun.DB) error { - // only run this for old sqlite db - if db.Dialect().Name().String() != "sqlite" { - return nil - } - - // begin transaction - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - tables := []string{"dashboards", "rules", "planned_maintenance", "ttl_status", "saved_views"} - columns := []string{"created_at", "updated_at"} - for _, table := range tables { - for _, column := range columns { - if err := modifyColumn(ctx, tx, table, column); err != nil { - return err - } - } - } - - for _, column := range []string{"started_at", "terminated_at"} { - if err := modifyColumn(ctx, tx, "agents", column); err != nil { - return err - } - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func modifyColumn(ctx context.Context, tx bun.Tx, table string, column string) error { - // rename old column - if _, err := tx.ExecContext(ctx, `ALTER TABLE `+table+` RENAME COLUMN `+column+` TO `+column+`_old`); err != nil { - return err - } - - // cannot add not null constraint to the column - if _, err := tx.ExecContext(ctx, `ALTER TABLE `+table+` ADD COLUMN `+column+` TIMESTAMP`); err != nil { - return err - } - - // update the new column with the value of the old column - if _, err := tx.ExecContext(ctx, `UPDATE `+table+` SET `+column+` = `+column+`_old`); err != nil { - return err - } - - // drop the old column - if _, err := tx.ExecContext(ctx, `ALTER TABLE `+table+` DROP COLUMN `+column+`_old`); err != nil { - return err - } - return nil -} - -func (migration *modifyDatetime) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/012_modify_org_domain.go b/pkg/sqlmigration/012_modify_org_domain.go deleted file mode 100644 index bd9c761dc6ee..000000000000 --- a/pkg/sqlmigration/012_modify_org_domain.go +++ /dev/null @@ -1,73 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/dialect" - "github.com/uptrace/bun/migrate" -) - -type modifyOrgDomain struct{} - -func NewModifyOrgDomainFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("modify_org_domain"), newModifyOrgDomain) -} - -func newModifyOrgDomain(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &modifyOrgDomain{}, nil -} - -func (migration *modifyOrgDomain) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *modifyOrgDomain) Up(ctx context.Context, db *bun.DB) error { - // only run this for old sqlite db - if db.Dialect().Name() != dialect.SQLite { - return nil - } - - // begin transaction - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - // rename old column - if _, err := tx.ExecContext(ctx, `ALTER TABLE org_domains RENAME COLUMN updated_at TO updated_at_old`); err != nil { - return err - } - - if _, err := tx.ExecContext(ctx, `ALTER TABLE org_domains ADD COLUMN updated_at INTEGER`); err != nil { - return err - } - - if _, err := tx.ExecContext(ctx, `UPDATE org_domains SET updated_at = CAST(updated_at_old AS INTEGER)`); err != nil { - return err - } - - // drop the old column - if _, err := tx.ExecContext(ctx, `ALTER TABLE org_domains DROP COLUMN updated_at_old`); err != nil { - return err - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *modifyOrgDomain) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/013_update_organization.go b/pkg/sqlmigration/013_update_organization.go deleted file mode 100644 index 42a0e0dddcd1..000000000000 --- a/pkg/sqlmigration/013_update_organization.go +++ /dev/null @@ -1,153 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "errors" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateOrganization struct { - store sqlstore.SQLStore -} - -func NewUpdateOrganizationFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_organization"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateOrganization(ctx, ps, c, sqlstore) - }) -} - -func newUpdateOrganization(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateOrganization{ - store: store, - }, nil -} - -func (migration *updateOrganization) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateOrganization) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - // update apdex settings table - if err := updateApdexSettings(ctx, tx); err != nil { - return err - } - - // drop user_flags table - if _, err := tx.NewDropTable().IfExists().Table("user_flags").Exec(ctx); err != nil { - return err - } - - // add org id to groups table - if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "groups", "org_id"); err != nil { - return err - } else if !exists { - if _, err := tx.NewAddColumn().Table("groups").ColumnExpr("org_id TEXT").Exec(ctx); err != nil { - return err - } - } - - // add created_at to groups table - for _, table := range []string{"groups"} { - if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, table, "created_at"); err != nil { - return err - } else if !exists { - if _, err := tx.NewAddColumn().Table(table).ColumnExpr("created_at TIMESTAMP").Exec(ctx); err != nil { - return err - } - } - } - - // add updated_at to organizations, users, groups table - for _, table := range []string{"organizations", "users", "groups"} { - if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, table, "updated_at"); err != nil { - return err - } else if !exists { - if _, err := tx.NewAddColumn().Table(table).ColumnExpr("updated_at TIMESTAMP").Exec(ctx); err != nil { - return err - } - } - } - - // since organizations, users has created_at as integer instead of timestamp - for _, table := range []string{"organizations", "users", "invites"} { - if err := migration.store.Dialect().IntToTimestamp(ctx, tx, table, "created_at"); err != nil { - return err - } - } - - // migrate is_anonymous and has_opted_updates to boolean from int - for _, column := range []string{"is_anonymous", "has_opted_updates"} { - if err := migration.store.Dialect().IntToBoolean(ctx, tx, "organizations", column); err != nil { - return err - } - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *updateOrganization) Down(ctx context.Context, db *bun.DB) error { - return nil -} - -func updateApdexSettings(ctx context.Context, tx bun.Tx) error { - if _, err := tx.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:apdex_settings_new"` - OrgID string `bun:"org_id,pk,type:text"` - ServiceName string `bun:"service_name,pk,type:text"` - Threshold float64 `bun:"threshold,type:float,notnull"` - ExcludeStatusCodes string `bun:"exclude_status_codes,type:text,notnull"` - }{}). - ForeignKey(`("org_id") REFERENCES "organizations" ("id")`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // get org id from organizations table - var orgID string - if err := tx.QueryRowContext(ctx, `SELECT id FROM organizations LIMIT 1`).Scan(&orgID); err != nil && !errors.Is(err, sql.ErrNoRows) { - return err - } - - if orgID != "" { - // copy old data - if _, err := tx.ExecContext(ctx, `INSERT INTO apdex_settings_new (org_id, service_name, threshold, exclude_status_codes) SELECT ?, service_name, threshold, exclude_status_codes FROM apdex_settings`, orgID); err != nil { - return err - } - } - - // drop old table - if _, err := tx.NewDropTable().IfExists().Table("apdex_settings").Exec(ctx); err != nil { - return err - } - - // rename new table to old table - if _, err := tx.ExecContext(ctx, `ALTER TABLE apdex_settings_new RENAME TO apdex_settings`); err != nil { - return err - } - - return nil -} diff --git a/pkg/sqlmigration/014_add_alertmanager.go b/pkg/sqlmigration/014_add_alertmanager.go deleted file mode 100644 index d45252914683..000000000000 --- a/pkg/sqlmigration/014_add_alertmanager.go +++ /dev/null @@ -1,293 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "encoding/json" - "strconv" - "time" - - "github.com/SigNoz/signoz/pkg/alertmanager/alertmanagerserver" - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types/alertmanagertypes" - "github.com/prometheus/alertmanager/config" - "github.com/tidwall/gjson" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addAlertmanager struct { - store sqlstore.SQLStore -} - -func NewAddAlertmanagerFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_alertmanager"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newAddAlertmanager(ctx, ps, c, store) - }) -} - -func newAddAlertmanager(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &addAlertmanager{ - store: store, - }, nil -} - -func (migration *addAlertmanager) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addAlertmanager) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "notification_channels", "deleted"); err != nil { - return err - } else if exists { - if _, err := tx. - NewDropColumn(). - Table("notification_channels"). - ColumnExpr("deleted"). - Exec(ctx); err != nil { - return err - } - } - - if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "notification_channels", "org_id"); err != nil { - return err - } else if !exists { - if _, err := tx. - NewAddColumn(). - Table("notification_channels"). - ColumnExpr("org_id TEXT REFERENCES organizations(id) ON DELETE CASCADE"). - Exec(ctx); err != nil && err != ErrNoExecute { - return err - } - } - - if _, err := tx. - NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:alertmanager_config"` - ID uint64 `bun:"id,pk,autoincrement"` - Config string `bun:"config,notnull,type:text"` - Hash string `bun:"hash,notnull,type:text"` - CreatedAt time.Time `bun:"created_at,notnull"` - UpdatedAt time.Time `bun:"updated_at,notnull"` - OrgID string `bun:"org_id,notnull,unique"` - }{}). - ForeignKey(`("org_id") REFERENCES "organizations" ("id")`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - if _, err := tx. - NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:alertmanager_state"` - ID uint64 `bun:"id,pk,autoincrement"` - Silences string `bun:"silences,nullzero,type:text"` - NFLog string `bun:"nflog,nullzero,type:text"` - CreatedAt time.Time `bun:"created_at,notnull"` - UpdatedAt time.Time `bun:"updated_at,notnull"` - OrgID string `bun:"org_id,notnull,unique"` - }{}). - ForeignKey(`("org_id") REFERENCES "organizations" ("id")`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - var orgID string - err = tx. - NewSelect(). - ColumnExpr("id"). - Table("organizations"). - Limit(1). - Scan(ctx, &orgID) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil { - if err := migration.populateOrgIDInChannels(ctx, tx, orgID); err != nil { - return err - } - - if err := migration.populateAlertmanagerConfig(ctx, tx, orgID); err != nil { - return err - } - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *addAlertmanager) populateOrgIDInChannels(ctx context.Context, tx bun.Tx, orgID string) error { - if _, err := tx. - NewUpdate(). - Table("notification_channels"). - Set("org_id = ?", orgID). - Where("org_id IS NULL"). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addAlertmanager) populateAlertmanagerConfig(ctx context.Context, tx bun.Tx, orgID string) error { - var channels []*alertmanagertypes.Channel - - err := tx. - NewSelect(). - Model(&channels). - Where("org_id = ?", orgID). - Scan(ctx) - if err != nil { - return err - } - - var receiversFromChannels []string - for _, channel := range channels { - receiversFromChannels = append(receiversFromChannels, channel.Name) - } - - type matcher struct { - bun.BaseModel `bun:"table:rules"` - ID int `bun:"id,pk"` - Data string `bun:"data"` - } - - matchers := []matcher{} - - err = tx. - NewSelect(). - Column("id", "data"). - Model(&matchers). - Scan(ctx) - if err != nil { - return err - } - - matchersMap := make(map[string][]string) - for _, matcher := range matchers { - receivers := gjson.Get(matcher.Data, "preferredChannels").Array() - for _, receiver := range receivers { - matchersMap[strconv.Itoa(matcher.ID)] = append(matchersMap[strconv.Itoa(matcher.ID)], receiver.String()) - } - - if len(receivers) == 0 { - matchersMap[strconv.Itoa(matcher.ID)] = append(matchersMap[strconv.Itoa(matcher.ID)], receiversFromChannels...) - } - } - - for _, channel := range channels { - if err := migration.msTeamsChannelToMSTeamsV2Channel(channel); err != nil { - return err - } - } - - config, err := alertmanagertypes.NewConfigFromChannels(alertmanagerserver.NewConfig().Global, alertmanagerserver.NewConfig().Route, channels, orgID) - if err != nil { - return err - } - - for ruleID, receivers := range matchersMap { - err = config.CreateRuleIDMatcher(ruleID, receivers) - if err != nil { - return err - } - } - - if _, err := tx. - NewInsert(). - Model(config.StoreableConfig()). - On("CONFLICT (org_id) DO UPDATE"). - Set("config = ?", config.StoreableConfig().Config). - Set("hash = ?", config.StoreableConfig().Hash). - Set("updated_at = ?", config.StoreableConfig().UpdatedAt). - Exec(ctx); err != nil { - return err - } - - for _, channel := range channels { - if channel.Type == "msteamsv2" { - if _, err := tx. - NewUpdate(). - Model(channel). - WherePK(). - Exec(ctx); err != nil { - return err - } - } - } - - return nil -} - -func (migration *addAlertmanager) Down(ctx context.Context, db *bun.DB) error { - return nil -} - -func (migration *addAlertmanager) msTeamsChannelToMSTeamsV2Channel(c *alertmanagertypes.Channel) error { - if c.Type != "msteams" { - return nil - } - - receiver, err := alertmanagertypes.NewReceiver(c.Data) - if err != nil { - return err - } - - receiver = migration.msTeamsReceiverToMSTeamsV2Receiver(receiver) - data, err := json.Marshal(receiver) - if err != nil { - return err - } - - c.Type = "msteamsv2" - c.Data = string(data) - c.UpdatedAt = time.Now() - - return nil -} - -func (migration *addAlertmanager) msTeamsReceiverToMSTeamsV2Receiver(receiver alertmanagertypes.Receiver) alertmanagertypes.Receiver { - if receiver.MSTeamsConfigs == nil { - return receiver - } - - var msTeamsV2Configs []*config.MSTeamsV2Config - for _, cfg := range receiver.MSTeamsConfigs { - msTeamsV2Configs = append(msTeamsV2Configs, &config.MSTeamsV2Config{ - NotifierConfig: cfg.NotifierConfig, - HTTPConfig: cfg.HTTPConfig, - WebhookURL: cfg.WebhookURL, - WebhookURLFile: cfg.WebhookURLFile, - Title: cfg.Title, - Text: cfg.Text, - }) - } - - receiver.MSTeamsConfigs = nil - receiver.MSTeamsV2Configs = msTeamsV2Configs - - return receiver -} diff --git a/pkg/sqlmigration/015_update_dashboards_savedviews.go b/pkg/sqlmigration/015_update_dashboards_savedviews.go deleted file mode 100644 index 60c9fbb5002a..000000000000 --- a/pkg/sqlmigration/015_update_dashboards_savedviews.go +++ /dev/null @@ -1,81 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateDashboardAndSavedViews struct { - store sqlstore.SQLStore -} - -func NewUpdateDashboardAndSavedViewsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_group"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateDashboardAndSavedViews(ctx, ps, c, sqlstore) - }) -} - -func newUpdateDashboardAndSavedViews(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateDashboardAndSavedViews{ - store: store, - }, nil -} - -func (migration *updateDashboardAndSavedViews) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateDashboardAndSavedViews) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - // get all org ids - var orgIDs []string - if err := migration.store.BunDB().NewSelect().Model((*types.Organization)(nil)).Column("id").Scan(ctx, &orgIDs); err != nil { - return err - } - - // add org id to dashboards table - for _, table := range []string{"dashboards", "saved_views"} { - if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, table, "org_id"); err != nil { - return err - } else if !exists { - if _, err := tx.NewAddColumn().Table(table).ColumnExpr("org_id TEXT REFERENCES organizations(id) ON DELETE CASCADE").Exec(ctx); err != nil { - return err - } - - // check if there is one org ID if yes then set it to all dashboards. - if len(orgIDs) == 1 { - orgID := orgIDs[0] - if _, err := tx.NewUpdate().Table(table).Set("org_id = ?", orgID).Where("org_id IS NULL").Exec(ctx); err != nil { - return err - } - } - } - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *updateDashboardAndSavedViews) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/016_pat_org_domains.go b/pkg/sqlmigration/016_pat_org_domains.go deleted file mode 100644 index b574ef2ecbeb..000000000000 --- a/pkg/sqlmigration/016_pat_org_domains.go +++ /dev/null @@ -1,133 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updatePatAndOrgDomains struct { - store sqlstore.SQLStore -} - -func NewUpdatePatAndOrgDomainsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_pat_and_org_domains"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdatePatAndOrgDomains(ctx, ps, c, sqlstore) - }) -} - -func newUpdatePatAndOrgDomains(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updatePatAndOrgDomains{ - store: store, - }, nil -} - -func (migration *updatePatAndOrgDomains) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updatePatAndOrgDomains) Up(ctx context.Context, db *bun.DB) error { - // begin transaction - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - // get all org ids - var orgIDs []string - if err := tx.NewSelect().Model((*types.Organization)(nil)).Column("id").Scan(ctx, &orgIDs); err != nil { - return err - } - - // add org id to pat and org_domains table - if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "personal_access_tokens", "org_id"); err != nil { - return err - } else if !exists { - if _, err := tx.NewAddColumn().Table("personal_access_tokens").ColumnExpr("org_id TEXT REFERENCES organizations(id) ON DELETE CASCADE").Exec(ctx); err != nil { - return err - } - - // check if there is one org ID if yes then set it to all personal_access_tokens. - if len(orgIDs) == 1 { - orgID := orgIDs[0] - if _, err := tx.NewUpdate().Table("personal_access_tokens").Set("org_id = ?", orgID).Where("org_id IS NULL").Exec(ctx); err != nil { - return err - } - } - } - - if err := updateOrgId(ctx, tx); err != nil { - return err - } - - // change created_at and updated_at from integer to timestamp - for _, table := range []string{"personal_access_tokens", "org_domains"} { - if err := migration.store.Dialect().IntToTimestamp(ctx, tx, table, "created_at"); err != nil { - return err - } - if err := migration.store.Dialect().IntToTimestamp(ctx, tx, table, "updated_at"); err != nil { - return err - } - } - - // drop table if exists ingestion_keys - if _, err := tx.NewDropTable().IfExists().Table("ingestion_keys").Exec(ctx); err != nil { - return err - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *updatePatAndOrgDomains) Down(ctx context.Context, db *bun.DB) error { - return nil -} - -func updateOrgId(ctx context.Context, tx bun.Tx) error { - if _, err := tx.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:org_domains_new"` - - ID string `bun:"id,pk,type:text"` - OrgID string `bun:"org_id,type:text,notnull"` - Name string `bun:"name,type:varchar(50),notnull,unique"` - CreatedAt int `bun:"created_at,notnull"` - UpdatedAt int `bun:"updated_at"` - Data string `bun:"data,type:text,notnull"` - }{}). - ForeignKey(`("org_id") REFERENCES "organizations" ("id") ON DELETE CASCADE`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // copy data from org_domains to org_domains_new - if _, err := tx.ExecContext(ctx, `INSERT INTO org_domains_new (id, org_id, name, created_at, updated_at, data) SELECT id, org_id, name, created_at, updated_at, data FROM org_domains`); err != nil { - return err - } - // delete old table - if _, err := tx.NewDropTable().IfExists().Table("org_domains").Exec(ctx); err != nil { - return err - } - - // rename new table to org_domains - if _, err := tx.ExecContext(ctx, `ALTER TABLE org_domains_new RENAME TO org_domains`); err != nil { - return err - } - return nil -} diff --git a/pkg/sqlmigration/017_update_pipelines.go b/pkg/sqlmigration/017_update_pipelines.go deleted file mode 100644 index f91de726596f..000000000000 --- a/pkg/sqlmigration/017_update_pipelines.go +++ /dev/null @@ -1,97 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updatePipelines struct { - store sqlstore.SQLStore -} - -func NewUpdatePipelines(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_pipelines"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdatePipelines(ctx, ps, c, sqlstore) - }) -} - -func newUpdatePipelines(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updatePipelines{ - store: store, - }, nil -} - -func (migration *updatePipelines) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updatePipelines) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - // get all org ids - var orgIDs []string - if err := migration.store.BunDB().NewSelect().Model((*types.Organization)(nil)).Column("id").Scan(ctx, &orgIDs); err != nil { - return err - } - - // add org id to pipelines table - if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "pipelines", "org_id"); err != nil { - return err - } else if !exists { - if _, err := tx.NewAddColumn().Table("pipelines").ColumnExpr("org_id TEXT REFERENCES organizations(id) ON DELETE CASCADE").Exec(ctx); err != nil { - return err - } - - // check if there is one org ID if yes then set it to all pipelines. - if len(orgIDs) == 1 { - orgID := orgIDs[0] - if _, err := tx.NewUpdate().Table("pipelines").Set("org_id = ?", orgID).Where("org_id IS NULL").Exec(ctx); err != nil { - return err - } - } - } - - // add updated_by to pipelines table - if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "pipelines", "updated_by"); err != nil { - return err - } else if !exists { - if _, err := tx.NewAddColumn().Table("pipelines").ColumnExpr("updated_by TEXT").Exec(ctx); err != nil { - return err - } - } - - // add updated_at to pipelines table - if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "pipelines", "updated_at"); err != nil { - return err - } else if !exists { - if _, err := tx.NewAddColumn().Table("pipelines").ColumnExpr("updated_at TIMESTAMP").Exec(ctx); err != nil { - return err - } - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *updatePipelines) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/018_drop_licenses_sites.go b/pkg/sqlmigration/018_drop_licenses_sites.go deleted file mode 100644 index edc29810145e..000000000000 --- a/pkg/sqlmigration/018_drop_licenses_sites.go +++ /dev/null @@ -1,77 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type dropLicensesSites struct { - store sqlstore.SQLStore -} - -func NewDropLicensesSitesFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("drop_licenses_sites"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newDropLicensesSites(ctx, ps, c, sqlstore) - }) -} - -func newDropLicensesSites(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &dropLicensesSites{store: store}, nil -} - -func (migration *dropLicensesSites) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *dropLicensesSites) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - if _, err := tx. - NewDropTable(). - IfExists(). - Table("sites"). - Exec(ctx); err != nil { - return err - } - - if _, err := tx. - NewDropTable(). - IfExists(). - Table("licenses"). - Exec(ctx); err != nil { - return err - } - - _, err = migration. - store. - Dialect(). - RenameColumn(ctx, tx, "saved_views", "uuid", "id") - if err != nil { - return err - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *dropLicensesSites) Down(context.Context, *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/019_update_invites.go b/pkg/sqlmigration/019_update_invites.go deleted file mode 100644 index 90bfa18e5b66..000000000000 --- a/pkg/sqlmigration/019_update_invites.go +++ /dev/null @@ -1,135 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateInvites struct { - store sqlstore.SQLStore -} - -type existingInvite struct { - bun.BaseModel `bun:"table:invites"` - - OrgID string `bun:"org_id,type:text,notnull" json:"orgId"` - ID int `bun:"id,pk,autoincrement" json:"id"` - Name string `bun:"name,type:text,notnull" json:"name"` - Email string `bun:"email,type:text,notnull,unique" json:"email"` - Token string `bun:"token,type:text,notnull" json:"token"` - CreatedAt time.Time `bun:"created_at,notnull" json:"createdAt"` - Role string `bun:"role,type:text,notnull" json:"role"` -} - -type newInvite struct { - bun.BaseModel `bun:"table:user_invite"` - - types.Identifiable - types.TimeAuditable - Name string `bun:"name,type:text,notnull" json:"name"` - Email string `bun:"email,type:text,notnull,unique" json:"email"` - Token string `bun:"token,type:text,notnull" json:"token"` - Role string `bun:"role,type:text,notnull" json:"role"` - OrgID string `bun:"org_id,type:text,notnull" json:"orgId"` -} - -func NewUpdateInvitesFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_invites"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateInvites(ctx, ps, c, sqlstore) - }) -} - -func newUpdateInvites(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateInvites{store: store}, nil -} - -func (migration *updateInvites) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateInvites) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingInvite), new(newInvite), []string{OrgReference}, func(ctx context.Context) error { - existingInvites := make([]*existingInvite, 0) - err = tx. - NewSelect(). - Model(&existingInvites). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingInvites) > 0 { - newInvites := migration.CopyOldInvitesToNewInvites(existingInvites) - _, err = tx. - NewInsert(). - Model(&newInvites). - Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - - return nil -} - -func (migration *updateInvites) Down(context.Context, *bun.DB) error { - return nil -} - -func (migration *updateInvites) CopyOldInvitesToNewInvites(existingInvites []*existingInvite) []*newInvite { - newInvites := make([]*newInvite, 0) - for _, invite := range existingInvites { - newInvites = append(newInvites, &newInvite{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - TimeAuditable: types.TimeAuditable{ - CreatedAt: invite.CreatedAt, - UpdatedAt: time.Now(), - }, - Name: invite.Name, - Email: invite.Email, - Token: invite.Token, - Role: invite.Role, - OrgID: invite.OrgID, - }) - } - - return newInvites -} diff --git a/pkg/sqlmigration/020_pat_update.go b/pkg/sqlmigration/020_pat_update.go deleted file mode 100644 index 487aa25d1420..000000000000 --- a/pkg/sqlmigration/020_pat_update.go +++ /dev/null @@ -1,76 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updatePat struct { - store sqlstore.SQLStore -} - -func NewUpdatePatFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_pat"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdatePat(ctx, ps, c, sqlstore) - }) -} - -func newUpdatePat(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updatePat{store: store}, nil -} - -func (migration *updatePat) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updatePat) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - for _, column := range []string{"last_used", "expires_at"} { - if err := migration. - store. - Dialect(). - AddNotNullDefaultToColumn(ctx, tx, "personal_access_tokens", column, "INTEGER", "0"); err != nil { - return err - } - } - - if err := migration. - store. - Dialect(). - AddNotNullDefaultToColumn(ctx, tx, "personal_access_tokens", "revoked", "BOOLEAN", "false"); err != nil { - return err - } - - if err := migration. - store. - Dialect(). - AddNotNullDefaultToColumn(ctx, tx, "personal_access_tokens", "updated_by_user_id", "TEXT", "''"); err != nil { - return err - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *updatePat) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/021_update_alertmanager.go b/pkg/sqlmigration/021_update_alertmanager.go deleted file mode 100644 index e20ba9cbadf2..000000000000 --- a/pkg/sqlmigration/021_update_alertmanager.go +++ /dev/null @@ -1,274 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateAlertmanager struct { - store sqlstore.SQLStore -} - -type existingChannel struct { - bun.BaseModel `bun:"table:notification_channels"` - ID int `json:"id" bun:"id,pk,autoincrement"` - Name string `json:"name" bun:"name"` - Type string `json:"type" bun:"type"` - Data string `json:"data" bun:"data"` - CreatedAt time.Time `json:"created_at" bun:"created_at"` - UpdatedAt time.Time `json:"updated_at" bun:"updated_at"` - OrgID string `json:"org_id" bun:"org_id"` -} - -type newChannel struct { - bun.BaseModel `bun:"table:notification_channel"` - types.Identifiable - types.TimeAuditable - Name string `json:"name" bun:"name"` - Type string `json:"type" bun:"type"` - Data string `json:"data" bun:"data"` - OrgID string `json:"org_id" bun:"org_id"` -} - -type existingAlertmanagerConfig struct { - bun.BaseModel `bun:"table:alertmanager_config"` - ID uint64 `bun:"id,pk,autoincrement"` - Config string `bun:"config,notnull,type:text"` - Hash string `bun:"hash,notnull,type:text"` - CreatedAt time.Time `bun:"created_at,notnull"` - UpdatedAt time.Time `bun:"updated_at,notnull"` - OrgID string `bun:"org_id,notnull,unique"` -} - -type newAlertmanagerConfig struct { - bun.BaseModel `bun:"table:alertmanager_config_new"` - types.Identifiable - types.TimeAuditable - Config string `bun:"config,notnull,type:text"` - Hash string `bun:"hash,notnull,type:text"` - OrgID string `bun:"org_id,notnull,unique"` -} - -type existingAlertmanagerState struct { - bun.BaseModel `bun:"table:alertmanager_state"` - ID uint64 `bun:"id,pk,autoincrement"` - Silences string `bun:"silences,nullzero,type:text"` - NFLog string `bun:"nflog,nullzero,type:text"` - CreatedAt time.Time `bun:"created_at,notnull"` - UpdatedAt time.Time `bun:"updated_at,notnull"` - OrgID string `bun:"org_id,notnull,unique"` -} - -type newAlertmanagerState struct { - bun.BaseModel `bun:"table:alertmanager_state_new"` - types.Identifiable - types.TimeAuditable - Silences string `bun:"silences,nullzero,type:text"` - NFLog string `bun:"nflog,nullzero,type:text"` - OrgID string `bun:"org_id,notnull,unique"` -} - -func NewUpdateAlertmanagerFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_alertmanager"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateAlertmanager(ctx, ps, c, sqlstore) - }) -} - -func newUpdateAlertmanager(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateAlertmanager{store: store}, nil -} - -func (migration *updateAlertmanager) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateAlertmanager) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingChannel), new(newChannel), []string{OrgReference}, func(ctx context.Context) error { - existingChannels := make([]*existingChannel, 0) - err = tx. - NewSelect(). - Model(&existingChannels). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingChannels) > 0 { - newChannels := migration. - CopyOldChannelToNewChannel(existingChannels) - _, err = tx. - NewInsert(). - Model(&newChannels). - Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - if err != nil { - return err - } - - err = migration. - store. - Dialect(). - UpdatePrimaryKey(ctx, tx, new(existingAlertmanagerConfig), new(newAlertmanagerConfig), OrgReference, func(ctx context.Context) error { - existingAlertmanagerConfigs := make([]*existingAlertmanagerConfig, 0) - err = tx. - NewSelect(). - Model(&existingAlertmanagerConfigs). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingAlertmanagerConfigs) > 0 { - newAlertmanagerConfigs := migration. - CopyOldConfigToNewConfig(existingAlertmanagerConfigs) - _, err = tx. - NewInsert(). - Model(&newAlertmanagerConfigs). - Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - if err != nil { - return err - } - - err = migration. - store. - Dialect(). - UpdatePrimaryKey(ctx, tx, new(existingAlertmanagerState), new(newAlertmanagerState), OrgReference, func(ctx context.Context) error { - existingAlertmanagerStates := make([]*existingAlertmanagerState, 0) - err = tx. - NewSelect(). - Model(&existingAlertmanagerStates). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingAlertmanagerStates) > 0 { - newAlertmanagerStates := migration. - CopyOldStateToNewState(existingAlertmanagerStates) - _, err = tx. - NewInsert(). - Model(&newAlertmanagerStates). - Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - - return nil -} - -func (migration *updateAlertmanager) Down(context.Context, *bun.DB) error { - return nil -} - -func (migration *updateAlertmanager) CopyOldChannelToNewChannel(existingChannels []*existingChannel) []*newChannel { - newChannels := make([]*newChannel, 0) - for _, channel := range existingChannels { - newChannels = append(newChannels, &newChannel{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - TimeAuditable: types.TimeAuditable{ - CreatedAt: channel.CreatedAt, - UpdatedAt: channel.UpdatedAt, - }, - Name: channel.Name, - Type: channel.Type, - Data: channel.Data, - OrgID: channel.OrgID, - }) - } - - return newChannels -} - -func (migration *updateAlertmanager) CopyOldConfigToNewConfig(existingAlertmanagerConfigs []*existingAlertmanagerConfig) []*newAlertmanagerConfig { - newAlertmanagerConfigs := make([]*newAlertmanagerConfig, 0) - for _, config := range existingAlertmanagerConfigs { - newAlertmanagerConfigs = append(newAlertmanagerConfigs, &newAlertmanagerConfig{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - TimeAuditable: types.TimeAuditable{ - CreatedAt: config.CreatedAt, - UpdatedAt: config.UpdatedAt, - }, - Config: config.Config, - Hash: config.Hash, - OrgID: config.OrgID, - }) - } - - return newAlertmanagerConfigs -} - -func (migration *updateAlertmanager) CopyOldStateToNewState(existingAlertmanagerStates []*existingAlertmanagerState) []*newAlertmanagerState { - newAlertmanagerStates := make([]*newAlertmanagerState, 0) - for _, state := range existingAlertmanagerStates { - newAlertmanagerStates = append(newAlertmanagerStates, &newAlertmanagerState{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - TimeAuditable: types.TimeAuditable{ - CreatedAt: state.CreatedAt, - UpdatedAt: state.UpdatedAt, - }, - Silences: state.Silences, - NFLog: state.NFLog, - OrgID: state.OrgID, - }) - } - - return newAlertmanagerStates -} diff --git a/pkg/sqlmigration/022_update_preferences.go b/pkg/sqlmigration/022_update_preferences.go deleted file mode 100644 index bfee30ba8e15..000000000000 --- a/pkg/sqlmigration/022_update_preferences.go +++ /dev/null @@ -1,198 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "fmt" - "reflect" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updatePreferences struct { - store sqlstore.SQLStore -} - -type existingOrgPreference struct { - bun.BaseModel `bun:"table:org_preference"` - PreferenceID string `bun:"preference_id,pk,type:text,notnull"` - PreferenceValue string `bun:"preference_value,type:text,notnull"` - OrgID string `bun:"org_id,pk,type:text,notnull"` -} - -type newOrgPreference struct { - bun.BaseModel `bun:"table:org_preference_new"` - types.Identifiable - PreferenceID string `bun:"preference_id,type:text,notnull"` - PreferenceValue string `bun:"preference_value,type:text,notnull"` - OrgID string `bun:"org_id,type:text,notnull"` -} - -type existingUserPreference struct { - bun.BaseModel `bun:"table:user_preference"` - PreferenceID string `bun:"preference_id,type:text,pk"` - PreferenceValue string `bun:"preference_value,type:text"` - UserID string `bun:"user_id,type:text,pk"` -} - -type newUserPreference struct { - bun.BaseModel `bun:"table:user_preference_new"` - types.Identifiable - PreferenceID string `bun:"preference_id,type:text,notnull"` - PreferenceValue string `bun:"preference_value,type:text,notnull"` - UserID string `bun:"user_id,type:text,notnull"` -} - -func NewUpdatePreferencesFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_preferences"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdatePreferences(ctx, ps, c, sqlstore) - }) -} - -func newUpdatePreferences(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updatePreferences{store: store}, nil -} - -func (migration *updatePreferences) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updatePreferences) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - err = migration. - store. - Dialect(). - AddPrimaryKey(ctx, tx, new(existingOrgPreference), new(newOrgPreference), OrgReference, func(ctx context.Context) error { - existingOrgPreferences := make([]*existingOrgPreference, 0) - err = tx. - NewSelect(). - Model(&existingOrgPreferences). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingOrgPreferences) > 0 { - newOrgPreferences := migration. - CopyOldOrgPreferencesToNewOrgPreferences(existingOrgPreferences) - _, err = tx. - NewInsert(). - Model(&newOrgPreferences). - Exec(ctx) - if err != nil { - return err - } - } - - tableName := tx.Dialect().Tables().Get(reflect.TypeOf(new(existingOrgPreference))).Name - _, err = tx. - ExecContext(ctx, fmt.Sprintf("CREATE UNIQUE INDEX IF NOT EXISTS %s_unique_idx ON %s (preference_id, org_id)", tableName, fmt.Sprintf("%s_new", tableName))) - if err != nil { - return err - } - - return nil - }) - if err != nil { - return err - } - - err = migration. - store. - Dialect(). - AddPrimaryKey(ctx, tx, new(existingUserPreference), new(newUserPreference), UserReference, func(ctx context.Context) error { - existingUserPreferences := make([]*existingUserPreference, 0) - err = tx. - NewSelect(). - Model(&existingUserPreferences). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingUserPreferences) > 0 { - newUserPreferences := migration.CopyOldUserPreferencesToNewUserPreferences(existingUserPreferences) - _, err = tx. - NewInsert(). - Model(&newUserPreferences). - Exec(ctx) - if err != nil { - return err - } - } - - tableName := tx.Dialect().Tables().Get(reflect.TypeOf(new(existingUserPreference))).Name - _, err = tx. - ExecContext(ctx, fmt.Sprintf("CREATE UNIQUE INDEX IF NOT EXISTS %s_unique_idx ON %s (preference_id, user_id)", tableName, fmt.Sprintf("%s_new", tableName))) - if err != nil { - return err - } - - return nil - }) - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - - return nil -} - -func (migration *updatePreferences) Down(context.Context, *bun.DB) error { - return nil -} - -func (migration *updatePreferences) CopyOldOrgPreferencesToNewOrgPreferences(existingOrgPreferences []*existingOrgPreference) []*newOrgPreference { - newOrgPreferences := make([]*newOrgPreference, 0) - for _, preference := range existingOrgPreferences { - newOrgPreferences = append(newOrgPreferences, &newOrgPreference{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - PreferenceID: preference.PreferenceID, - PreferenceValue: preference.PreferenceValue, - OrgID: preference.OrgID, - }) - } - return newOrgPreferences -} - -func (migration *updatePreferences) CopyOldUserPreferencesToNewUserPreferences(existingUserPreferences []*existingUserPreference) []*newUserPreference { - newUserPreferences := make([]*newUserPreference, 0) - for _, preference := range existingUserPreferences { - newUserPreferences = append(newUserPreferences, &newUserPreference{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - PreferenceID: preference.PreferenceID, - PreferenceValue: preference.PreferenceValue, - UserID: preference.UserID, - }) - } - return newUserPreferences -} diff --git a/pkg/sqlmigration/023_update_apdex_ttl.go b/pkg/sqlmigration/023_update_apdex_ttl.go deleted file mode 100644 index 2524b386421c..000000000000 --- a/pkg/sqlmigration/023_update_apdex_ttl.go +++ /dev/null @@ -1,229 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "fmt" - "reflect" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateApdexTtl struct { - store sqlstore.SQLStore -} - -type existingApdexSettings struct { - bun.BaseModel `bun:"table:apdex_settings"` - OrgID string `bun:"org_id,pk,type:text" json:"orgId"` - ServiceName string `bun:"service_name,pk,type:text" json:"serviceName"` - Threshold float64 `bun:"threshold,type:float,notnull" json:"threshold"` - ExcludeStatusCodes string `bun:"exclude_status_codes,type:text,notnull" json:"excludeStatusCodes"` -} - -type newApdexSettings struct { - bun.BaseModel `bun:"table:apdex_setting"` - types.Identifiable - OrgID string `bun:"org_id,type:text" json:"orgId"` - ServiceName string `bun:"service_name,type:text" json:"serviceName"` - Threshold float64 `bun:"threshold,type:float,notnull" json:"threshold"` - ExcludeStatusCodes string `bun:"exclude_status_codes,type:text,notnull" json:"excludeStatusCodes"` -} - -type existingTTLStatus struct { - bun.BaseModel `bun:"table:ttl_status"` - ID int `bun:"id,pk,autoincrement"` - TransactionID string `bun:"transaction_id,type:text,notnull"` - CreatedAt time.Time `bun:"created_at,type:datetime,notnull"` - UpdatedAt time.Time `bun:"updated_at,type:datetime,notnull"` - TableName string `bun:"table_name,type:text,notnull"` - TTL int `bun:"ttl,notnull,default:0"` - ColdStorageTTL int `bun:"cold_storage_ttl,notnull,default:0"` - Status string `bun:"status,type:text,notnull"` -} - -type newTTLStatus struct { - bun.BaseModel `bun:"table:ttl_setting"` - types.Identifiable - types.TimeAuditable - TransactionID string `bun:"transaction_id,type:text,notnull"` - TableName string `bun:"table_name,type:text,notnull"` - TTL int `bun:"ttl,notnull,default:0"` - ColdStorageTTL int `bun:"cold_storage_ttl,notnull,default:0"` - Status string `bun:"status,type:text,notnull"` - OrgID string `json:"-" bun:"org_id,notnull"` -} - -func NewUpdateApdexTtlFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_apdex_ttl"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateApdexTtl(ctx, ps, c, sqlstore) - }) -} - -func newUpdateApdexTtl(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateApdexTtl{store: store}, nil -} - -func (migration *updateApdexTtl) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateApdexTtl) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingApdexSettings), new(newApdexSettings), []string{OrgReference}, func(ctx context.Context) error { - existingApdexSettings := make([]*existingApdexSettings, 0) - err = tx. - NewSelect(). - Model(&existingApdexSettings). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingApdexSettings) > 0 { - newSettings := migration. - CopyExistingApdexSettingsToNewApdexSettings(existingApdexSettings) - _, err = tx. - NewInsert(). - Model(&newSettings). - Exec(ctx) - if err != nil { - return err - } - } - - tableName := tx.Dialect().Tables().Get(reflect.TypeOf(new(newApdexSettings))).Name - _, err = tx. - ExecContext(ctx, fmt.Sprintf("CREATE UNIQUE INDEX IF NOT EXISTS %s_unique_idx ON %s (service_name, org_id)", tableName, tableName)) - if err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingTTLStatus), new(newTTLStatus), []string{OrgReference}, func(ctx context.Context) error { - existingTTLStatus := make([]*existingTTLStatus, 0) - err = tx. - NewSelect(). - Model(&existingTTLStatus). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingTTLStatus) > 0 { - var orgID string - err := migration. - store. - BunDB(). - NewSelect(). - Model((*types.Organization)(nil)). - Column("id"). - Scan(ctx, &orgID) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil { - newTTLStatus := migration.CopyExistingTTLStatusToNewTTLStatus(existingTTLStatus, orgID) - _, err = tx. - NewInsert(). - Model(&newTTLStatus). - Exec(ctx) - if err != nil { - return err - } - } - - } - return nil - }) - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - - return nil -} - -func (migration *updateApdexTtl) Down(context.Context, *bun.DB) error { - return nil -} - -func (migration *updateApdexTtl) CopyExistingApdexSettingsToNewApdexSettings(existingApdexSettings []*existingApdexSettings) []*newApdexSettings { - newSettings := make([]*newApdexSettings, 0) - for _, apdexSetting := range existingApdexSettings { - newSettings = append(newSettings, &newApdexSettings{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - ServiceName: apdexSetting.ServiceName, - Threshold: apdexSetting.Threshold, - ExcludeStatusCodes: apdexSetting.ExcludeStatusCodes, - OrgID: apdexSetting.OrgID, - }) - } - - return newSettings -} - -func (migration *updateApdexTtl) CopyExistingTTLStatusToNewTTLStatus(existingTTLStatus []*existingTTLStatus, orgID string) []*newTTLStatus { - newTTLStatuses := make([]*newTTLStatus, 0) - - for _, ttl := range existingTTLStatus { - newTTLStatuses = append(newTTLStatuses, &newTTLStatus{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - TimeAuditable: types.TimeAuditable{ - CreatedAt: ttl.CreatedAt, - UpdatedAt: ttl.UpdatedAt, - }, - TransactionID: ttl.TransactionID, - TTL: ttl.TTL, - TableName: ttl.TableName, - ColdStorageTTL: ttl.ColdStorageTTL, - Status: ttl.Status, - OrgID: orgID, - }) - } - - return newTTLStatuses -} diff --git a/pkg/sqlmigration/024_update_reset_password.go b/pkg/sqlmigration/024_update_reset_password.go deleted file mode 100644 index eddddcf73d94..000000000000 --- a/pkg/sqlmigration/024_update_reset_password.go +++ /dev/null @@ -1,195 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateResetPassword struct { - store sqlstore.SQLStore -} - -type existingResetPasswordRequest struct { - bun.BaseModel `bun:"table:reset_password_request"` - ID int `bun:"id,pk,autoincrement" json:"id"` - Token string `bun:"token,type:text,notnull" json:"token"` - UserID string `bun:"user_id,type:text,notnull" json:"userId"` -} - -type newResetPasswordRequest struct { - bun.BaseModel `bun:"table:reset_password_request_new"` - types.Identifiable - Token string `bun:"token,type:text,notnull" json:"token"` - UserID string `bun:"user_id,type:text,notnull" json:"userId"` -} - -type existingPersonalAccessToken struct { - bun.BaseModel `bun:"table:personal_access_tokens"` - types.TimeAuditable - OrgID string `json:"orgId" bun:"org_id,type:text,notnull"` - ID int `json:"id" bun:"id,pk,autoincrement"` - Role string `json:"role" bun:"role,type:text,notnull,default:'ADMIN'"` - UserID string `json:"userId" bun:"user_id,type:text,notnull"` - Token string `json:"token" bun:"token,type:text,notnull,unique"` - Name string `json:"name" bun:"name,type:text,notnull"` - ExpiresAt int64 `json:"expiresAt" bun:"expires_at,notnull,default:0"` - LastUsed int64 `json:"lastUsed" bun:"last_used,notnull,default:0"` - Revoked bool `json:"revoked" bun:"revoked,notnull,default:false"` - UpdatedByUserID string `json:"updatedByUserId" bun:"updated_by_user_id,type:text,notnull,default:''"` -} - -type newPersonalAccessToken struct { - bun.BaseModel `bun:"table:personal_access_token"` - types.Identifiable - types.TimeAuditable - OrgID string `json:"orgId" bun:"org_id,type:text,notnull"` - Role string `json:"role" bun:"role,type:text,notnull,default:'ADMIN'"` - UserID string `json:"userId" bun:"user_id,type:text,notnull"` - Token string `json:"token" bun:"token,type:text,notnull,unique"` - Name string `json:"name" bun:"name,type:text,notnull"` - ExpiresAt int64 `json:"expiresAt" bun:"expires_at,notnull,default:0"` - LastUsed int64 `json:"lastUsed" bun:"last_used,notnull,default:0"` - Revoked bool `json:"revoked" bun:"revoked,notnull,default:false"` - UpdatedByUserID string `json:"updatedByUserId" bun:"updated_by_user_id,type:text,notnull,default:''"` -} - -func NewUpdateResetPasswordFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_reset_password"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateResetPassword(ctx, ps, c, sqlstore) - }) -} - -func newUpdateResetPassword(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateResetPassword{store: store}, nil -} - -func (migration *updateResetPassword) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateResetPassword) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - err = migration.store.Dialect().UpdatePrimaryKey(ctx, tx, new(existingResetPasswordRequest), new(newResetPasswordRequest), UserReference, func(ctx context.Context) error { - existingResetPasswordRequests := make([]*existingResetPasswordRequest, 0) - err = tx. - NewSelect(). - Model(&existingResetPasswordRequests). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingResetPasswordRequests) > 0 { - newResetPasswordRequests := migration.CopyExistingResetPasswordRequestsToNewResetPasswordRequests(existingResetPasswordRequests) - _, err = tx. - NewInsert(). - Model(&newResetPasswordRequests). - Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - - if err != nil { - return err - } - - err = migration.store.Dialect().RenameTableAndModifyModel(ctx, tx, new(existingPersonalAccessToken), new(newPersonalAccessToken), []string{OrgReference, UserReference}, func(ctx context.Context) error { - existingPersonalAccessTokens := make([]*existingPersonalAccessToken, 0) - err = tx. - NewSelect(). - Model(&existingPersonalAccessTokens). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingPersonalAccessTokens) > 0 { - newPersonalAccessTokens := migration.CopyExistingPATsToNewPATs(existingPersonalAccessTokens) - _, err = tx.NewInsert().Model(&newPersonalAccessTokens).Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - - return nil -} - -func (migration *updateResetPassword) Down(context.Context, *bun.DB) error { - return nil -} - -func (migration *updateResetPassword) CopyExistingResetPasswordRequestsToNewResetPasswordRequests(existingPasswordRequests []*existingResetPasswordRequest) []*newResetPasswordRequest { - newResetPasswordRequests := make([]*newResetPasswordRequest, 0) - for _, request := range existingPasswordRequests { - newResetPasswordRequests = append(newResetPasswordRequests, &newResetPasswordRequest{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - Token: request.Token, - UserID: request.UserID, - }) - } - return newResetPasswordRequests -} - -func (migration *updateResetPassword) CopyExistingPATsToNewPATs(existingPATs []*existingPersonalAccessToken) []*newPersonalAccessToken { - newPATs := make([]*newPersonalAccessToken, 0) - for _, pat := range existingPATs { - newPATs = append(newPATs, &newPersonalAccessToken{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - TimeAuditable: types.TimeAuditable{ - CreatedAt: pat.CreatedAt, - UpdatedAt: pat.UpdatedAt, - }, - Role: pat.Role, - Name: pat.Name, - ExpiresAt: pat.ExpiresAt, - LastUsed: pat.LastUsed, - UserID: pat.UserID, - Token: pat.Token, - Revoked: pat.Revoked, - UpdatedByUserID: pat.UpdatedByUserID, - OrgID: pat.OrgID, - }) - } - return newPATs -} diff --git a/pkg/sqlmigration/025_add_virtual_fields.go b/pkg/sqlmigration/025_add_virtual_fields.go deleted file mode 100644 index 8dbf6fa3bf40..000000000000 --- a/pkg/sqlmigration/025_add_virtual_fields.go +++ /dev/null @@ -1,58 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/types/telemetrytypes" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addVirtualFields struct{} - -func NewAddVirtualFieldsFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_virtual_fields"), newAddVirtualFields) -} - -func newAddVirtualFields(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &addVirtualFields{}, nil -} - -func (migration *addVirtualFields) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addVirtualFields) Up(ctx context.Context, db *bun.DB) error { - // table:virtual_field op:create - if _, err := db.NewCreateTable(). - Model(&struct { - bun.BaseModel `bun:"table:virtual_field"` - - types.Identifiable - types.TimeAuditable - types.UserAuditable - - Name string `bun:"name,type:text,notnull"` - Expression string `bun:"expression,type:text,notnull"` - Description string `bun:"description,type:text"` - Signal telemetrytypes.Signal `bun:"signal,type:text,notnull"` - OrgID string `bun:"org_id,type:text,notnull"` - }{}). - ForeignKey(`("org_id") REFERENCES "organizations" ("id") ON DELETE CASCADE`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - return nil -} - -func (migration *addVirtualFields) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/026_update_integrations.go b/pkg/sqlmigration/026_update_integrations.go deleted file mode 100644 index 2611cae4dd04..000000000000 --- a/pkg/sqlmigration/026_update_integrations.go +++ /dev/null @@ -1,446 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/google/uuid" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateIntegrations struct { - store sqlstore.SQLStore -} - -func NewUpdateIntegrationsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_integrations"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateIntegrations(ctx, ps, c, sqlstore) - }) -} - -func newUpdateIntegrations(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateIntegrations{store: store}, nil -} - -func (migration *updateIntegrations) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -type existingInstalledIntegration struct { - bun.BaseModel `bun:"table:integrations_installed"` - - IntegrationID string `bun:"integration_id,pk,type:text"` - ConfigJSON string `bun:"config_json,type:text"` - InstalledAt time.Time `bun:"installed_at,default:current_timestamp"` -} - -type newInstalledIntegration struct { - bun.BaseModel `bun:"table:installed_integration"` - - types.Identifiable - Type string `json:"type" bun:"type,type:text,unique:org_id_type"` - Config string `json:"config" bun:"config,type:text"` - InstalledAt time.Time `json:"installed_at" bun:"installed_at,default:current_timestamp"` - OrgID string `json:"org_id" bun:"org_id,type:text,unique:org_id_type"` -} - -type existingCloudIntegration struct { - bun.BaseModel `bun:"table:cloud_integrations_accounts"` - - CloudProvider string `bun:"cloud_provider,type:text,unique:cloud_provider_id"` - ID string `bun:"id,type:text,notnull,unique:cloud_provider_id"` - ConfigJSON string `bun:"config_json,type:text"` - CloudAccountID string `bun:"cloud_account_id,type:text"` - LastAgentReportJSON string `bun:"last_agent_report_json,type:text"` - CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"` - RemovedAt *time.Time `bun:"removed_at,type:timestamp"` -} - -type newCloudIntegration struct { - bun.BaseModel `bun:"table:cloud_integration"` - - types.Identifiable - types.TimeAuditable - Provider string `json:"provider" bun:"provider,type:text"` - Config string `json:"config" bun:"config,type:text"` - AccountID string `json:"account_id" bun:"account_id,type:text"` - LastAgentReport string `json:"last_agent_report" bun:"last_agent_report,type:text"` - RemovedAt *time.Time `json:"removed_at" bun:"removed_at,type:timestamp"` - OrgID string `json:"org_id" bun:"org_id,type:text"` -} - -type existingCloudIntegrationService struct { - bun.BaseModel `bun:"table:cloud_integrations_service_configs,alias:c1"` - - CloudProvider string `bun:"cloud_provider,type:text,notnull,unique:service_cloud_provider_account"` - CloudAccountID string `bun:"cloud_account_id,type:text,notnull,unique:service_cloud_provider_account"` - ServiceID string `bun:"service_id,type:text,notnull,unique:service_cloud_provider_account"` - ConfigJSON string `bun:"config_json,type:text"` - CreatedAt time.Time `bun:"created_at,default:current_timestamp"` -} - -type newCloudIntegrationService struct { - bun.BaseModel `bun:"table:cloud_integration_service,alias:cis"` - - types.Identifiable - types.TimeAuditable - Type string `bun:"type,type:text,notnull,unique:cloud_integration_id_type"` - Config string `bun:"config,type:text"` - CloudIntegrationID string `bun:"cloud_integration_id,type:text,notnull,unique:cloud_integration_id_type"` -} - -type StorablePersonalAccessToken struct { - bun.BaseModel `bun:"table:personal_access_token"` - types.Identifiable - types.TimeAuditable - OrgID string `json:"orgId" bun:"org_id,type:text,notnull"` - Role string `json:"role" bun:"role,type:text,notnull,default:'ADMIN'"` - UserID string `json:"userId" bun:"user_id,type:text,notnull"` - Token string `json:"token" bun:"token,type:text,notnull,unique"` - Name string `json:"name" bun:"name,type:text,notnull"` - ExpiresAt int64 `json:"expiresAt" bun:"expires_at,notnull,default:0"` - LastUsed int64 `json:"lastUsed" bun:"last_used,notnull,default:0"` - Revoked bool `json:"revoked" bun:"revoked,notnull,default:false"` - UpdatedByUserID string `json:"updatedByUserId" bun:"updated_by_user_id,type:text,notnull,default:''"` -} - -func (migration *updateIntegrations) Up(ctx context.Context, db *bun.DB) error { - - // begin transaction - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - defer func() { - _ = tx.Rollback() - }() - - // don't run the migration if there are multiple org ids - orgIDs := make([]string, 0) - err = migration.store.BunDB().NewSelect().Model((*types.Organization)(nil)).Column("id").Scan(ctx, &orgIDs) - if err != nil { - return err - } - if len(orgIDs) > 1 { - return nil - } - - // installed integrations - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingInstalledIntegration), new(newInstalledIntegration), []string{OrgReference}, func(ctx context.Context) error { - existingIntegrations := make([]*existingInstalledIntegration, 0) - err = tx. - NewSelect(). - Model(&existingIntegrations). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingIntegrations) > 0 { - newIntegrations := migration. - CopyOldIntegrationsToNewIntegrations(tx, orgIDs[0], existingIntegrations) - _, err = tx. - NewInsert(). - Model(&newIntegrations). - Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - if err != nil { - return err - } - - // cloud integrations - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingCloudIntegration), new(newCloudIntegration), []string{OrgReference}, func(ctx context.Context) error { - existingIntegrations := make([]*existingCloudIntegration, 0) - err = tx. - NewSelect(). - Model(&existingIntegrations). - Where("removed_at IS NULL"). // we will only copy the accounts that are not removed - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingIntegrations) > 0 { - newIntegrations := migration. - CopyOldCloudIntegrationsToNewCloudIntegrations(tx, orgIDs[0], existingIntegrations) - _, err = tx. - NewInsert(). - Model(&newIntegrations). - Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - if err != nil { - return err - } - - // add unique constraint to cloud_integration table - _, err = tx.ExecContext(ctx, `CREATE UNIQUE INDEX IF NOT EXISTS unique_cloud_integration ON cloud_integration (id, provider, org_id)`) - if err != nil { - return err - } - - // cloud integration service - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingCloudIntegrationService), new(newCloudIntegrationService), []string{CloudIntegrationReference}, func(ctx context.Context) error { - existingServices := make([]*existingCloudIntegrationService, 0) - - // only one service per provider,account id and type - // so there won't be any duplicates. - // just that these will be enabled as soon as the integration for the account is enabled - err = tx. - NewSelect(). - Model(&existingServices). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingServices) > 0 { - newServices := migration. - CopyOldCloudIntegrationServicesToNewCloudIntegrationServices(tx, orgIDs[0], existingServices) - if len(newServices) > 0 { - _, err = tx. - NewInsert(). - Model(&newServices). - Exec(ctx) - if err != nil { - return err - } - } - } - return nil - }) - if err != nil { - return err - } - - if len(orgIDs) == 0 { - err = tx.Commit() - if err != nil { - return err - } - return nil - } - - // copy the old aws integration user to the new user - err = migration.copyOldAwsIntegrationUser(tx, orgIDs[0]) - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - - return nil -} - -func (migration *updateIntegrations) Down(ctx context.Context, db *bun.DB) error { - return nil -} - -func (migration *updateIntegrations) CopyOldIntegrationsToNewIntegrations(tx bun.IDB, orgID string, existingIntegrations []*existingInstalledIntegration) []*newInstalledIntegration { - newIntegrations := make([]*newInstalledIntegration, 0) - - for _, integration := range existingIntegrations { - newIntegrations = append(newIntegrations, &newInstalledIntegration{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - Type: integration.IntegrationID, - Config: integration.ConfigJSON, - InstalledAt: integration.InstalledAt, - OrgID: orgID, - }) - } - - return newIntegrations -} - -func (migration *updateIntegrations) CopyOldCloudIntegrationsToNewCloudIntegrations(tx bun.IDB, orgID string, existingIntegrations []*existingCloudIntegration) []*newCloudIntegration { - newIntegrations := make([]*newCloudIntegration, 0) - - for _, integration := range existingIntegrations { - newIntegrations = append(newIntegrations, &newCloudIntegration{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - TimeAuditable: types.TimeAuditable{ - CreatedAt: integration.CreatedAt, - UpdatedAt: integration.CreatedAt, - }, - Provider: integration.CloudProvider, - AccountID: integration.CloudAccountID, - Config: integration.ConfigJSON, - LastAgentReport: integration.LastAgentReportJSON, - RemovedAt: integration.RemovedAt, - OrgID: orgID, - }) - } - - return newIntegrations -} - -func (migration *updateIntegrations) CopyOldCloudIntegrationServicesToNewCloudIntegrationServices(tx bun.IDB, orgID string, existingServices []*existingCloudIntegrationService) []*newCloudIntegrationService { - newServices := make([]*newCloudIntegrationService, 0) - - for _, service := range existingServices { - var cloudIntegrationID string - err := tx.NewSelect(). - Model((*newCloudIntegration)(nil)). - Column("id"). - Where("account_id = ?", service.CloudAccountID). - Where("provider = ?", service.CloudProvider). - Where("org_id = ?", orgID). - Scan(context.Background(), &cloudIntegrationID) - if err != nil { - if err == sql.ErrNoRows { - continue - } - return nil - } - newServices = append(newServices, &newCloudIntegrationService{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - TimeAuditable: types.TimeAuditable{ - CreatedAt: service.CreatedAt, - UpdatedAt: service.CreatedAt, - }, - Type: service.ServiceID, - Config: service.ConfigJSON, - CloudIntegrationID: cloudIntegrationID, - }) - } - - return newServices -} - -func (migration *updateIntegrations) copyOldAwsIntegrationUser(tx bun.IDB, orgID string) error { - type oldUser struct { - bun.BaseModel `bun:"table:users"` - - types.TimeAuditable - ID string `bun:"id,pk,type:text" json:"id"` - Name string `bun:"name,type:text,notnull" json:"name"` - Email string `bun:"email,type:text,notnull,unique" json:"email"` - Password string `bun:"password,type:text,notnull" json:"-"` - ProfilePictureURL string `bun:"profile_picture_url,type:text" json:"profilePictureURL"` - GroupID string `bun:"group_id,type:text,notnull" json:"groupId"` - OrgID string `bun:"org_id,type:text,notnull" json:"orgId"` - } - - user := &oldUser{} - err := tx.NewSelect().Model(user).Where("email = ?", "aws-integration@signoz.io").Scan(context.Background()) - if err != nil { - if err == sql.ErrNoRows { - return nil - } - return err - } - - // check if the id is already an uuid - if _, err := uuid.Parse(user.ID); err == nil { - return nil - } - - // new user - newUser := &oldUser{ - ID: uuid.New().String(), - TimeAuditable: types.TimeAuditable{ - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }, - OrgID: orgID, - Name: user.Name, - Email: user.Email, - GroupID: user.GroupID, - Password: user.Password, - } - - // get the pat for old user - pat := &StorablePersonalAccessToken{} - err = tx.NewSelect().Model(pat).Where("user_id = ? and revoked = false", "aws-integration").Scan(context.Background()) - if err != nil { - if err == sql.ErrNoRows { - // delete the old user - _, err = tx.ExecContext(context.Background(), `DELETE FROM users WHERE id = ?`, user.ID) - if err != nil { - return err - } - return nil - } - return err - } - - // new pat - newPAT := &StorablePersonalAccessToken{ - Identifiable: types.Identifiable{ID: valuer.GenerateUUID()}, - TimeAuditable: types.TimeAuditable{ - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }, - OrgID: orgID, - UserID: newUser.ID, - Token: pat.Token, - Name: pat.Name, - ExpiresAt: pat.ExpiresAt, - LastUsed: pat.LastUsed, - Revoked: pat.Revoked, - Role: pat.Role, - } - - // delete old user - _, err = tx.ExecContext(context.Background(), `DELETE FROM users WHERE id = ?`, user.ID) - if err != nil { - return err - } - - // insert the new user - _, err = tx.NewInsert().Model(newUser).Exec(context.Background()) - if err != nil { - return err - } - - // insert the new pat - _, err = tx.NewInsert().Model(newPAT).Exec(context.Background()) - if err != nil { - return err - } - - return nil -} diff --git a/pkg/sqlmigration/027_update_rules.go b/pkg/sqlmigration/027_update_rules.go deleted file mode 100644 index fe9bdf0edecd..000000000000 --- a/pkg/sqlmigration/027_update_rules.go +++ /dev/null @@ -1,345 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "database/sql/driver" - "encoding/json" - "strconv" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - ruletypes "github.com/SigNoz/signoz/pkg/types/ruletypes" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateRules struct { - store sqlstore.SQLStore -} - -type AlertIds []string - -func (a *AlertIds) Scan(src interface{}) error { - if data, ok := src.([]byte); ok { - return json.Unmarshal(data, a) - } - return nil -} - -func (a *AlertIds) Value() (driver.Value, error) { - return json.Marshal(a) -} - -type existingRule struct { - bun.BaseModel `bun:"table:rules"` - ID int `bun:"id,pk,autoincrement"` - CreatedAt time.Time `bun:"created_at,type:datetime,notnull"` - CreatedBy string `bun:"created_by,type:text,notnull"` - UpdatedAt time.Time `bun:"updated_at,type:datetime,notnull"` - UpdatedBy string `bun:"updated_by,type:text,notnull"` - Deleted int `bun:"deleted,notnull,default:0"` - Data string `bun:"data,type:text,notnull"` -} - -type newRule struct { - bun.BaseModel `bun:"table:rule"` - types.Identifiable - types.TimeAuditable - types.UserAuditable - Deleted int `bun:"deleted,notnull,default:0"` - Data string `bun:"data,type:text,notnull"` - OrgID string `bun:"org_id,type:text"` -} - -type existingMaintenance struct { - bun.BaseModel `bun:"table:planned_maintenance"` - ID int `bun:"id,pk,autoincrement"` - Name string `bun:"name,type:text,notnull"` - Description string `bun:"description,type:text"` - AlertIDs *AlertIds `bun:"alert_ids,type:text"` - Schedule *ruletypes.Schedule `bun:"schedule,type:text,notnull"` - CreatedAt time.Time `bun:"created_at,type:datetime,notnull"` - CreatedBy string `bun:"created_by,type:text,notnull"` - UpdatedAt time.Time `bun:"updated_at,type:datetime,notnull"` - UpdatedBy string `bun:"updated_by,type:text,notnull"` -} - -type newMaintenance struct { - bun.BaseModel `bun:"table:planned_maintenance_new"` - types.Identifiable - types.TimeAuditable - types.UserAuditable - Name string `bun:"name,type:text,notnull"` - Description string `bun:"description,type:text"` - Schedule *ruletypes.Schedule `bun:"schedule,type:text,notnull"` - OrgID string `bun:"org_id,type:text"` -} - -type storablePlannedMaintenanceRule struct { - bun.BaseModel `bun:"table:planned_maintenance_rule"` - types.Identifiable - PlannedMaintenanceID valuer.UUID `bun:"planned_maintenance_id,type:text"` - RuleID valuer.UUID `bun:"rule_id,type:text"` -} - -type ruleHistory struct { - bun.BaseModel `bun:"table:rule_history"` - RuleID int `bun:"rule_id"` - RuleUUID valuer.UUID `bun:"rule_uuid"` -} - -func NewUpdateRulesFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_rules"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateRules(ctx, ps, c, sqlstore) - }) -} - -func newUpdateRules(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateRules{store: store}, nil -} - -func (migration *updateRules) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateRules) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - ruleIDToRuleUUIDMap := map[int]valuer.UUID{} - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingRule), new(newRule), []string{OrgReference}, func(ctx context.Context) error { - existingRules := make([]*existingRule, 0) - err := tx. - NewSelect(). - Model(&existingRules). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - if err == nil && len(existingRules) > 0 { - var orgID string - err := migration. - store. - BunDB(). - NewSelect(). - Model((*types.Organization)(nil)). - Column("id"). - Scan(ctx, &orgID) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - if err == nil { - newRules, idUUIDMap := migration.CopyExistingRulesToNewRules(existingRules, orgID) - ruleIDToRuleUUIDMap = idUUIDMap - _, err = tx. - NewInsert(). - Model(&newRules). - Exec(ctx) - if err != nil { - return err - } - } - } - err = migration.store.Dialect().UpdatePrimaryKey(ctx, tx, new(existingMaintenance), new(newMaintenance), OrgReference, func(ctx context.Context) error { - _, err := tx. - NewCreateTable(). - IfNotExists(). - Model(new(storablePlannedMaintenanceRule)). - ForeignKey(`("planned_maintenance_id") REFERENCES "planned_maintenance_new" ("id") ON DELETE CASCADE ON UPDATE CASCADE`). - ForeignKey(`("rule_id") REFERENCES "rule" ("id")`). - Exec(ctx) - if err != nil { - return err - } - - existingMaintenances := make([]*existingMaintenance, 0) - err = tx. - NewSelect(). - Model(&existingMaintenances). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - if err == nil && len(existingMaintenances) > 0 { - var orgID string - err := migration. - store. - BunDB(). - NewSelect(). - Model((*types.Organization)(nil)). - Column("id"). - Scan(ctx, &orgID) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - if err == nil { - newMaintenances, newMaintenancesRules, err := migration.CopyExistingMaintenancesToNewMaintenancesAndRules(existingMaintenances, orgID, ruleIDToRuleUUIDMap) - if err != nil { - return err - } - - _, err = tx. - NewInsert(). - Model(&newMaintenances). - Exec(ctx) - if err != nil { - return err - } - - if len(newMaintenancesRules) > 0 { - _, err = tx. - NewInsert(). - Model(&newMaintenancesRules). - Exec(ctx) - if err != nil { - return err - } - } - - } - - } - return nil - }) - if err != nil { - return err - } - - ruleHistories := make([]*ruleHistory, 0) - for ruleID, ruleUUID := range ruleIDToRuleUUIDMap { - ruleHistories = append(ruleHistories, &ruleHistory{ - RuleID: ruleID, - RuleUUID: ruleUUID, - }) - } - - _, err = tx. - NewCreateTable(). - IfNotExists(). - Model(&ruleHistories). - Exec(ctx) - if err != nil { - return err - } - if len(ruleHistories) > 0 { - _, err = tx. - NewInsert(). - Model(&ruleHistories). - Exec(ctx) - if err != nil { - return err - } - } - - return nil - }) - - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - - return nil -} - -func (migration *updateRules) Down(context.Context, *bun.DB) error { - return nil -} - -func (migration *updateRules) CopyExistingRulesToNewRules(existingRules []*existingRule, orgID string) ([]*newRule, map[int]valuer.UUID) { - newRules := make([]*newRule, 0) - idUUIDMap := map[int]valuer.UUID{} - for _, rule := range existingRules { - uuid := valuer.GenerateUUID() - idUUIDMap[rule.ID] = uuid - newRules = append(newRules, &newRule{ - Identifiable: types.Identifiable{ - ID: uuid, - }, - TimeAuditable: types.TimeAuditable{ - CreatedAt: rule.CreatedAt, - UpdatedAt: rule.UpdatedAt, - }, - UserAuditable: types.UserAuditable{ - CreatedBy: rule.CreatedBy, - UpdatedBy: rule.UpdatedBy, - }, - Deleted: rule.Deleted, - Data: rule.Data, - OrgID: orgID, - }) - } - return newRules, idUUIDMap -} - -func (migration *updateRules) CopyExistingMaintenancesToNewMaintenancesAndRules(existingMaintenances []*existingMaintenance, orgID string, ruleIDToRuleUUIDMap map[int]valuer.UUID) ([]*newMaintenance, []*storablePlannedMaintenanceRule, error) { - newMaintenances := make([]*newMaintenance, 0) - newMaintenanceRules := make([]*storablePlannedMaintenanceRule, 0) - - for _, maintenance := range existingMaintenances { - ruleIDs := maintenance.AlertIDs - maintenanceUUID := valuer.GenerateUUID() - newMaintenance := newMaintenance{ - Identifiable: types.Identifiable{ - ID: maintenanceUUID, - }, - TimeAuditable: types.TimeAuditable{ - CreatedAt: maintenance.CreatedAt, - UpdatedAt: maintenance.UpdatedAt, - }, - UserAuditable: types.UserAuditable{ - CreatedBy: maintenance.CreatedBy, - UpdatedBy: maintenance.UpdatedBy, - }, - Name: maintenance.Name, - Description: maintenance.Description, - Schedule: maintenance.Schedule, - OrgID: orgID, - } - newMaintenances = append(newMaintenances, &newMaintenance) - for _, ruleIDStr := range *ruleIDs { - ruleID, err := strconv.Atoi(ruleIDStr) - if err != nil { - return nil, nil, err - } - - newMaintenanceRules = append(newMaintenanceRules, &storablePlannedMaintenanceRule{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - PlannedMaintenanceID: maintenanceUUID, - RuleID: ruleIDToRuleUUIDMap[ruleID], - }) - } - } - return newMaintenances, newMaintenanceRules, nil -} diff --git a/pkg/sqlmigration/028_update_organizations.go b/pkg/sqlmigration/028_update_organizations.go deleted file mode 100644 index 06887602ad21..000000000000 --- a/pkg/sqlmigration/028_update_organizations.go +++ /dev/null @@ -1,117 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateOrganizations struct { - store sqlstore.SQLStore -} - -func NewUpdateOrganizationsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_organizations"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateOrganizations(ctx, ps, c, sqlstore) - }) -} - -func newUpdateOrganizations(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateOrganizations{store: store}, nil -} - -func (migration *updateOrganizations) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateOrganizations) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - err = migration. - store. - Dialect(). - DropColumn(ctx, tx, "organizations", "is_anonymous") - if err != nil { - return err - } - - err = migration. - store. - Dialect(). - DropColumn(ctx, tx, "organizations", "has_opted_updates") - if err != nil { - return err - } - - _, err = migration. - store. - Dialect(). - RenameColumn(ctx, tx, "organizations", "name", "display_name") - if err != nil { - return err - } - - err = migration. - store. - Dialect(). - AddColumn(ctx, tx, "organizations", "name", "TEXT") - if err != nil { - return err - } - - _, err = tx. - NewCreateIndex(). - Unique(). - IfNotExists(). - Index("idx_unique_name"). - Table("organizations"). - Column("name"). - Exec(ctx) - if err != nil { - return err - } - - err = migration. - store. - Dialect(). - AddColumn(ctx, tx, "organizations", "alias", "TEXT") - if err != nil { - return err - } - _, err = tx. - NewCreateIndex(). - Unique(). - IfNotExists(). - Index("idx_unique_alias"). - Table("organizations"). - Column("alias"). - Exec(ctx) - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - - return nil -} - -func (migration *updateOrganizations) Down(context.Context, *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/029_drop_groups.go b/pkg/sqlmigration/029_drop_groups.go deleted file mode 100644 index 62b619abe3da..000000000000 --- a/pkg/sqlmigration/029_drop_groups.go +++ /dev/null @@ -1,162 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type dropGroups struct { - sqlstore sqlstore.SQLStore -} - -func NewDropGroupsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("drop_groups"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) { - return newDropGroups(ctx, providerSettings, config, sqlstore) - }) -} - -func newDropGroups(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore) (SQLMigration, error) { - return &dropGroups{sqlstore: sqlstore}, nil -} - -func (migration *dropGroups) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *dropGroups) Up(ctx context.Context, db *bun.DB) error { - type Group struct { - bun.BaseModel `bun:"table:groups"` - - types.TimeAuditable - OrgID string `bun:"org_id,type:text"` - ID string `bun:"id,pk,type:text" json:"id"` - Name string `bun:"name,type:text,notnull,unique" json:"name"` - } - - exists, err := migration.sqlstore.Dialect().TableExists(ctx, db, new(Group)) - if err != nil { - return err - } - - if !exists { - return nil - } - - // Disable foreign keys temporarily - if err := migration.sqlstore.Dialect().ToggleForeignKeyConstraint(ctx, db, false); err != nil { - return err - } - - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - type existingUser struct { - bun.BaseModel `bun:"table:users"` - - types.TimeAuditable - ID string `bun:"id,pk,type:text" json:"id"` - Name string `bun:"name,type:text,notnull" json:"name"` - Email string `bun:"email,type:text,notnull,unique" json:"email"` - Password string `bun:"password,type:text,notnull" json:"-"` - ProfilePictureURL string `bun:"profile_picture_url,type:text" json:"profilePictureURL"` - GroupID string `bun:"group_id,type:text,notnull" json:"groupId"` - OrgID string `bun:"org_id,type:text,notnull" json:"orgId"` - } - - var existingUsers []*existingUser - if err := tx. - NewSelect(). - Model(&existingUsers). - Scan(ctx); err != nil { - return err - } - - var groups []*Group - if err := tx. - NewSelect(). - Model(&groups). - Scan(ctx); err != nil { - return err - } - - groupIDToRoleMap := make(map[string]string) - for _, group := range groups { - groupIDToRoleMap[group.ID] = group.Name - } - - roleToUserIDMap := make(map[string][]string) - for _, user := range existingUsers { - roleToUserIDMap[groupIDToRoleMap[user.GroupID]] = append(roleToUserIDMap[groupIDToRoleMap[user.GroupID]], user.ID) - } - - if err := migration.sqlstore.Dialect().DropColumnWithForeignKeyConstraint(ctx, tx, new(struct { - bun.BaseModel `bun:"table:users"` - - types.TimeAuditable - ID string `bun:"id,pk,type:text"` - Name string `bun:"name,type:text,notnull"` - Email string `bun:"email,type:text,notnull,unique"` - Password string `bun:"password,type:text,notnull"` - ProfilePictureURL string `bun:"profile_picture_url,type:text"` - OrgID string `bun:"org_id,type:text,notnull"` - }), "group_id"); err != nil { - return err - } - - if err := migration.sqlstore.Dialect().AddColumn(ctx, tx, "users", "role", "TEXT"); err != nil { - return err - } - - for role, userIDs := range roleToUserIDMap { - if _, err := tx. - NewUpdate(). - Table("users"). - Set("role = ?", role). - Where("id IN (?)", bun.In(userIDs)). - Exec(ctx); err != nil { - return err - } - } - - if err := migration.sqlstore.Dialect().AddNotNullDefaultToColumn(ctx, tx, "users", "role", "TEXT", "'VIEWER'"); err != nil { - return err - } - - if _, err := tx. - NewDropTable(). - Table("groups"). - IfExists(). - Exec(ctx); err != nil { - return err - } - - if err := tx.Commit(); err != nil { - return err - } - - // Enable foreign keys - if err := migration.sqlstore.Dialect().ToggleForeignKeyConstraint(ctx, db, true); err != nil { - return err - } - - return nil -} - -func (migration *dropGroups) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/030_create_quick_filters.go b/pkg/sqlmigration/030_create_quick_filters.go deleted file mode 100644 index 2a7016e0ec81..000000000000 --- a/pkg/sqlmigration/030_create_quick_filters.go +++ /dev/null @@ -1,103 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - - "github.com/SigNoz/signoz/pkg/errors" - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/types/quickfiltertypes" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type createQuickFilters struct { - store sqlstore.SQLStore -} - -type quickFilter struct { - bun.BaseModel `bun:"table:quick_filter"` - types.Identifiable - OrgID string `bun:"org_id,notnull,unique:org_id_signal,type:text"` - Filter string `bun:"filter,notnull,type:text"` - Signal string `bun:"signal,notnull,unique:org_id_signal,type:text"` - types.TimeAuditable - types.UserAuditable -} - -func NewCreateQuickFiltersFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("create_quick_filters"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return &createQuickFilters{store: store}, nil - }) -} - -func (m *createQuickFilters) Register(migrations *migrate.Migrations) error { - return migrations.Register(m.Up, m.Down) -} - -func (m *createQuickFilters) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - defer func() { - _ = tx.Rollback() - }() - - // Create table if not exists - _, err = tx.NewCreateTable(). - Model((*quickFilter)(nil)). - IfNotExists(). - ForeignKey(`("org_id") REFERENCES "organizations" ("id") ON DELETE CASCADE ON UPDATE CASCADE`). - Exec(ctx) - if err != nil { - return err - } - - // Get default organization ID - var defaultOrg valuer.UUID - err = tx.NewSelect().Table("organizations").Column("id").Limit(1).Scan(ctx, &defaultOrg) - if err != nil { - if err == sql.ErrNoRows { - // No organizations found, nothing to insert, commit and return - err := tx.Commit() - if err != nil { - return err - } - return nil - } - return err - } - - // Get the default quick filters - storableQuickFilters, err := quickfiltertypes.NewDefaultQuickFilter(defaultOrg) - if err != nil { - return err - } - - // Insert all filters at once - _, err = tx.NewInsert(). - Model(&storableQuickFilters). - Exec(ctx) - - if err != nil { - if errors.Ast(m.store.WrapAlreadyExistsErrf(err, errors.CodeAlreadyExists, "Quick Filter already exists"), errors.TypeAlreadyExists) { - err := tx.Commit() - if err != nil { - return err - } - return nil - } - return err - } - - // Commit the transaction - return tx.Commit() -} - -func (m *createQuickFilters) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/031_update_quick_filters.go b/pkg/sqlmigration/031_update_quick_filters.go deleted file mode 100644 index 15241011a866..000000000000 --- a/pkg/sqlmigration/031_update_quick_filters.go +++ /dev/null @@ -1,106 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - - "github.com/SigNoz/signoz/pkg/errors" - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types/quickfiltertypes" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateQuickFilters struct { - store sqlstore.SQLStore -} - -func NewUpdateQuickFiltersFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_quick_filters"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateQuickFilters(ctx, ps, c, store) - }) -} - -func newUpdateQuickFilters(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateQuickFilters{ - store: store, - }, nil -} - -func (migration *updateQuickFilters) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateQuickFilters) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - // Delete all existing quick filters - _, err = tx.NewDelete(). - Table("quick_filter"). - Where("1=1"). // Delete all rows - Exec(ctx) - if err != nil { - return err - } - - // Get all organization IDs as strings - var orgIDs []string - err = tx.NewSelect(). - Table("organizations"). - Column("id"). - Scan(ctx, &orgIDs) - if err != nil { - if err == sql.ErrNoRows { - // No organizations found, commit the transaction (deletion is done) and return - if err := tx.Commit(); err != nil { - return err - } - return nil - } - return err - } - - // For each organization, create new quick filters with the updated NewDefaultQuickFilter function - for _, orgID := range orgIDs { - // Get the updated default quick filters - storableQuickFilters, err := quickfiltertypes.NewDefaultQuickFilter(valuer.MustNewUUID(orgID)) - if err != nil { - return err - } - - // Insert all filters for this organization - _, err = tx.NewInsert(). - Model(&storableQuickFilters). - Exec(ctx) - - if err != nil { - if errors.Ast(migration.store.WrapAlreadyExistsErrf(err, errors.CodeAlreadyExists, "Quick Filter already exists"), errors.TypeAlreadyExists) { - // Skip if filters already exist for this org - continue - } - return err - } - } - - if err := tx.Commit(); err != nil { - return err - } - return nil -} - -func (migration *updateQuickFilters) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/032_auth_refactor.go b/pkg/sqlmigration/032_auth_refactor.go deleted file mode 100644 index e2733b799f88..000000000000 --- a/pkg/sqlmigration/032_auth_refactor.go +++ /dev/null @@ -1,235 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type authRefactor struct { - store sqlstore.SQLStore -} - -func NewAuthRefactorFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("auth_refactor"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newAuthRefactor(ctx, ps, c, sqlstore) - }) -} - -func newAuthRefactor(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &authRefactor{store: store}, nil -} - -func (migration *authRefactor) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -type existingUser32 struct { - bun.BaseModel `bun:"table:users"` - - types.TimeAuditable - ID string `bun:"id,pk,type:text" json:"id"` - Name string `bun:"name,type:text,notnull" json:"name"` - Email string `bun:"email,type:text,notnull,unique" json:"email"` - Password string `bun:"password,type:text,notnull" json:"-"` - ProfilePictureURL string `bun:"profile_picture_url,type:text" json:"profilePictureURL"` - Role string `bun:"role,type:text,notnull" json:"role"` - OrgID string `bun:"org_id,type:text,notnull" json:"orgId"` -} - -type factorPassword32 struct { - bun.BaseModel `bun:"table:factor_password"` - - types.Identifiable - types.TimeAuditable - Password string `bun:"password,type:text,notnull" json:"password"` - Temporary bool `bun:"temporary,type:boolean,notnull" json:"temporary"` - UserID string `bun:"user_id,type:text,notnull" json:"userID"` -} - -type existingResetPasswordRequest32 struct { - bun.BaseModel `bun:"table:reset_password_request"` - - types.Identifiable - Token string `bun:"token,type:text,notnull" json:"token"` - UserID string `bun:"user_id,type:text,notnull,unique" json:"userId"` -} - -type newResetPasswordRequest32 struct { - bun.BaseModel `bun:"table:reset_password_token"` - - types.Identifiable - Token string `bun:"token,type:text,notnull" json:"token"` - PasswordID string `bun:"password_id,type:text,notnull" json:"passwordID"` -} - -func (migration *authRefactor) Up(ctx context.Context, db *bun.DB) error { - - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - if _, err := tx.NewCreateTable(). - Model(new(factorPassword32)). - ForeignKey(`("user_id") REFERENCES "users" ("id")`). - IfNotExists(). - Exec(ctx); err != nil { - return err - } - - // copy passwords from users table to factor_password table - err = migration.CopyOldPasswordToNewPassword(ctx, tx) - if err != nil { - return err - } - - // delete profile picture url - err = migration.store.Dialect().DropColumn(ctx, tx, "users", "profile_picture_url") - if err != nil { - return err - } - // delete password - err = migration.store.Dialect().DropColumn(ctx, tx, "users", "password") - if err != nil { - return err - } - - // rename name to display name - _, err = migration.store.Dialect().RenameColumn(ctx, tx, "users", "name", "display_name") - if err != nil { - return err - } - - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingResetPasswordRequest32), new(newResetPasswordRequest32), []string{FactorPasswordReference}, func(ctx context.Context) error { - existingRequests := make([]*existingResetPasswordRequest32, 0) - err = tx. - NewSelect(). - Model(&existingRequests). - Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingRequests) > 0 { - // copy users and their passwords to new table - newRequests, err := migration. - CopyOldResetPasswordToNewResetPassword(ctx, tx, existingRequests) - if err != nil { - return err - } - _, err = tx. - NewInsert(). - Model(&newRequests). - Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - return nil -} - -func (migration *authRefactor) Down(context.Context, *bun.DB) error { - return nil -} - -func (migration *authRefactor) CopyOldPasswordToNewPassword(ctx context.Context, tx bun.IDB) error { - // check if data already in factor_password table - var count int64 - err := tx.NewSelect().Model(new(factorPassword32)).ColumnExpr("COUNT(*)").Scan(ctx, &count) - if err != nil { - return err - } - - if count > 0 { - return nil - } - - // check if password column exist in the users table. - exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "users", "password") - if err != nil { - return err - } - if !exists { - return nil - } - - // get all users from users table - existingUsers := make([]*existingUser32, 0) - err = tx.NewSelect().Model(&existingUsers).Scan(ctx) - if err != nil { - return err - } - - newPasswords := make([]*factorPassword32, 0) - for _, user := range existingUsers { - newPasswords = append(newPasswords, &factorPassword32{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - Password: user.Password, - Temporary: false, - UserID: user.ID, - }) - } - - // insert - if len(newPasswords) > 0 { - _, err = tx.NewInsert().Model(&newPasswords).Exec(ctx) - if err != nil { - return err - } - } - - return nil -} - -func (migration *authRefactor) CopyOldResetPasswordToNewResetPassword(ctx context.Context, tx bun.IDB, existingRequests []*existingResetPasswordRequest32) ([]*newResetPasswordRequest32, error) { - newRequests := make([]*newResetPasswordRequest32, 0) - for _, request := range existingRequests { - // get password id from user id - var passwordID string - err := tx.NewSelect().Table("factor_password").Column("id").Where("user_id = ?", request.UserID).Scan(ctx, &passwordID) - if err != nil { - return nil, err - } - - newRequests = append(newRequests, &newResetPasswordRequest32{ - Identifiable: types.Identifiable{ - ID: valuer.GenerateUUID(), - }, - Token: request.Token, - PasswordID: passwordID, - }) - } - return newRequests, nil -} diff --git a/pkg/sqlmigration/033_api_keys.go b/pkg/sqlmigration/033_api_keys.go deleted file mode 100644 index 5d2857393eb5..000000000000 --- a/pkg/sqlmigration/033_api_keys.go +++ /dev/null @@ -1,164 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type migratePATToFactorAPIKey struct { - store sqlstore.SQLStore -} - -func NewMigratePATToFactorAPIKey(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("migrate_pat_to_factor_api_key"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newMigratePATToFactorAPIKey(ctx, ps, c, sqlstore) - }) -} - -func newMigratePATToFactorAPIKey(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &migratePATToFactorAPIKey{store: store}, nil -} - -func (migration *migratePATToFactorAPIKey) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -type existingPersonalAccessToken33 struct { - bun.BaseModel `bun:"table:personal_access_token"` - - types.Identifiable - types.TimeAuditable - OrgID string `json:"orgId" bun:"org_id,type:text,notnull"` - Role string `json:"role" bun:"role,type:text,notnull,default:'ADMIN'"` - UserID string `json:"userId" bun:"user_id,type:text,notnull"` - Token string `json:"token" bun:"token,type:text,notnull,unique"` - Name string `json:"name" bun:"name,type:text,notnull"` - ExpiresAt int64 `json:"expiresAt" bun:"expires_at,notnull,default:0"` - LastUsed int64 `json:"lastUsed" bun:"last_used,notnull,default:0"` - Revoked bool `json:"revoked" bun:"revoked,notnull,default:false"` - UpdatedByUserID string `json:"updatedByUserId" bun:"updated_by_user_id,type:text,notnull,default:''"` -} - -// we are removing the connection with org, -// the reason we are doing this is the api keys should just have -// one foreign key, we don't want a dangling state where, an API key -// belongs to one org and some user which doesn't belong to that org. -// so going ahead with directly attaching it to user will help dangling states. -type newFactorAPIKey33 struct { - bun.BaseModel `bun:"table:factor_api_key"` - - types.Identifiable - CreatedAt time.Time `bun:"created_at,notnull,nullzero,type:timestamptz" json:"createdAt"` - UpdatedAt time.Time `bun:"updated_at,notnull,nullzero,type:timestamptz" json:"updatedAt"` - CreatedBy string `bun:"created_by,notnull" json:"createdBy"` - UpdatedBy string `bun:"updated_by,notnull" json:"updatedBy"` - Token string `json:"token" bun:"token,type:text,notnull,unique"` - Role string `json:"role" bun:"role,type:text,notnull"` - Name string `json:"name" bun:"name,type:text,notnull"` - ExpiresAt time.Time `json:"expiresAt" bun:"expires_at,notnull,nullzero,type:timestamptz"` - LastUsed time.Time `json:"lastUsed" bun:"last_used,notnull,nullzero,type:timestamptz"` - Revoked bool `json:"revoked" bun:"revoked,notnull,default:false"` - UserID string `json:"userId" bun:"user_id,type:text,notnull"` -} - -func (migration *migratePATToFactorAPIKey) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingPersonalAccessToken33), new(newFactorAPIKey33), []string{UserReferenceNoCascade}, func(ctx context.Context) error { - existingAPIKeys := make([]*existingPersonalAccessToken33, 0) - err = tx. - NewSelect(). - Model(&existingAPIKeys). - Scan(ctx) - if err != nil && err != sql.ErrNoRows { - return err - } - - if err == nil && len(existingAPIKeys) > 0 { - newAPIKeys, err := migration. - CopyOldPatToFactorAPIKey(ctx, tx, existingAPIKeys) - if err != nil { - return err - } - _, err = tx. - NewInsert(). - Model(&newAPIKeys). - Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - - return nil -} - -func (migration *migratePATToFactorAPIKey) Down(ctx context.Context, db *bun.DB) error { - return nil -} - -func (migration *migratePATToFactorAPIKey) CopyOldPatToFactorAPIKey(ctx context.Context, tx bun.IDB, existingAPIKeys []*existingPersonalAccessToken33) ([]*newFactorAPIKey33, error) { - newAPIKeys := make([]*newFactorAPIKey33, 0) - for _, apiKey := range existingAPIKeys { - - if apiKey.CreatedAt.IsZero() { - apiKey.CreatedAt = time.Now() - } - if apiKey.UpdatedAt.IsZero() { - apiKey.UpdatedAt = time.Now() - } - - // convert expiresAt and lastUsed to time.Time - expiresAt := time.Unix(apiKey.ExpiresAt, 0) - lastUsed := time.Unix(apiKey.LastUsed, 0) - if apiKey.LastUsed == 0 { - lastUsed = apiKey.CreatedAt - } - - newAPIKeys = append(newAPIKeys, &newFactorAPIKey33{ - Identifiable: apiKey.Identifiable, - CreatedAt: apiKey.CreatedAt, - UpdatedAt: apiKey.UpdatedAt, - CreatedBy: apiKey.UserID, - UpdatedBy: apiKey.UpdatedByUserID, - Token: apiKey.Token, - Role: apiKey.Role, - Name: apiKey.Name, - ExpiresAt: expiresAt, - LastUsed: lastUsed, - Revoked: apiKey.Revoked, - UserID: apiKey.UserID, - }) - } - return newAPIKeys, nil -} diff --git a/pkg/sqlmigration/034_update_license.go b/pkg/sqlmigration/034_update_license.go deleted file mode 100644 index 0be8ab82bdf4..000000000000 --- a/pkg/sqlmigration/034_update_license.go +++ /dev/null @@ -1,149 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "encoding/json" - "time" - - "github.com/SigNoz/signoz/pkg/errors" - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateLicense struct { - store sqlstore.SQLStore -} - -type existingLicense34 struct { - bun.BaseModel `bun:"table:licenses_v3"` - - ID string `bun:"id,pk,type:text"` - Key string `bun:"key,type:text,notnull,unique"` - Data string `bun:"data,type:text"` -} - -type newLicense34 struct { - bun.BaseModel `bun:"table:license"` - - types.Identifiable - types.TimeAuditable - Key string `bun:"key,type:text,notnull,unique"` - Data map[string]any `bun:"data,type:text"` - LastValidatedAt time.Time `bun:"last_validated_at,notnull"` - OrgID string `bun:"org_id,type:text,notnull" json:"orgID"` -} - -func NewUpdateLicenseFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_license"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateLicense(ctx, ps, c, store) - }) -} - -func newUpdateLicense(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateLicense{store: store}, nil -} - -func (migration *updateLicense) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateLicense) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - err = migration.store.Dialect().RenameTableAndModifyModel(ctx, tx, new(existingLicense34), new(newLicense34), []string{OrgReference}, func(ctx context.Context) error { - existingLicenses := make([]*existingLicense34, 0) - err = tx.NewSelect().Model(&existingLicenses).Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingLicenses) > 0 { - var orgID string - err := migration. - store. - BunDB(). - NewSelect(). - Model((*types.Organization)(nil)). - Column("id"). - Scan(ctx, &orgID) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - if err == nil { - newLicenses, err := migration.CopyExistingLicensesToNewLicenses(existingLicenses, orgID) - if err != nil { - return err - } - _, err = tx. - NewInsert(). - Model(&newLicenses). - Exec(ctx) - if err != nil { - return err - } - } - return nil - } - return nil - }) - - err = tx.Commit() - if err != nil { - return err - } - - return nil -} - -func (migration *updateLicense) Down(context.Context, *bun.DB) error { - return nil -} - -func (migration *updateLicense) CopyExistingLicensesToNewLicenses(existingLicenses []*existingLicense34, orgID string) ([]*newLicense34, error) { - newLicenses := make([]*newLicense34, len(existingLicenses)) - for idx, existingLicense := range existingLicenses { - licenseID, err := valuer.NewUUID(existingLicense.ID) - if err != nil { - return nil, errors.Wrapf(err, errors.TypeInvalidInput, errors.CodeInvalidInput, "license id is not a valid UUID: %s", existingLicense.ID) - } - licenseData := map[string]any{} - err = json.Unmarshal([]byte(existingLicense.Data), &licenseData) - if err != nil { - return nil, errors.Wrapf(err, errors.TypeInvalidInput, errors.CodeInvalidInput, "unable to unmarshal license data in map[string]any") - } - newLicenses[idx] = &newLicense34{ - Identifiable: types.Identifiable{ - ID: licenseID, - }, - TimeAuditable: types.TimeAuditable{ - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }, - Key: existingLicense.Key, - Data: licenseData, - LastValidatedAt: time.Now(), - OrgID: orgID, - } - } - return newLicenses, nil -} diff --git a/pkg/sqlmigration/035_update_api_monitoring_filters.go b/pkg/sqlmigration/035_update_api_monitoring_filters.go deleted file mode 100644 index a1efc6076677..000000000000 --- a/pkg/sqlmigration/035_update_api_monitoring_filters.go +++ /dev/null @@ -1,103 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types/quickfiltertypes" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateApiMonitoringFilters struct { - store sqlstore.SQLStore -} - -func NewUpdateApiMonitoringFiltersFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_api_monitoring_filters"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateApiMonitoringFilters(ctx, ps, c, store) - }) -} - -func newUpdateApiMonitoringFilters(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateApiMonitoringFilters{ - store: store, - }, nil -} - -func (migration *updateApiMonitoringFilters) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateApiMonitoringFilters) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - // Get all organization IDs as strings - var orgIDs []string - err = tx.NewSelect(). - Table("organizations"). - Column("id"). - Scan(ctx, &orgIDs) - if err != nil { - if err == sql.ErrNoRows { - if err := tx.Commit(); err != nil { - return err - } - return nil - } - return err - } - - for _, orgID := range orgIDs { - // Get the updated default quick filters which includes the new API monitoring filters - storableQuickFilters, err := quickfiltertypes.NewDefaultQuickFilter(valuer.MustNewUUID(orgID)) - if err != nil { - return err - } - - // Find the API monitoring filter from the storable quick filters - var apiMonitoringFilterJSON string - for _, filter := range storableQuickFilters { - if filter.Signal == quickfiltertypes.SignalApiMonitoring { - apiMonitoringFilterJSON = filter.Filter - break - } - } - - if apiMonitoringFilterJSON != "" { - _, err = tx.NewUpdate(). - Table("quick_filter"). - Set("filter = ?, updated_at = ?", apiMonitoringFilterJSON, time.Now()). - Where("signal = ? AND org_id = ?", quickfiltertypes.SignalApiMonitoring, orgID). - Exec(ctx) - - if err != nil { - return err - } - } - } - - if err := tx.Commit(); err != nil { - return err - } - return nil -} - -func (migration *updateApiMonitoringFilters) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/036_add_key_organization.go b/pkg/sqlmigration/036_add_key_organization.go deleted file mode 100644 index 753736a0edea..000000000000 --- a/pkg/sqlmigration/036_add_key_organization.go +++ /dev/null @@ -1,112 +0,0 @@ -package sqlmigration - -import ( - "context" - "hash/fnv" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addKeyOrganization struct { - sqlstore sqlstore.SQLStore -} - -func NewAddKeyOrganizationFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_key_organization"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) { - return newAddKeyOrganization(ctx, providerSettings, config, sqlstore) - }) -} - -func newAddKeyOrganization(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore) (SQLMigration, error) { - return &addKeyOrganization{ - sqlstore: sqlstore, - }, nil -} - -func (migration *addKeyOrganization) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addKeyOrganization) Up(ctx context.Context, db *bun.DB) error { - ok, err := migration.sqlstore.Dialect().ColumnExists(ctx, db, "organizations", "key") - if err != nil { - return err - } - - if ok { - return nil - } - - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - if _, err := tx. - NewAddColumn(). - Table("organizations"). - ColumnExpr("key BIGINT"). - Exec(ctx); err != nil { - return err - } - - var existingOrgIDs []string - if err := tx.NewSelect(). - Table("organizations"). - Column("id"). - Scan(ctx, &existingOrgIDs); err != nil { - return err - } - - for _, orgID := range existingOrgIDs { - key := migration.getHash(ctx, orgID) - if _, err := tx. - NewUpdate(). - Table("organizations"). - Set("key = ?", key). - Where("id = ?", orgID). - Exec(ctx); err != nil { - return err - } - } - - if _, err := tx. - NewCreateIndex(). - Unique(). - IfNotExists(). - Index("idx_unique_key"). - Table("organizations"). - Column("key"). - Exec(ctx); err != nil { - return err - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *addKeyOrganization) Down(ctx context.Context, db *bun.DB) error { - return nil -} - -func (migration *addKeyOrganization) getHash(_ context.Context, orgID string) uint32 { - hasher := fnv.New32a() - - // Hasher never returns err. - _, _ = hasher.Write([]byte(orgID)) - return hasher.Sum32() -} diff --git a/pkg/sqlmigration/037_add_trace_funnels.go b/pkg/sqlmigration/037_add_trace_funnels.go deleted file mode 100644 index 99a885b1cf49..000000000000 --- a/pkg/sqlmigration/037_add_trace_funnels.go +++ /dev/null @@ -1,89 +0,0 @@ -package sqlmigration - -import ( - "context" - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -// funnel Core Data Structure (funnel and funnelStep) -type funnel struct { - bun.BaseModel `bun:"table:trace_funnel"` - types.Identifiable // funnel id - types.TimeAuditable - types.UserAuditable - Name string `json:"funnel_name" bun:"name,type:text,notnull"` // funnel name - Description string `json:"description" bun:"description,type:text"` // funnel description - OrgID valuer.UUID `json:"org_id" bun:"org_id,type:varchar,notnull"` - Steps []funnelStep `json:"steps" bun:"steps,type:text,notnull"` - Tags string `json:"tags" bun:"tags,type:text"` - CreatedByUser *types.User `json:"user" bun:"rel:belongs-to,join:created_by=id"` -} - -type funnelStep struct { - types.Identifiable - Name string `json:"name,omitempty"` // step name - Description string `json:"description,omitempty"` // step description - Order int64 `json:"step_order"` - ServiceName string `json:"service_name"` - SpanName string `json:"span_name"` - Filters string `json:"filters,omitempty"` - LatencyPointer string `json:"latency_pointer,omitempty"` - LatencyType string `json:"latency_type,omitempty"` - HasErrors bool `json:"has_errors"` -} - -type addTraceFunnels struct { - sqlstore sqlstore.SQLStore -} - -func NewAddTraceFunnelsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_trace_funnels"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) { - return newAddTraceFunnels(ctx, providerSettings, config, sqlstore) - }) -} - -func newAddTraceFunnels(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore) (SQLMigration, error) { - return &addTraceFunnels{sqlstore: sqlstore}, nil -} - -func (migration *addTraceFunnels) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - return nil -} - -func (migration *addTraceFunnels) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - defer func() { - _ = tx.Rollback() - }() - - _, err = tx.NewCreateTable(). - Model(new(funnel)). - ForeignKey(`("org_id") REFERENCES "organizations" ("id") ON DELETE CASCADE`). - IfNotExists(). - Exec(ctx) - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - - return nil -} - -func (migration *addTraceFunnels) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/038_update_dashboard.go b/pkg/sqlmigration/038_update_dashboard.go deleted file mode 100644 index c950d6cbfc8c..000000000000 --- a/pkg/sqlmigration/038_update_dashboard.go +++ /dev/null @@ -1,141 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateDashboard struct { - store sqlstore.SQLStore -} - -type existingDashboard36 struct { - bun.BaseModel `bun:"table:dashboards"` - - types.TimeAuditable - types.UserAuditable - OrgID string `json:"-" bun:"org_id,notnull"` - ID int `json:"id" bun:"id,pk,autoincrement"` - UUID string `json:"uuid" bun:"uuid,type:text,notnull,unique"` - Data map[string]interface{} `json:"data" bun:"data,type:text,notnull"` - Locked *int `json:"isLocked" bun:"locked,notnull,default:0"` -} - -type newDashboard36 struct { - bun.BaseModel `bun:"table:dashboard"` - - types.Identifiable - types.TimeAuditable - types.UserAuditable - Data map[string]interface{} `bun:"data,type:text,notnull"` - Locked bool `bun:"locked,notnull,default:false"` - OrgID valuer.UUID `bun:"org_id,type:text,notnull"` -} - -func NewUpdateDashboardFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_dashboards"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateDashboard(ctx, ps, c, store) - }) -} - -func newUpdateDashboard(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateDashboard{store: store}, nil -} - -func (migration *updateDashboard) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateDashboard) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - err = migration.store.Dialect().RenameTableAndModifyModel(ctx, tx, new(existingDashboard36), new(newDashboard36), []string{OrgReference}, func(ctx context.Context) error { - existingDashboards := make([]*existingDashboard36, 0) - err = tx.NewSelect().Model(&existingDashboards).Scan(ctx) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if err == nil && len(existingDashboards) > 0 { - newDashboards, err := migration.CopyExistingDashboardsToNewDashboards(existingDashboards) - if err != nil { - return err - } - _, err = tx. - NewInsert(). - Model(&newDashboards). - Exec(ctx) - if err != nil { - return err - } - } - - return nil - }) - if err != nil { - return err - } - - err = tx.Commit() - if err != nil { - return err - } - - return nil - -} -func (migration *updateDashboard) Down(context.Context, *bun.DB) error { - return nil -} - -func (migration *updateDashboard) CopyExistingDashboardsToNewDashboards(existingDashboards []*existingDashboard36) ([]*newDashboard36, error) { - newDashboards := make([]*newDashboard36, len(existingDashboards)) - - for idx, existingDashboard := range existingDashboards { - dashboardID, err := valuer.NewUUID(existingDashboard.UUID) - if err != nil { - return nil, err - } - orgID, err := valuer.NewUUID(existingDashboard.OrgID) - if err != nil { - return nil, err - } - locked := false - if existingDashboard.Locked != nil && *existingDashboard.Locked == 1 { - locked = true - } - - newDashboards[idx] = &newDashboard36{ - Identifiable: types.Identifiable{ - ID: dashboardID, - }, - TimeAuditable: existingDashboard.TimeAuditable, - UserAuditable: existingDashboard.UserAuditable, - Data: existingDashboard.Data, - Locked: locked, - OrgID: orgID, - } - } - - return newDashboards, nil -} diff --git a/pkg/sqlmigration/039_drop_feature_set.go b/pkg/sqlmigration/039_drop_feature_set.go deleted file mode 100644 index 241f08efb321..000000000000 --- a/pkg/sqlmigration/039_drop_feature_set.go +++ /dev/null @@ -1,58 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type dropFeatureSet struct{} - -func NewDropFeatureSetFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("drop_feature_set"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newDropFeatureSet(ctx, ps, c) - }) -} - -func newDropFeatureSet(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &dropFeatureSet{}, nil -} - -func (migration *dropFeatureSet) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *dropFeatureSet) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - if _, err := tx. - NewDropTable(). - IfExists(). - Table("feature_status"). - Exec(ctx); err != nil { - return err - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *dropFeatureSet) Down(context.Context, *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/040_drop_deprecated_tables.go b/pkg/sqlmigration/040_drop_deprecated_tables.go deleted file mode 100644 index e5a43bcc14de..000000000000 --- a/pkg/sqlmigration/040_drop_deprecated_tables.go +++ /dev/null @@ -1,66 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type dropDeprecatedTables struct{} - -func NewDropDeprecatedTablesFactory() factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("drop_deprecated_tables"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newDropDeprecatedTables(ctx, ps, c) - }) -} - -func newDropDeprecatedTables(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { - return &dropDeprecatedTables{}, nil -} - -func (migration *dropDeprecatedTables) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *dropDeprecatedTables) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - if _, err := tx. - NewDropTable(). - IfExists(). - Table("rule_history"). - Exec(ctx); err != nil { - return err - } - - if _, err := tx. - NewDropTable(). - IfExists(). - Table("data_migrations"). - Exec(ctx); err != nil { - return err - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *dropDeprecatedTables) Down(context.Context, *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/041_update_agents.go b/pkg/sqlmigration/041_update_agents.go deleted file mode 100644 index 9a89005f8e0e..000000000000 --- a/pkg/sqlmigration/041_update_agents.go +++ /dev/null @@ -1,278 +0,0 @@ -package sqlmigration - -import ( - "context" - "database/sql" - "time" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/SigNoz/signoz/pkg/types" - "github.com/SigNoz/signoz/pkg/types/opamptypes" - "github.com/SigNoz/signoz/pkg/valuer" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateAgents struct { - store sqlstore.SQLStore -} -type newAgent41 struct { - bun.BaseModel `bun:"table:agent"` - - types.Identifiable - types.TimeAuditable - // AgentID is needed as the ID from opamp client is ULID and not UUID, so we are keeping it like this - AgentID string `json:"agentId" yaml:"agentId" bun:"agent_id,type:text,notnull,unique"` - OrgID string `json:"orgId" yaml:"orgId" bun:"org_id,type:text,notnull"` - TerminatedAt time.Time `json:"terminatedAt" yaml:"terminatedAt" bun:"terminated_at"` - Status opamptypes.AgentStatus `json:"currentStatus" yaml:"currentStatus" bun:"status,type:text,notnull"` - Config string `bun:"config,type:text,notnull"` -} - -type existingAgentConfigVersions41 struct { - bun.BaseModel `bun:"table:agent_config_versions"` - ID string `bun:"id,pk,type:text"` - CreatedBy string `bun:"created_by,type:text"` - CreatedAt time.Time `bun:"created_at,default:CURRENT_TIMESTAMP"` - UpdatedBy string `bun:"updated_by,type:text"` - UpdatedAt time.Time `bun:"updated_at,default:CURRENT_TIMESTAMP"` - Version int `bun:"version,default:1,unique:element_version_idx"` - Active int `bun:"active"` - IsValid int `bun:"is_valid"` - Disabled int `bun:"disabled"` - ElementType opamptypes.ElementType `bun:"element_type,notnull,type:varchar(120),unique:element_version_idx"` - DeployStatus opamptypes.DeployStatus `bun:"deploy_status,notnull,type:varchar(80),default:'DIRTY'"` - DeploySequence int `bun:"deploy_sequence"` - DeployResult string `bun:"deploy_result,type:text"` - LastHash string `bun:"last_hash,type:text"` - LastConfig string `bun:"last_config,type:text"` -} - -type newAgentConfigVersion41 struct { - bun.BaseModel `bun:"table:agent_config_version"` - - types.Identifiable - types.TimeAuditable - types.UserAuditable - OrgID string `json:"orgId" bun:"org_id,type:text,notnull,unique:element_version_org_idx"` - Version int `json:"version" bun:"version,unique:element_version_org_idx"` - ElementType opamptypes.ElementType `json:"elementType" bun:"element_type,type:text,notnull,unique:element_version_org_idx"` - DeployStatus opamptypes.DeployStatus `json:"deployStatus" bun:"deploy_status,type:text,notnull,default:'dirty'"` - DeploySequence int `json:"deploySequence" bun:"deploy_sequence"` - DeployResult string `json:"deployResult" bun:"deploy_result,type:text"` - Hash string `json:"lastHash" bun:"hash,type:text"` - Config string `json:"config" bun:"config,type:text"` -} - -type existingAgentConfigElement41 struct { - bun.BaseModel `bun:"table:agent_config_elements"` - - ID string `bun:"id,pk,type:text"` - CreatedBy string `bun:"created_by,type:text"` - CreatedAt time.Time `bun:"created_at,default:CURRENT_TIMESTAMP"` - UpdatedBy string `bun:"updated_by,type:text"` - UpdatedAt time.Time `bun:"updated_at,default:CURRENT_TIMESTAMP"` - ElementID string `bun:"element_id,type:text,notnull,unique:agent_config_elements_u1"` - ElementType string `bun:"element_type,type:varchar(120),notnull,unique:agent_config_elements_u1"` - VersionID string `bun:"version_id,type:text,notnull,unique:agent_config_elements_u1"` -} - -type newAgentConfigElement41 struct { - bun.BaseModel `bun:"table:agent_config_element"` - - types.Identifiable - types.TimeAuditable - ElementID string `bun:"element_id,type:text,notnull,unique:element_type_version_idx"` - ElementType string `bun:"element_type,type:text,notnull,unique:element_type_version_idx"` - VersionID string `bun:"version_id,type:text,notnull,unique:element_type_version_idx"` -} - -func NewUpdateAgentsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_agents"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) { - return newUpdateAgents(ctx, ps, c, sqlstore) - }) -} - -func newUpdateAgents(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) { - return &updateAgents{ - store: store, - }, nil -} - -func (migration *updateAgents) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateAgents) Up(ctx context.Context, db *bun.DB) error { - - // begin transaction - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - var orgID string - err = tx. - NewSelect(). - ColumnExpr("id"). - Table("organizations"). - Limit(1). - Scan(ctx, &orgID) - if err != nil { - if err != sql.ErrNoRows { - return err - } - } - - if _, err := tx. - NewDropTable(). - IfExists(). - Table("agents"). - Exec(ctx); err != nil { - return err - } - - if _, err := tx. - NewCreateTable(). - IfNotExists(). - Model(new(newAgent41)). - Exec(ctx); err != nil { - return err - } - - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingAgentConfigVersions41), new(newAgentConfigVersion41), []string{OrgReference}, func(ctx context.Context) error { - existingAgentConfigVersions := make([]*existingAgentConfigVersions41, 0) - err = tx. - NewSelect(). - Model(&existingAgentConfigVersions). - Scan(ctx) - if err != nil && err != sql.ErrNoRows { - return err - } - - if err == nil && len(existingAgentConfigVersions) > 0 { - newAgentConfigVersions, err := migration. - CopyOldAgentConfigVersionToNewAgentConfigVersion(ctx, tx, existingAgentConfigVersions, orgID) - if err != nil { - return err - } - _, err = tx. - NewInsert(). - Model(&newAgentConfigVersions). - Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - if err != nil { - return err - } - - err = migration. - store. - Dialect(). - RenameTableAndModifyModel(ctx, tx, new(existingAgentConfigElement41), new(newAgentConfigElement41), []string{AgentConfigVersionReference}, func(ctx context.Context) error { - existingAgentConfigElements := make([]*existingAgentConfigElement41, 0) - err = tx. - NewSelect(). - Model(&existingAgentConfigElements). - Scan(ctx) - if err != nil && err != sql.ErrNoRows { - return err - } - - if err == nil && len(existingAgentConfigElements) > 0 { - newAgentConfigElements, err := migration. - CopyOldAgentConfigElementToNewAgentConfigElement(ctx, tx, existingAgentConfigElements, orgID) - if err != nil { - return err - } - _, err = tx. - NewInsert(). - Model(&newAgentConfigElements). - Exec(ctx) - if err != nil { - return err - } - } - return nil - }) - if err != nil { - return err - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *updateAgents) Down(ctx context.Context, db *bun.DB) error { - return nil -} - -func (migration *updateAgents) CopyOldAgentConfigVersionToNewAgentConfigVersion(ctx context.Context, tx bun.IDB, existingAgentConfigVersions []*existingAgentConfigVersions41, orgID string) ([]*newAgentConfigVersion41, error) { - newAgentConfigVersions := make([]*newAgentConfigVersion41, 0) - for _, existingAgentConfigVersion := range existingAgentConfigVersions { - versionID, err := valuer.NewUUID(existingAgentConfigVersion.ID) - if err != nil { - return nil, err - } - newAgentConfigVersions = append(newAgentConfigVersions, &newAgentConfigVersion41{ - Identifiable: types.Identifiable{ID: versionID}, - TimeAuditable: types.TimeAuditable{ - CreatedAt: time.Unix(existingAgentConfigVersion.CreatedAt.Unix(), 0), - UpdatedAt: time.Unix(existingAgentConfigVersion.UpdatedAt.Unix(), 0), - }, - UserAuditable: types.UserAuditable{ - CreatedBy: existingAgentConfigVersion.CreatedBy, - UpdatedBy: existingAgentConfigVersion.UpdatedBy, - }, - OrgID: orgID, - Version: existingAgentConfigVersion.Version, - ElementType: existingAgentConfigVersion.ElementType, - DeployStatus: existingAgentConfigVersion.DeployStatus, - DeploySequence: existingAgentConfigVersion.DeploySequence, - DeployResult: existingAgentConfigVersion.DeployResult, - Hash: orgID + existingAgentConfigVersion.LastHash, - Config: existingAgentConfigVersion.LastConfig, - }) - } - return newAgentConfigVersions, nil -} - -func (migration *updateAgents) CopyOldAgentConfigElementToNewAgentConfigElement(ctx context.Context, tx bun.IDB, existingAgentConfigElements []*existingAgentConfigElement41, orgID string) ([]*newAgentConfigElement41, error) { - newAgentConfigElements := make([]*newAgentConfigElement41, 0) - for _, existingAgentConfigElement := range existingAgentConfigElements { - elementID, err := valuer.NewUUID(existingAgentConfigElement.ElementID) - if err != nil { - return nil, err - } - newAgentConfigElements = append(newAgentConfigElements, &newAgentConfigElement41{ - Identifiable: types.Identifiable{ID: elementID}, - TimeAuditable: types.TimeAuditable{ - CreatedAt: time.Unix(existingAgentConfigElement.CreatedAt.Unix(), 0), - UpdatedAt: time.Unix(existingAgentConfigElement.UpdatedAt.Unix(), 0), - }, - VersionID: existingAgentConfigElement.VersionID, - ElementID: existingAgentConfigElement.ElementID, - ElementType: existingAgentConfigElement.ElementType, - }) - } - return newAgentConfigElements, nil -} diff --git a/pkg/sqlmigration/042_update_users.go b/pkg/sqlmigration/042_update_users.go deleted file mode 100644 index 5220ae3d8875..000000000000 --- a/pkg/sqlmigration/042_update_users.go +++ /dev/null @@ -1,85 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlschema" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateUsers struct { - sqlstore sqlstore.SQLStore - sqlschema sqlschema.SQLSchema -} - -func NewUpdateUsersFactory(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_users"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) { - return newUpdateUsers(ctx, providerSettings, config, sqlstore, sqlschema) - }) -} - -func newUpdateUsers(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) (SQLMigration, error) { - return &updateUsers{ - sqlstore: sqlstore, - sqlschema: sqlschema, - }, nil -} - -func (migration *updateUsers) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateUsers) Up(ctx context.Context, db *bun.DB) error { - if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, false); err != nil { - return err - } - - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - table, uniqueConstraints, err := migration.sqlschema.GetTable(ctx, sqlschema.TableName("users")) - if err != nil { - return err - } - - sqls := [][]byte{} - - dropSQLs := migration.sqlschema.Operator().DropConstraint(table, uniqueConstraints, &sqlschema.UniqueConstraint{ColumnNames: []sqlschema.ColumnName{"email"}}) - sqls = append(sqls, dropSQLs...) - - indexSQLs := migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "users", ColumnNames: []sqlschema.ColumnName{"email", "org_id"}}) - sqls = append(sqls, indexSQLs...) - - for _, sql := range sqls { - if _, err := tx.ExecContext(ctx, string(sql)); err != nil { - return err - } - } - - if err := tx.Commit(); err != nil { - return err - } - - if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, true); err != nil { - return err - } - - return nil -} - -func (migration *updateUsers) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/043_update_user_invite.go b/pkg/sqlmigration/043_update_user_invite.go deleted file mode 100644 index 0bd2e60850c4..000000000000 --- a/pkg/sqlmigration/043_update_user_invite.go +++ /dev/null @@ -1,88 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlschema" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateUserInvite struct { - sqlstore sqlstore.SQLStore - sqlschema sqlschema.SQLSchema -} - -func NewUpdateUserInviteFactory(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_user_invite"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) { - return newUpdateUserInvite(ctx, providerSettings, config, sqlstore, sqlschema) - }) -} - -func newUpdateUserInvite(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) (SQLMigration, error) { - return &updateUserInvite{ - sqlstore: sqlstore, - sqlschema: sqlschema, - }, nil -} - -func (migration *updateUserInvite) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateUserInvite) Up(ctx context.Context, db *bun.DB) error { - if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, false); err != nil { - return err - } - - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - table, uniqueConstraints, err := migration.sqlschema.GetTable(ctx, sqlschema.TableName("user_invite")) - if err != nil { - return err - } - - sqls := [][]byte{} - - dropSQLs := migration.sqlschema.Operator().DropConstraint(table, uniqueConstraints, &sqlschema.UniqueConstraint{ColumnNames: []sqlschema.ColumnName{"email"}}) - sqls = append(sqls, dropSQLs...) - - indexSQLs := migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "user_invite", ColumnNames: []sqlschema.ColumnName{"email", "org_id"}}) - sqls = append(sqls, indexSQLs...) - - indexSQLs = migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "user_invite", ColumnNames: []sqlschema.ColumnName{"token"}}) - sqls = append(sqls, indexSQLs...) - - for _, sql := range sqls { - if _, err := tx.ExecContext(ctx, string(sql)); err != nil { - return err - } - } - - if err := tx.Commit(); err != nil { - return err - } - - if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, true); err != nil { - return err - } - - return nil -} - -func (migration *updateUserInvite) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/044_update_org_domain.go b/pkg/sqlmigration/044_update_org_domain.go deleted file mode 100644 index 82cb392eb725..000000000000 --- a/pkg/sqlmigration/044_update_org_domain.go +++ /dev/null @@ -1,85 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlschema" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type updateOrgDomain struct { - sqlstore sqlstore.SQLStore - sqlschema sqlschema.SQLSchema -} - -func NewUpdateOrgDomainFactory(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("update_org_domain"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) { - return newUpdateOrgDomain(ctx, providerSettings, config, sqlstore, sqlschema) - }) -} - -func newUpdateOrgDomain(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) (SQLMigration, error) { - return &updateOrgDomain{ - sqlstore: sqlstore, - sqlschema: sqlschema, - }, nil -} - -func (migration *updateOrgDomain) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *updateOrgDomain) Up(ctx context.Context, db *bun.DB) error { - if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, false); err != nil { - return err - } - - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - table, uniqueConstraints, err := migration.sqlschema.GetTable(ctx, sqlschema.TableName("org_domains")) - if err != nil { - return err - } - - sqls := [][]byte{} - - dropSQLs := migration.sqlschema.Operator().DropConstraint(table, uniqueConstraints, &sqlschema.UniqueConstraint{ColumnNames: []sqlschema.ColumnName{"name"}}) - sqls = append(sqls, dropSQLs...) - - indexSQLs := migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "org_domains", ColumnNames: []sqlschema.ColumnName{"name", "org_id"}}) - sqls = append(sqls, indexSQLs...) - - for _, sql := range sqls { - if _, err := tx.ExecContext(ctx, string(sql)); err != nil { - return err - } - } - - if err := tx.Commit(); err != nil { - return err - } - - if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, true); err != nil { - return err - } - - return nil -} - -func (migration *updateOrgDomain) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/045_add_factor_indexes.go b/pkg/sqlmigration/045_add_factor_indexes.go deleted file mode 100644 index ef1080cb0420..000000000000 --- a/pkg/sqlmigration/045_add_factor_indexes.go +++ /dev/null @@ -1,75 +0,0 @@ -package sqlmigration - -import ( - "context" - - "github.com/SigNoz/signoz/pkg/factory" - "github.com/SigNoz/signoz/pkg/sqlschema" - "github.com/SigNoz/signoz/pkg/sqlstore" - "github.com/uptrace/bun" - "github.com/uptrace/bun/migrate" -) - -type addFactorIndexes struct { - sqlstore sqlstore.SQLStore - sqlschema sqlschema.SQLSchema -} - -func NewAddFactorIndexesFactory(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.ProviderFactory[SQLMigration, Config] { - return factory.NewProviderFactory(factory.MustNewName("add_factor_indexes"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) { - return newAddFactorIndexes(ctx, providerSettings, config, sqlstore, sqlschema) - }) -} - -func newAddFactorIndexes(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) (SQLMigration, error) { - return &addFactorIndexes{ - sqlstore: sqlstore, - sqlschema: sqlschema, - }, nil -} - -func (migration *addFactorIndexes) Register(migrations *migrate.Migrations) error { - if err := migrations.Register(migration.Up, migration.Down); err != nil { - return err - } - - return nil -} - -func (migration *addFactorIndexes) Up(ctx context.Context, db *bun.DB) error { - tx, err := db.BeginTx(ctx, nil) - if err != nil { - return err - } - - defer func() { - _ = tx.Rollback() - }() - - sqls := [][]byte{} - - indexSQLs := migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "factor_password", ColumnNames: []sqlschema.ColumnName{"user_id"}}) - sqls = append(sqls, indexSQLs...) - - indexSQLs = migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "reset_password_token", ColumnNames: []sqlschema.ColumnName{"password_id"}}) - sqls = append(sqls, indexSQLs...) - - indexSQLs = migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "reset_password_token", ColumnNames: []sqlschema.ColumnName{"token"}}) - sqls = append(sqls, indexSQLs...) - - for _, sql := range sqls { - if _, err := tx.ExecContext(ctx, string(sql)); err != nil { - return err - } - } - - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -func (migration *addFactorIndexes) Down(ctx context.Context, db *bun.DB) error { - return nil -} diff --git a/pkg/sqlmigration/s100sqlmigration/100_v100.go b/pkg/sqlmigration/s100sqlmigration/100_v100.go new file mode 100644 index 000000000000..f8fee1606516 --- /dev/null +++ b/pkg/sqlmigration/s100sqlmigration/100_v100.go @@ -0,0 +1,578 @@ +package s100sqlmigration + +import ( + "context" + + "github.com/SigNoz/signoz/pkg/errors" + "github.com/SigNoz/signoz/pkg/factory" + "github.com/SigNoz/signoz/pkg/sqlmigration" + "github.com/SigNoz/signoz/pkg/sqlschema" + "github.com/SigNoz/signoz/pkg/sqlstore" + "github.com/uptrace/bun" + "github.com/uptrace/bun/migrate" +) + +type v100 struct { + sqlstore sqlstore.SQLStore + sqlschema sqlschema.SQLSchema +} + +func NewV100Factory(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.ProviderFactory[sqlmigration.SQLMigration, sqlmigration.Config] { + return factory.NewProviderFactory(factory.MustNewName("v100"), func(_ context.Context, _ factory.ProviderSettings, _ sqlmigration.Config) (sqlmigration.SQLMigration, error) { + return &v100{ + sqlstore: sqlstore, + sqlschema: sqlschema, + }, nil + }) +} + +func (migration *v100) Register(migrations *migrate.Migrations) error { + return migrations.Register(migration.Up, migration.Down) +} + +func (migration *v100) Up(ctx context.Context, db *bun.DB) error { + tables := []*sqlschema.Table{ + { + Name: "organizations", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("display_name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("alias"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("key"), DataType: sqlschema.DataTypeBigInt, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + }, + { + Name: "users", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("display_name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("email"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("role"), DataType: sqlschema.DataTypeText, Nullable: false, Default: "'VIEWER'"}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "saved_views", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("category"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("source_page"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("tags"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("extra_data"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, //Problematic + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "pipelines", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("order_id"), DataType: sqlschema.DataTypeInteger, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("enabled"), DataType: sqlschema.DataTypeBoolean, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("alias"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("description"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("filter"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("config_json"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "notification_channel", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("type"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "alertmanager_config", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("hash"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "alertmanager_state", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("silences"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("nflog"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "org_preference", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("preference_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("preference_value"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "user_preference", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("preference_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("preference_value"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("user_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("user_id"), ReferencedTableName: sqlschema.TableName("users"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "apdex_setting", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("service_name"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("threshold"), DataType: sqlschema.DataTypeNumeric, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("exclude_status_codes"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "ttl_setting", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("transaction_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("table_name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("ttl"), DataType: sqlschema.DataTypeInteger, Nullable: false, Default: "0"}, + {Name: sqlschema.ColumnName("cold_storage_ttl"), DataType: sqlschema.DataTypeInteger, Nullable: false, Default: "0"}, + {Name: sqlschema.ColumnName("status"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "virtual_field", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("expression"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("description"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("signal"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "installed_integration", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("type"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("installed_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: "current_timestamp"}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "cloud_integration", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("provider"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("account_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("last_agent_report"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("removed_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "cloud_integration_service", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("type"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("cloud_integration_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("cloud_integration_id"), ReferencedTableName: sqlschema.TableName("cloud_integration"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "rule", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("deleted"), DataType: sqlschema.DataTypeInteger, Nullable: false, Default: "0"}, + {Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "planned_maintenance", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("description"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("schedule"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "planned_maintenance_rule", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("planned_maintenance_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("rule_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("planned_maintenance_id"), ReferencedTableName: sqlschema.TableName("planned_maintenance"), ReferencedColumnName: sqlschema.ColumnName("id")}, + {ReferencingColumnName: sqlschema.ColumnName("rule_id"), ReferencedTableName: sqlschema.TableName("rule"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "quick_filter", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("filter"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("signal"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "factor_password", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("password"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("temporary"), DataType: sqlschema.DataTypeBoolean, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("user_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("user_id"), ReferencedTableName: sqlschema.TableName("users"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "reset_password_token", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("token"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("password_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("password_id"), ReferencedTableName: sqlschema.TableName("factor_password"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "factor_api_key", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("token"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("role"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("expires_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("last_used"), DataType: sqlschema.DataTypeTimestamp, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("revoked"), DataType: sqlschema.DataTypeBoolean, Nullable: false, Default: "false"}, + {Name: sqlschema.ColumnName("user_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("user_id"), ReferencedTableName: sqlschema.TableName("users"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "license", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("key"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("last_validated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "trace_funnel", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("description"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("steps"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("tags"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "dashboard", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("locked"), DataType: sqlschema.DataTypeBoolean, Nullable: false, Default: "false"}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "agent", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("agent_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("terminated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("status"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "agent_config_version", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("version"), DataType: sqlschema.DataTypeInteger, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("element_type"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("deploy_status"), DataType: sqlschema.DataTypeText, Nullable: false, Default: "dirty"}, + {Name: sqlschema.ColumnName("deploy_sequence"), DataType: sqlschema.DataTypeInteger, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("deploy_result"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("hash"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "agent_config_element", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("element_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("element_type"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("version_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("version_id"), ReferencedTableName: sqlschema.TableName("agent_config_version"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "user_invite", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("email"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("token"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("role"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + { + Name: "org_domains", + Columns: []*sqlschema.Column{ + {Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""}, + {Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + {Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""}, + }, + PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}}, + ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{ + {ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")}, + }, + }, + } + + if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, false); err != nil { + return err + } + + tx, err := db.BeginTx(ctx, nil) + if err != nil { + return err + } + + defer func() { + _ = tx.Rollback() + }() + + sqls := [][]byte{} + + for _, table := range tables { + existingTable, existingUniqueConstraints, err := migration.sqlschema.GetTable(ctx, table.Name) + if err != nil { + if errors.Ast(err, errors.TypeNotFound) { + sqls = append(sqls, migration.sqlschema.Operator().CreateTable(table)...) + continue + } + + return err + } + + sqls = append(sqls, migration.sqlschema.Operator().ConvertTable(existingTable, existingUniqueConstraints, table)...) + } + + for _, sql := range sqls { + if _, err := tx.ExecContext(ctx, string(sql)); err != nil { + return err + } + } + + if err := tx.Commit(); err != nil { + return err + } + + if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, true); err != nil { + return err + } + + return nil +} + +func (migration *v100) Down(ctx context.Context, db *bun.DB) error { + return nil +} diff --git a/pkg/sqlmigrator/migrator.go b/pkg/sqlmigrator/migrator.go index 646b895ae220..93591929e043 100644 --- a/pkg/sqlmigrator/migrator.go +++ b/pkg/sqlmigrator/migrator.go @@ -53,6 +53,7 @@ func (migrator *migrator) Migrate(ctx context.Context) error { group, err := migrator.migrator.Migrate(ctx) if err != nil { + migrator.settings.Logger().ErrorContext(ctx, "failed to run sqlstore migrations", "error", err, "dialect", migrator.dialect, "group", group.String(), "applied", group.Migrations.Applied()) return err } diff --git a/pkg/sqlschema/column.go b/pkg/sqlschema/column.go index 470fbb8c81d8..fc9b2ab17ea7 100644 --- a/pkg/sqlschema/column.go +++ b/pkg/sqlschema/column.go @@ -8,6 +8,7 @@ import ( var ( DataTypeText = DataType{s: valuer.NewString("TEXT"), z: ""} + DataTypeVarchar = DataType{s: valuer.NewString("VARCHAR"), z: ""} // Do not use this data type. Use DataTypeText instead. DataTypeBigInt = DataType{s: valuer.NewString("BIGINT"), z: int64(0)} DataTypeInteger = DataType{s: valuer.NewString("INTEGER"), z: int64(0)} DataTypeNumeric = DataType{s: valuer.NewString("NUMERIC"), z: float64(0)} @@ -40,6 +41,13 @@ type Column struct { Default string } +func (column *Column) Equals(other *Column) bool { + return column.Name == other.Name && + column.DataType == other.DataType && + column.Nullable == other.Nullable && + column.Default == other.Default +} + func (column *Column) ToDefinitionSQL(fmter SQLFormatter) []byte { sql := []byte{} @@ -128,3 +136,53 @@ func (column *Column) ToSetNotNullSQL(fmter SQLFormatter, tableName TableName) [ return sql } + +func (column *Column) ToDropNotNullSQL(fmter SQLFormatter, tableName TableName) []byte { + sql := []byte{} + + sql = append(sql, "ALTER TABLE "...) + sql = fmter.AppendIdent(sql, string(tableName)) + sql = append(sql, " ALTER COLUMN "...) + sql = fmter.AppendIdent(sql, string(column.Name)) + sql = append(sql, " DROP NOT NULL"...) + + return sql +} + +func (column *Column) ToSetDefaultSQL(fmter SQLFormatter, tableName TableName) []byte { + sql := []byte{} + + sql = append(sql, "ALTER TABLE "...) + sql = fmter.AppendIdent(sql, string(tableName)) + sql = append(sql, " ALTER COLUMN "...) + sql = fmter.AppendIdent(sql, string(column.Name)) + sql = append(sql, " SET DEFAULT "...) + sql = append(sql, column.Default...) + + return sql +} + +func (column *Column) ToDropDefaultSQL(fmter SQLFormatter, tableName TableName) []byte { + sql := []byte{} + + sql = append(sql, "ALTER TABLE "...) + sql = fmter.AppendIdent(sql, string(tableName)) + sql = append(sql, " ALTER COLUMN "...) + sql = fmter.AppendIdent(sql, string(column.Name)) + sql = append(sql, " DROP DEFAULT"...) + + return sql +} + +func (column *Column) ToSetDataTypeSQL(fmter SQLFormatter, tableName TableName) []byte { + sql := []byte{} + + sql = append(sql, "ALTER TABLE "...) + sql = fmter.AppendIdent(sql, string(tableName)) + sql = append(sql, " ALTER COLUMN "...) + sql = fmter.AppendIdent(sql, string(column.Name)) + sql = append(sql, " SET DATA TYPE "...) + sql = append(sql, fmter.SQLDataTypeOf(column.DataType)...) + + return sql +} diff --git a/pkg/sqlschema/constraint.go b/pkg/sqlschema/constraint.go index 3b0b52c2901a..56b26aa144c1 100644 --- a/pkg/sqlschema/constraint.go +++ b/pkg/sqlschema/constraint.go @@ -49,6 +49,9 @@ type Constraint interface { // The SQL representation of the constraint. ToDropSQL(fmter SQLFormatter, tableName TableName) []byte + + // The SQL representation of the constraint. + ToCreateSQL(fmter SQLFormatter, tableName TableName) []byte } type PrimaryKeyConstraint struct { @@ -139,6 +142,27 @@ func (constraint *PrimaryKeyConstraint) ToDropSQL(fmter SQLFormatter, tableName return sql } +func (constraint *PrimaryKeyConstraint) ToCreateSQL(fmter SQLFormatter, tableName TableName) []byte { + sql := []byte{} + + sql = append(sql, "ALTER TABLE "...) + sql = fmter.AppendIdent(sql, string(tableName)) + sql = append(sql, " ADD CONSTRAINT "...) + sql = fmter.AppendIdent(sql, constraint.Name(tableName)) + sql = append(sql, " PRIMARY KEY ("...) + + for i, column := range constraint.ColumnNames { + if i > 0 { + sql = append(sql, ", "...) + } + sql = fmter.AppendIdent(sql, string(column)) + } + + sql = append(sql, ")"...) + + return sql +} + type ForeignKeyConstraint struct { ReferencingColumnName ColumnName ReferencedTableName TableName @@ -220,6 +244,24 @@ func (constraint *ForeignKeyConstraint) ToDropSQL(fmter SQLFormatter, tableName return sql } +func (constraint *ForeignKeyConstraint) ToCreateSQL(fmter SQLFormatter, tableName TableName) []byte { + sql := []byte{} + + sql = append(sql, "ALTER TABLE "...) + sql = fmter.AppendIdent(sql, string(tableName)) + sql = append(sql, " ADD CONSTRAINT "...) + sql = fmter.AppendIdent(sql, constraint.Name(tableName)) + sql = append(sql, " FOREIGN KEY ("...) + sql = fmter.AppendIdent(sql, string(constraint.ReferencingColumnName)) + sql = append(sql, ") REFERENCES "...) + sql = fmter.AppendIdent(sql, string(constraint.ReferencedTableName)) + sql = append(sql, " ("...) + sql = fmter.AppendIdent(sql, string(constraint.ReferencedColumnName)) + sql = append(sql, ")"...) + + return sql +} + // Do not use this constraint type. Instead create an index with the `UniqueIndex` type. // The main difference between a Unique Index and a Unique Constraint is mostly semantic, with a constraint focusing more on data integrity, while an index focuses on performance. // We choose to create unique indices because of sqlite. Dropping a unique index is directly supported whilst dropping a unique constraint requires a recreation of the table with the constraint removed. @@ -323,3 +365,7 @@ func (constraint *UniqueConstraint) ToDropSQL(fmter SQLFormatter, tableName Tabl return sql } + +func (constraint *UniqueConstraint) ToCreateSQL(fmter SQLFormatter, tableName TableName) []byte { + return []byte{} +} diff --git a/pkg/sqlschema/formatter.go b/pkg/sqlschema/formatter.go index 0f72d7df8983..add6565e1fb1 100644 --- a/pkg/sqlschema/formatter.go +++ b/pkg/sqlschema/formatter.go @@ -25,6 +25,8 @@ func (formatter Formatter) DataTypeOf(dataType string) DataType { switch strings.ToUpper(dataType) { case "TEXT": return DataTypeText + case "VARCHAR": + return DataTypeVarchar case "BIGINT": return DataTypeBigInt case "INTEGER": diff --git a/pkg/sqlschema/operator.go b/pkg/sqlschema/operator.go index fe8fddcc6e66..f0f9ebc66a8f 100644 --- a/pkg/sqlschema/operator.go +++ b/pkg/sqlschema/operator.go @@ -1,11 +1,19 @@ package sqlschema +import ( + "reflect" + "slices" +) + var _ SQLOperator = (*Operator)(nil) type OperatorSupport struct { + CreateConstraint bool DropConstraint bool ColumnIfNotExistsExists bool AlterColumnSetNotNull bool + AlterColumnSetDataType bool + AlterColumnSetDefault bool } type Operator struct { @@ -29,6 +37,62 @@ func (operator *Operator) RenameTable(table *Table, newName TableName) [][]byte return [][]byte{table.ToRenameSQL(operator.fmter, newName)} } +// Returns a list of SQL statements to convert the table to the new table. +func (operator *Operator) ConvertTable(oldTable *Table, oldTableUniqueConstraints []*UniqueConstraint, newTable *Table) [][]byte { + sql := [][]byte{} + + // Check if the name has changed + if oldTable.Name != newTable.Name { + sql = append(sql, operator.RenameTable(oldTable, newTable.Name)...) + } + + // Drop columns that are in the old table but not in the new table. + for _, column := range oldTable.Columns { + if index := operator.findColumnByName(newTable, column.Name); index == -1 { + sql = append(sql, operator.DropColumn(oldTable, column)...) + } + } + + // Add columns that are in the new table but not in the old table. + for _, column := range newTable.Columns { + if index := operator.findColumnByName(oldTable, column.Name); index == -1 { + sql = append(sql, operator.AddColumn(oldTable, oldTableUniqueConstraints, column, column.Default)...) + } + } + + // Modify columns that are in the new table and in the old table + for _, column := range newTable.Columns { + sql = append(sql, operator.AlterColumn(oldTable, oldTableUniqueConstraints, column)...) + } + + // Primary key constraints + sql = append(sql, operator.CreateConstraint(oldTable, oldTableUniqueConstraints, newTable.PrimaryKeyConstraint)...) + + // Drop foreign key constraints that are in the old table but not in the new table. + for _, fkConstraint := range oldTable.ForeignKeyConstraints { + if index := operator.findForeignKeyConstraint(newTable, fkConstraint); index == -1 { + sql = append(sql, operator.DropConstraint(oldTable, oldTableUniqueConstraints, fkConstraint)...) + } + } + + // Create foreign key constraints that are in the new table but not in the old table. + for _, fkConstraint := range newTable.ForeignKeyConstraints { + if index := operator.findForeignKeyConstraint(oldTable, fkConstraint); index == -1 { + sql = append(sql, operator.CreateConstraint(oldTable, oldTableUniqueConstraints, fkConstraint)...) + } + } + + // Drop all unique constraints and create indices for the new table. + for _, uniqueConstraint := range oldTableUniqueConstraints { + sql = append(sql, operator.DropConstraint(oldTable, oldTableUniqueConstraints, uniqueConstraint)...) + sql = append(sql, uniqueConstraint.ToIndex(oldTable.Name).ToCreateSQL(operator.fmter)) + } + + return slices.CompactFunc(sql, func(a, b []byte) bool { + return string(a) == string(b) + }) +} + func (operator *Operator) RecreateTable(table *Table, uniqueConstraints []*UniqueConstraint) [][]byte { sqls := [][]byte{} @@ -82,6 +146,62 @@ func (operator *Operator) AddColumn(table *Table, uniqueConstraints []*UniqueCon return sqls } +func (operator *Operator) AlterColumn(table *Table, uniqueConstraints []*UniqueConstraint, column *Column) [][]byte { + index := operator.findColumnByName(table, column.Name) + // If the column does not exist, we do not need to alter it. + if index == -1 { + return [][]byte{} + } + + oldColumn := table.Columns[index] + // If the column is the same, we do not need to alter it. + if oldColumn.Equals(column) { + return [][]byte{} + } + + sqls := [][]byte{} + var recreateTable bool + + if oldColumn.DataType != column.DataType { + if operator.support.AlterColumnSetDataType { + sqls = append(sqls, column.ToSetDataTypeSQL(operator.fmter, table.Name)) + } else { + recreateTable = true + } + } + + if oldColumn.Nullable != column.Nullable { + if operator.support.AlterColumnSetNotNull { + if column.Nullable { + sqls = append(sqls, column.ToDropNotNullSQL(operator.fmter, table.Name)) + } else { + sqls = append(sqls, column.ToSetNotNullSQL(operator.fmter, table.Name)) + } + } else { + recreateTable = true + } + } + + if oldColumn.Default != column.Default { + if operator.support.AlterColumnSetDefault { + if column.Default != "" { + sqls = append(sqls, column.ToSetDefaultSQL(operator.fmter, table.Name)) + } else { + sqls = append(sqls, column.ToDropDefaultSQL(operator.fmter, table.Name)) + } + } else { + recreateTable = true + } + } + + table.Columns[index] = column + if recreateTable { + sqls = append(sqls, operator.RecreateTable(table, uniqueConstraints)...) + } + + return sqls +} + func (operator *Operator) DropColumn(table *Table, column *Column) [][]byte { index := operator.findColumnByName(table, column.Name) // If the column does not exist, we do not need to drop it. @@ -94,6 +214,45 @@ func (operator *Operator) DropColumn(table *Table, column *Column) [][]byte { return [][]byte{column.ToDropSQL(operator.fmter, table.Name, operator.support.ColumnIfNotExistsExists)} } +func (operator *Operator) CreateConstraint(table *Table, uniqueConstraints []*UniqueConstraint, constraint Constraint) [][]byte { + if constraint == nil { + return [][]byte{} + } + + if reflect.ValueOf(constraint).IsNil() { + return [][]byte{} + } + + if constraint.Type() == ConstraintTypeForeignKey { + // Constraint already exists as foreign key constraint. + if table.ForeignKeyConstraints != nil { + for _, fkConstraint := range table.ForeignKeyConstraints { + if constraint.Equals(fkConstraint) { + return [][]byte{} + } + } + } + + table.ForeignKeyConstraints = append(table.ForeignKeyConstraints, constraint.(*ForeignKeyConstraint)) + } + + sqls := [][]byte{} + if constraint.Type() == ConstraintTypePrimaryKey { + if operator.support.DropConstraint { + if table.PrimaryKeyConstraint != nil { + sqls = append(sqls, table.PrimaryKeyConstraint.ToDropSQL(operator.fmter, table.Name)) + } + } + table.PrimaryKeyConstraint = constraint.(*PrimaryKeyConstraint) + } + + if operator.support.CreateConstraint { + return append(sqls, constraint.ToCreateSQL(operator.fmter, table.Name)) + } + + return operator.RecreateTable(table, uniqueConstraints) +} + func (operator *Operator) DropConstraint(table *Table, uniqueConstraints []*UniqueConstraint, constraint Constraint) [][]byte { // The name of the input constraint is not guaranteed to be the same as the name of the constraint in the database. // So we need to find the constraint in the database and drop it. @@ -141,3 +300,17 @@ func (*Operator) findUniqueConstraint(uniqueConstraints []*UniqueConstraint, con return -1 } + +func (*Operator) findForeignKeyConstraint(table *Table, constraint Constraint) int { + if constraint.Type() != ConstraintTypeForeignKey { + return -1 + } + + for i, fkConstraint := range table.ForeignKeyConstraints { + if fkConstraint.Equals(constraint) { + return i + } + } + + return -1 +} diff --git a/pkg/sqlschema/operator_test.go b/pkg/sqlschema/operator_test.go index 6ea932ff98cf..1a11373ccad2 100644 --- a/pkg/sqlschema/operator_test.go +++ b/pkg/sqlschema/operator_test.go @@ -700,3 +700,144 @@ func TestOperatorDropConstraint(t *testing.T) { }) } } + +func TestOperatorConvertTable(t *testing.T) { + testCases := []struct { + name string + table *Table + uniqueConstraints []*UniqueConstraint + newTable *Table + support OperatorSupport + expectedSQLs [][]byte + }{ + { + name: "NoOperation", + table: &Table{ + Name: "users", + Columns: []*Column{ + {Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""}, + {Name: "name", DataType: DataTypeText, Nullable: false, Default: ""}, + }, + }, + newTable: &Table{ + Name: "users", + Columns: []*Column{ + {Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""}, + {Name: "name", DataType: DataTypeText, Nullable: false, Default: ""}, + }, + }, + support: OperatorSupport{}, + expectedSQLs: [][]byte{}, + }, + { + name: "AddColumn_NullableNoDefault_ColumnIfNotExistsExistsTrue", + table: &Table{ + Name: "users", + Columns: []*Column{ + {Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""}, + {Name: "name", DataType: DataTypeText, Nullable: false, Default: ""}, + }, + }, + newTable: &Table{ + Name: "users", + Columns: []*Column{ + {Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""}, + {Name: "name", DataType: DataTypeText, Nullable: false, Default: ""}, + {Name: "age", DataType: DataTypeInteger, Nullable: true, Default: ""}, + }, + }, + support: OperatorSupport{ + ColumnIfNotExistsExists: true, + }, + expectedSQLs: [][]byte{ + []byte(`ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "age" INTEGER`), + }, + }, + { + name: "AddColumn_NullableNoDefault_ColumnIfNotExistsExistsFalse", + table: &Table{ + Name: "users", + Columns: []*Column{ + {Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""}, + {Name: "name", DataType: DataTypeText, Nullable: false, Default: ""}, + }, + }, + newTable: &Table{ + Name: "users", + Columns: []*Column{ + {Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""}, + {Name: "name", DataType: DataTypeText, Nullable: false, Default: ""}, + {Name: "age", DataType: DataTypeInteger, Nullable: true, Default: ""}, + }, + }, + support: OperatorSupport{ + ColumnIfNotExistsExists: false, + }, + expectedSQLs: [][]byte{ + []byte(`ALTER TABLE "users" ADD COLUMN "age" INTEGER`), + }, + }, + { + name: "CreatePrimaryKeyConstraint_CreateConstraintTrue", + table: &Table{ + Name: "users", + Columns: []*Column{ + {Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""}, + }, + }, + newTable: &Table{ + Name: "users", + Columns: []*Column{ + {Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &PrimaryKeyConstraint{ + ColumnNames: []ColumnName{"id"}, + }, + }, + support: OperatorSupport{ + CreateConstraint: true, + }, + expectedSQLs: [][]byte{ + []byte(`ALTER TABLE "users" ADD CONSTRAINT "pk_users" PRIMARY KEY ("id")`), + }, + }, + { + name: "CreatePrimaryKeyConstraint_CreateConstraintFalse", + table: &Table{ + Name: "users", + Columns: []*Column{ + {Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""}, + }, + }, + newTable: &Table{ + Name: "users", + Columns: []*Column{ + {Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""}, + }, + PrimaryKeyConstraint: &PrimaryKeyConstraint{ + ColumnNames: []ColumnName{"id"}, + }, + }, + support: OperatorSupport{ + CreateConstraint: false, + }, + expectedSQLs: [][]byte{ + []byte(`CREATE TABLE IF NOT EXISTS "users__temp" ("id" INTEGER NOT NULL, CONSTRAINT "pk_users" PRIMARY KEY ("id"))`), + []byte(`INSERT INTO "users__temp" ("id") SELECT "id" FROM "users"`), + []byte(`DROP TABLE IF EXISTS "users"`), + []byte(`ALTER TABLE "users__temp" RENAME TO "users"`), + }, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + fmter := NewFormatter(schema.NewNopFormatter().Dialect()) + operator := NewOperator(fmter, testCase.support) + + actuals := operator.ConvertTable(testCase.table, testCase.uniqueConstraints, testCase.newTable) + assert.Equal(t, testCase.expectedSQLs, actuals) + assert.Equal(t, testCase.newTable, testCase.table) + }) + } +} diff --git a/pkg/sqlschema/sqlitesqlschema/provider.go b/pkg/sqlschema/sqlitesqlschema/provider.go index 354df7a0356a..d7b8c8d85b93 100644 --- a/pkg/sqlschema/sqlitesqlschema/provider.go +++ b/pkg/sqlschema/sqlitesqlschema/provider.go @@ -33,9 +33,12 @@ func New(ctx context.Context, providerSettings factory.ProviderSettings, config settings: settings, sqlstore: sqlstore, operator: sqlschema.NewOperator(fmter, sqlschema.OperatorSupport{ + CreateConstraint: false, DropConstraint: false, ColumnIfNotExistsExists: false, AlterColumnSetNotNull: false, + AlterColumnSetDefault: false, + AlterColumnSetDataType: false, }), }, nil } @@ -56,7 +59,7 @@ func (provider *provider) GetTable(ctx context.Context, tableName sqlschema.Tabl BunDB(). NewRaw("SELECT sql FROM sqlite_master WHERE type IN (?) AND tbl_name = ? AND sql IS NOT NULL", bun.In([]string{"table"}), string(tableName)). Scan(ctx, &sql); err != nil { - return nil, nil, err + return nil, nil, provider.sqlstore.WrapNotFoundErrf(err, errors.CodeNotFound, "table (%s) not found", tableName) } table, uniqueConstraints, err := parseCreateTable(sql, provider.fmter) diff --git a/pkg/sqlschema/sqlschema.go b/pkg/sqlschema/sqlschema.go index 1fdeab35c853..eb393832b50a 100644 --- a/pkg/sqlschema/sqlschema.go +++ b/pkg/sqlschema/sqlschema.go @@ -34,6 +34,9 @@ type SQLOperator interface { // Returns a list of SQL statements to rename a table. RenameTable(*Table, TableName) [][]byte + // Returns a list of SQL statements to convert a table to a new table. + ConvertTable(*Table, []*UniqueConstraint, *Table) [][]byte + // Returns a list of SQL statements to recreate a table. RecreateTable(*Table, []*UniqueConstraint) [][]byte @@ -47,9 +50,15 @@ type SQLOperator interface { // If the column is not nullable, the column is added with the input value, then the column is made non-nullable. AddColumn(*Table, []*UniqueConstraint, *Column, any) [][]byte + // Returns a list of SQL statements to alter a column. + AlterColumn(*Table, []*UniqueConstraint, *Column) [][]byte + // Returns a list of SQL statements to drop a column from a table. DropColumn(*Table, *Column) [][]byte + // Returns a list of SQL statements to create a constraint on a table. + CreateConstraint(*Table, []*UniqueConstraint, Constraint) [][]byte + // Returns a list of SQL statements to drop a constraint from a table. DropConstraint(*Table, []*UniqueConstraint, Constraint) [][]byte }