package repository import ( "context" "git.sch9.ru/new_gate/ms-tester/internal/models" "github.com/jmoiron/sqlx" ) type ProblemRepository struct { db *sqlx.DB //logger *zap.Logger } func NewProblemRepository(db *sqlx.DB) *ProblemRepository { return &ProblemRepository{ db: db, //logger: logger, } } const createProblemQuery = "INSERT INTO problems (title) VALUES (?) RETURNING id" func (r *ProblemRepository) CreateProblem(ctx context.Context, title string) (int32, error) { const op = "ProblemRepository.CreateProblem" query := r.db.Rebind(createProblemQuery) rows, err := r.db.QueryxContext(ctx, query, title) if err != nil { return 0, handlePgErr(err, op) } defer rows.Close() var id int32 rows.Next() err = rows.Scan(&id) if err != nil { return 0, handlePgErr(err, op) } return id, nil } const readProblemQuery = "SELECT * from problems WHERE id=? LIMIT 1" func (r *ProblemRepository) ReadProblemById(ctx context.Context, id int32) (*models.Problem, error) { const op = "ProblemRepository.ReadProblemById" var problem models.Problem query := r.db.Rebind(readProblemQuery) err := r.db.GetContext(ctx, &problem, query, id) if err != nil { return nil, handlePgErr(err, op) } return &problem, nil } const deleteProblemQuery = "DELETE FROM problems WHERE id=?" func (r *ProblemRepository) DeleteProblem(ctx context.Context, id int32) error { const op = "ProblemRepository.DeleteProblem" query := r.db.Rebind(deleteProblemQuery) _, err := r.db.ExecContext(ctx, query, id) if err != nil { return handlePgErr(err, op) } return nil } const ( ListProblemsQuery = `SELECT id, title, time_limit, memory_limit, created_at, updated_at FROM problems LIMIT ? OFFSET ?` CountProblemsQuery = "SELECT COUNT(*) FROM problems" ) func (r *ProblemRepository) ListProblems(ctx context.Context, page int32, pageSize int32) ([]*models.ProblemListItem, int32, error) { const op = "ContestRepository.ListProblems" if pageSize > 20 || pageSize < 1 { pageSize = 1 } var problems []*models.ProblemListItem query := r.db.Rebind(ListProblemsQuery) err := r.db.SelectContext(ctx, &problems, query, pageSize, (page-1)*pageSize) if err != nil { return nil, 0, handlePgErr(err, op) } var count int32 err = r.db.GetContext(ctx, &count, CountProblemsQuery) if err != nil { return nil, 0, handlePgErr(err, op) } return problems, count, nil }