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"}). Model(&repo).Where(&types.Repo{UUID_ID: types.UUID_ID{ID: *issue.RepoID}}). First(&repo).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 }) } // closes an issue, only the repo owner may call this. func (db *DB) CloseIssue(issue *types.Issue) error { return db.Model(issue).Update("status", "closed").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 }