1
0
mirror of https://github.com/raseels-repos/golang-saas-starter-kit.git synced 2025-06-17 00:17:59 +02:00

fix schema migration requiring web context

This commit is contained in:
Lee Brown
2019-08-21 19:28:23 -08:00
parent 9e0f105e2f
commit 4894f2a3d8
14 changed files with 79 additions and 76 deletions

View File

@ -9,6 +9,7 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"geeks-accelerator/oss/saas-starter-kit/internal/schema"
"github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/service/cloudfront" "github.com/aws/aws-sdk-go/service/cloudfront"
@ -18,7 +19,6 @@ import (
"github.com/iancoleman/strcase" "github.com/iancoleman/strcase"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
"github.com/pkg/errors" "github.com/pkg/errors"
"geeks-accelerator/oss/saas-starter-kit/internal/schema"
"gitlab.com/geeks-accelerator/oss/devops/pkg/devdeploy" "gitlab.com/geeks-accelerator/oss/devops/pkg/devdeploy"
) )
@ -35,7 +35,7 @@ type Env = string
var ( var (
EnvDev Env = webcontext.Env_Dev EnvDev Env = webcontext.Env_Dev
EnvStage Env = webcontext.Env_Stage EnvStage Env = webcontext.Env_Stage
EnvProd Env = webcontext.Env_Prod EnvProd Env = webcontext.Env_Prod
) )

View File

@ -14,8 +14,8 @@ import (
type Function = string type Function = string
var ( var (
Function_Ddlogscollector = "ddlogscollector" Function_Ddlogscollector = "ddlogscollector"
Function_YourNewFunction = "your-new-function" Function_YourNewFunction = "your-new-function"
) )
// List of function names used by main.go for help. // List of function names used by main.go for help.

View File

@ -4,13 +4,13 @@ import (
"context" "context"
"log" "log"
"geeks-accelerator/oss/saas-starter-kit/internal/schema"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
"github.com/pkg/errors" "github.com/pkg/errors"
"geeks-accelerator/oss/saas-starter-kit/internal/schema"
"gitlab.com/geeks-accelerator/oss/devops/pkg/devdeploy" "gitlab.com/geeks-accelerator/oss/devops/pkg/devdeploy"
) )
// RunSchemaMigrationsForTargetEnv executes the build commands for a target service. // RunSchemaMigrationsForTargetEnv executes schema migrations for the target environment.
func RunSchemaMigrationsForTargetEnv(log *log.Logger, awsCredentials devdeploy.AwsCredentials, targetEnv Env, isUnittest bool) error { func RunSchemaMigrationsForTargetEnv(log *log.Logger, awsCredentials devdeploy.AwsCredentials, targetEnv Env, isUnittest bool) error {
cfgCtx, err := NewConfigContext(targetEnv, awsCredentials) cfgCtx, err := NewConfigContext(targetEnv, awsCredentials)
@ -34,5 +34,5 @@ func RunSchemaMigrationsForTargetEnv(log *log.Logger, awsCredentials devdeploy.A
} }
defer masterDb.Close() defer masterDb.Close()
return schema.Migrate(context.Background(), masterDb, log, false) return schema.Migrate(context.Background(), targetEnv, masterDb, log, false)
} }

View File

