Files
server/database/db.go
T
2023-01-13 23:25:41 -07:00

114 lines
2.0 KiB
Go

package database
import (
"time"
"git.ohea.xyz/cursorius/server/config"
"context"
"fmt"
"github.com/jackc/pgx/v5"
"github.com/op/go-logging"
)
var log = logging.MustGetLogger("cursorius-server")
func LaunchDB(conf config.DBConfig) error {
dbURL := fmt.Sprintf(
"postgres://%v:%v@%v:%v/%v",
conf.Username,
conf.Password,
conf.Address,
conf.Port,
conf.Name,
)
dbURLNoPasswd := fmt.Sprintf(
"postgres://%v:********@%v:%v/%v",
conf.Username,
conf.Address,
conf.Port,
conf.Name,
)
log.Infof("Connecting to database with URL \"%v\"", dbURLNoPasswd)
var conn *pgx.Conn
var err error
for i := 0; i < 10; i++ {
conn, err = pgx.Connect(context.Background(), dbURL)
if err == nil {
defer conn.Close(context.Background())
break
}
time.Sleep(2 * time.Second)
}
if err != nil {
return fmt.Errorf("Could not open database: %w", err)
}
versionTableExistsQuery := `
SELECT EXISTS (
SELECT FROM pg_tables
WHERE tablename = 'version'
);`
var versionTableExists bool
err = conn.QueryRow(context.Background(), versionTableExistsQuery).Scan(&versionTableExists)
if err != nil {
return fmt.Errorf("Could not check if database was initalized: %w", err)
}
if versionTableExists {
// TODO: migrations
} else {
err = initDB(conn)
if err != nil {
return fmt.Errorf("Could not initalize database: %w", err)
}
}
return nil
}
func initDB(conn *pgx.Conn) error {
createTablesQuery := `
CREATE TABLE version (
version INT NOT NULL
);
CREATE TABLE pipelines (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
url TEXT NOT NULL,
poll_interval INTEGER
);
CREATE TABLE webhooks (
id SERIAL PRIMARY KEY,
type TEXT,
secret TEXT,
pipeline INTEGER,
CONSTRAINT fk_pipeline
FOREIGN KEY(pipeline)
REFERENCES pipelines(id)
);
CREATE TABLE runners (
id SERIAL PRIMARY KEY,
name TEXT,
secret TEXT
);`
_, err := conn.Exec(context.Background(), createTablesQuery)
if err != nil {
return err
}
return nil
}