Skip to content

Commit

Permalink
Merge pull request stakwork#2475 from aliraza556/feature/workspace-dr…
Browse files Browse the repository at this point in the history
…aft-tickets

Add Support for Workspace Draft Tickets
  • Loading branch information
humansinstitute authored Jan 21, 2025
2 parents c9afbbd + 8052fa9 commit b88b803
Show file tree
Hide file tree
Showing 8 changed files with 1,042 additions and 17 deletions.
4 changes: 4 additions & 0 deletions db/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -263,4 +263,8 @@ type Database interface {
GetNotificationsByPubKey(pubKey string, limit, offset int) ([]Notification, error)
IncrementRetryCount(uuid string) error
GetNotificationCount(pubKey string) (int64, error)
GetWorkspaceDraftTicket(workspaceUuid string, uuid string) (Tickets, error)
CreateWorkspaceDraftTicket(ticket *Tickets) (Tickets, error)
UpdateWorkspaceDraftTicket(ticket *Tickets) (Tickets, error)
DeleteWorkspaceDraftTicket(workspaceUuid string, uuid string) error
}
34 changes: 18 additions & 16 deletions db/structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -1020,23 +1020,25 @@ const (
)

type Tickets struct {
UUID uuid.UUID `gorm:"primaryKey;type:uuid"`
TicketGroup *uuid.UUID `gorm:"type:uuid;index:group_index" json:"ticket_group,omitempty"`
FeatureUUID string `gorm:"type:varchar(255);index:composite_index" json:"feature_uuid"`
Features WorkspaceFeatures `gorm:"foreignKey:FeatureUUID;references:Uuid"`
PhaseUUID string `gorm:"type:varchar(255);index:phase_index" json:"phase_uuid"`
FeaturePhase FeaturePhase `gorm:"foreignKey:PhaseUUID;references:Uuid"`
Name string `gorm:"type:varchar(255)" json:"name"`
Sequence int `gorm:"type:integer;index:composite_index;default:0" json:"sequence"`
Dependency []int `gorm:"type:integer[]" json:"dependency"`
Description string `gorm:"type:text" json:"description"`
Status TicketStatus `gorm:"type:varchar(50);default:'DRAFT'" json:"status"`
Version int `gorm:"type:integer;default:0" json:"version"`
Author *Author `gorm:"type:varchar(50)" json:"author,omitempty"`
AuthorID *string `gorm:"type:varchar(255)" json:"author_id,omitempty"`
CreatedAt time.Time `gorm:"type:timestamp;default:current_timestamp" json:"created_at"`
UpdatedAt time.Time `gorm:"type:timestamp;default:current_timestamp" json:"updated_at"`
UUID uuid.UUID `gorm:"primaryKey;type:uuid"`
TicketGroup *uuid.UUID `gorm:"type:uuid;index:group_index" json:"ticket_group,omitempty"`
WorkspaceUuid string `gorm:"type:varchar(255);index:workspace_index" json:"workspace_uuid"`
FeatureUUID string `gorm:"type:varchar(255);index:composite_index;default:null" json:"feature_uuid"`
Features WorkspaceFeatures `gorm:"foreignKey:FeatureUUID;references:Uuid;constraint:OnDelete:SET NULL"`
PhaseUUID string `gorm:"type:varchar(255);index:phase_index;default:null" json:"phase_uuid"`
FeaturePhase FeaturePhase `gorm:"foreignKey:PhaseUUID;references:Uuid;constraint:OnDelete:SET NULL"`
Name string `gorm:"type:varchar(255)" json:"name"`
Sequence int `gorm:"type:integer;index:composite_index;default:0" json:"sequence"`
Dependency []int `gorm:"type:integer[]" json:"dependency"`
Description string `gorm:"type:text" json:"description"`
Status TicketStatus `gorm:"type:varchar(50);default:'DRAFT'" json:"status"`
Version int `gorm:"type:integer;default:0" json:"version"`
Author *Author `gorm:"type:varchar(50)" json:"author,omitempty"`
AuthorID *string `gorm:"type:varchar(255)" json:"author_id,omitempty"`
CreatedAt time.Time `gorm:"type:timestamp;default:current_timestamp" json:"created_at"`
UpdatedAt time.Time `gorm:"type:timestamp;default:current_timestamp" json:"updated_at"`
}

