Skip to content

Commit

Permalink
Merge pull request stakwork#2503 from MahtabBukhari/On_Conversion_of_…
Browse files Browse the repository at this point in the history
…a_ticket

On Conversion of a ticket to a bounty remove all tickets from a ticket group
  • Loading branch information
humansinstitute authored Jan 30, 2025
2 parents 578acab + 3db49fa commit 10ed924
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 29 deletions.
1 change: 1 addition & 0 deletions db/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -279,4 +279,5 @@ type Database interface {
ListFileAssets(params ListFileAssetsParams) ([]FileAsset, int64, error)
UpdateFileAsset(asset *FileAsset) error
DeleteFileAsset(id uint) error
DeleteTicketGroup(TicketGroupUUID uuid.UUID) error
}
11 changes: 11 additions & 0 deletions db/tickets.go
Original file line number Diff line number Diff line change
Expand Up @@ -361,3 +361,14 @@ func (db database) DeleteWorkspaceDraftTicket(workspaceUuid string, uuid string)

return nil
}

func (db database) DeleteTicketGroup(TicketGroupUUID uuid.UUID) error {
result := db.db.Where("ticket_group = ?", TicketGroupUUID).Delete(&Tickets{})
if result.Error != nil {
return fmt.Errorf("failed to delete ticket group: %w", result.Error)
}
if result.RowsAffected == 0 {
return errors.New("no tickets found in group")
}
return nil
}
6 changes: 3 additions & 3 deletions handlers/ticket.go
Original file line number Diff line number Diff line change
Expand Up @@ -814,10 +814,10 @@ func (th *ticketHandler) TicketToBounty(w http.ResponseWriter, r *http.Request)
"owner_id", bounty.OwnerID)

// Delete the ticket after successful bounty creation
if err := th.db.DeleteTicket(ticketUUID); err != nil {
logger.Log.Error("failed to delete ticket after bounty creation",
if err := th.db.DeleteTicketGroup(*ticket.TicketGroup); err != nil {
logger.Log.Error("failed to delete ticket group after bounty creation",
"error", err,
"ticket_uuid", ticketUUID)
"ticket_group", ticket.TicketGroup)

w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
Expand Down
68 changes: 59 additions & 9 deletions handlers/ticket_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,47 @@ func TestTicketToBounty(t *testing.T) {
createdTicket, err := db.TestDB.UpdateTicket(ticket)
require.NoError(t, err)

groupUUID := uuid.New()
tickets := []db.Tickets{
{
UUID: uuid.New(),
TicketGroup: &groupUUID,
FeatureUUID: feature.Uuid,
PhaseUUID: phase.Uuid,
Name: "Test Ticket v1",
Description: "Test Description v1",
Status: db.DraftTicket,
Version: 1,
},
{
UUID: uuid.New(),
TicketGroup: &groupUUID,
FeatureUUID: feature.Uuid,
PhaseUUID: phase.Uuid,
Name: "Test Ticket v2",
Description: "Test Description v2",
Status: db.DraftTicket,
Version: 2,
},
{
UUID: uuid.New(),
TicketGroup: &groupUUID,
FeatureUUID: feature.Uuid,
PhaseUUID: phase.Uuid,
Name: "Test Ticket Final",
Description: "Test Description Final",
Status: db.DraftTicket,
Version: 3,
},
}

var latestTicket db.Tickets
for _, ticket := range tickets {
var err error
latestTicket, err = db.TestDB.UpdateTicket(ticket)
require.NoError(t, err)
}

tests := []struct {
name string
ticket string
Expand All @@ -541,8 +582,8 @@ func TestTicketToBounty(t *testing.T) {
wantCode: http.StatusNotFound,
},
{
name: "success - creates bounty from ticket and deletes ticket",
ticket: createdTicket.UUID.String(),
name: "success - creates bounty and deletes all ticket versions",
ticket: latestTicket.UUID.String(),
auth: workspace.OwnerPubKey,
wantCode: http.StatusCreated,
validate: func(t *testing.T, rr *httptest.ResponseRecorder) {
Expand All @@ -555,17 +596,24 @@ func TestTicketToBounty(t *testing.T) {

// Verify bounty was created correctly
bounty := db.TestDB.GetBounty(resp.BountyID)
assert.Equal(t, createdTicket.Name, bounty.Title)
assert.Equal(t, createdTicket.Description, bounty.Description)
assert.Equal(t, createdTicket.PhaseUUID, bounty.PhaseUuid)
assert.Equal(t, latestTicket.Name, bounty.Title)
assert.Equal(t, latestTicket.Description, bounty.Description)
assert.Equal(t, latestTicket.PhaseUUID, bounty.PhaseUuid)
assert.Equal(t, "freelance_job_request", bounty.Type)
assert.Equal(t, uint(21), bounty.Price)
assert.True(t, bounty.Show)

// Verify ticket was deleted
_, err := db.TestDB.GetTicket(createdTicket.UUID.String())
assert.Error(t, err)
assert.Equal(t, "ticket not found", err.Error())
// Verify all ticket versions are deleted
for _, ticket := range tickets {
_, err := db.TestDB.GetTicket(ticket.UUID.String())
assert.Error(t, err)
assert.Equal(t, "ticket not found", err.Error())
}

// Verify getting tickets by group returns no results
groupTickets, err := db.TestDB.GetTicketsByGroup(groupUUID.String())
assert.NoError(t, err)
assert.Empty(t, groupTickets)
},
},
}
Expand Down Expand Up @@ -646,8 +694,10 @@ func TestTicketToBountyConversionAndEditing(t *testing.T) {
require.NoError(t, err)

ticketUUID := uuid.New()
groupUUID := uuid.New()
ticket := db.Tickets{
UUID: ticketUUID,
TicketGroup: &groupUUID,
FeatureUUID: feature.Uuid,
PhaseUUID: phase.Uuid,
Name: "Test Ticket",
Expand Down
59 changes: 42 additions & 17 deletions mocks/Database.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 10ed924

Please sign in to comment.