Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion schema/providers.go → dbProviders/index.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package schema
package providers

import "fmt"

Expand Down
13 changes: 12 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"encoding/json"
"fmt"
"os"
"strings"
"valkyrie/migration"
"valkyrie/schema"
)

Expand All @@ -22,11 +24,20 @@ func main() {
for _, err := range errs {
fmt.Println(err)
}
os.Exit(1)

}

mig, err := migration.GenerateMigration(schema)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(schema, "", " ")

os.WriteFile("result.json", b, 0644)
if strings.Contains(rawString, `provider = "sqlite"`) {
os.WriteFile("migrate_Sqlite.sql", []byte(mig), 0644)
} else {
os.WriteFile("migrate_Postgres.sql", []byte(mig), 0644)
}
fmt.Println(string(b))
}
78 changes: 78 additions & 0 deletions migrate_Postgres.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
-- +goose Up
CREATE TYPE "user_roles" AS ENUM (
'ADMIN',
'student',
'TEACHER'
);

CREATE TYPE "Clancy" AS ENUM (
'VOICES',
'BLEH'
);

CREATE TABLE "User" (
"twistedID" TEXT NOT NULL,
"email" TEXT NOT NULL,
"phoneNum" TEXT NOT NULL,
"role" "user_roles" NOT NULL DEFAULT 'student',
"referredById" TEXT NULL,
CONSTRAINT "User_pkey" PRIMARY KEY ("twistedID"),
CONSTRAINT "User_email_key" UNIQUE ("email"),
CONSTRAINT "User_email_phoneNum_key" UNIQUE ("email", "phoneNum"),
CONSTRAINT "User_referredById_fkey" FOREIGN KEY ("referredById") REFERENCES "User" ("twistedID")
);

CREATE TABLE "Profile" (
"id" TEXT NOT NULL,
"bio" TEXT NULL,
"userId" TEXT NOT NULL,
CONSTRAINT "Profile_pkey" PRIMARY KEY ("id"),
CONSTRAINT "Profile_userId_key" UNIQUE ("userId"),
CONSTRAINT "Profile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("twistedID")
);

CREATE TABLE "Post" (
"id" TEXT NOT NULL,
"title" TEXT NOT NULL,
"content" TEXT NULL,
"published" BOOLEAN NOT NULL DEFAULT FALSE,
"authorId" TEXT NOT NULL,
CONSTRAINT "Post_pkey" PRIMARY KEY ("id"),
CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User" ("twistedID")
);

CREATE TABLE "Comment" (
"id" TEXT NOT NULL,
"text" TEXT NOT NULL,
"postId" TEXT NOT NULL,
"authorId" TEXT NOT NULL,
CONSTRAINT "Comment_pkey" PRIMARY KEY ("id"),
CONSTRAINT "Comment_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post" ("id"),
CONSTRAINT "Comment_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User" ("twistedID")
);

CREATE TABLE "Category" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
CONSTRAINT "Category_pkey" PRIMARY KEY ("id"),
CONSTRAINT "Category_name_key" UNIQUE ("name")
);

CREATE TABLE "CategoryToPost" (
"postId" TEXT NOT NULL,
"categoryId" INTEGER NOT NULL,
CONSTRAINT "CategoryToPost_pkey" PRIMARY KEY ("postId", "categoryId"),
CONSTRAINT "CategoryToPost_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post" ("id"),
CONSTRAINT "CategoryToPost_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "Category" ("id")
);


-- +goose Down
DROP TABLE IF EXISTS "CategoryToPost";
DROP TABLE IF EXISTS "Category";
DROP TABLE IF EXISTS "Comment";
DROP TABLE IF EXISTS "Post";
DROP TABLE IF EXISTS "Profile";
DROP TABLE IF EXISTS "User";
DROP TYPE IF EXISTS "Clancy";
DROP TYPE IF EXISTS "user_roles";
68 changes: 68 additions & 0 deletions migrate_Sqlite.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
-- +goose Up
PRAGMA foreign_keys = ON;

CREATE TABLE "User" (
"twistedID" TEXT NOT NULL,
"email" TEXT NOT NULL,
"phoneNum" TEXT NOT NULL,
"role" TEXT NOT NULL DEFAULT 'student' CHECK ("role" IN ('ADMIN', 'student', 'TEACHER')),
"referredById" TEXT NULL,
CONSTRAINT "User_pkey" PRIMARY KEY ("twistedID"),
CONSTRAINT "User_email_key" UNIQUE ("email"),
CONSTRAINT "User_email_phoneNum_key" UNIQUE ("email", "phoneNum"),
CONSTRAINT "User_referredById_fkey" FOREIGN KEY ("referredById") REFERENCES "User" ("twistedID")
);