type BroadcastType string

const (
Expand Down
10 changes: 10 additions & 0 deletions db/test_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@ func InitTestDB() {

logger.Log.Info("DB CONNECTED")

db.Exec(`
DO $$ BEGIN
ALTER TABLE tickets
ALTER COLUMN feature_uuid DROP NOT NULL,
ALTER COLUMN phase_uuid DROP NOT NULL;
EXCEPTION
WHEN others THEN null;
END $$;
`)

// migrate table changes
db.AutoMigrate(&Tribe{})
db.AutoMigrate(&Person{})
Expand Down
92 changes: 92 additions & 0 deletions db/tickets.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,3 +265,95 @@ func (db database) GetAllTicketGroups(workspaceUuid string) ([]uuid.UUID, error)

return groups, nil
}

func (db database) GetWorkspaceDraftTicket(workspaceUuid string, uuid string) (Tickets, error) {
var ticket Tickets

result := db.db.
Where("workspace_uuid = ? AND uuid = ? AND feature_uuid IS NULL AND phase_uuid IS NULL",
workspaceUuid, uuid).
First(&ticket)

if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
return Tickets{}, fmt.Errorf("draft ticket not found")
}
return Tickets{}, fmt.Errorf("failed to fetch draft ticket: %w", result.Error)
}

return ticket, nil
}

func (db database) CreateWorkspaceDraftTicket(ticket *Tickets) (Tickets, error) {
if ticket.UUID == uuid.Nil {
return Tickets{}, errors.New("ticket UUID is required")
}

if ticket.WorkspaceUuid == "" {
return Tickets{}, errors.New("workspace UUID is required")
}

now := time.Now()
ticket.CreatedAt = now
ticket.UpdatedAt = now
ticket.Status = DraftTicket
ticket.Version = 1

if err := db.db.Omit("Features", "FeaturePhase").Create(ticket).Error; err != nil {
return Tickets{}, fmt.Errorf("failed to create draft ticket: %w", err)
}

var createdTicket Tickets
if err := db.db.Where("uuid = ?", ticket.UUID).First(&createdTicket).Error; err != nil {
return Tickets{}, fmt.Errorf("failed to fetch created ticket: %w", err)
}

return createdTicket, nil
}

func (db database) UpdateWorkspaceDraftTicket(ticket *Tickets) (Tickets, error) {
var existingTicket Tickets
result := db.db.Where("uuid = ? AND workspace_uuid = ?",
ticket.UUID, ticket.WorkspaceUuid).First(&existingTicket)

if result.Error != nil {
return Tickets{}, fmt.Errorf("failed to find draft ticket: %w", result.Error)
}

ticket.UpdatedAt = time.Now()
ticket.Version = existingTicket.Version + 1

if err := db.db.Model(&existingTicket).
Omit("Features", "FeaturePhase").
Updates(map[string]interface{}{
"name": ticket.Name,
"description": ticket.Description,
"status": ticket.Status,
"updated_at": ticket.UpdatedAt,
"version": ticket.Version,
}).Error; err != nil {
return Tickets{}, fmt.Errorf("failed to update draft ticket: %w", err)
}

var updatedTicket Tickets
if err := db.db.Where("uuid = ?", ticket.UUID).First(&updatedTicket).Error; err != nil {
return Tickets{}, fmt.Errorf("failed to fetch updated ticket: %w", err)
}

return updatedTicket, nil
}

func (db database) DeleteWorkspaceDraftTicket(workspaceUuid string, uuid string) error {
result := db.db.Where("workspace_uuid = ? AND uuid = ? AND feature_uuid IS NULL AND phase_uuid IS NULL",
workspaceUuid, uuid).Delete(&Tickets{})

if result.Error != nil {
return fmt.Errorf("failed to delete draft ticket: %w", result.Error)
}

if result.RowsAffected == 0 {
return errors.New("draft ticket not found")
}

return nil
}
Loading

0 comments on commit b88b803

Please sign in to comment.