Application superstructure (or supersingleton, if you want).
Some checks failed
continuous-integration/drone/push Build is failing

Got rid of context thing which misleads due to existance of stdlib's
context package.

Also fixed golangci-lint configuration.

Fixes #20.
This commit is contained in:
2022-08-19 21:52:49 +05:00
parent b87921c811
commit 5fc6d3a181
35 changed files with 589 additions and 440 deletions

View File

@@ -25,19 +25,19 @@
package mysql
import (
"go.dev.pztrn.name/fastpastebin/internal/context"
"go.dev.pztrn.name/fastpastebin/internal/application"
dialectinterface "go.dev.pztrn.name/fastpastebin/internal/database/dialects/interface"
)
var (
ctx *context.Context
app *application.Application
dbAdapter *Database
)
func New(cc *context.Context) {
ctx = cc
func New(cc *application.Application) {
app = cc
//nolint:exhaustruct
dbAdapter = &Database{}
ctx.Database.RegisterDialect(dialectinterface.Interface(Handler{}))
app.Database.RegisterDialect(dialectinterface.Interface(Handler{}))
}

View File

@@ -26,19 +26,19 @@ package migrations
import (
"github.com/pressly/goose"
"go.dev.pztrn.name/fastpastebin/internal/context"
"go.dev.pztrn.name/fastpastebin/internal/application"
)
var ctx *context.Context
var app *application.Application
// New initializes migrations.
func New(cc *context.Context) {
ctx = cc
func New(cc *application.Application) {
app = cc
}
// Migrate launching migrations.
func Migrate() {
ctx.Logger.Info().Msg("Migrating database...")
app.Log.Info().Msg("Migrating database...")
_ = goose.SetDialect("mysql")
goose.AddNamedMigration("1_initial.go", InitialUp, nil)
@@ -47,13 +47,13 @@ func Migrate() {
goose.AddNamedMigration("4_passworded_pastes.go", PasswordedPastesUp, PasswordedPastesDown)
// Add new migrations BEFORE this message.
dbConn := ctx.Database.GetDatabaseConnection()
dbConn := app.Database.GetDatabaseConnection()
if dbConn != nil {
err := goose.Up(dbConn, ".")
if err != nil {
ctx.Logger.Panic().Msgf("Failed to migrate database to latest version: %s", err.Error())
app.Log.Panic().Msgf("Failed to migrate database to latest version: %s", err.Error())
}
} else {
ctx.Logger.Warn().Msg("Current database dialect isn't supporting migrations, skipping")
app.Log.Warn().Msg("Current database dialect isn't supporting migrations, skipping")
}
}

View File

@@ -103,10 +103,10 @@ func (db *Database) GetPagedPastes(page int) ([]structs.Paste, error) {
// Pagination.
startPagination := 0
if page > 1 {
startPagination = (page - 1) * ctx.Config.Pastes.Pagination
startPagination = (page - 1) * app.Config.Pastes.Pagination
}
err := db.db.Select(&pastesRaw, db.db.Rebind("SELECT * FROM `pastes` WHERE private != true ORDER BY id DESC LIMIT ? OFFSET ?"), ctx.Config.Pastes.Pagination, startPagination)
err := db.db.Select(&pastesRaw, db.db.Rebind("SELECT * FROM `pastes` WHERE private != true ORDER BY id DESC LIMIT ? OFFSET ?"), app.Config.Pastes.Pagination, startPagination)
if err != nil {
//nolint:wrapcheck
return nil, err
@@ -142,9 +142,9 @@ func (db *Database) GetPastesPages() int {
}
// Calculate pages.
pages := len(pastes) / ctx.Config.Pastes.Pagination
pages := len(pastes) / app.Config.Pastes.Pagination
// Check if we have any remainder. Add 1 to pages count if so.
if len(pastes)%ctx.Config.Pastes.Pagination > 0 {
if len(pastes)%app.Config.Pastes.Pagination > 0 {
pages++
}
@@ -153,23 +153,23 @@ func (db *Database) GetPastesPages() int {
// Initialize initializes MySQL/MariaDB connection.
func (db *Database) Initialize() {
ctx.Logger.Info().Msg("Initializing database connection...")
app.Log.Info().Msg("Initializing database connection...")
// There might be only user, without password. MySQL/MariaDB driver
// in DSN wants "user" or "user:password", "user:" is invalid.
var userpass string
if ctx.Config.Database.Password == "" {
userpass = ctx.Config.Database.Username
if app.Config.Database.Password == "" {
userpass = app.Config.Database.Username
} else {
userpass = ctx.Config.Database.Username + ":" + ctx.Config.Database.Password
userpass = app.Config.Database.Username + ":" + app.Config.Database.Password
}
dbConnString := fmt.Sprintf("%s@tcp(%s:%s)/%s?parseTime=true&collation=utf8mb4_unicode_ci&charset=utf8mb4", userpass, ctx.Config.Database.Address, ctx.Config.Database.Port, ctx.Config.Database.Database)
ctx.Logger.Debug().Str("DSN", dbConnString).Msgf("Database connection string composed")
dbConnString := fmt.Sprintf("%s@tcp(%s:%s)/%s?parseTime=true&collation=utf8mb4_unicode_ci&charset=utf8mb4", userpass, app.Config.Database.Address, app.Config.Database.Port, app.Config.Database.Database)
app.Log.Debug().Str("DSN", dbConnString).Msgf("Database connection string composed")
dbConn, err := sqlx.Connect("mysql", dbConnString)
if err != nil {
ctx.Logger.Error().Err(err).Msg("Failed to connect to database")
app.Log.Error().Err(err).Msg("Failed to connect to database")
return
}
@@ -177,12 +177,12 @@ func (db *Database) Initialize() {
// Force UTC for current connection.
_ = dbConn.MustExec("SET @@session.time_zone='+00:00';")
ctx.Logger.Info().Msg("Database connection established")
app.Log.Info().Msg("Database connection established")
db.db = dbConn
// Perform migrations.
migrations.New(ctx)
migrations.New(app)
migrations.Migrate()
}
@@ -208,7 +208,7 @@ func (db *Database) Shutdown() {
if db.db != nil {
err := db.db.Close()
if err != nil {
ctx.Logger.Error().Err(err).Msg("Failed to close database connection")
app.Log.Error().Err(err).Msg("Failed to close database connection")
}
}
}