package db import ( "farga/db/types" "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, "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 }) } // gets an issue from a repo, given the issue's ID. func (db *DB) GetIssue(issueID uint) (types.Issue, error) { issue := types.Issue{ IssueID: issueID, } err := db.Preload(clause.Associations).First(&issue).Error return issue, err }