Skip to content

Commit

Permalink
feat: update init
Browse files Browse the repository at this point in the history
  • Loading branch information
soedirgo committed Nov 25, 2021
1 parent 34c6ea9 commit dafb25e
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 167 deletions.
194 changes: 30 additions & 164 deletions internal/init/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,147 +2,23 @@ package init

import (
"bytes"
"context"
_ "embed"
"errors"
"fmt"
"os"
"path/filepath"
"text/template"

"github.com/charmbracelet/bubbles/progress"
"github.com/charmbracelet/bubbles/spinner"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/docker/docker/api/types"
"github.com/supabase/cli/internal/utils"
)

// TODO: Handle cleanup on SIGINT/SIGTERM.
func Init() error {
// Sanity checks.
{
if _, err := os.ReadDir("supabase"); err == nil {
fmt.Fprintln(
os.Stderr,
"Project already initialized. Remove `supabase` directory to reinitialize.",
)
os.Exit(1)
} else if !errors.Is(err, os.ErrNotExist) {
return err
}

if _, err := utils.GetGitRoot(); err != nil {
return err
}

if err := utils.AssertDockerIsRunning(); err != nil {
return err
}
}

s := spinner.NewModel()
s.Spinner = spinner.Dot
s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("205"))
p := tea.NewProgram(model{spinner: s})

errCh := make(chan error, 1)
go func() {
errCh <- run(p)
p.Send(tea.Quit())
}()

if err := p.Start(); err != nil {
_ = os.RemoveAll("supabase")
return err
}
if errors.Is(ctx.Err(), context.Canceled) {
_ = os.RemoveAll("supabase")
return errors.New("Aborted `supabase init`.")
}
if err := <-errCh; err != nil {
_ = os.RemoveAll("supabase")
return err
}

fmt.Println("Finished `supabase init`.")
return nil
}

type model struct {
spinner spinner.Model
status string
progress *progress.Model
}

func (m model) Init() tea.Cmd {
return spinner.Tick
}

func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
switch msg.Type {
case tea.KeyCtrlC:
// Stop future runs
cancelCtx()
// Stop current runs
utils.DockerRemoveAll()
return m, tea.Quit
default:
return m, nil
}
case spinner.TickMsg:
spinnerModel, cmd := m.spinner.Update(msg)
m.spinner = spinnerModel
return m, cmd
case progress.FrameMsg:
if m.progress == nil {
return m, nil
}

tmp, cmd := m.progress.Update(msg)
progressModel := tmp.(progress.Model)
m.progress = &progressModel
return m, cmd
case utils.StatusMsg:
m.status = string(msg)
return m, nil
case utils.ProgressMsg:
if msg == nil {
m.progress = nil
return m, nil
}

if m.progress == nil {
progressModel := progress.NewModel(progress.WithDefaultGradient())
m.progress = &progressModel
}

return m, m.progress.SetPercent(*msg)
default:
return m, nil
}
}

func (m model) View() string {
var progress string
if m.progress != nil {
progress = "\n\n" + m.progress.View()
}

return m.spinner.View() + m.status + progress
}

const (
latestDbImage = "supabase/postgres:13.3.0" // Latest supabase/postgres image on hosted platform.
latestDbVersion = "130003"
netId = "supabase_init_net"
)
const latestDbVersion = "130003" // Server version of latest supabase/postgres image on hosted platform (supabase/postgres:13.3.0)

