2024-02-19 16:33:15 +00:00
|
|
|
package dal
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"database/sql"
|
|
|
|
_ "embed"
|
|
|
|
"errors"
|
2024-06-13 12:25:11 +00:00
|
|
|
"fmt"
|
2024-02-19 16:33:15 +00:00
|
|
|
_ "github.com/lib/pq"
|
2024-03-28 11:53:12 +00:00
|
|
|
"github.com/minio/minio-go/v7"
|
2024-02-19 17:55:07 +00:00
|
|
|
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal/sqlcgen"
|
|
|
|
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/account"
|
2024-04-17 09:30:19 +00:00
|
|
|
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/amo"
|
2024-02-19 17:55:07 +00:00
|
|
|
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/answer"
|
|
|
|
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/question"
|
|
|
|
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/quiz"
|
|
|
|
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/result"
|
2024-03-15 12:31:12 +00:00
|
|
|
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/statistics"
|
2024-02-19 17:55:07 +00:00
|
|
|
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/workers"
|
2024-02-19 16:33:15 +00:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
var errNextDeclined = errors.New("next is declined")
|
|
|
|
|
|
|
|
type DAL struct {
|
2024-03-15 12:31:12 +00:00
|
|
|
conn *sql.DB
|
|
|
|
queries *sqlcgen.Queries
|
|
|
|
AccountRepo *account.AccountRepository
|
|
|
|
AnswerRepo *answer.AnswerRepository
|
|
|
|
QuestionRepo *question.QuestionRepository
|
|
|
|
QuizRepo *quiz.QuizRepository
|
|
|
|
ResultRepo *result.ResultRepository
|
|
|
|
WorkerRepo *workers.WorkerRepository
|
|
|
|
StatisticsRepo *statistics.StatisticsRepository
|
2024-02-19 16:33:15 +00:00
|
|
|
}
|
|
|
|
|
2024-04-13 22:17:46 +00:00
|
|
|
func New(ctx context.Context, cred string, minioClient *minio.Client) (*DAL, error) {
|
2024-02-19 16:33:15 +00:00
|
|
|
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{
|
2024-04-17 09:30:19 +00:00
|
|
|
Queries: queries,
|
|
|
|
Pool: pool,
|
2024-02-19 16:33:15 +00:00
|
|
|
})
|
|
|
|
|
2024-03-28 12:22:54 +00:00
|
|
|
storerAnswer := &answer.StorerAnswer{}
|
2024-03-28 11:53:12 +00:00
|
|
|
|
|
|
|
if minioClient != nil {
|
2024-03-28 12:22:54 +00:00
|
|
|
storerAnswer, err = answer.NewAnswerMinio(ctx, minioClient)
|
2024-03-28 11:53:12 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-02-19 16:33:15 +00:00
|
|
|
answerRepo := answer.NewAnswerRepository(answer.Deps{
|
2024-03-28 11:53:12 +00:00
|
|
|
Queries: queries,
|
|
|
|
Pool: pool,
|
|
|
|
AnswerMinio: storerAnswer,
|
2024-02-19 16:33:15 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
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,
|
|
|
|
})
|
|
|
|
|
2024-03-15 12:31:12 +00:00
|
|
|
statisticsRepo := statistics.NewStatisticsRepo(statistics.Deps{
|
|
|
|
Queries: queries,
|
|
|
|
Pool: pool,
|
|
|
|
})
|
|
|
|
|
2024-02-19 16:33:15 +00:00
|
|
|
return &DAL{
|
2024-03-15 12:31:12 +00:00
|
|
|
conn: pool,
|
|
|
|
queries: queries,
|
|
|
|
AccountRepo: accountRepo,
|
|
|
|
AnswerRepo: answerRepo,
|
|
|
|
QuestionRepo: questionRepo,
|
|
|
|
QuizRepo: quizRepo,
|
|
|
|
ResultRepo: resultRepo,
|
|
|
|
WorkerRepo: workerRepo,
|
|
|
|
StatisticsRepo: statisticsRepo,
|
2024-02-19 16:33:15 +00:00
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) Close() {
|
|
|
|
d.conn.Close()
|
|
|
|
}
|
|
|
|
|
2024-04-17 09:30:19 +00:00
|
|
|
type AmoDal struct {
|
2024-05-02 07:42:31 +00:00
|
|
|
conn *sql.DB
|
|
|
|
queries *sqlcgen.Queries
|
|
|
|
AmoRepo *amo.AmoRepository
|
|
|
|
QuestionRepo *question.QuestionRepository
|
2024-05-04 12:35:52 +00:00
|
|
|
AnswerRepo *answer.AnswerRepository
|
2024-05-07 13:40:29 +00:00
|
|
|
QuizRepo *quiz.QuizRepository
|
2024-06-08 14:12:05 +00:00
|
|
|
AccountRepo *account.AccountRepository
|
2024-04-17 09:30:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewAmoDal(ctx context.Context, cred string) (*AmoDal, 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)
|
|
|
|
|
|
|
|
amoRepo := amo.NewAmoRepository(amo.Deps{
|
|
|
|
Queries: queries,
|
|
|
|
Pool: pool,
|
|
|
|
})
|
|
|
|
|
2024-05-02 07:42:31 +00:00
|
|
|
questionRepo := question.NewQuestionRepository(question.Deps{
|
|
|
|
Queries: queries,
|
|
|
|
Pool: pool,
|
|
|
|
})
|
|
|
|
|
2024-05-04 12:35:52 +00:00
|
|
|
answerRepo := answer.NewAnswerRepository(answer.Deps{
|
|
|
|
Queries: queries,
|
|
|
|
Pool: pool,
|
|
|
|
})
|
|
|
|
|
2024-05-07 13:40:29 +00:00
|
|
|
quizRepo := quiz.NewQuizRepository(quiz.Deps{
|
|
|
|
Queries: queries,
|
|
|
|
Pool: pool,
|
|
|
|
})
|
|
|
|
|
2024-06-08 14:12:05 +00:00
|
|
|
accountRepo := account.NewAccountRepository(account.Deps{
|
|
|
|
Queries: queries,
|
|
|
|
Pool: pool,
|
|
|
|
})
|
|
|
|
|
2024-04-17 09:30:19 +00:00
|
|
|
return &AmoDal{
|
2024-05-02 07:42:31 +00:00
|
|
|
conn: pool,
|
|
|
|
queries: queries,
|
|
|
|
AmoRepo: amoRepo,
|
|
|
|
QuestionRepo: questionRepo,
|
2024-05-04 12:35:52 +00:00
|
|
|
AnswerRepo: answerRepo,
|
2024-05-07 13:40:29 +00:00
|
|
|
QuizRepo: quizRepo,
|
2024-06-08 14:12:05 +00:00
|
|
|
AccountRepo: accountRepo,
|
2024-04-17 09:30:19 +00:00
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *AmoDal) Close(ctx context.Context) error {
|
|
|
|
err := d.conn.Close()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
2024-06-13 12:25:11 +00:00
|
|
|
|
|
|
|
type ClickHouseDAL struct {
|
2024-06-13 12:39:18 +00:00
|
|
|
conn *sql.DB
|
|
|
|
StatisticClickRepo *statistics.StatisticClick
|
2024-06-13 12:25:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewClickHouseDAL(ctx context.Context, cred string) (*ClickHouseDAL, error) {
|
|
|
|
conn, err := sql.Open("clickhouse", cred)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("error open database connection: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
timeoutCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
|
|
|
defer cancel()
|
|
|
|
|
|
|
|
if err := conn.PingContext(timeoutCtx); err != nil {
|
|
|
|
return nil, fmt.Errorf("error ping database: %w", err)
|
|
|
|
}
|
|
|
|
|
2024-06-13 12:39:18 +00:00
|
|
|
statsClickRepo := statistics.NewClickStatistic(statistics.DepsClick{
|
|
|
|
Conn: conn,
|
|
|
|
})
|
|
|
|
|
2024-06-13 12:25:11 +00:00
|
|
|
return &ClickHouseDAL{
|
2024-06-13 12:39:18 +00:00
|
|
|
conn: conn,
|
|
|
|
StatisticClickRepo: statsClickRepo,
|
2024-06-13 12:25:11 +00:00
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *ClickHouseDAL) Close(ctx context.Context) error {
|
|
|
|
return d.conn.Close()
|
|
|
|
}
|