Skip to content

Features API

Listing Features

Basic List

ctx := context.Background()
features, _, err := apiClient.FeaturesAPI.GetFeatures(ctx).Execute()
if err != nil {
    return err
}

for _, feature := range features.Features {
    fmt.Printf("%s: %s\n", feature.ReferenceNum, feature.Name)
}

With Filters

features, _, err := apiClient.FeaturesAPI.GetFeatures(ctx).
    Q("payment").                    // Search query
    Tag("Q1-2024").                  // Tag filter
    AssignedToUser("user@email.com"). // Assignee filter
    UpdatedSince(time.Now().AddDate(0, -1, 0)). // Last month
    Page(1).
    PerPage(50).
    Execute()

Available Filters

Method Description
Q(string) Search query
Tag(string) Filter by tag
AssignedToUser(string) Filter by assignee email or ID
UpdatedSince(time.Time) Updated after date
Page(int32) Page number
PerPage(int32) Results per page

Getting a Single Feature

feature, _, err := apiClient.FeaturesAPI.GetFeature(ctx, "FEAT-123").Execute()
if err != nil {
    return err
}

f := feature.Feature
fmt.Printf("Feature: %s\n", f.Name)
fmt.Printf("Reference: %s\n", f.ReferenceNum)

// Workflow status
if f.WorkflowStatus != nil {
    fmt.Printf("Status: %s\n", f.WorkflowStatus.GetName())
}

// Release info
if f.Release != nil {
    fmt.Printf("Release: %s\n", f.Release.GetName())
    fmt.Printf("Release Date: %s\n", f.Release.GetReleaseDate())
}

// Dates
fmt.Printf("Start: %s\n", f.GetStartDate())
fmt.Printf("Due: %s\n", f.GetDueDate())

Feature Model

Key fields in the aha.Feature struct:

Field Type Description
Id string Unique identifier
ReferenceNum string Human-readable reference (e.g., FEAT-123)
Name string Feature title
WorkflowStatus *FeatureWorkflowStatus Current status
Release *Release Assigned release
StartDate *string Start date (YYYY-MM-DD)
DueDate *string Due date (YYYY-MM-DD)
Tags []string Assigned tags
IntegrationFields []IntegrationField External integrations (Jira, etc.)
CreatedAt time.Time Creation timestamp
Url *string Web URL

Integration Fields (Jira, etc.)

Features can have integration fields linking to external systems:

import "github.com/grokify/go-aha/v3/oag7/features"

// Use the features helper
f := features.Feature(*featureResp.Feature)

// Get Jira key
jiraKey := f.JiraKey()
jiraURL := f.JiraURL()

if jiraKey != "" {
    fmt.Printf("Jira: %s (%s)\n", jiraKey, jiraURL)
}

Manual Access

for _, field := range feature.IntegrationFields {
    if field.ServiceName != nil && *field.ServiceName == "Jira" {
        if field.Name != nil && *field.Name == "key" {
            fmt.Printf("Jira Key: %s\n", field.GetValue())
        }
    }
}

Release Features

Get features for a specific release:

features, _, err := apiClient.FeaturesAPI.
    GetReleaseFeatures(ctx, "release-id").
    Execute()