feat: create migrator

This commit is contained in:
2026-04-15 19:03:51 +03:00
parent 4e6e83795a
commit 65d8f883dc
7 changed files with 100 additions and 2 deletions
+23 -1
View File
@@ -1,10 +1,13 @@
package app
import (
"database/sql"
"fmt"
standartlog "log"
"net"
hubdir "github.com/lorsanstand/HomeOps-Hub/internal/hub"
"github.com/lorsanstand/HomeOps-Hub/internal/hub/migrator"
grpcserv "github.com/lorsanstand/HomeOps-Hub/internal/hub/rpc"
"github.com/lorsanstand/HomeOps-Hub/internal/hub/service/hub_service"
"github.com/lorsanstand/HomeOps-Hub/internal/shared/config"
@@ -29,9 +32,28 @@ func NewApp() *App {
}
func (a *App) Run() {
err := a.hubServe()
migratePGConn, err := sql.Open("pgx", a.cfg.GetURLPostgres())
if err != nil {
a.log.Error().Err(err).Msg("failed to connect to the database")
return
}
defer migratePGConn.Close()
mgrt, err := migrator.NewMigrator(hubdir.MigrationsFS, "migrations")
if err != nil {
a.log.Error().Err(err).Msg("failed create migrator")
return
}
if err = mgrt.ApplyMigrations(migratePGConn); err != nil {
a.log.Error().Err(err).Msg("migrations were not applied")
}
migratePGConn.Close()
err = a.hubServe()
if err != nil {
a.log.Error().Err(err).Msg("failed to start the server")
return
}
}
+6
View File
@@ -0,0 +1,6 @@
package hub
import "embed"
//go:embed migrations/*.sql
var MigrationsFS embed.FS
@@ -0,0 +1,4 @@
DROP INDEX idx_agent_id_id;
DROP INDEX idx_agent_id;
DROP TABLE agents IF EXISTS agents;
@@ -0,0 +1,14 @@
CREATE TABLE agents (
id BIGINT UNIQUE PRIMARY KEY,
agent_id VARCHAR(32) UNIQUE NOT NULL,
agent_name VARCHAR(255),
architecture VARCHAR(10) NOT NULL,
system VARCHAR(10) NOT NULL,
hostname VARCHAR(100) NOT NULL,
version VARCHAR(10) NOT NULL,
capabilities JSON,
registered_at timestamp without time zone DEFAULT now() NOT NULL
);
CREATE UNIQUE INDEX idx_agent_id ON agent (id);
CREATE UNIQUE INDEX idx_agent_id_id On agent (agent_id)
+45
View File
@@ -0,0 +1,45 @@
package migrator
import (
"database/sql"
"embed"
"errors"
"fmt"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/postgres"
"github.com/golang-migrate/migrate/v4/source"
"github.com/golang-migrate/migrate/v4/source/iofs"
)
type Migrator struct {
srcDriver source.Driver
}
func NewMigrator(sqlFiles embed.FS, dirname string) (*Migrator, error) {
d, err := iofs.New(sqlFiles, dirname)
if err != nil {
return nil, fmt.Errorf("failed to initialize migration driver: %w", err)
}
return &Migrator{srcDriver: d}, nil
}
func (m *Migrator) ApplyMigrations(db *sql.DB) error {
driver, err := postgres.WithInstance(db, &postgres.Config{})
if err != nil {
return fmt.Errorf("unable to create db instance: %w", err)
}
migrator, err := migrate.NewWithInstance("migration_embeded_sql_files", m.srcDriver, "psql_db", driver)
if err != nil {
return fmt.Errorf("unable to create migration: %w", err)
}
defer migrator.Close()
if err = migrator.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) {
return fmt.Errorf("unable to apply migrations: %w", err)
}
return nil
}