mirror of
https://github.com/sysadminsmedia/homebox.git
synced 2025-12-21 13:23:14 +01:00
* [VNEXT] feat: Multi-DB type support (#291) * feat: Multi-DB type URL formats and config * fix: remove legacy sqlite path config and minor other things * fix: dumb eslint issues * fix: dumb eslint issues * fix: application can be tested with sqlite * fix: minor config formatting * chore: some cleanup * feat: postgres migration creation now works The migration creation for postgres now works properly. Removed MySQL support, having too many issues with it at this time. * chore: revert some strings back to bytes as they should be * feat: improve languages support * feat: add locale time ago formatting and the local name for the language in language dropdown * Update FUNDING.yml * chore: remove some more mysql stuff * fix: coderabbit security recommendations * fix: validate postgres sslmode * Update migrations.go * fix: postgres migration creation now works * fix: errors in raw sql queries * fix: lint error, and simpler SQL query * fix: migrations directory string * fix: stats related test * fix: sql query * Update TextArea.vue * Update TextField.vue * chore: run integration testing on multiple postgresql versions * chore: jobs should run for vnext branch PRs * fix: missed $ for Postgres testing * fix: environment variable for db ssl mode * fix: lint issue from a merge * chore: trying to fix postgresql testing * chore: trying to fix postgresql testing * fix: trying to fix postgresql testing * fix: trying to fix postgresql testing --------- Co-authored-by: tonya <tonya@tokia.dev> * fix: publish docker vnext branch * Add upgrade guide documentation * chore: add new config options to documentation * Update vnext (#314) * feat: make 404 follow theme and add a return home page * feat: sanitise translations when using v-html * chore: Add native API docs to website * chore: remove try it button from api docs --------- Co-authored-by: tonyaellie <tonya@tokia.dev> * Update Dockerfile Update dockerfile to test the theory of data folder breaking in vnext * fix: broken docker image * fix: statistics * feat: support mm, cm and inches for label generation * [VNEXT] feat: Multi-DB type support (#291) * feat: Multi-DB type URL formats and config * fix: remove legacy sqlite path config and minor other things * fix: dumb eslint issues * fix: dumb eslint issues * fix: application can be tested with sqlite * fix: minor config formatting * chore: some cleanup * feat: postgres migration creation now works The migration creation for postgres now works properly. Removed MySQL support, having too many issues with it at this time. * chore: revert some strings back to bytes as they should be * feat: improve languages support * feat: add locale time ago formatting and the local name for the language in language dropdown * Update FUNDING.yml * chore: remove some more mysql stuff * fix: coderabbit security recommendations * fix: validate postgres sslmode * Update migrations.go * fix: postgres migration creation now works * fix: errors in raw sql queries * fix: lint error, and simpler SQL query * fix: migrations directory string * fix: stats related test * fix: sql query * Update TextArea.vue * Update TextField.vue * chore: run integration testing on multiple postgresql versions * chore: jobs should run for vnext branch PRs * fix: missed $ for Postgres testing * fix: environment variable for db ssl mode * fix: lint issue from a merge * chore: trying to fix postgresql testing * chore: trying to fix postgresql testing * fix: trying to fix postgresql testing * fix: trying to fix postgresql testing --------- Co-authored-by: tonya <tonya@tokia.dev> * fix: publish docker vnext branch * Add upgrade guide documentation * chore: add new config options to documentation * Update Dockerfile Update dockerfile to test the theory of data folder breaking in vnext * fix: broken docker image * fix: statistics * feat: support mm, cm and inches for label generation * Update go dependencies * Update documentation * Slight update to docker actions * Small doc update * More doc changes * Sort out migrations * Temp fix to broken stats test * Update dependencies * Update documentation * Fix broken merge * Fix docker image sqlite path * Fix minor taskfile issue --------- Co-authored-by: tonya <tonya@tokia.dev> Co-authored-by: Katos <7927609+katosdev@users.noreply.github.com>
109 lines
3.0 KiB
Go
109 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/sysadminsmedia/homebox/backend/internal/sys/config"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/sysadminsmedia/homebox/backend/internal/data/ent/migrate"
|
|
|
|
atlas "ariga.io/atlas/sql/migrate"
|
|
_ "ariga.io/atlas/sql/sqlite"
|
|
"entgo.io/ent/dialect"
|
|
"entgo.io/ent/dialect/sql/schema"
|
|
|
|
_ "github.com/lib/pq"
|
|
_ "github.com/mattn/go-sqlite3"
|
|
)
|
|
|
|
func main() {
|
|
cfg, err := config.New(build(), "Homebox inventory management system")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
sqlDialect := ""
|
|
switch strings.ToLower(cfg.Database.Driver) {
|
|
case "sqlite3":
|
|
sqlDialect = dialect.SQLite
|
|
case "postgres":
|
|
sqlDialect = dialect.Postgres
|
|
default:
|
|
log.Fatalf("unsupported database driver: %s", cfg.Database.Driver)
|
|
}
|
|
ctx := context.Background()
|
|
// Create a local migration directory able to understand Atlas migration file format for replay.
|
|
safePath := filepath.Clean(fmt.Sprintf("internal/data/migrations/%s", sqlDialect))
|
|
dir, err := atlas.NewLocalDir(safePath)
|
|
if err != nil {
|
|
log.Fatalf("failed creating atlas migration directory: %v", err)
|
|
}
|
|
// Migrate diff options.
|
|
opts := []schema.MigrateOption{
|
|
schema.WithDir(dir), // provide migration directory
|
|
schema.WithMigrationMode(schema.ModeReplay), // provide migration mode
|
|
schema.WithDialect(sqlDialect), // Ent dialect to use
|
|
schema.WithFormatter(atlas.DefaultFormatter),
|
|
schema.WithDropIndex(true),
|
|
schema.WithDropColumn(true),
|
|
}
|
|
if len(os.Args) != 2 {
|
|
log.Fatalln("migration name is required. Use: 'go run -mod=mod ent/migrate/main.go <name>'")
|
|
}
|
|
|
|
if sqlDialect == dialect.Postgres {
|
|
if !validatePostgresSSLMode(cfg.Database.SslMode) {
|
|
log.Fatalf("invalid sslmode: %s", cfg.Database.SslMode)
|
|
}
|
|
}
|
|
|
|
databaseURL := ""
|
|
switch {
|
|
case cfg.Database.Driver == "sqlite3":
|
|
databaseURL = fmt.Sprintf("sqlite://%s", cfg.Database.SqlitePath)
|
|
case cfg.Database.Driver == "postgres":
|
|
databaseURL = fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=%s", cfg.Database.Username, cfg.Database.Password, cfg.Database.Host, cfg.Database.Port, cfg.Database.Database, cfg.Database.SslMode)
|
|
default:
|
|
log.Fatalf("unsupported database driver: %s", cfg.Database.Driver)
|
|
}
|
|
|
|
// Generate migrations using Atlas support for MySQL (note the Ent dialect option passed above).
|
|
err = migrate.NamedDiff(ctx, databaseURL, os.Args[1], opts...)
|
|
if err != nil {
|
|
log.Fatalf("failed generating migration file: %v", err)
|
|
}
|
|
|
|
fmt.Println("Migration file generated successfully.")
|
|
}
|
|
|
|
var (
|
|
version = "nightly"
|
|
commit = "HEAD"
|
|
buildTime = "now"
|
|
)
|
|
|
|
func build() string {
|
|
short := commit
|
|
if len(short) > 7 {
|
|
short = short[:7]
|
|
}
|
|
|
|
return fmt.Sprintf("%s, commit %s, built at %s", version, short, buildTime)
|
|
}
|
|
|
|
func validatePostgresSSLMode(sslMode string) bool {
|
|
validModes := map[string]bool{
|
|
"": true,
|
|
"disable": true,
|
|
"allow": true,
|
|
"prefer": true,
|
|
"require": true,
|
|
"verify-ca": true,
|
|
"verify-full": true,
|
|
}
|
|
return validModes[strings.ToLower(strings.TrimSpace(sslMode))]
|
|
}
|