117 lines
2.4 KiB
Go
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
|
||
|
}
|