common/dal/dal.go

303 lines
6.6 KiB
Go
Raw Permalink Normal View History

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-06-19 14:39:51 +00:00
_ "github.com/ClickHouse/clickhouse-go"
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"
2025-02-21 13:40:10 +00:00
"gitea.pena/SQuiz/common/dal/sqlcgen"
"gitea.pena/SQuiz/common/repository/account"
"gitea.pena/SQuiz/common/repository/amo"
"gitea.pena/SQuiz/common/repository/answer"
"gitea.pena/SQuiz/common/repository/question"
2025-05-13 13:40:18 +00:00
"gitea.pena/SQuiz/common/repository/bitrix"
2025-02-21 13:40:10 +00:00
"gitea.pena/SQuiz/common/repository/quiz"
"gitea.pena/SQuiz/common/repository/result"
"gitea.pena/SQuiz/common/repository/statistics"
"gitea.pena/SQuiz/common/repository/tg"
"gitea.pena/SQuiz/common/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
WorkerAnsRepo *answer.WorkerAnswerRepository
2024-06-27 19:30:57 +00:00
TgRepo *tg.TgRepo
2024-02-19 16:33:15 +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
}
}
workerAnsRepo := answer.NewWorkerAnswerRepo(answer.Deps{
2024-03-28 11:53:12 +00:00
Queries: queries,
Pool: pool,
AnswerMinio: storerAnswer,
2024-02-19 16:33:15 +00:00
})
answerRepo := answer.NewAnswerRepository(answer.Deps{
Queries: queries,
Pool: pool,
})
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-06-27 19:30:57 +00:00
tgRepo := tg.NewTgRepo(tg.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,
WorkerAnsRepo: workerAnsRepo,
2024-06-27 19:30:57 +00:00
TgRepo: tgRepo,
2024-02-19 16:33:15 +00:00
}, nil
}
2024-10-25 13:04:05 +00:00
func (d *DAL) Close(ctx context.Context) error {
err := d.conn.Close()
if err != nil {
return err
}
return nil
2024-02-19 16:33:15 +00:00
}
2024-04-17 09:30:19 +00:00
type AmoDal struct {
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
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,
})
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,
})
accountRepo := account.NewAccountRepository(account.Deps{
Queries: queries,
Pool: pool,
})
2024-04-17 09:30:19 +00:00
return &AmoDal{
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,
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
2025-05-13 13:40:18 +00:00
type BitrixDal struct {
conn *sql.DB
queries *sqlcgen.Queries
BitrixRepo *bitrix.BitrixRepository
QuizRepo *quiz.QuizRepository
QuestionRepo *question.QuestionRepository
AccountRepo *account.AccountRepository
AnswerRepo *answer.AnswerRepository
}
func NewBitrixDal(ctx context.Context, cred string) (*BitrixDal, 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)
bitrixRepo := bitrix.NewBitrixRepository(bitrix.Deps{
Queries: queries,
Pool: pool,
})
quizRepo := quiz.NewQuizRepository(quiz.Deps{
Queries: queries,
Pool: pool,
})
questionRepo := question.NewQuestionRepository(question.Deps{
Queries: queries,
Pool: pool,
})
accountRepo := account.NewAccountRepository(account.Deps{
Queries: queries,
Pool: pool,
})
answerRepo := answer.NewAnswerRepository(answer.Deps{
Queries: queries,
Pool: pool,
})
return &BitrixDal{
conn: pool,
queries: queries,
BitrixRepo: bitrixRepo,
QuizRepo: quizRepo,
QuestionRepo: questionRepo,
AccountRepo: accountRepo,
AnswerRepo: answerRepo,
}, nil
}
func (d *BitrixDal) 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-07-02 08:18:00 +00:00
statsClickRepo := statistics.NewClickStatistic(statistics.DepsClick{
2024-06-13 12:39:18 +00:00
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()
}