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 }