Skip to content

Commit

Permalink
Merge pull request #2521 from aliraza556/feature/ticket-plan-endpoint…
Browse files Browse the repository at this point in the history
…-tests

Feature: Implement Ticket Plan System for Enhanced Project Management
  • Loading branch information
humansinstitute authored Feb 4, 2025
2 parents fcc5550 + 893b775 commit 7bcac91
Show file tree
Hide file tree
Showing 9 changed files with 1,812 additions and 1 deletion.
1 change: 1 addition & 0 deletions db/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ func InitDB() {
db.AutoMigrate(&TextSnippet{})
db.AutoMigrate(&BountyTiming{})
db.AutoMigrate(&FileAsset{})
db.AutoMigrate(&TicketPlan{})

DB.MigrateTablesWithOrgUuid()
DB.MigrateOrganizationToWorkspace()
Expand Down
6 changes: 6 additions & 0 deletions db/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,4 +284,10 @@ type Database interface {
DeleteTicketGroup(TicketGroupUUID uuid.UUID) error
PauseBountyTiming(bountyID uint) error
ResumeBountyTiming(bountyID uint) error
CreateOrEditTicketPlan(plan *TicketPlan) (*TicketPlan, error)
GetTicketPlan(uuid string) (*TicketPlan, error)
DeleteTicketPlan(uuid string) error
GetTicketPlansByFeature(featureUUID string) ([]TicketPlan, error)
GetTicketPlansByPhase(phaseUUID string) ([]TicketPlan, error)
GetTicketPlansByWorkspace(workspaceUUID string) ([]TicketPlan, error)
}
25 changes: 25 additions & 0 deletions db/structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -1264,6 +1264,31 @@ type ListFileAssetsParams struct {
PageSize int `form:"pageSize,default=50"`
}

type PlanStatus string

const (
DraftPlan PlanStatus = "DRAFT"
ApprovedPlan PlanStatus = "APPROVED"
)

type TicketPlan struct {
UUID uuid.UUID `gorm:"primaryKey;type:uuid"`
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);not null" json:"name"`
Description string `gorm:"type:text" json:"description"`
TicketGroups pq.StringArray `gorm:"type:uuid[];not null;default:'{}'" json:"ticket_groups"`
Status PlanStatus `gorm:"type:varchar(50);default:'DRAFT'" json:"status"`
Version int `gorm:"type:integer;default:0" json:"version"`
CreatedBy string `gorm:"type:varchar(255)" json:"created_by"`
UpdatedBy string `gorm:"type:varchar(255)" json:"updated_by"`
CreatedAt time.Time `gorm:"type:timestamp;default:current_timestamp" json:"created_at"`
UpdatedAt time.Time `gorm:"type:timestamp;default:current_timestamp" json:"updated_at"`
}

func (Person) TableName() string {
return "people"
}
Expand Down
1 change: 1 addition & 0 deletions db/test_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ func InitTestDB() {
db.AutoMigrate(&TextSnippet{})
db.AutoMigrate(&ConnectionCodesList{})
db.AutoMigrate(&TicketMessage{})
db.AutoMigrate(&TicketPlan{})

people := TestDB.GetAllPeople()
for _, p := range people {
Expand Down
100 changes: 100 additions & 0 deletions db/ticket_plan.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package db

import (
"errors"
"fmt"
"time"

"github.com/google/uuid"
"gorm.io/gorm"
)

func (db database) CreateOrEditTicketPlan(plan *TicketPlan) (*TicketPlan, error) {
if plan.UUID == uuid.Nil {
return nil, errors.New("ticket plan UUID is required")
}

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

if plan.Name == "" {
return nil, errors.New("name is required")
}

var existingPlan TicketPlan
result := db.db.Where("uuid = ?", plan.UUID).First(&existingPlan)

now := time.Now()
if result.Error != nil {

plan.CreatedAt = now
plan.UpdatedAt = now
plan.Version = 1
if err := db.db.Create(plan).Error; err != nil {
return nil, fmt.Errorf("failed to create ticket plan: %w", err)
}
} else {
plan.UpdatedAt = now
plan.Version = existingPlan.Version + 1
if err := db.db.Model(&existingPlan).Updates(plan).Error; err != nil {
return nil, fmt.Errorf("failed to update ticket plan: %w", err)
}
}

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

return &updatedPlan, nil
}

func (db database) GetTicketPlan(uuid string) (*TicketPlan, error) {
var plan TicketPlan
result := db.db.Where("uuid = ?", uuid).First(&plan)

if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
return nil, fmt.Errorf("ticket plan not found")
}
return nil, result.Error
}

return &plan, nil
}

func (db database) DeleteTicketPlan(uuid string) error {
result := db.db.Where("uuid = ?", uuid).Delete(&TicketPlan{})
if result.Error != nil {
return fmt.Errorf("failed to delete ticket plan: %w", result.Error)
}
if result.RowsAffected == 0 {
return errors.New("ticket plan not found")
}
return nil
}

func (db database) GetTicketPlansByFeature(featureUUID string) ([]TicketPlan, error) {
var plans []TicketPlan
if err := db.db.Where("feature_uuid = ?", featureUUID).Find(&plans).Error; err != nil {
return nil, fmt.Errorf("failed to fetch ticket plans by feature: %w", err)
}
return plans, nil
}

func (db database) GetTicketPlansByPhase(phaseUUID string) ([]TicketPlan, error) {
var plans []TicketPlan
if err := db.db.Where("phase_uuid = ?", phaseUUID).Find(&plans).Error; err != nil {
return nil, fmt.Errorf("failed to fetch ticket plans by phase: %w", err)
}
return plans, nil
}

func (db database) GetTicketPlansByWorkspace(workspaceUUID string) ([]TicketPlan, error) {
var plans []TicketPlan
if err := db.db.Where("workspace_uuid = ?", workspaceUUID).Find(&plans).Error; err != nil {
return nil, fmt.Errorf("failed to fetch ticket plans by workspace: %w", err)
}
return plans, nil
}
Loading

0 comments on commit 7bcac91

Please sign in to comment.