github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/db/remote/changes/changes.go (about)

     1  package changes
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/url"
     7  
     8  	"github.com/spf13/afero"
     9  	"github.com/Redstoneguy129/cli/internal/db/diff"
    10  	"github.com/Redstoneguy129/cli/internal/utils"
    11  )
    12  
    13  var output string
    14  
    15  func Run(ctx context.Context, schema []string, username, password, database string, fsys afero.Fs) error {
    16  	// Sanity checks.
    17  	{
    18  		if err := utils.AssertDockerIsRunning(ctx); err != nil {
    19  			return err
    20  		}
    21  		if err := utils.LoadConfigFS(fsys); err != nil {
    22  			return err
    23  		}
    24  	}
    25  
    26  	if err := utils.RunProgram(ctx, func(p utils.Program, ctx context.Context) error {
    27  		return run(p, ctx, schema, username, password, database, fsys)
    28  	}); err != nil {
    29  		return err
    30  	}
    31  
    32  	return diff.SaveDiff(output, "", fsys)
    33  }
    34  
    35  func run(p utils.Program, ctx context.Context, schema []string, username, password, database string, fsys afero.Fs) error {
    36  	projectRef, err := utils.LoadProjectRef(fsys)
    37  	if err != nil {
    38  		return err
    39  	}
    40  	host := utils.GetSupabaseDbHost(projectRef)
    41  
    42  	// 1. Assert `supabase/migrations` and `schema_migrations` are in sync.
    43  	{
    44  		p.Send(utils.StatusMsg("Connecting to remote database..."))
    45  		conn, err := utils.ConnectRemotePostgres(ctx, username, password, database, host)
    46  		if err != nil {
    47  			return err
    48  		}
    49  		defer conn.Close(context.Background())
    50  		if len(schema) == 0 {
    51  			schema, err = diff.LoadUserSchemas(ctx, conn)
    52  			if err != nil {
    53  				return err
    54  			}
    55  		}
    56  	}
    57  
    58  	w := utils.StatusWriter{Program: p}
    59  	// 2. Diff remote db (source) & shadow db (target) and print it.
    60  	target := fmt.Sprintf("postgresql://%s@%s:6543/postgres", url.UserPassword(database, password), host)
    61  	output, err = diff.DiffDatabase(ctx, schema, target, w, fsys)
    62  	return err
    63  }