Skip to content

Commit 4590840

Browse files
committed
refactor(issues): implemento carga perezosa del servicio de issues
1 parent be117b8 commit 4590840

4 files changed

Lines changed: 58 additions & 44 deletions

File tree

cmd/main.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/Tomas-vilte/MateCommit/internal/cli/command/update"
1717
"github.com/Tomas-vilte/MateCommit/internal/cli/registry"
1818
cfg "github.com/Tomas-vilte/MateCommit/internal/config"
19+
"github.com/Tomas-vilte/MateCommit/internal/domain/ports"
1920
"github.com/Tomas-vilte/MateCommit/internal/i18n"
2021
"github.com/Tomas-vilte/MateCommit/internal/infrastructure/ai/gemini"
2122
"github.com/Tomas-vilte/MateCommit/internal/infrastructure/di"
@@ -91,18 +92,17 @@ func initializeApp() (*cli.Command, error) {
9192
prServiceFactory := factory.NewPrServiceFactory(cfgApp, translations, nil, gitService)
9293
prCommand := pull_requests.NewSummarizeCommand(prServiceFactory)
9394

94-
issueGeneratorService, err := container.GetIssueGeneratorService(ctx)
95-
if err != nil {
96-
log.Printf("Warning: no se pudo inicializar el servicio de generación de issues: %v", err)
97-
}
98-
9995
registerCommand := registry.NewRegistry(cfgApp, translations)
10096

10197
if err := registerCommand.Register("suggest", suggests_commits.NewSuggestCommandFactory(commitService, commitHandler)); err != nil {
10298
log.Fatalf("Error al registrar el comando 'suggest': %v", err)
10399
}
104100

105-
if err := registerCommand.Register("issue", issues.NewIssuesCommandFactory(issueGeneratorService, container.GetIssueTemplateService())); err != nil {
101+
issueServiceProvider := func(ctx context.Context) (ports.IssueGeneratorService, error) {
102+
return container.GetIssueGeneratorService(ctx)
103+
}
104+
105+
if err := registerCommand.Register("issue", issues.NewIssuesCommandFactory(issueServiceProvider, container.GetIssueTemplateService())); err != nil {
106106
log.Fatalf("Error al registrar el comando 'issue': %v", err)
107107
}
108108

internal/cli/command/issues/issues.go

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,20 @@ import (
1717
"github.com/urfave/cli/v3"
1818
)
1919

20+
// IssueServiceProvider es una interfaz para obtener el servicio de issues de manera lazy
21+
type IssueServiceProvider func(ctx context.Context) (ports.IssueGeneratorService, error)
22+
2023
// IssuesCommandFactory es el factory para crear el comando de issues.
2124
type IssuesCommandFactory struct {
22-
issueService ports.IssueGeneratorService
23-
templateService ports.IssueTemplateService
25+
issueServiceProvider IssueServiceProvider
26+
templateService ports.IssueTemplateService
2427
}
2528

2629
// NewIssuesCommandFactory crea una nueva instancia del factory.
27-
func NewIssuesCommandFactory(issueService ports.IssueGeneratorService, templateService ports.IssueTemplateService) *IssuesCommandFactory {
30+
func NewIssuesCommandFactory(issueServiceProvider IssueServiceProvider, templateService ports.IssueTemplateService) *IssuesCommandFactory {
2831
return &IssuesCommandFactory{
29-
issueService: issueService,
30-
templateService: templateService,
32+
issueServiceProvider: issueServiceProvider,
33+
templateService: templateService,
3134
}
3235
}
3336

@@ -141,6 +144,12 @@ func (f *IssuesCommandFactory) createGenerateAction(t *i18n.Translations, cfg *c
141144

142145
ui.PrintSectionBanner(t.GetMessage("issue.banner", 0, nil))
143146

147+
issueService, err := f.issueServiceProvider(ctx)
148+
if err != nil {
149+
ui.PrintError(fmt.Sprintf("%s: %v", t.GetMessage("issue.error_generating", 0, nil), err))
150+
return err
151+
}
152+
144153
var spinnerMsg string
145154
if fromPR > 0 {
146155
spinnerMsg = t.GetMessage("issue.analyzing_pr", 0, map[string]interface{}{
@@ -154,16 +163,15 @@ func (f *IssuesCommandFactory) createGenerateAction(t *i18n.Translations, cfg *c
154163
spinner.Start()
155164

156165
var result *models.IssueGenerationResult
157-
var err error
158166

159167
if templateName != "" {
160-
result, err = f.issueService.GenerateWithTemplate(ctx, templateName, hint, fromDiff, description, noLabels)
168+
result, err = issueService.GenerateWithTemplate(ctx, templateName, hint, fromDiff, description, noLabels)
161169
} else if fromDiff {
162-
result, err = f.issueService.GenerateFromDiff(ctx, hint, noLabels)
170+
result, err = issueService.GenerateFromDiff(ctx, hint, noLabels)
163171
} else if fromPR > 0 {
164-
result, err = f.issueService.GenerateFromPR(ctx, fromPR, hint, noLabels)
172+
result, err = issueService.GenerateFromPR(ctx, fromPR, hint, noLabels)
165173
} else {
166-
result, err = f.issueService.GenerateFromDescription(ctx, description, noLabels)
174+
result, err = issueService.GenerateFromDescription(ctx, description, noLabels)
167175
}
168176

169177
spinner.Stop()
@@ -191,7 +199,7 @@ func (f *IssuesCommandFactory) createGenerateAction(t *i18n.Translations, cfg *c
191199
spinner = ui.NewSmartSpinner(t.GetMessage("issue.getting_user", 0, nil))
192200
spinner.Start()
193201

194-
username, err := f.issueService.GetAuthenticatedUser(ctx)
202+
username, err := issueService.GetAuthenticatedUser(ctx)
195203
spinner.Stop()
196204

197205
if err != nil {
@@ -207,7 +215,7 @@ func (f *IssuesCommandFactory) createGenerateAction(t *i18n.Translations, cfg *c
207215
spinner = ui.NewSmartSpinner(t.GetMessage("issue.creating", 0, nil))
208216
spinner.Start()
209217

210-
issue, err := f.issueService.CreateIssue(ctx, result, assignees)
218+
issue, err := issueService.CreateIssue(ctx, result, assignees)
211219
spinner.Stop()
212220

213221
if err != nil {
@@ -221,7 +229,7 @@ func (f *IssuesCommandFactory) createGenerateAction(t *i18n.Translations, cfg *c
221229
}))
222230

223231
if fromPR > 0 {
224-
if err := f.issueService.LinkIssueToPR(ctx, fromPR, issue.Number); err != nil {
232+
if err := issueService.LinkIssueToPR(ctx, fromPR, issue.Number); err != nil {
225233
ui.PrintWarning(t.GetMessage("issue.link_error", 0, map[string]interface{}{
226234
"PR": fromPR,
227235
"Error": err,
@@ -235,7 +243,7 @@ func (f *IssuesCommandFactory) createGenerateAction(t *i18n.Translations, cfg *c
235243
}
236244

237245
if checkoutBranch {
238-
branchName := f.issueService.InferBranchName(issue.Number, result.Labels)
246+
branchName := issueService.InferBranchName(issue.Number, result.Labels)
239247

240248
ui.PrintInfo(t.GetMessage("issue.creating_branch", 0, map[string]interface{}{
241249
"Branch": branchName,

internal/cli/command/issues/issues_test.go

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,26 @@ import (
77

88
"github.com/Tomas-vilte/MateCommit/internal/config"
99
"github.com/Tomas-vilte/MateCommit/internal/domain/models"
10+
"github.com/Tomas-vilte/MateCommit/internal/domain/ports"
1011
"github.com/Tomas-vilte/MateCommit/internal/i18n"
1112
"github.com/stretchr/testify/assert"
1213
"github.com/stretchr/testify/mock"
1314
"github.com/stretchr/testify/require"
1415
"github.com/urfave/cli/v3"
1516
)
1617

17-
func setupIssuesTest(t *testing.T) (*MockIssueGeneratorService, *MockIssueTemplateService, *i18n.Translations, *config.Config) {
18+
func setupIssuesTest(t *testing.T) (*MockIssueGeneratorService, *MockIssueTemplateService, IssueServiceProvider, *i18n.Translations, *config.Config) {
1819
mockGen := &MockIssueGeneratorService{}
1920
mockTemp := &MockIssueTemplateService{}
21+
22+
provider := func(ctx context.Context) (ports.IssueGeneratorService, error) {
23+
return mockGen, nil
24+
}
25+
2026
trans, err := i18n.NewTranslations("en", "../../../../internal/i18n/locales")
2127
require.NoError(t, err)
2228
cfg := &config.Config{Language: "en"}
23-
return mockGen, mockTemp, trans, cfg
29+
return mockGen, mockTemp, provider, trans, cfg
2430
}
2531

2632
func withStdin(input string, f func()) {
@@ -41,8 +47,8 @@ func withStdin(input string, f func()) {
4147

4248
func TestIssueGenerateAction(t *testing.T) {
4349
t.Run("should fail if no input provided", func(t *testing.T) {
44-
mockGen, mockTemp, trans, cfg := setupIssuesTest(t)
45-
factory := NewIssuesCommandFactory(mockGen, mockTemp)
50+
_, mockTemp, provider, trans, cfg := setupIssuesTest(t)
51+
factory := NewIssuesCommandFactory(provider, mockTemp)
4652
cmd := factory.CreateCommand(trans, cfg)
4753

4854
app := &cli.Command{Name: "test", Commands: []*cli.Command{cmd}}
@@ -53,8 +59,8 @@ func TestIssueGenerateAction(t *testing.T) {
5359
})
5460

5561
t.Run("should fail if multiple sources provided", func(t *testing.T) {
56-
mockGen, mockTemp, trans, cfg := setupIssuesTest(t)
57-
factory := NewIssuesCommandFactory(mockGen, mockTemp)
62+
_, mockTemp, provider, trans, cfg := setupIssuesTest(t)
63+
factory := NewIssuesCommandFactory(provider, mockTemp)
5864
cmd := factory.CreateCommand(trans, cfg)
5965

6066
app := &cli.Command{Name: "test", Commands: []*cli.Command{cmd}}
@@ -65,8 +71,8 @@ func TestIssueGenerateAction(t *testing.T) {
6571
})
6672

6773
t.Run("should generate from diff successfully", func(t *testing.T) {
68-
mockGen, mockTemp, trans, cfg := setupIssuesTest(t)
69-
factory := NewIssuesCommandFactory(mockGen, mockTemp)
74+
mockGen, mockTemp, provider, trans, cfg := setupIssuesTest(t)
75+
factory := NewIssuesCommandFactory(provider, mockTemp)
7076
cmd := factory.CreateCommand(trans, cfg)
7177

7278
expectedResult := &models.IssueGenerationResult{
@@ -88,8 +94,8 @@ func TestIssueGenerateAction(t *testing.T) {
8894
})
8995

9096
t.Run("should handle dry-run correctly", func(t *testing.T) {
91-
mockGen, mockTemp, trans, cfg := setupIssuesTest(t)
92-
factory := NewIssuesCommandFactory(mockGen, mockTemp)
97+
mockGen, mockTemp, provider, trans, cfg := setupIssuesTest(t)
98+
factory := NewIssuesCommandFactory(provider, mockTemp)
9399
cmd := factory.CreateCommand(trans, cfg)
94100

95101
expectedResult := &models.IssueGenerationResult{
@@ -108,8 +114,8 @@ func TestIssueGenerateAction(t *testing.T) {
108114
})
109115

110116
t.Run("should handle assign-me flag", func(t *testing.T) {
111-
mockGen, mockTemp, trans, cfg := setupIssuesTest(t)
112-
factory := NewIssuesCommandFactory(mockGen, mockTemp)
117+
mockGen, mockTemp, provider, trans, cfg := setupIssuesTest(t)
118+
factory := NewIssuesCommandFactory(provider, mockTemp)
113119
cmd := factory.CreateCommand(trans, cfg)
114120

115121
expectedResult := &models.IssueGenerationResult{
@@ -130,8 +136,8 @@ func TestIssueGenerateAction(t *testing.T) {
130136
})
131137

132138
t.Run("should cancel if user chooses no", func(t *testing.T) {
133-
mockGen, mockTemp, trans, cfg := setupIssuesTest(t)
134-
factory := NewIssuesCommandFactory(mockGen, mockTemp)
139+
mockGen, mockTemp, provider, trans, cfg := setupIssuesTest(t)
140+
factory := NewIssuesCommandFactory(provider, mockTemp)
135141
cmd := factory.CreateCommand(trans, cfg)
136142

137143
mockGen.On("GenerateFromDiff", mock.Anything, "", false).Return(&models.IssueGenerationResult{Title: "T"}, nil)
@@ -146,8 +152,8 @@ func TestIssueGenerateAction(t *testing.T) {
146152
})
147153

148154
t.Run("should use template if specified", func(t *testing.T) {
149-
mockGen, mockTemp, trans, cfg := setupIssuesTest(t)
150-
factory := NewIssuesCommandFactory(mockGen, mockTemp)
155+
mockGen, mockTemp, provider, trans, cfg := setupIssuesTest(t)
156+
factory := NewIssuesCommandFactory(provider, mockTemp)
151157
cmd := factory.CreateCommand(trans, cfg)
152158

153159
expectedResult := &models.IssueGenerationResult{Title: "Template Issue"}

internal/cli/command/issues/templates_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import (
1111

1212
func TestIssueTemplateAction(t *testing.T) {
1313
t.Run("should init templates successfully", func(t *testing.T) {
14-
mockGen, mockTemp, trans, cfg := setupIssuesTest(t)
15-
factory := NewIssuesCommandFactory(mockGen, mockTemp)
14+
_, mockTemp, provider, trans, cfg := setupIssuesTest(t)
15+
factory := NewIssuesCommandFactory(provider, mockTemp)
1616
cmd := factory.CreateCommand(trans, cfg)
1717

1818
mockTemp.On("InitializeTemplates", false).Return(nil)
@@ -26,8 +26,8 @@ func TestIssueTemplateAction(t *testing.T) {
2626
})
2727

2828
t.Run("should init templates with force flag", func(t *testing.T) {
29-
mockGen, mockTemp, trans, cfg := setupIssuesTest(t)
30-
factory := NewIssuesCommandFactory(mockGen, mockTemp)
29+
_, mockTemp, provider, trans, cfg := setupIssuesTest(t)
30+
factory := NewIssuesCommandFactory(provider, mockTemp)
3131
cmd := factory.CreateCommand(trans, cfg)
3232

3333
mockTemp.On("InitializeTemplates", true).Return(nil)
@@ -41,8 +41,8 @@ func TestIssueTemplateAction(t *testing.T) {
4141
})
4242

4343
t.Run("should list templates successfully", func(t *testing.T) {
44-
mockGen, mockTemp, trans, cfg := setupIssuesTest(t)
45-
factory := NewIssuesCommandFactory(mockGen, mockTemp)
44+
_, mockTemp, provider, trans, cfg := setupIssuesTest(t)
45+
factory := NewIssuesCommandFactory(provider, mockTemp)
4646
cmd := factory.CreateCommand(trans, cfg)
4747

4848
templates := []models.TemplateMetadata{
@@ -59,8 +59,8 @@ func TestIssueTemplateAction(t *testing.T) {
5959
})
6060

6161
t.Run("should handle empty template list", func(t *testing.T) {
62-
mockGen, mockTemp, trans, cfg := setupIssuesTest(t)
63-
factory := NewIssuesCommandFactory(mockGen, mockTemp)
62+
_, mockTemp, provider, trans, cfg := setupIssuesTest(t)
63+
factory := NewIssuesCommandFactory(provider, mockTemp)
6464
cmd := factory.CreateCommand(trans, cfg)
6565

6666
mockTemp.On("ListTemplates").Return([]models.TemplateMetadata{}, nil)

0 commit comments

Comments
 (0)