common/dal/dal.go
2024-02-19 19:33:15 +03:00

117 lines
2.4 KiB
Go

package dal
import (
"context"
"database/sql"
_ "embed"
"errors"
"github.com/golang-migrate/migrate/v4/database/postgres"
_ "github.com/golang-migrate/migrate/v4/source/file"
_ "github.com/lib/pq"
"squiz/client/auth"
"squiz/dal/sqlcgen"
"squiz/repository/account"
"squiz/repository/answer"
"squiz/repository/question"
"squiz/repository/quiz"
"squiz/repository/result"
"squiz/repository/workers"
"time"
)
var errNextDeclined = errors.New("next is declined")
type DAL struct {
conn *sql.DB
authClient *auth.AuthClient
queries *sqlcgen.Queries
AccountRepo *account.AccountRepository
AnswerRepo *answer.AnswerRepository
QuestionRepo *question.QuestionRepository
QuizRepo *quiz.QuizRepository
ResultRepo *result.ResultRepository
WorkerRepo *workers.WorkerRepository
}
func New(ctx context.Context, cred string, authClient *auth.AuthClient) (*DAL, error) {
pool, err := sql.Open("postgres", cred)
if err != nil {
return nil, err
}
timeoutCtx, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
if err := pool.PingContext(timeoutCtx); err != nil {
return nil, err
}
queries := sqlcgen.New(pool)
accountRepo := account.NewAccountRepository(account.Deps{
Queries: queries,
AuthClient: authClient,
Pool: pool,
})
answerRepo := answer.NewAnswerRepository(answer.Deps{
Queries: queries,
Pool: pool,
})
questionRepo := question.NewQuestionRepository(question.Deps{
Queries: queries,
Pool: pool,
})
quizRepo := quiz.NewQuizRepository(quiz.Deps{
Queries: queries,
Pool: pool,
})
resultRepo := result.NewResultRepository(result.Deps{
Queries: queries,
Pool: pool,
})
workerRepo := workers.NewWorkerRepository(workers.Deps{
Queries: queries,
})
return &DAL{
conn: pool,
authClient: authClient,
queries: queries,
AccountRepo: accountRepo,
AnswerRepo: answerRepo,
QuestionRepo: questionRepo,
QuizRepo: quizRepo,
ResultRepo: resultRepo,
WorkerRepo: workerRepo,
}, nil
}
func (d *DAL) Close() {
d.conn.Close()
}
func (d *DAL) Init() error {
driver, err := postgres.WithInstance(d.conn, &postgres.Config{})
if err != nil {
return err
}
m, err := migrate.NewWithDatabaseInstance(
"file://dal/schema",
"postgres", driver,
)
if err != nil {
return err
}
if err := m.Up(); err != nil && err != migrate.ErrNoChange {
return err
}
return nil
}