From 991db9ea7a0cb0b0b90182abc1551d5714b93b96 Mon Sep 17 00:00:00 2001 From: "Gustavo \"Guz\" L de Mello" Date: Mon, 9 Jun 2025 19:24:59 -0300 Subject: [PATCH] feat(repo): create projects --- repository/project.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/repository/project.go b/repository/project.go index 884c6d3..df57bfc 100644 --- a/repository/project.go +++ b/repository/project.go @@ -6,6 +6,7 @@ import ( "errors" "log/slog" + "forge.capytal.company/capytalcode/project-comicverse/model" "forge.capytal.company/loreddev/x/tinyssert" ) @@ -39,3 +40,44 @@ func NewProjectRepository(ctx context.Context, db *sql.DB, log *slog.Logger, ass return &ProjectRepository{baseRepostiory: b}, nil } +func (repo ProjectRepository) Create(p model.Project) error { + repo.assert.NotNil(repo.db) + repo.assert.NotNil(repo.ctx) + repo.assert.NotNil(repo.ctx) + + if err := p.Validate(); err != nil { + return errors.Join(ErrInvalidData, err) + } + + tx, err := repo.db.BeginTx(repo.ctx, nil) + if err != nil { + return errors.Join(ErrDatabaseConn, err) + } + + q := ` + INSERT INTO users (uuid, title, created_at, updated_at) + VALUES (:uuid, :title, :created_at, :updated_at) + ` + + log := repo.log.With(slog.String("uuid", p.UUID.String()), slog.String("query", q)) + log.DebugContext(repo.ctx, "Inserting new project") + + _, err = tx.ExecContext(repo.ctx, q, + sql.Named("uuid", p.UUID), + sql.Named("title", p.Title), + sql.Named("created_at", p.DateCreated.Format(dateFormat)), + sql.Named("updated_at", p.DateUpdated.Format(dateFormat)), + ) + if err != nil { + log.ErrorContext(repo.ctx, "Failed to insert project", slog.String("error", err.Error())) + return errors.Join(ErrExecuteQuery, err) + } + + if err := tx.Commit(); err != nil { + log.ErrorContext(repo.ctx, "Failed to commit transaction", slog.String("error", err.Error())) + return errors.Join(ErrCommitQuery, err) + } + + return nil +} +