@ -8,10 +8,10 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/pkg/errors"
"github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/ecs" "github.com/aws/aws-sdk-go/service/ecs"
"github.com/iancoleman/strcase" "github.com/iancoleman/strcase"
"github.com/pkg/errors"
"gitlab.com/geeks-accelerator/oss/devops/pkg/devdeploy" "gitlab.com/geeks-accelerator/oss/devops/pkg/devdeploy"
"gopkg.in/go-playground/validator.v9" "gopkg.in/go-playground/validator.v9"
) )
@ -33,12 +33,12 @@ var ServiceNames = []Service{
// ServiceConfig defines the settings for a service. // ServiceConfig defines the settings for a service.
type ServiceConfig struct { type ServiceConfig struct {
// Required flags. // Required flags.
Name string `validate:"required" example:"web-api"` Name string `validate:"required" example:"web-api"`
ServiceHostPrimary string `validate:"required" example:"example-project.com"` ServiceHostPrimary string `validate:"required" example:"example-project.com"`
DesiredCount int `validate:"required" example:"2"` DesiredCount int `validate:"required" example:"2"`
ServiceDir string `validate:"required"` ServiceDir string `validate:"required"`
Dockerfile string `validate:"required" example:"./cmd/web-api/Dockerfile"` Dockerfile string `validate:"required" example:"./cmd/web-api/Dockerfile"`
ReleaseTag string `validate:"required"` ReleaseTag string `validate:"required"`
// Optional flags. // Optional flags.
ServiceHostNames []string `validate:"omitempty" example:"subdomain.example-project.com"` ServiceHostNames []string `validate:"omitempty" example:"subdomain.example-project.com"`
@ -89,7 +89,7 @@ func NewServiceConfig(serviceName string, cfg *devdeploy.Config) (ServiceConfig,
// Set the hostnames for the service. // Set the hostnames for the service.
if cfg.Env == EnvProd { if cfg.Env == EnvProd {
srv.ServiceHostPrimary = "example.saasstartupkit.com" srv.ServiceHostPrimary = "example.saasstartupkit.com"
// Any hostname listed here that doesn't match the primary hostname will be updated in Route 53 but the // Any hostname listed here that doesn't match the primary hostname will be updated in Route 53 but the
// service itself will redirect any requests back to the primary hostname. // service itself will redirect any requests back to the primary hostname.
@ -97,7 +97,7 @@ func NewServiceConfig(serviceName string, cfg *devdeploy.Config) (ServiceConfig,
fmt.Sprintf("%s.example.saasstartupkit.com", cfg.Env), fmt.Sprintf("%s.example.saasstartupkit.com", cfg.Env),
} }
} else { } else {
srv.ServiceHostPrimary = fmt.Sprintf("%s.example.saasstartupkit.com", cfg.Env) srv.ServiceHostPrimary = fmt.Sprintf("%s.example.saasstartupkit.com", cfg.Env)
} }
case ServiceWebApi: case ServiceWebApi:
@ -111,8 +111,8 @@ func NewServiceConfig(serviceName string, cfg *devdeploy.Config) (ServiceConfig,
default: default:
return ServiceConfig{}, errors.Wrapf(devdeploy.ErrInvalidService, return ServiceConfig{}, errors.Wrapf(devdeploy.ErrInvalidService,
"No service config defined for service '%s'", "No service config defined for service '%s'",
serviceName) serviceName)
} }
// Set the docker file if no custom one has been defined for the service. // Set the docker file if no custom one has been defined for the service.
@ -140,7 +140,6 @@ func (c ServiceConfig) BaseUrl() string {
return fmt.Sprintf("%s://%s/", schema, c.ServiceHostPrimary) return fmt.Sprintf("%s://%s/", schema, c.ServiceHostPrimary)
} }
// NewServiceContext returns the ServiceContext for a service that is configured for the target deployment env. // NewServiceContext returns the ServiceContext for a service that is configured for the target deployment env.
func NewServiceContext(serviceName Service, cfg *devdeploy.Config) (*ServiceContext, error) { func NewServiceContext(serviceName Service, cfg *devdeploy.Config) (*ServiceContext, error) {
@ -193,7 +192,6 @@ func NewServiceContext(serviceName Service, cfg *devdeploy.Config) (*ServiceCont
} }
} }
// ========================================================================= // =========================================================================
// Service dependant settings. // Service dependant settings.
@ -306,7 +304,6 @@ func NewServiceContext(serviceName Service, cfg *devdeploy.Config) (*ServiceCont
return def, nil return def, nil
} }
// Define the ServiceContext for the web-api that will be used for build and deploy. // Define the ServiceContext for the web-api that will be used for build and deploy.
case ServiceWebApi: case ServiceWebApi:

View File

@ -6,8 +6,8 @@ import (
"os" "os"
"strings" "strings"
"github.com/urfave/cli"
"geeks-accelerator/oss/saas-starter-kit/build/cicd/internal/config" "geeks-accelerator/oss/saas-starter-kit/build/cicd/internal/config"
"github.com/urfave/cli"
"gitlab.com/geeks-accelerator/oss/devops/pkg/devdeploy" "gitlab.com/geeks-accelerator/oss/devops/pkg/devdeploy"
) )

View File

