106 lines
2.7 KiB
Go
106 lines
2.7 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
commonUtils "git.mic.pp.ua/anderson/nettools/common"
|
|
dbUtils "git.mic.pp.ua/anderson/nettools/db"
|
|
"github.com/golang-migrate/migrate/v4/database/pgx/v5"
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
_ "github.com/jackc/pgx/v5/stdlib"
|
|
"github.com/matchsystems/werr"
|
|
"log"
|
|
"mic-wallet/server/core"
|
|
"mic-wallet/server/repository"
|
|
"net"
|
|
"net/http"
|
|
"runtime"
|
|
"time"
|
|
)
|
|
|
|
func (s *Server) Setup(ctx context.Context) error {
|
|
// ===================
|
|
// Setting up database
|
|
|
|
var db *sql.DB
|
|
var err error
|
|
success, errs := commonUtils.Retry(ctx, 5, time.Second*1, func(_ context.Context) error {
|
|
db, err = sql.Open("pgx", s.Cfg.DbConnUrl)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return db.Ping()
|
|
})
|
|
if !success {
|
|
return werr.Wrapf(errs[0], "failed to connect to database")
|
|
}
|
|
|
|
log.Println("Applying database migrations")
|
|
ver, dirty, err := dbUtils.DoMigrate(dbUtils.MigrationConfig[*pgx.Config]{
|
|
MigrationsPath: "./migrations",
|
|
DB: db,
|
|
VersionLimit: -1,
|
|
Drop: false,
|
|
DriverCfg: &pgx.Config{
|
|
MigrationsTable: "migrations",
|
|
SchemaName: "public",
|
|
},
|
|
}, dbUtils.NewMigratePgxInstance)
|
|
if err != nil {
|
|
return werr.Wrapf(err, "failed to apply database migrations")
|
|
}
|
|
log.Println("Database migrations applied")
|
|
log.Println("\tVersion: ", ver)
|
|
log.Println("\tDirty: ", dirty)
|
|
|
|
if err = db.Close(); err != nil {
|
|
return werr.Wrapf(err, "failed to close database connection")
|
|
}
|
|
s.DB, err = pgxpool.New(ctx, s.Cfg.DbConnUrl)
|
|
if err != nil {
|
|
return werr.Wrapf(err, "failed to create new pgxpool")
|
|
}
|
|
|
|
// ========================
|
|
// Internals initialization
|
|
|
|
s.Repo = repository.NewRepository(s.DB)
|
|
|
|
commiterWorkersLim := runtime.NumCPU() - 1
|
|
if commiterWorkersLim < 1 {
|
|
commiterWorkersLim = 1
|
|
}
|
|
s.BlocksCommiter = core.NewBlocksCommiter(s.Repo, s.ErrChan, commiterWorkersLim)
|
|
s.BlocksCreator = core.NewBlocksCreator(s.BlocksCommiter)
|
|
|
|
// ======================
|
|
// Creating net listeners
|
|
|
|
if s.Cfg.HttpPort > 0 || s.Cfg.HttpsPort > 0 {
|
|
s.Mux = http.NewServeMux()
|
|
}
|
|
if s.Cfg.HttpPort > 0 {
|
|
addr := fmt.Sprintf("%s:%d", s.Cfg.Addr, s.Cfg.HttpPort)
|
|
s.HttpListener, err = net.Listen("tcp", addr)
|
|
if err != nil {
|
|
return werr.Wrapf(err, "failed to listen http on address %s", addr)
|
|
}
|
|
}
|
|
if s.Cfg.HttpsPort > 0 {
|
|
addr := fmt.Sprintf("%s:%d", s.Cfg.Addr, s.Cfg.HttpsPort)
|
|
s.HttpListener, err = net.Listen("tcp", addr)
|
|
if err != nil {
|
|
return werr.Wrapf(err, "failed to listen https on address %s", addr)
|
|
}
|
|
}
|
|
if s.Cfg.GrpcPort > 0 {
|
|
addr := fmt.Sprintf("%s:%d", s.Cfg.Addr, s.Cfg.GrpcPort)
|
|
s.GrpcListener, err = net.Listen("tcp", addr)
|
|
if err != nil {
|
|
return werr.Wrapf(err, "failed to listen grpc on address %s", addr)
|
|
}
|
|
}
|
|
return nil
|
|
}
|