Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

On Conversion of a ticket to a bounty remove all tickets from a ticket group #2503

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.

Loading