CreateIssue creates a new issue.
(ctx context.Context, create *IssueMessage)
| 152 | |
| 153 | // CreateIssue creates a new issue. |
| 154 | func (s *Store) CreateIssue(ctx context.Context, create *IssueMessage) (*IssueMessage, error) { |
| 155 | create.Status = storepb.Issue_OPEN |
| 156 | if create.Payload != nil { |
| 157 | create.Payload.Labels = CanonicalizeIssueLabels(create.Payload.Labels) |
| 158 | } |
| 159 | payload, err := protojson.Marshal(create.Payload) |
| 160 | if err != nil { |
| 161 | return nil, errors.Wrapf(err, "failed to marshal issue payload") |
| 162 | } |
| 163 | tsVector := getTSVector(fmt.Sprintf("%s %s", create.Title, create.Description)) |
| 164 | |
| 165 | tx, err := s.GetDB().BeginTx(ctx, nil) |
| 166 | if err != nil { |
| 167 | return nil, errors.Wrapf(err, "failed to begin tx") |
| 168 | } |
| 169 | defer tx.Rollback() |
| 170 | |
| 171 | nextID, err := nextProjectID(ctx, tx, "issue", create.ProjectID) |
| 172 | if err != nil { |
| 173 | return nil, err |
| 174 | } |
| 175 | |
| 176 | q := qb.Q().Space(` |
| 177 | INSERT INTO issue ( |
| 178 | id, |
| 179 | creator, |
| 180 | project, |
| 181 | plan_id, |
| 182 | name, |
| 183 | status, |
| 184 | type, |
| 185 | description, |
| 186 | payload, |
| 187 | ts_vector |
| 188 | ) |
| 189 | VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, |
| 190 | nextID, |
| 191 | create.CreatorEmail, |
| 192 | create.ProjectID, |
| 193 | create.PlanUID, |
| 194 | create.Title, |
| 195 | create.Status.String(), |
| 196 | create.Type.String(), |
| 197 | create.Description, |
| 198 | payload, |
| 199 | tsVector, |
| 200 | ) |
| 201 | |
| 202 | query, args, err := q.ToSQL() |
| 203 | if err != nil { |
| 204 | return nil, errors.Wrapf(err, "failed to build sql") |
| 205 | } |
| 206 | |
| 207 | if _, err := tx.ExecContext(ctx, query, args...); err != nil { |
| 208 | return nil, err |
| 209 | } |
| 210 | |
| 211 | if err := tx.Commit(); err != nil { |
nothing calls this directly
no test coverage detected