11package main
22
33import (
4+ "bufio"
45 "fmt"
56 "os"
67 "path/filepath"
@@ -25,8 +26,9 @@ import (
2526 {{.ModuleName}}Services "{{.ProjectRoot}}/internal/app/modules/{{.ModuleName}}/services"
2627 "{{.ProjectRoot}}/pkg/logger"
2728 "{{.ProjectRoot}}/pkg/validators"
28- "github.com/go-chi/chi/v5 "
29+ "github.com/go-chi/chi"
2930 "gorm.io/gorm"
31+ "net/http"
3032)
3133
3234// Module represents the {{.CapitalizedModuleName}} module.
@@ -37,7 +39,7 @@ type Module struct {
3739
3840// NewModule initializes {{.CapitalizedModuleName}} module.
3941func NewModule(db *gorm.DB, log logger.Logger, validator *validators.Validator) *Module {
40- repo := {{.ModuleName}}Repositories.NewGorm {{.CapitalizedModuleName}}Repository(db, log)
42+ repo := {{.ModuleName}}Repositories.New {{.CapitalizedModuleName}}Repository(db, log)
4143 service := {{.ModuleName}}Services.New{{.CapitalizedModuleName}}Service(repo, validator, log)
4244 handler := {{.ModuleName}}Handlers.New{{.CapitalizedModuleName}}Handler(service, log)
4345
@@ -49,31 +51,35 @@ func NewModule(db *gorm.DB, log logger.Logger, validator *validators.Validator)
4951// RegisterRoutes registers the routes for the {{.CapitalizedModuleName}} module.
5052func (m *Module) RegisterRoutes(r chi.Router) {
5153 // Register the routes for the {{.ModuleName}} module
52- r.Route("/{{.ModuleName}}s", func(r chi.Router) {
53- r.Post("/", m.Handlers.Create{{.CapitalizedModuleName}})
54- r.Get("/", m.Handlers.GetAll{{.CapitalizedModuleName}}s)
54+ r.Route("/{{.ModuleName}}", func(r chi.Router) {
55+ r.Get("/test", func(w http.ResponseWriter, r *http.Request) {
56+ w.WriteHeader(http.StatusOK)
57+ w.Write([]byte("Module {{.ModuleName}} is working!"))
58+ })
59+ //r.Post("/", m.Handlers.Create{{.CapitalizedModuleName}})
60+ //r.Get("/", m.Handlers.GetAll{{.CapitalizedModuleName}}s)
5561
5662 })
5763}
5864`
5965
6066const handlersGoTemplate = `package handlers
6167import (
62- "context"
63- "net/http"
68+ // "context"
69+ // "net/http"
6470 {{.ModuleName}}Services "{{.ProjectRoot}}/internal/app/modules/{{.ModuleName}}/services"
6571 "{{.ProjectRoot}}/pkg/logger"
66- "{{.ProjectRoot}}/pkg/web"
67- "{{.ProjectRoot}}/internal/app/modules/{{.ModuleName}}/models"
72+ // "{{.ProjectRoot}}/pkg/web"
73+ // "{{.ProjectRoot}}/internal/app/modules/{{.ModuleName}}/models"
6874)
6975
7076type {{.CapitalizedModuleName}}Handler struct {
71- {{.ModuleName}}Service * {{.ModuleName}}Services.{{.CapitalizedModuleName}}Service
77+ {{.ModuleName}}Service {{.ModuleName}}Services.{{.CapitalizedModuleName}}Service
7278 log logger.Logger
7379}
7480
7581// constructor for {{.CapitalizedModuleName}}Handler
76- func New{{.CapitalizedModuleName}}Handler({{.ModuleName}}Service * {{.ModuleName}}Services.{{.CapitalizedModuleName}}Service, log logger.Logger) *{{.CapitalizedModuleName}}Handler {
82+ func New{{.CapitalizedModuleName}}Handler({{.ModuleName}}Service {{.ModuleName}}Services.{{.CapitalizedModuleName}}Service, log logger.Logger) *{{.CapitalizedModuleName}}Handler {
7783 return &{{.CapitalizedModuleName}}Handler{
7884 {{.ModuleName}}Service: {{.ModuleName}}Service,
7985 log: log,
@@ -93,9 +99,9 @@ func New{{.CapitalizedModuleName}}Handler({{.ModuleName}}Service *{{.ModuleName}
9399
94100const servicesGoTemplate = `package services
95101import (
96- "context"
102+ // "context"
97103 {{.ModuleName}}Repositories "{{.ProjectRoot}}/internal/app/modules/{{.ModuleName}}/repositories"
98- "{{.ProjectRoot}}/internal/app/modules/{{.ModuleName}}/models"
104+ // "{{.ProjectRoot}}/internal/app/modules/{{.ModuleName}}/models"
99105 "{{.ProjectRoot}}/pkg/logger"
100106 "{{.ProjectRoot}}/pkg/validators"
101107)
@@ -105,15 +111,15 @@ type {{.CapitalizedModuleName}}Service interface {
105111 //Get{{.CapitalizedModuleName}}ByID(ctx context.Context, id int) (*models.{{.CapitalizedModuleName}}, error)
106112}
107113
108- type {{.CapitalizedModuleName }}Service struct {
109- {{.ModuleName}} Repo {{.ModuleName}}Repositories.{{.CapitalizedModuleName}}Repository
114+ type {{.ModuleName }}Service struct {
115+ Repo {{.ModuleName}}Repositories.{{.CapitalizedModuleName}}Repository
110116 validator *validators.Validator
111117 log logger.Logger
112118}
113119
114120//service constructor
115- func New{{.CapitalizedModuleName}}Service({{.ModuleName}} Repo {{.ModuleName}}Repositories.{{.CapitalizedModuleName}}Repository, validator *validators.Validator, log logger.Logger) * {{.CapitalizedModuleName}}Service {
116- return &{{.CapitalizedModuleName }}Service{
121+ func New{{.CapitalizedModuleName}}Service(Repo {{.ModuleName}}Repositories.{{.CapitalizedModuleName}}Repository, validator *validators.Validator, log logger.Logger) {{.CapitalizedModuleName}}Service {
122+ return &{{.ModuleName }}Service{
117123 Repo: Repo,
118124 validator: validator,
119125 log: log,
@@ -129,8 +135,8 @@ func New{{.CapitalizedModuleName}}Service({{.ModuleName}}Repo {{.ModuleName}}Rep
129135`
130136const repositoriesGoTemplate = `package repositories
131137 import (
132- "context"
133- "{{.ProjectRoot}}/internal/app/modules/{{.ModuleName}}/models"
138+ // "context"
139+ // "{{.ProjectRoot}}/internal/app/modules/{{.ModuleName}}/models"
134140 "{{.ProjectRoot}}/pkg/logger"
135141 "gorm.io/gorm"
136142 )
@@ -139,11 +145,17 @@ const repositoriesGoTemplate = `package repositories
139145 // Example method:
140146 // Create{{.CapitalizedModuleName}}(ctx context.Context, {{.ModuleName}} *models.{{.CapitalizedModuleName}}) error
141147}
142- type gorm {{.CapitalizedModuleName }}Repository struct {
148+ type {{.ModuleName }}Repository struct {
143149 db *gorm.DB
144150 log logger.Logger
145151 }
146-
152+ // repo constructor
153+ func New{{.CapitalizedModuleName}}Repository(db *gorm.DB, log logger.Logger) {{.CapitalizedModuleName}}Repository {
154+ return &{{.ModuleName}}Repository{
155+ db: db,
156+ log: log,
157+ }
158+ }
147159 //repos methods
148160 //eg.
149161 // func (r *gorm{{.CapitalizedModuleName}}Repository) Create{{.CapitalizedModuleName}}(ctx context.Context, {{.ModuleName}} *models.{{.CapitalizedModuleName}}) error {
@@ -162,13 +174,36 @@ func main(){
162174 moduleName := strings .ToLower (os .Args [1 ])
163175 capitalizedModuleName := strings .ToUpper (moduleName [:1 ]) + moduleName [1 :]
164176
177+ if strings .Contains (moduleName , "-" ) || strings .Contains (moduleName , "_" ) {
178+ fmt .Println ("Module name cannot contain '-' or '_' characters. Please use a valid module name." )
179+ os .Exit (1 )
180+ }
181+ if moduleName == "main" || moduleName == "cmd" || moduleName == "internal" || moduleName == "pkg" {
182+ fmt .Printf ("Module name '%s' is reserved. Please choose a different name.\n " , moduleName )
183+ os .Exit (1 )
184+ }
185+
165186 moduleData := ModuleData {
166187 ModuleName : moduleName ,
167188 CapitalizedModuleName : capitalizedModuleName ,
168189 ProjectRoot : projectGoModulePath ,
169190 }
170191 basePath := filepath .Join ("internal" , "app" , "modules" , moduleName )
171192
193+ if _ , err := os .Stat (basePath ); ! os .IsNotExist (err ) {
194+ reader := bufio .NewReader (os .Stdin )
195+ fmt .Printf ("Module '%s' already exists at %s . Overwrite? (Y/N): " , moduleName , basePath )
196+
197+ response , _ := reader .ReadString ('\n' )
198+ response = strings .ToLower (strings .TrimSpace (response ))
199+
200+ if response != "y" {
201+ fmt .Println ("Operation cancelled" )
202+ os .Exit (0 )
203+ }
204+ fmt .Printf ("proceeding to overwrite module '%s'....\n " , moduleName )
205+ }
206+
172207 dirs := []string {
173208 basePath ,
174209 filepath .Join (basePath , "handlers" ),
@@ -216,7 +251,7 @@ func main(){
216251
217252 fmt .Printf ("\n Module '%s' generated successfully. Remember to:\n " , moduleName )
218253 fmt .Println ("- Add it to 'internal/bootstrap/app.go' in the appModules slice." )
219- fmt .Printf ("- **Crucially, create your model file(s) in 'internal/app/modules/%s/models/' (e.g., %s.go) and define your structs with 'package models'.** " , moduleName , moduleName )
254+ fmt .Printf ("- **Crucially, create your model file(s) in 'internal/app/modules/%s/models/'.** \n " , moduleName )
220255 fmt .Println ("- Adjust generated boilerplate code (e.g., imports, methods, model usage)." )
221256 fmt .Println ("- Run 'go mod tidy' after adding to app.go." )
222257
0 commit comments