Skip to content

Commit 9ef3fe3

Browse files
committed
Refactor to use existing logic
1 parent 3dce73b commit 9ef3fe3

File tree

7 files changed

+135
-93
lines changed

7 files changed

+135
-93
lines changed

apptrust/commands/version/promote_app_version_cmd.go

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -70,33 +70,14 @@ func (pv *promoteAppVersionCommand) prepareAndRunCommand(ctx *components.Context
7070
func (pv *promoteAppVersionCommand) buildRequestPayload(ctx *components.Context) (*model.PromoteAppVersionRequest, error) {
7171
stage := ctx.Arguments[2]
7272

73-
var includedRepos []string
74-
var excludedRepos []string
75-
76-
if includeReposStr := ctx.GetStringFlagValue(commands.IncludeReposFlag); includeReposStr != "" {
77-
includedRepos = utils.ParseSliceFlag(includeReposStr)
78-
}
79-
80-
if excludeReposStr := ctx.GetStringFlagValue(commands.ExcludeReposFlag); excludeReposStr != "" {
81-
excludedRepos = utils.ParseSliceFlag(excludeReposStr)
82-
}
83-
84-
// Validate promotion type flag
85-
promotionType := ctx.GetStringFlagValue(commands.PromotionTypeFlag)
86-
validatedPromotionType, err := utils.ValidateEnumFlag(commands.PromotionTypeFlag, promotionType, model.PromotionTypeCopy, model.PromotionTypeValues)
73+
promotionType, includedRepos, excludedRepos, err := BuildPromotionParams(ctx)
8774
if err != nil {
8875
return nil, err
8976
}
9077

91-
// If dry-run is true, override with dry_run
92-
dryRun := ctx.GetBoolFlagValue(commands.DryRunFlag)
93-
if dryRun {
94-
validatedPromotionType = model.PromotionTypeDryRun
95-
}
96-
9778
return &model.PromoteAppVersionRequest{
9879
Stage: stage,
99-
PromotionType: validatedPromotionType,
80+
PromotionType: promotionType,
10081
IncludedRepositoryKeys: includedRepos,
10182
ExcludedRepositoryKeys: excludedRepos,
10283
}, nil

apptrust/commands/version/release_app_version_cmd.go

Lines changed: 14 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -68,54 +68,29 @@ func (rv *releaseAppVersionCommand) prepareAndRunCommand(ctx *components.Context
6868
}
6969

7070
func (rv *releaseAppVersionCommand) buildRequestPayload(ctx *components.Context) (*model.ReleaseAppVersionRequest, error) {
71-
var includedRepos []string
72-
var excludedRepos []string
73-
var artifactProps map[string]string
74-
75-
if includeReposStr := ctx.GetStringFlagValue(commands.IncludeReposFlag); includeReposStr != "" {
76-
includedRepos = utils.ParseSliceFlag(includeReposStr)
77-
}
78-
79-
if excludeReposStr := ctx.GetStringFlagValue(commands.ExcludeReposFlag); excludeReposStr != "" {
80-
excludedRepos = utils.ParseSliceFlag(excludeReposStr)
81-
}
82-
83-
if propsStr := ctx.GetStringFlagValue(commands.PropsFlag); propsStr != "" {
84-
var err error
85-
artifactProps, err = utils.ParseMapFlag(propsStr)
86-
if err != nil {
87-
return nil, errorutils.CheckErrorf("failed to parse properties: %s", err.Error())
88-
}
89-
}
90-
91-
// Validate promotion type flag
92-
promotionType := ctx.GetStringFlagValue(commands.PromotionTypeFlag)
93-
94-
// For validation, we need to add the dry_run option
95-
allowedValues := append([]string{}, model.PromotionTypeValues...)
96-
allowedValues = append(allowedValues, model.PromotionTypeDryRun)
97-
98-
validatedPromotionType, err := utils.ValidateEnumFlag(commands.PromotionTypeFlag, promotionType, model.PromotionTypeCopy, allowedValues)
71+
promotionType, includedRepos, excludedRepos, err := BuildPromotionParams(ctx)
9972
if err != nil {
10073
return nil, err
10174
}
10275

103-
// If dry-run is true, override with dry_run
104-
dryRun := ctx.GetBoolFlagValue(commands.DryRunFlag)
105-
if dryRun {
106-
validatedPromotionType = model.PromotionTypeDryRun
76+
artifactProps, err := ParseArtifactProps(ctx)
77+
if err != nil {
78+
return nil, err
10779
}
10880

109-
return &model.ReleaseAppVersionRequest{
110-
PromotionType: validatedPromotionType,
111-
IncludedRepositoryKeys: includedRepos,
112-
ExcludedRepositoryKeys: excludedRepos,
113-
ArtifactAdditionalProperties: artifactProps,
114-
}, nil
81+
// Create the release request
82+
return model.NewReleaseAppVersionRequest(
83+
promotionType,
84+
includedRepos,
85+
excludedRepos,
86+
artifactProps,
87+
), nil
11588
}
11689

11790
func GetReleaseAppVersionCommand(appContext app.Context) components.Command {
118-
cmd := &releaseAppVersionCommand{versionService: appContext.GetVersionService()}
91+
cmd := &releaseAppVersionCommand{
92+
versionService: appContext.GetVersionService(),
93+
}
11994
return components.Command{
12095
Name: commands.VersionRelease,
12196
Description: "Release application version.",

apptrust/commands/version/release_app_version_cmd_test.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@ func TestReleaseAppVersionCommand_Run(t *testing.T) {
3737
serverDetails := &config.ServerDetails{Url: "https://example.com"}
3838
applicationKey := "app-key"
3939
version := "1.0.0"
40-
requestPayload := &model.ReleaseAppVersionRequest{
41-
PromotionType: model.PromotionTypeCopy,
42-
}
40+
requestPayload := model.NewReleaseAppVersionRequest(
41+
model.PromotionTypeCopy,
42+
nil, // includedRepos
43+
nil, // excludedRepos
44+
nil, // artifactProps
45+
)
4346

4447
mockVersionService := mockversions.NewMockVersionService(ctrl)
4548
mockVersionService.EXPECT().ReleaseAppVersion(gomock.Any(), applicationKey, version, requestPayload, tt.sync).
@@ -83,9 +86,12 @@ func TestReleaseAppVersionCommand_Run_Error(t *testing.T) {
8386
serverDetails := &config.ServerDetails{Url: "https://example.com"}
8487
applicationKey := "app-key"
8588
version := "1.0.0"
86-
requestPayload := &model.ReleaseAppVersionRequest{
87-
PromotionType: model.PromotionTypeCopy,
88-
}
89+
requestPayload := model.NewReleaseAppVersionRequest(
90+
model.PromotionTypeCopy,
91+
nil, // includedRepos
92+
nil, // excludedRepos
93+
nil, // artifactProps
94+
)
8995
expectedError := errors.New("service error occurred")
9096

9197
mockVersionService := mockversions.NewMockVersionService(ctrl)
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package version
2+
3+
import (
4+
"github.com/jfrog/jfrog-cli-application/apptrust/commands"
5+
"github.com/jfrog/jfrog-cli-application/apptrust/commands/utils"
6+
"github.com/jfrog/jfrog-cli-application/apptrust/model"
7+
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
8+
"github.com/jfrog/jfrog-client-go/utils/errorutils"
9+
)
10+
11+
// BuildPromotionParams extracts common promotion parameters from command context
12+
// Used by both promote and release commands
13+
func BuildPromotionParams(ctx *components.Context) (string, []string, []string, error) {
14+
var includedRepos []string
15+
var excludedRepos []string
16+
17+
if includeReposStr := ctx.GetStringFlagValue(commands.IncludeReposFlag); includeReposStr != "" {
18+
includedRepos = utils.ParseSliceFlag(includeReposStr)
19+
}
20+
21+
if excludeReposStr := ctx.GetStringFlagValue(commands.ExcludeReposFlag); excludeReposStr != "" {
22+
excludedRepos = utils.ParseSliceFlag(excludeReposStr)
23+
}
24+
25+
// Validate promotion type flag
26+
promotionType := ctx.GetStringFlagValue(commands.PromotionTypeFlag)
27+
28+
// For validation, we need to add the dry_run option
29+
allowedValues := append([]string{}, model.PromotionTypeValues...)
30+
allowedValues = append(allowedValues, model.PromotionTypeDryRun)
31+
32+
validatedPromotionType, err := utils.ValidateEnumFlag(commands.PromotionTypeFlag, promotionType, model.PromotionTypeCopy, allowedValues)
33+
if err != nil {
34+
return "", nil, nil, err
35+
}
36+
37+
// If dry-run is true, override with dry_run
38+
dryRun := ctx.GetBoolFlagValue(commands.DryRunFlag)
39+
if dryRun {
40+
validatedPromotionType = model.PromotionTypeDryRun
41+
}
42+
43+
return validatedPromotionType, includedRepos, excludedRepos, nil
44+
}
45+
46+
// ParseArtifactProps extracts artifact properties from command context
47+
func ParseArtifactProps(ctx *components.Context) (map[string]string, error) {
48+
if propsStr := ctx.GetStringFlagValue(commands.PropsFlag); propsStr != "" {
49+
props, err := utils.ParseMapFlag(propsStr)
50+
if err != nil {
51+
return nil, errorutils.CheckErrorf("failed to parse properties: %s", err.Error())
52+
}
53+
return props, nil
54+
}
55+
return nil, nil
56+
}

apptrust/model/promote_app_version_request.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ var PromotionTypeValues = []string{
1515
}
1616

1717
type PromoteAppVersionRequest struct {
18-
Stage string `json:"stage"`
19-
PromotionType string `json:"promotion_type,omitempty"`
20-
IncludedRepositoryKeys []string `json:"included_repository_keys,omitempty"`
21-
ExcludedRepositoryKeys []string `json:"excluded_repository_keys,omitempty"`
18+
Stage string `json:"stage"`
19+
PromotionType string `json:"promotion_type,omitempty"`
20+
IncludedRepositoryKeys []string `json:"included_repository_keys,omitempty"`
21+
ExcludedRepositoryKeys []string `json:"excluded_repository_keys,omitempty"`
22+
ArtifactAdditionalProperties map[string]string `json:"artifact_additional_properties,omitempty"`
2223
}
Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,26 @@
11
package model
22

3-
// ReleaseAppVersionRequest represents a request to release an app version to the release stage
3+
const (
4+
ReleaseStage = "RELEASE"
5+
)
6+
47
type ReleaseAppVersionRequest struct {
5-
PromotionType string `json:"promotion_type,omitempty"`
6-
IncludedRepositoryKeys []string `json:"included_repository_keys,omitempty"`
7-
ExcludedRepositoryKeys []string `json:"excluded_repository_keys,omitempty"`
8-
ArtifactAdditionalProperties map[string]string `json:"artifact_additional_properties,omitempty"`
8+
PromoteAppVersionRequest
9+
}
10+
11+
func NewReleaseAppVersionRequest(
12+
promotionType string,
13+
includedRepositoryKeys []string,
14+
excludedRepositoryKeys []string,
15+
artifactProperties map[string]string,
16+
) *ReleaseAppVersionRequest {
17+
return &ReleaseAppVersionRequest{
18+
PromoteAppVersionRequest: PromoteAppVersionRequest{
19+
Stage: ReleaseStage,
20+
PromotionType: promotionType,
21+
IncludedRepositoryKeys: includedRepositoryKeys,
22+
ExcludedRepositoryKeys: excludedRepositoryKeys,
23+
ArtifactAdditionalProperties: artifactProperties,
24+
},
25+
}
926
}

apptrust/service/versions/version_service_test.go

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,12 @@ func TestReleaseAppVersion(t *testing.T) {
200200
name: "success with sync=true",
201201
applicationKey: "test-app",
202202
version: "1.0.0",
203-
payload: &model.ReleaseAppVersionRequest{
204-
PromotionType: model.PromotionTypeCopy,
205-
IncludedRepositoryKeys: []string{"repo1", "repo2"},
206-
ExcludedRepositoryKeys: []string{"repo3"},
207-
ArtifactAdditionalProperties: map[string]string{"key1": "value1"},
208-
},
203+
payload: model.NewReleaseAppVersionRequest(
204+
model.PromotionTypeCopy,
205+
[]string{"repo1", "repo2"},
206+
[]string{"repo3"},
207+
map[string]string{"key1": "value1"},
208+
),
209209
sync: true,
210210
expectedEndpoint: "/v1/applications/test-app/versions/1.0.0/release",
211211
mockResponse: &http.Response{StatusCode: 200},
@@ -217,12 +217,12 @@ func TestReleaseAppVersion(t *testing.T) {
217217
name: "success with sync=false",
218218
applicationKey: "test-app",
219219
version: "1.0.0",
220-
payload: &model.ReleaseAppVersionRequest{
221-
PromotionType: model.PromotionTypeCopy,
222-
IncludedRepositoryKeys: []string{"repo1", "repo2"},
223-
ExcludedRepositoryKeys: []string{"repo3"},
224-
ArtifactAdditionalProperties: map[string]string{"key1": "value1"},
225-
},
220+
payload: model.NewReleaseAppVersionRequest(
221+
model.PromotionTypeCopy,
222+
[]string{"repo1", "repo2"},
223+
[]string{"repo3"},
224+
map[string]string{"key1": "value1"},
225+
),
226226
sync: false,
227227
expectedEndpoint: "/v1/applications/test-app/versions/1.0.0/release",
228228
mockResponse: &http.Response{StatusCode: 202},
@@ -234,9 +234,12 @@ func TestReleaseAppVersion(t *testing.T) {
234234
name: "failure",
235235
applicationKey: "test-app",
236236
version: "1.0.0",
237-
payload: &model.ReleaseAppVersionRequest{
238-
PromotionType: model.PromotionTypeCopy,
239-
},
237+
payload: model.NewReleaseAppVersionRequest(
238+
model.PromotionTypeCopy,
239+
nil,
240+
nil,
241+
nil,
242+
),
240243
sync: true,
241244
expectedEndpoint: "/v1/applications/test-app/versions/1.0.0/release",
242245
mockResponse: &http.Response{StatusCode: 400},
@@ -248,9 +251,12 @@ func TestReleaseAppVersion(t *testing.T) {
248251
name: "http client error",
249252
applicationKey: "test-app",
250253
version: "1.0.0",
251-
payload: &model.ReleaseAppVersionRequest{
252-
PromotionType: model.PromotionTypeCopy,
253-
},
254+
payload: model.NewReleaseAppVersionRequest(
255+
model.PromotionTypeCopy,
256+
nil,
257+
nil,
258+
nil,
259+
),
254260
sync: false,
255261
expectedEndpoint: "/v1/applications/test-app/versions/1.0.0/release",
256262
mockResponse: nil,

0 commit comments

Comments
 (0)