2021-02-27 09:13:35 +00:00
|
|
|
package db
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
envutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/env"
|
|
|
|
|
|
|
|
"github.com/go-pg/pg/v10"
|
|
|
|
"github.com/go-pg/pg/v10/orm"
|
|
|
|
"github.com/pkg/errors"
|
2021-02-27 13:01:59 +00:00
|
|
|
"github.com/sethvargo/go-password/password"
|
2021-02-27 09:13:35 +00:00
|
|
|
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
|
|
|
|
)
|
|
|
|
|
2021-02-27 13:01:59 +00:00
|
|
|
var log = logrus.WithField("package", "internal/db")
|
2021-02-27 09:13:35 +00:00
|
|
|
|
|
|
|
type Config struct {
|
|
|
|
DebugHook bool
|
|
|
|
}
|
|
|
|
|
2021-02-27 13:01:59 +00:00
|
|
|
func init() {
|
|
|
|
orm.RegisterTable((*models.QualificationToProfession)(nil))
|
|
|
|
}
|
|
|
|
|
2021-02-27 09:13:35 +00:00
|
|
|
func New(cfg *Config) (*pg.DB, error) {
|
|
|
|
db := pg.Connect(prepareOptions())
|
|
|
|
|
|
|
|
if cfg != nil {
|
|
|
|
if cfg.DebugHook {
|
|
|
|
db.AddQueryHook(DebugHook{
|
2021-02-27 13:01:59 +00:00
|
|
|
Entry: log,
|
2021-02-27 09:13:35 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-27 13:01:59 +00:00
|
|
|
if err := createSchema(db); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2021-02-27 09:13:35 +00:00
|
|
|
return db, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func prepareOptions() *pg.Options {
|
|
|
|
return &pg.Options{
|
|
|
|
User: os.Getenv("DB_USER"),
|
|
|
|
Password: os.Getenv("DB_PASSWORD"),
|
|
|
|
Database: os.Getenv("DB_NAME"),
|
|
|
|
Addr: os.Getenv("DB_HOST") + ":" + os.Getenv("DB_PORT"),
|
|
|
|
PoolSize: envutils.GetenvInt("DB_POOL_SIZE"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func createSchema(db *pg.DB) error {
|
|
|
|
return db.RunInTransaction(context.Background(), func(tx *pg.Tx) error {
|
2021-02-27 13:01:59 +00:00
|
|
|
modelsToCreate := []interface{}{
|
2021-02-27 09:13:35 +00:00
|
|
|
(*models.User)(nil),
|
|
|
|
(*models.Profession)(nil),
|
|
|
|
(*models.Qualification)(nil),
|
|
|
|
(*models.QualificationToProfession)(nil),
|
|
|
|
(*models.Question)(nil),
|
|
|
|
}
|
|
|
|
|
2021-02-27 13:01:59 +00:00
|
|
|
for _, model := range modelsToCreate {
|
2021-02-27 09:13:35 +00:00
|
|
|
err := tx.Model(model).CreateTable(&orm.CreateTableOptions{
|
2021-02-27 09:34:06 +00:00
|
|
|
IfNotExists: true,
|
|
|
|
FKConstraints: true,
|
2021-02-27 09:13:35 +00:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return errors.Wrap(err, "createSchema")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-27 13:46:00 +00:00
|
|
|
total, err := tx.Model(modelsToCreate[0]).Where("role = ?", models.RoleAdmin).Count()
|
2021-02-27 13:01:59 +00:00
|
|
|
if err != nil {
|
|
|
|
return errors.Wrap(err, "createSchema")
|
|
|
|
}
|
|
|
|
if total == 0 {
|
|
|
|
activated := true
|
2021-03-04 18:27:00 +00:00
|
|
|
pswd, err := password.Generate(15, 4, 2, true, false)
|
2021-02-27 13:01:59 +00:00
|
|
|
if err != nil {
|
|
|
|
return errors.Wrap(err, "createSchema")
|
|
|
|
}
|
|
|
|
email := "admin@admin.com"
|
|
|
|
_, err = tx.
|
|
|
|
Model(&models.User{
|
|
|
|
DisplayName: "admin",
|
|
|
|
Email: email,
|
|
|
|
Role: models.RoleAdmin,
|
|
|
|
Activated: &activated,
|
|
|
|
Password: pswd,
|
|
|
|
}).
|
|
|
|
Insert()
|
|
|
|
if err != nil {
|
|
|
|
return errors.Wrap(err, "createSchema")
|
|
|
|
}
|
|
|
|
log.
|
|
|
|
WithField("email", email).
|
|
|
|
WithField("password", pswd).
|
|
|
|
Info("Admin account has been created")
|
|
|
|
}
|
|
|
|
|
2021-02-27 09:13:35 +00:00
|
|
|
return nil
|
|
|
|
})
|
|
|
|
}
|