controllers/jiraissuemetadata/chain/factory.go (56 lines of code) (raw):
package chain
import (
"context"
"fmt"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
codebaseApi "github.com/epam/edp-codebase-operator/v2/api/v1"
"github.com/epam/edp-codebase-operator/v2/controllers/jiraissuemetadata/chain/handler"
"github.com/epam/edp-codebase-operator/v2/pkg/client/jira"
"github.com/epam/edp-codebase-operator/v2/pkg/util"
)
const issuesLinks = "issuesLinks"
func CreateChain(metadataPayload string, jiraClient jira.Client, c client.Client) (handler.JiraIssueMetadataHandler, error) {
payload, err := util.GetFieldsMap(metadataPayload, nil)
if err != nil {
return nil, fmt.Errorf("failed to parse fields map from payload: %w", err)
}
if len(payload) == 1 && payload[issuesLinks] != nil {
return createWithoutApplyingTagsChain(jiraClient, c), nil
}
return createDefChain(jiraClient, c), nil
}
func createDefChain(jiraClient jira.Client, c client.Client) handler.JiraIssueMetadataHandler {
return PutTagValue{
next: ApplyTagsToIssues{
next: PutIssueWebLink{
next: DeleteJiraIssueMetadataCr{
c: c,
},
client: jiraClient,
},
client: jiraClient,
},
client: jiraClient,
}
}
func createWithoutApplyingTagsChain(jiraClient jira.Client, c client.Client) handler.JiraIssueMetadataHandler {
return PutIssueWebLink{
next: DeleteJiraIssueMetadataCr{
c: c,
},
client: jiraClient,
}
}
func nextServeOrNil(ctx context.Context, next handler.JiraIssueMetadataHandler, metadata *codebaseApi.JiraIssueMetadata) error {
log := ctrl.LoggerFrom(ctx)
if next == nil {
log.Info("handling of JiraIssueMetadata has been finished", "name", metadata.Name)
return nil
}
err := next.ServeRequest(ctx, metadata)
if err != nil {
return fmt.Errorf("failed to process next handler: %w", err)
}
return nil
}