diff --git a/internal/storage/problem.go b/internal/storage/problem.go new file mode 100644 index 0000000..ba32b61 --- /dev/null +++ b/internal/storage/problem.go @@ -0,0 +1,84 @@ +package storage + +import ( + "context" + "errors" + "git.sch9.ru/new_gate/ms-auth/internal/lib" + "git.sch9.ru/new_gate/ms-auth/internal/models" + "github.com/jackc/pgerrcode" + "github.com/jackc/pgx/v5/pgconn" + "github.com/jmoiron/sqlx" + "go.uber.org/zap" + "time" +) + +type ProblemStorage struct { + db *sqlx.DB + logger *zap.Logger +} + +func NewProblemStorage(db *sqlx.DB, logger *zap.Logger) *ProblemStorage { + return &ProblemStorage{ + db: db, + logger: logger, + } +} + +func (storage *ProblemStorage) CreateProblem(ctx context.Context, problem *models.Problem) (int32, error) { + query := storage.db.Rebind(` +INSERT INTO problems + (name,description,time_limit,memory_limit) +VALUES (?, ?, ?, ?) +RETURNING id +`) + + rows, err := storage.db.QueryxContext( + ctx, + query, + problem.Name, + problem.Description, + problem.TimeLimit, + problem.MemoryLimit + ) + if err != nil { + return 0, storage.HandlePgErr(err) + } + + defer rows.Close() + var id int32 + err = rows.StructScan(&id) + if err != nil { + return 0, storage.HandlePgErr(err) + } + + return id, nil +} + +func (storage *ProblemStorage) ReadProblemById(ctx context.Context, id int32) (*models.Problem, error) { + var problem models.Problem + query := storage.db.Rebind("SELECT * from problems WHERE id=? LIMIT 1") + err := storage.db.GetContext(ctx, &problem, query, id) + if err != nil { + return nil, storage.HandlePgErr(err) + } + return &problem, nil +} + +func (storage *ProblemStorage) UpdateProblem(ctx context.Context, id int32,problem models.Problem) error { + query := storage.db.Rebind("UPDATE problems SET name=?,description=?,time_limit=?,memory_limit=?") + _, err := storage.db.ExecContext(ctx, query, problem.Name,Problem.Description,problem.TimeLimit,problem.MemoryLimit) + if err != nil { + return storage.HandlePgErr(err) + } +} + +func (storage *ProblemStorage) DeleteProblem(ctx context.Context, id int32) error { + query := storage.db.Rebind("DELETE FROM problems WHERE id=?") + _, err := storage.db.ExecContext(ctx, query, id) + if err != nil { + return storage.HandlePgErr(err) + } + + return nil +} +