Skip to content

Commit 1a1f92b

Browse files
authored
Merge pull request #1 from Klass-lk/develop
feat: separated the db implementations
2 parents 67e19d2 + cdea53b commit 1a1f92b

3 files changed

Lines changed: 682 additions & 139 deletions

File tree

cmd/new.go

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
var (
1313
projectName string
1414
moduleName string
15+
dbType string
1516
)
1617

1718
var newCmd = &cobra.Command{
@@ -31,17 +32,62 @@ var newCmd = &cobra.Command{
3132
moduleName = fmt.Sprintf("github.com/%s/%s", os.Getenv("USER"), projectName)
3233
}
3334

35+
// Handle database type prompting
36+
if dbType == "" {
37+
var setupDb string
38+
fmt.Print("Do you want to set up a database in this project? (y/n): ")
39+
_, err := fmt.Scanln(&setupDb)
40+
if err != nil || (setupDb != "y" && setupDb != "yes" && setupDb != "Y" && setupDb != "YES") {
41+
dbType = "none"
42+
} else {
43+
fmt.Println("\nCurrently supported databases:")
44+
fmt.Println(" 1) MongoDB")
45+
fmt.Println(" 2) PostgreSQL")
46+
fmt.Println(" 3) MySQL")
47+
fmt.Println(" 4) DynamoDB")
48+
for {
49+
var choice int
50+
fmt.Print("Select a database (1-4): ")
51+
_, err := fmt.Scanln(&choice)
52+
if err != nil || choice < 1 || choice > 4 {
53+
fmt.Println("Invalid selection. Please enter a number between 1 and 4.")
54+
// Clear standard input if needed or handle retry
55+
continue
56+
}
57+
switch choice {
58+
case 1:
59+
dbType = "mongodb"
60+
case 2:
61+
dbType = "postgres"
62+
case 3:
63+
dbType = "mysql"
64+
case 4:
65+
dbType = "dynamodb"
66+
}
67+
break
68+
}
69+
}
70+
} else {
71+
// Validate flag
72+
switch dbType {
73+
case "none", "mongodb", "postgres", "mysql", "dynamodb":
74+
// valid
75+
default:
76+
return fmt.Errorf("invalid database type '%s': must be one of none, mongodb, postgres, mysql, dynamodb", dbType)
77+
}
78+
}
79+
3480
projectPath := filepath.Join(".", projectName)
3581
if err := os.MkdirAll(projectPath, 0755); err != nil {
3682
return fmt.Errorf("failed to create project directory: %w", err)
3783
}
3884

39-
gen := generator.NewProjectGenerator(projectPath, projectName, moduleName)
85+
gen := generator.NewProjectGenerator(projectPath, projectName, moduleName, dbType)
4086
if err := gen.Generate(); err != nil {
4187
return fmt.Errorf("failed to generate project: %w", err)
4288
}
4389

44-
fmt.Printf("Successfully created project '%s' at %s\n", projectName, projectPath)
90+
fmt.Printf("Successfully created project '%s' at %s (Database: %s)\n", projectName, projectPath, dbType)
4591
fmt.Println("\nNext steps:")
4692
fmt.Printf(" cd %s\n", projectName)
4793
fmt.Println(" go mod tidy")
@@ -60,4 +106,5 @@ func isValidProjectName(name string) bool {
60106

61107
func init() {
62108
newCmd.Flags().StringVar(&moduleName, "module", "", "Go module name (default: github.com/username/project-name)")
109+
newCmd.Flags().StringVar(&dbType, "db", "", "Database type: none, mongodb, postgres, mysql, dynamodb")
63110
}

internal/generator/generator.go

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,18 @@ import (
88
)
99

1010
type ProjectGenerator struct {
11-
ProjectPath string
12-
ProjectName string
13-
ModuleName string
11+
ProjectPath string
12+
ProjectName string
13+
ModuleName string
14+
DatabaseType string
1415
}
1516

16-
func NewProjectGenerator(projectPath, projectName, moduleName string) *ProjectGenerator {
17+
func NewProjectGenerator(projectPath, projectName, moduleName, databaseType string) *ProjectGenerator {
1718
return &ProjectGenerator{
18-
ProjectPath: projectPath,
19-
ProjectName: projectName,
20-
ModuleName: moduleName,
19+
ProjectPath: projectPath,
20+
ProjectName: projectName,
21+
ModuleName: moduleName,
22+
DatabaseType: databaseType,
2123
}
2224
}
2325

@@ -36,14 +38,53 @@ func (g *ProjectGenerator) Generate() error {
3638
}
3739
}
3840

41+
// Select templates based on database choice
42+
var mainTmpl, goModTmpl, dockerComposeTmpl, userModelTmpl, userRepoTmpl string
43+
44+
switch g.DatabaseType {
45+
case "mongodb":
46+
mainTmpl = mainMongoTemplate
47+
goModTmpl = goModMongoTemplate
48+
dockerComposeTmpl = dockerComposeMongoTemplate
49+
userModelTmpl = userModelMongoTemplate
50+
userRepoTmpl = userRepositoryMongoTemplate
51+
case "postgres":
52+
mainTmpl = mainPostgresTemplate
53+
goModTmpl = goModPostgresTemplate
54+
dockerComposeTmpl = dockerComposePostgresTemplate
55+
userModelTmpl = userModelPostgresTemplate
56+
userRepoTmpl = userRepositoryPostgresTemplate
57+
case "mysql":
58+
mainTmpl = mainMysqlTemplate
59+
goModTmpl = goModMysqlTemplate
60+
dockerComposeTmpl = dockerComposeMysqlTemplate
61+
userModelTmpl = userModelMysqlTemplate
62+
userRepoTmpl = userRepositoryMysqlTemplate
63+
case "dynamodb":
64+
mainTmpl = mainDynamodbTemplate
65+
goModTmpl = goModDynamodbTemplate
66+
dockerComposeTmpl = dockerComposeDynamodbTemplate
67+
userModelTmpl = userModelDynamodbTemplate
68+
userRepoTmpl = userRepositoryDynamodbTemplate
69+
default: // "none"
70+
mainTmpl = mainNoneTemplate
71+
goModTmpl = goModNoneTemplate
72+
dockerComposeTmpl = dockerComposeNoneTemplate
73+
userModelTmpl = userModelNoneTemplate
74+
userRepoTmpl = userRepositoryNoneTemplate
75+
}
76+
3977
// Generate files
4078
files := map[string]string{
41-
"main.go": mainTemplate,
42-
"go.mod": goModTemplate,
43-
"Makefile": makefileTemplate,
44-
"template.yaml": templateYamlTemplate,
45-
"Dockerfile": dockerfileTemplate,
46-
"docker-compose.yml": dockerComposeTemplate,
79+
"main.go": mainTmpl,
80+
"go.mod": goModTmpl,
81+
"Makefile": makefileTemplate,
82+
"template.yaml": templateYamlTemplate,
83+
"Dockerfile": dockerfileTemplate,
84+
}
85+
86+
if dockerComposeTmpl != "" {
87+
files["docker-compose.yml"] = dockerComposeTmpl
4788
}
4889

4990
for filename, tmpl := range files {
@@ -55,8 +96,8 @@ func (g *ProjectGenerator) Generate() error {
5596
// Generate internal package files
5697
internalFiles := map[string]string{
5798
"internal/controller/user_controller.go": userControllerTemplate,
58-
"internal/model/user.go": userModelTemplate,
59-
"internal/repository/user_repository.go": userRepositoryTemplate,
99+
"internal/model/user.go": userModelTmpl,
100+
"internal/repository/user_repository.go": userRepoTmpl,
60101
"internal/service/user_service.go": userServiceTemplate,
61102
}
62103

0 commit comments

Comments
 (0)