package db import ( "farga/db/types" "github.com/google/uuid" "gorm.io/gorm" "gorm.io/gorm/clause" ) // creates an issue in a given repo func (db *DB) NewIssue(issue *types.Issue) error { return db.Transaction(func(tx *gorm.DB) error { var repo types.Repo // Lock the repo row. if err := tx. Clauses(clause.Locking{Strength: "UPDATE"}). First(&repo).Where("id = ?", issue.RepoID).Error; err != nil { return err } issue.IssueID = repo.NextIssueID repo.NextIssueID++ if err := tx.Save(&repo).Error; err != nil { return err } return tx.Create(issue).Error }) } func (db *DB) NewIssueComment(comment *types.IssueComment) error { return db.Create(comment).Error } // gets an issue from a repo, given the issue's ID. func (db *DB) Issue(repo *types.Repo, issueNumber uint) (types.Issue, error) { var issue types.Issue err := db. Where("repo_id = ? AND issue_id = ?", repo.ID, issueNumber). Preload(clause.Associations). First(&issue).Error return issue, err } func (db *DB) IssueComments(issueID uuid.UUID) ([]types.IssueComment, error) { var comments []types.IssueComment err := db.Preload("User"). Where("issue_id = ?", issueID). Order("created_at ASC"). Find(&comments).Error return comments, err }