From 64a3072a54ea031747531abd3294953a90af2a6a Mon Sep 17 00:00:00 2001 From: gearnode Date: Fri, 24 Jan 2025 14:48:01 +0100 Subject: [PATCH] Add migrations system Signed-off-by: gearnode --- pkg/probo/coredata/migrations.go | 10 +++++ .../coredata/migrations/20250124T113100Z.sql | 37 +++++++++++++++++++ pkg/probo/probo.go | 11 +++++- pkg/probod/probod.go | 5 ++- 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 pkg/probo/coredata/migrations.go create mode 100644 pkg/probo/coredata/migrations/20250124T113100Z.sql diff --git a/pkg/probo/coredata/migrations.go b/pkg/probo/coredata/migrations.go new file mode 100644 index 000000000..c551d0a8b --- /dev/null +++ b/pkg/probo/coredata/migrations.go @@ -0,0 +1,10 @@ +package coredata + +import ( + "embed" +) + +var ( + //go:embed migrations/*.sql + Migrations embed.FS +) diff --git a/pkg/probo/coredata/migrations/20250124T113100Z.sql b/pkg/probo/coredata/migrations/20250124T113100Z.sql new file mode 100644 index 000000000..ffd8a94da --- /dev/null +++ b/pkg/probo/coredata/migrations/20250124T113100Z.sql @@ -0,0 +1,37 @@ +CREATE TABLE organizations ( + id UUID PRIMARY KEY, + name TEXT NOT NULL, + description TEXT, + created_at TIMESTAMP WITH TIME ZONE NOT NULL, + updated_at TIMESTAMP WITH TIME ZONE NOT NULL +); + +CREATE TABLE frameworks ( + id UUID PRIMARY KEY, + organization_id UUID REFERENCES organizations(id) NOT NULL, + name TEXT NOT NULL, + description TEXT NOT NULL, + content_ref TEXT NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL, + updated_at TIMESTAMP WITH TIME ZONE NOT NULL +); + +CREATE TABLE controls ( + id UUID PRIMARY KEY, + framework_id UUID REFERENCES frameworks(id) NOT NULL, + name TEXT NOT NULL, + description TEXT NOT NULL, + content_ref TEXT NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL, + updated_at TIMESTAMP WITH TIME ZONE NOT NULL +); + +CREATE TABLE tasks ( + id UUID PRIMARY KEY, + control_id UUID REFERENCES controls(id) NOT NULL, + name TEXT NOT NULL, + description TEXT NOT NULL, + content_ref TEXT NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL, + updated_at TIMESTAMP WITH TIME ZONE NOT NULL +); diff --git a/pkg/probo/probo.go b/pkg/probo/probo.go index 61c4cd7ed..0399f78ec 100644 --- a/pkg/probo/probo.go +++ b/pkg/probo/probo.go @@ -16,10 +16,12 @@ package probo import ( "context" + "fmt" "github.com/getprobo/probo/pkg/probo/coredata" "github.com/getprobo/probo/pkg/probo/coredata/gid" "github.com/getprobo/probo/pkg/probo/coredata/page" + "go.gearno.de/kit/migrator" "go.gearno.de/kit/pg" ) @@ -30,11 +32,16 @@ type ( } ) -func NewService(ctx context.Context, pgClient *pg.Client) *Service { +func NewService(ctx context.Context, pgClient *pg.Client) (*Service, error) { + err := migrator.NewMigrator(pgClient, coredata.Migrations).Run(ctx, "migrations") + if err != nil { + return nil, fmt.Errorf("cannot migrate database schema: %w", err) + } + return &Service{ pg: pgClient, scope: coredata.NewScope(), // must be created from auth - } + }, nil } func (s *Service) GetOrganization( diff --git a/pkg/probod/probod.go b/pkg/probod/probod.go index cfa0dce87..bda7fe491 100644 --- a/pkg/probod/probod.go +++ b/pkg/probod/probod.go @@ -94,7 +94,10 @@ func (impl *Implm) Run( return fmt.Errorf("cannot create pg client: %w", err) } - probo := probo.NewService(ctx, pgClient) + probo, err := probo.NewService(ctx, pgClient) + if err != nil { + return fmt.Errorf("cannot create probo service: %w", err) + } apiServer, err := api.NewServer( api.Config{