diff --git a/.gitignore b/.gitignore index 18ec85a..f190244 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea/ build/ bin -mocks/ \ No newline at end of file +mocks/ +.ai \ No newline at end of file diff --git a/doc/aictl_get.md b/doc/aictl_get.md index 5fe0322..ec23b2c 100644 --- a/doc/aictl_get.md +++ b/doc/aictl_get.md @@ -18,4 +18,5 @@ Get resources * [aictl](aictl.md) - Application Inspector ConTroL tool * [aictl get projects](aictl_get_projects.md) - Get AI projects * [aictl get scan](aictl_get_scan.md) - Get scan +* [aictl get version](aictl_get_version.md) - Get aie version diff --git a/doc/aictl_get_version.md b/doc/aictl_get_version.md new file mode 100644 index 0000000..26ae9af --- /dev/null +++ b/doc/aictl_get_version.md @@ -0,0 +1,28 @@ +## aictl get version + +Get aie version + +``` +aictl get version [flags] +``` + +### Options + +``` + -h, --help help for version +``` + +### Options inherited from parent commands + +``` + -l, --log-path string log file path + --tls-skip Skip certificate verification + -t, --token string AI server access token + -u, --uri string AI server uri + -v, --verbose verbose output +``` + +### SEE ALSO + +* [aictl get](aictl_get.md) - Get resources + diff --git a/internal/core/application/usecase/get/scan/report/defaultreport/default_report.go b/internal/core/application/usecase/get/scan/report/defaultreport/default_report.go index ee050dd..6d57d75 100644 --- a/internal/core/application/usecase/get/scan/report/defaultreport/default_report.go +++ b/internal/core/application/usecase/get/scan/report/defaultreport/default_report.go @@ -56,7 +56,7 @@ func (u *UseCase) Execute(ctx context.Context, scanId uuid.UUID, reportType repo templateId, err := u.aiAdapter.GetDefaultTemplateId(ctx, reportType) if err != nil { - return err + return fmt.Errorf("get default template id: %w", err) } r, err := u.aiAdapter.GetReport(ctx, u.cfg.ProjectId(), scanId, templateId, includeComments, includeDFD, includeGlossary, l10n) diff --git a/internal/core/application/usecase/get/scan/scan.go b/internal/core/application/usecase/get/scan/scan.go index 5e6502f..cb10375 100644 --- a/internal/core/application/usecase/get/scan/scan.go +++ b/internal/core/application/usecase/get/scan/scan.go @@ -49,7 +49,7 @@ func (u *UseCase) Execute(ctx context.Context, scanId uuid.UUID) error { scanStage, err := u.aiAdapter.GetScan(ctx, u.cfg.ProjectId(), scanId) if err != nil { - return err + return fmt.Errorf("get scan: %w", err) } u.cliAdapter.ShowScans(ctx, []scan.Scan{*scanStage}) diff --git a/internal/core/application/usecase/get/scan/state/state.go b/internal/core/application/usecase/get/scan/state/state.go index 16d1029..f8d021d 100644 --- a/internal/core/application/usecase/get/scan/state/state.go +++ b/internal/core/application/usecase/get/scan/state/state.go @@ -49,7 +49,7 @@ func (u *UseCase) Execute(ctx context.Context, scanId uuid.UUID) error { scanStage, err := u.aiAdapter.GetScanStage(ctx, u.cfg.ProjectId(), scanId) if err != nil { - return err + return fmt.Errorf("get scan stage: %w", err) } u.cliAdapter.ReturnText(ctx, scanStage.Stage) diff --git a/internal/core/application/usecase/get/version/version.go b/internal/core/application/usecase/get/version/version.go new file mode 100644 index 0000000..0e2f510 --- /dev/null +++ b/internal/core/application/usecase/get/version/version.go @@ -0,0 +1,57 @@ +package version + +import ( + "context" + "fmt" + + "github.com/POSIdev-community/aictl/internal/core/domain/config" + "github.com/POSIdev-community/aictl/internal/core/domain/version" + "github.com/POSIdev-community/aictl/pkg/errs" +) + +type AI interface { + InitializeWithRetry(ctx context.Context) error + GetVersion(ctx context.Context) (version.Version, error) +} + +type CLI interface { + ReturnText(ctx context.Context, text string) +} + +type UseCase struct { + aiAdapter AI + cliAdapter CLI + cfg *config.Config +} + +func NewUseCase(aiAdapter AI, cliAdapter CLI, cfg *config.Config) (*UseCase, error) { + if aiAdapter == nil { + return nil, errs.NewValidationRequiredError("aiAdapter") + } + + if cliAdapter == nil { + return nil, errs.NewValidationRequiredError("cliAdapter") + } + + return &UseCase{ + aiAdapter: aiAdapter, + cliAdapter: cliAdapter, + cfg: cfg, + }, nil +} + +func (u *UseCase) Execute(ctx context.Context) error { + err := u.aiAdapter.InitializeWithRetry(ctx) + if err != nil { + return fmt.Errorf("initialize with retry: %w", err) + } + + v, err := u.aiAdapter.GetVersion(ctx) + if err != nil { + return fmt.Errorf("get version: %w", err) + } + + u.cliAdapter.ReturnText(ctx, v.String()) + + return nil +} diff --git a/internal/di/container.go b/internal/di/container.go index e4d4765..a12b1ad 100644 --- a/internal/di/container.go +++ b/internal/di/container.go @@ -17,6 +17,7 @@ import ( "github.com/POSIdev-community/aictl/internal/core/application/usecase/get/scan/report" defaultreport "github.com/POSIdev-community/aictl/internal/core/application/usecase/get/scan/report/defaultreport" "github.com/POSIdev-community/aictl/internal/core/application/usecase/get/scan/state" + getVersion "github.com/POSIdev-community/aictl/internal/core/application/usecase/get/version" "github.com/POSIdev-community/aictl/internal/core/application/usecase/scan/await" startBranch "github.com/POSIdev-community/aictl/internal/core/application/usecase/scan/start/branch" startProject "github.com/POSIdev-community/aictl/internal/core/application/usecase/scan/start/project" @@ -207,7 +208,11 @@ func buildGetCmd(aiAdapter *ai.Adapter, cliAdapter *cli.Adapter, cfg *config.Con cmdScan := get.NewGetScanCmd(persistentPreRunEGetScanCmd, scanUC, cmdAiproj, cmdLogs, cmdReport, cmdSbom, cmdState) - return get.NewGetCmd(persistentPreRunEGetCmd, cmdProjects, cmdScan), nil + versionUC, err := getVersion.NewUseCase(aiAdapter, cliAdapter, cfg) + + cmdVersion := get.NewGetVersionCmd(versionUC) + + return get.NewGetCmd(persistentPreRunEGetCmd, cmdProjects, cmdScan, cmdVersion), nil } func buildScanCmd(aiAdapter *ai.Adapter, cliAdapter *cli.Adapter, cfg *config.Config) (*scanPresenter.CmdScan, error) { diff --git a/internal/presenter/get/get.go b/internal/presenter/get/get.go index 9f7f46a..513a85a 100644 --- a/internal/presenter/get/get.go +++ b/internal/presenter/get/get.go @@ -19,7 +19,8 @@ func NewPersistentPreRunEGetCmd(cfg *config.Config) PersistentPreRunEGetCmd { func NewGetCmd( persistentPreRunE PersistentPreRunEGetCmd, cmdGetProjects CmdGetProjects, - cmdGetScan CmdGetScan) *CmdGet { + cmdGetScan CmdGetScan, + cmdGetVersion CmdGetVersion) *CmdGet { cmd := &cobra.Command{ Use: "get", @@ -29,6 +30,7 @@ func NewGetCmd( cmd.AddCommand(cmdGetProjects.Command) cmd.AddCommand(cmdGetScan.Command) + cmd.AddCommand(cmdGetVersion.Command) _utils.AddConnectionPersistentFlags(cmd) diff --git a/internal/presenter/get/get_version.go b/internal/presenter/get/get_version.go new file mode 100644 index 0000000..a4dc13e --- /dev/null +++ b/internal/presenter/get/get_version.go @@ -0,0 +1,36 @@ +package get + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" +) + +type CmdGetVersion struct { + *cobra.Command +} + +type UseCaseGetVersion interface { + Execute(ctx context.Context) error +} + +func NewGetVersionCmd(uc UseCaseGetVersion) CmdGetVersion { + cmd := &cobra.Command{ + Use: "version", + Short: "Get aie version", + RunE: func(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + + if err := uc.Execute(ctx); err != nil { + cmd.SilenceUsage = true + + return fmt.Errorf("'get version' usecase call: %w", err) + } + + return nil + }, + } + + return CmdGetVersion{cmd} +}