CREATE TABLE "Profile" (
"id" TEXT NOT NULL,
"bio" TEXT NULL,
"userId" TEXT NOT NULL,
CONSTRAINT "Profile_pkey" PRIMARY KEY ("id"),
CONSTRAINT "Profile_userId_key" UNIQUE ("userId"),
CONSTRAINT "Profile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("twistedID")
);

CREATE TABLE "Post" (
"id" TEXT NOT NULL,
"title" TEXT NOT NULL,
"content" TEXT NULL,
"published" INTEGER NOT NULL DEFAULT FALSE,
"authorId" TEXT NOT NULL,
CONSTRAINT "Post_pkey" PRIMARY KEY ("id"),
CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User" ("twistedID")
);

CREATE TABLE "Comment" (
"id" TEXT NOT NULL,
"text" TEXT NOT NULL,
"postId" TEXT NOT NULL,
"authorId" TEXT NOT NULL,
CONSTRAINT "Comment_pkey" PRIMARY KEY ("id"),
CONSTRAINT "Comment_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post" ("id"),
CONSTRAINT "Comment_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User" ("twistedID")
);

CREATE TABLE "Category" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT NOT NULL,
CONSTRAINT "Category_name_key" UNIQUE ("name")
);

CREATE TABLE "CategoryToPost" (
"postId" TEXT NOT NULL,
"categoryId" INTEGER NOT NULL,
CONSTRAINT "CategoryToPost_pkey" PRIMARY KEY ("postId", "categoryId"),
CONSTRAINT "CategoryToPost_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post" ("id"),
CONSTRAINT "CategoryToPost_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "Category" ("id")
);


-- +goose Down
PRAGMA foreign_keys = ON;

DROP TABLE IF EXISTS "CategoryToPost";
DROP TABLE IF EXISTS "Category";
DROP TABLE IF EXISTS "Comment";
DROP TABLE IF EXISTS "Post";
DROP TABLE IF EXISTS "Profile";
DROP TABLE IF EXISTS "User";
25 changes: 19 additions & 6 deletions migration/dialect.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,53 @@ package migration

import (
"strings"
providers "valkyrie/dbProviders"
"valkyrie/schema"
)

type Dialect interface {
GetSQLType(sf *schema.ScalarField) string
GetSQLDefault(dv *schema.DefaultValue, pslType string) string
QuoteIdent(name string) string

GenerateEnum(enum *schema.Enum) string
FormatAutoIncrement(sqlType string) (typeOverride string, extraKeyword string)
FormatSinglePK(tableName, colName string, isAutoInc bool) (inlineSQL string, tableConstraint string)
FormatEnumConstraint(colName string, enum *schema.Enum) string
}

func GetDialect(provider schema.DbProvider) Dialect {
func GetDialect(provider providers.DbProvider) Dialect {
switch provider {
case schema.Mysql:

case providers.Mysql:
return nil //TODO
case schema.Postgres, schema.Postgresql:

case providers.Postgres, providers.Postgresql:
return &PostgresDialect{}
case schema.Sqlite:

case providers.Sqlite:
return &SqliteDialect{}

default:
return nil

}
}

func getSQLType(sf *schema.ScalarField, provider schema.DbProvider) string {
func getSQLType(sf *schema.ScalarField, provider providers.DbProvider) string {
dialect := GetDialect(provider)
if dialect == nil {
return strings.ToUpper(sf.SQLType)
}

return dialect.GetSQLType(sf)
}

func getSQLDefault(dv *schema.DefaultValue, pslType string, provider schema.DbProvider) string {
func getSQLDefault(dv *schema.DefaultValue, pslType string, provider providers.DbProvider) string {
dialect := GetDialect(provider)
if dialect == nil {
return ""
}

return dialect.GetSQLDefault(dv, pslType)
}
37 changes: 37 additions & 0 deletions migration/dropTablesAndEnums.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package migration

import (
"fmt"
"strings"
"valkyrie/schema"
)

type dropProps struct {
schemaDef schema.Schema
dialect Dialect
downBuilder *strings.Builder
}

func dropTables(schemaDef *schema.Schema, dialect Dialect, downBuilder *strings.Builder) {
for i := len(schemaDef.Models) - 1; i >= 0; i-- {
model := schemaDef.Models[i]
tableName := model.TableName
if tableName == "" {
tableName = model.Name
}
fmt.Fprintf(downBuilder, "DROP TABLE IF EXISTS %s;\n", dialect.QuoteIdent(tableName))
}
}

func dropEnums(schemaDef *schema.Schema, dialect Dialect, downBuilder *strings.Builder) {
for i := len(schemaDef.Enums) - 1; i >= 0; i-- {
enum := schemaDef.Enums[i]
name := enum.Name
if enum.TableMapName != "" {
name = enum.TableMapName
}
if dialect.GenerateEnum(enum) != "" {
fmt.Fprintf(downBuilder, "DROP TYPE IF EXISTS %s;\n", dialect.QuoteIdent(name))
}
}
}
Loading
Loading