@ -17,7 +17,7 @@ import (
// Account represents the Account API method handler set. // Account represents the Account API method handler set.
type Accounts struct { type Accounts struct {
Repository *account.Repository Repository *account.Repository
// ADD OTHER STATE LIKE THE LOGGER AND CONFIG HERE. // ADD OTHER STATE LIKE THE LOGGER AND CONFIG HERE.
} }

View File

@ -5,14 +5,14 @@ import (
"net/http" "net/http"
"os" "os"
"geeks-accelerator/oss/saas-starter-kit/internal/account"
"geeks-accelerator/oss/saas-starter-kit/internal/account/account_preference"
"geeks-accelerator/oss/saas-starter-kit/internal/mid" "geeks-accelerator/oss/saas-starter-kit/internal/mid"
saasSwagger "geeks-accelerator/oss/saas-starter-kit/internal/mid/saas-swagger" saasSwagger "geeks-accelerator/oss/saas-starter-kit/internal/mid/saas-swagger"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/auth" "geeks-accelerator/oss/saas-starter-kit/internal/platform/auth"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web" "geeks-accelerator/oss/saas-starter-kit/internal/platform/web"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext" "geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext"
_ "geeks-accelerator/oss/saas-starter-kit/internal/platform/web/weberror" _ "geeks-accelerator/oss/saas-starter-kit/internal/platform/web/weberror"
"geeks-accelerator/oss/saas-starter-kit/internal/account"
"geeks-accelerator/oss/saas-starter-kit/internal/account/account_preference"
"geeks-accelerator/oss/saas-starter-kit/internal/project" "geeks-accelerator/oss/saas-starter-kit/internal/project"
"geeks-accelerator/oss/saas-starter-kit/internal/signup" "geeks-accelerator/oss/saas-starter-kit/internal/signup"
"geeks-accelerator/oss/saas-starter-kit/internal/user" "geeks-accelerator/oss/saas-starter-kit/internal/user"

View File

@ -12,18 +12,18 @@ import (
"geeks-accelerator/oss/saas-starter-kit/internal/account" "geeks-accelerator/oss/saas-starter-kit/internal/account"
"geeks-accelerator/oss/saas-starter-kit/internal/account/account_preference" "geeks-accelerator/oss/saas-starter-kit/internal/account/account_preference"
"geeks-accelerator/oss/saas-starter-kit/internal/geonames" "geeks-accelerator/oss/saas-starter-kit/internal/geonames"
"geeks-accelerator/oss/saas-starter-kit/internal/project"
"geeks-accelerator/oss/saas-starter-kit/internal/signup"
"geeks-accelerator/oss/saas-starter-kit/internal/user"
"geeks-accelerator/oss/saas-starter-kit/internal/user_account"
"geeks-accelerator/oss/saas-starter-kit/internal/user_account/invite"
"geeks-accelerator/oss/saas-starter-kit/internal/user_auth"
"geeks-accelerator/oss/saas-starter-kit/internal/mid" "geeks-accelerator/oss/saas-starter-kit/internal/mid"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/auth" "geeks-accelerator/oss/saas-starter-kit/internal/platform/auth"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web" "geeks-accelerator/oss/saas-starter-kit/internal/platform/web"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext" "geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web/weberror" "geeks-accelerator/oss/saas-starter-kit/internal/platform/web/weberror"
"geeks-accelerator/oss/saas-starter-kit/internal/project"
"geeks-accelerator/oss/saas-starter-kit/internal/project_route" "geeks-accelerator/oss/saas-starter-kit/internal/project_route"
"geeks-accelerator/oss/saas-starter-kit/internal/signup"
"geeks-accelerator/oss/saas-starter-kit/internal/user"
"geeks-accelerator/oss/saas-starter-kit/internal/user_account"
"geeks-accelerator/oss/saas-starter-kit/internal/user_account/invite"
"geeks-accelerator/oss/saas-starter-kit/internal/user_auth"
"github.com/ikeikeikeike/go-sitemap-generator/v2/stm" "github.com/ikeikeikeike/go-sitemap-generator/v2/stm"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"

View File

@ -23,7 +23,7 @@ import (
type Signup struct { type Signup struct {
SignupRepo *signup.Repository SignupRepo *signup.Repository
AuthRepo *user_auth.Repository AuthRepo *user_auth.Repository
GeoRepo *geonames.Repository GeoRepo *geonames.Repository
MasterDB *sqlx.DB MasterDB *sqlx.DB
Renderer web.Renderer Renderer web.Renderer
} }

View File

@ -7,8 +7,8 @@ import (
"strings" "strings"
"time" "time"
"geeks-accelerator/oss/saas-starter-kit/internal/geonames"
"geeks-accelerator/oss/saas-starter-kit/internal/account" "geeks-accelerator/oss/saas-starter-kit/internal/account"
"geeks-accelerator/oss/saas-starter-kit/internal/geonames"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/auth" "geeks-accelerator/oss/saas-starter-kit/internal/platform/auth"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/datatable" "geeks-accelerator/oss/saas-starter-kit/internal/platform/datatable"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web" "geeks-accelerator/oss/saas-starter-kit/internal/platform/web"

View File

@ -20,15 +20,10 @@ import (
"syscall" "syscall"
"time" "time"
"geeks-accelerator/oss/saas-starter-kit/internal/account/account_preference"
"geeks-accelerator/oss/saas-starter-kit/internal/geonames"
"geeks-accelerator/oss/saas-starter-kit/internal/project"
"geeks-accelerator/oss/saas-starter-kit/internal/signup"
"geeks-accelerator/oss/saas-starter-kit/internal/user_account"
"geeks-accelerator/oss/saas-starter-kit/internal/user_account/invite"
"geeks-accelerator/oss/saas-starter-kit/internal/user_auth"
"geeks-accelerator/oss/saas-starter-kit/cmd/web-app/handlers" "geeks-accelerator/oss/saas-starter-kit/cmd/web-app/handlers"
"geeks-accelerator/oss/saas-starter-kit/internal/account" "geeks-accelerator/oss/saas-starter-kit/internal/account"
"geeks-accelerator/oss/saas-starter-kit/internal/account/account_preference"
"geeks-accelerator/oss/saas-starter-kit/internal/geonames"
"geeks-accelerator/oss/saas-starter-kit/internal/mid" "geeks-accelerator/oss/saas-starter-kit/internal/mid"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/auth" "geeks-accelerator/oss/saas-starter-kit/internal/platform/auth"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/devops" "geeks-accelerator/oss/saas-starter-kit/internal/platform/devops"
@ -39,8 +34,13 @@ import (
template_renderer "geeks-accelerator/oss/saas-starter-kit/internal/platform/web/template-renderer" template_renderer "geeks-accelerator/oss/saas-starter-kit/internal/platform/web/template-renderer"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext" "geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web/weberror" "geeks-accelerator/oss/saas-starter-kit/internal/platform/web/weberror"
"geeks-accelerator/oss/saas-starter-kit/internal/project"
"geeks-accelerator/oss/saas-starter-kit/internal/project_route" "geeks-accelerator/oss/saas-starter-kit/internal/project_route"
"geeks-accelerator/oss/saas-starter-kit/internal/signup"
"geeks-accelerator/oss/saas-starter-kit/internal/user" "geeks-accelerator/oss/saas-starter-kit/internal/user"
"geeks-accelerator/oss/saas-starter-kit/internal/user_account"
"geeks-accelerator/oss/saas-starter-kit/internal/user_account/invite"
"geeks-accelerator/oss/saas-starter-kit/internal/user_auth"
"github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/credentials"

View File

@ -5,10 +5,10 @@ import (
"context" "context"
"database/sql" "database/sql"
"encoding/csv" "encoding/csv"
"fmt"
"log" "log"
"strings" "strings"
"time" "time"
"fmt"
"geeks-accelerator/oss/saas-starter-kit/internal/geonames" "geeks-accelerator/oss/saas-starter-kit/internal/geonames"
"github.com/geeks-accelerator/sqlxmigrate" "github.com/geeks-accelerator/sqlxmigrate"

View File

@ -3,12 +3,24 @@ package schema
import ( import (
"context" "context"
"log" "log"
"time"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext"
"github.com/geeks-accelerator/sqlxmigrate" "github.com/geeks-accelerator/sqlxmigrate"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
) )
func Migrate(ctx context.Context, masterDb *sqlx.DB, log *log.Logger, isUnittest bool) error { // Migrate is the entry point for performing init schema and running all the migrations.
func Migrate(ctx context.Context, targetEnv webcontext.Env, masterDb *sqlx.DB, log *log.Logger, isUnittest bool) error {
// Set the context with the required values to
// process the request.
v := webcontext.Values{
Now: time.Now(),
Env: targetEnv,
}
ctx = context.WithValue(ctx, webcontext.KeyValues, &v)
// Load list of Schema migrations and init new sqlxmigrate client // Load list of Schema migrations and init new sqlxmigrate client
migrations := migrationList(ctx, masterDb, log, isUnittest) migrations := migrationList(ctx, masterDb, log, isUnittest)
m := sqlxmigrate.New(masterDb, sqlxmigrate.DefaultOptions, migrations) m := sqlxmigrate.New(masterDb, sqlxmigrate.DefaultOptions, migrations)

View File

@ -9,11 +9,11 @@ import (
"strings" "strings"
"time" "time"
"github.com/urfave/cli"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext" "geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext"
"geeks-accelerator/oss/saas-starter-kit/internal/schema" "geeks-accelerator/oss/saas-starter-kit/internal/schema"
"github.com/lib/pq" "github.com/lib/pq"
_ "github.com/lib/pq" _ "github.com/lib/pq"
"github.com/urfave/cli"
sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql"
sqlxtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/jmoiron/sqlx" sqlxtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/jmoiron/sqlx"
) )
@ -59,54 +59,54 @@ func main() {
Name: "env", Name: "env",
Usage: fmt.Sprintf("target environment, one of [%s]", Usage: fmt.Sprintf("target environment, one of [%s]",
strings.Join(webcontext.EnvNames, ", ")), strings.Join(webcontext.EnvNames, ", ")),
Value: "dev", Value: "dev",
EnvVar: "ENV", EnvVar: "ENV",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "host", Name: "host",
Usage: "host", Usage: "host",
Value:"127.0.0.1:5433", Value: "127.0.0.1:5433",
EnvVar: "SCHEMA_DB_HOST", EnvVar: "SCHEMA_DB_HOST",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "user", Name: "user",
Usage: "username", Usage: "username",
Value: "postgres", Value: "postgres",
EnvVar: "SCHEMA_DB_USER", EnvVar: "SCHEMA_DB_USER",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "pass", Name: "pass",
Usage: "password", Usage: "password",
Value: "postgres", Value: "postgres",
EnvVar: "SCHEMA_DB_PASS", EnvVar: "SCHEMA_DB_PASS",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "database", Name: "database",
Usage: "name of the default", Usage: "name of the default",
Value: "shared", Value: "shared",
EnvVar: "SCHEMA_DB_DATABASE", EnvVar: "SCHEMA_DB_DATABASE",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "driver", Name: "driver",
Usage: "database drive to use for connection", Usage: "database drive to use for connection",
Value: "postgres", Value: "postgres",
EnvVar: "SCHEMA_DB_DRIVER", EnvVar: "SCHEMA_DB_DRIVER",
}, },
cli.BoolTFlag{ cli.BoolTFlag{
Name: "disable-tls", Name: "disable-tls",
Usage: "disable TLS for the database connection", Usage: "disable TLS for the database connection",
EnvVar: "SCHEMA_DB_DISABLE_TLS", EnvVar: "SCHEMA_DB_DISABLE_TLS",
}, },
}, },
Action: func(c *cli.Context) error { Action: func(c *cli.Context) error {
targetEnv := c.String("env") targetEnv := c.String("env")
var dbInfo = DB { var dbInfo = DB{
Host : c.String("host"), Host: c.String("host"),
User : c.String("user"), User: c.String("user"),
Pass : c.String("pass"), Pass: c.String("pass"),
Database : c.String("database"), Database: c.String("database"),
Driver : c.String("driver"), Driver: c.String("driver"),
DisableTLS: c.Bool("disable-tls"), DisableTLS: c.Bool("disable-tls"),
} }
@ -160,16 +160,10 @@ func runMigrate(log *log.Logger, targetEnv string, dbInfo DB) error {
// ========================================================================= // =========================================================================
// Start Migrations // Start Migrations
// Set the context with the required values to ctx := context.Background()
// process the request.
v := webcontext.Values{
Now: time.Now(),
Env: targetEnv,
}
ctx := context.WithValue(context.Background(), webcontext.KeyValues, &v)
// Execute the migrations // Execute the migrations
if err = schema.Migrate(ctx, masterDb, log, false); err != nil { if err = schema.Migrate(ctx, env, masterDb, log, false); err != nil {
return err return err
} }