var (
ctx, cancelCtx = context.WithCancel(context.Background())

//go:embed templates/extensions_sql
extensionsSql []byte
//go:embed templates/globals_sql
globalsSql []byte
// pg_dump --dbname $DB_URL
//go:embed templates/init_migration_sql
initMigrationSql []byte
Expand All @@ -155,51 +31,37 @@ var (
initGitignore []byte
)

func run(p *tea.Program) error {
defer utils.Docker.NetworkRemove(context.Background(), netId) //nolint:errcheck
_, _ = utils.Docker.NetworkCreate(ctx, netId, types.NetworkCreate{CheckDuplicate: true})

defer utils.DockerRemoveAll()
func Init() error {
if err := run(); err != nil {
_ = os.RemoveAll("supabase")
return err
}

p.Send(utils.StatusMsg("Pulling images..."))
return nil
}

// Pull images.
func run() error {
// Sanity checks.
{
// Don't know deploy db's version yet, so use latest image.
if _, _, err := utils.Docker.ImageInspectWithRaw(ctx, "docker.io/"+latestDbImage); err != nil {
out, err := utils.Docker.ImagePull(
ctx,
"docker.io/"+latestDbImage,
types.ImagePullOptions{},
if _, err := os.ReadDir("supabase"); err == nil {
fmt.Fprintln(
os.Stderr,
"Project already initialized. Remove `supabase` directory to reinitialize.",
)
if err != nil {
return err
}
if err := utils.ProcessPullOutput(out, p); err != nil {
return err
}
os.Exit(1)
} else if !errors.Is(err, os.ErrNotExist) {
return err
}
if _, _, err := utils.Docker.ImageInspectWithRaw(ctx, "docker.io/"+utils.DifferImage); err != nil {
out, err := utils.Docker.ImagePull(
ctx,
"docker.io/"+utils.DifferImage,
types.ImagePullOptions{},
)
if err != nil {
return err
}
if err := utils.ProcessPullOutput(out, p); err != nil {
return err
}

if _, err := utils.GetGitRoot(); err != nil {
return err
}
}

if err := os.Mkdir("supabase", 0755); err != nil {
return err
}

p.Send(utils.StatusMsg("Generating initial migration..."))

// 1. Write `migrations`.
if err := os.Mkdir("supabase/migrations", 0755); err != nil {
return err
Expand All @@ -212,8 +74,11 @@ func run(p *tea.Program) error {
return err
}

// 2. Write `.globals.sql`.
if err := os.WriteFile("supabase/.globals.sql", utils.FallbackGlobalsSql, 0644); err != nil {
// 2. Write `extensions.sql`, `globals.sql`.
if err := os.WriteFile("supabase/extensions.sql", extensionsSql, 0644); err != nil {
return err
}
if err := os.WriteFile("supabase/globals.sql", globalsSql, 0644); err != nil {
return err
}

Expand Down Expand Up @@ -275,5 +140,6 @@ func run(p *tea.Program) error {
}
}

fmt.Println("Finished `supabase init`.")
return nil
}
3 changes: 3 additions & 0 deletions internal/init/templates/extensions_sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
-- Add `CREATE EXTENSION` SQL here. This script is only run on the local
-- database - you are expected to manually install each extension on remote
-- databases.
103 changes: 103 additions & 0 deletions internal/init/templates/globals_sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
--
-- PostgreSQL database cluster dump
--

SET default_transaction_read_only = off;

SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;

--
-- Roles
--

CREATE ROLE anon;
ALTER ROLE anon WITH NOSUPERUSER NOINHERIT NOCREATEROLE NOCREATEDB NOLOGIN NOREPLICATION NOBYPASSRLS;
CREATE ROLE authenticated;
ALTER ROLE authenticated WITH NOSUPERUSER NOINHERIT NOCREATEROLE NOCREATEDB NOLOGIN NOREPLICATION NOBYPASSRLS;
CREATE ROLE authenticator;
ALTER ROLE authenticator WITH NOSUPERUSER NOINHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'postgres';
CREATE ROLE dashboard_user;
ALTER ROLE dashboard_user WITH NOSUPERUSER INHERIT CREATEROLE CREATEDB NOLOGIN REPLICATION NOBYPASSRLS;
CREATE ROLE pgbouncer;
ALTER ROLE pgbouncer WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'postgres';
CREATE ROLE service_role;
ALTER ROLE service_role WITH NOSUPERUSER NOINHERIT NOCREATEROLE NOCREATEDB NOLOGIN NOREPLICATION BYPASSRLS;
CREATE ROLE supabase_admin;
ALTER ROLE supabase_admin WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS PASSWORD 'postgres';
CREATE ROLE supabase_auth_admin;
ALTER ROLE supabase_auth_admin WITH NOSUPERUSER NOINHERIT CREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'postgres';
CREATE ROLE supabase_storage_admin;
ALTER ROLE supabase_storage_admin WITH NOSUPERUSER NOINHERIT CREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'postgres';
--
-- User Configurations
--

--
-- User Config "anon"
--

ALTER ROLE anon SET statement_timeout TO '3s';
--
-- User Configurations
--

--
-- User Config "authenticated"
--

ALTER ROLE authenticated SET statement_timeout TO '8s';
--
-- User Configurations
--

--
-- User Config "postgres"
--

ALTER ROLE postgres SET search_path TO E'\\$user', 'public', 'extensions';
--
-- User Configurations
--

--
-- User Config "supabase_admin"
--

ALTER ROLE supabase_admin SET search_path TO '$user', 'public', 'auth', 'extensions';
--
-- User Configurations
--

--
-- User Config "supabase_auth_admin"
--

ALTER ROLE supabase_auth_admin SET search_path TO 'auth';
--
-- User Configurations
--

--
-- User Config "supabase_storage_admin"
--

ALTER ROLE supabase_storage_admin SET search_path TO 'storage';


--
-- Role memberships
--

GRANT anon TO authenticator GRANTED BY postgres;
GRANT authenticated TO authenticator GRANTED BY postgres;
GRANT service_role TO authenticator GRANTED BY postgres;
GRANT supabase_admin TO authenticator GRANTED BY postgres;




--
-- PostgreSQL database cluster dump complete
--

3 changes: 1 addition & 2 deletions internal/init/templates/init_config
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,5 @@
"db": 54322,
"pgMeta": 54323
},
"dbVersion": "{{ .DbVersion }}",
"excludeSchemas": ["extensions"]
"dbVersion": "{{ .DbVersion }}"
}
2 changes: 1 addition & 1 deletion internal/init/templates/init_gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Supabase
**/supabase/.branches
**/supabase/.temp
**/supabase/.env
**/supabase/.globals.sql

0 comments on commit dafb25e

Please sign in to comment.