Skip to content

Commit 8abe8d5

Browse files
committed
chore(multi-tenant): creating multi tenant stubs
1 parent 2998ead commit 8abe8d5

File tree

20 files changed

+171
-118
lines changed

20 files changed

+171
-118
lines changed

internal/application/services/dummy/GET/service.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ func (s *Service) Execute(request Request) {
2525
s.BadRequest(err.Error())
2626
return
2727
}
28-
s.produceResponseRule(request.Data, request.Client, request.Domain)
28+
s.produceResponseRule(request.Data, request.Domain)
2929
}
3030

3131
func (s *Service) GetResponse() (*Response, *services.Error) {
3232
return s.response, s.Error
3333
}
3434

35-
func (s *Service) produceResponseRule(data *Data, client string, domain *dummy.Dummy) {
35+
func (s *Service) produceResponseRule(data *Data, domain *dummy.Dummy) {
3636
dummyData, err := s.repository.Get(*domain, "id", data.ID)
3737

3838
if err != nil {

tools/generator/config.toml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,15 @@ table "{{domain}}" {
3939
$repeat$"""
4040
"{{domainType}}" = """type {{domainPascalCase}} struct {
4141
ID string `db:"id"`
42+
client string
43+
filters *filters.Filters
4244
}"""
4345
"{{pkType}}" = "ID string `param:\"id\"`"
4446
"{{pkName}}" = "ID"
4547
"{{pkDbName}}" = "id"
4648
"{{dataType}}" = ""
47-
"{{createServiceData}}" = "ID: s.idCreator.Create(),"
48-
"{{editServiceData}}" = "ID: id,"
49+
"{{createServiceData}}" = ""
50+
"{{editServiceData}}" = ""
4951
"{{optionalImports}}" = ""
5052
"{{idVar}}" = ""
5153

@@ -101,7 +103,7 @@ deleteLinePatterns = [
101103
]
102104

103105
[stubs.crud.migrator_schema]
104-
toPath = "tools/migrator/schema/schema.my.hcl"
106+
toPath = "schemas/schema.my.hcl"
105107
isGenerated = false
106108
deleteRegex = "(?s)table \"{{domain}}\" {\\s*.*?\\s*}\n*//tableEnd\n\n"
107109

tools/generator/generateFromDb.go

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func (cg *CodeGenerator) generateDomainFromHclBlock(block *hclwrite.Block, table
6666
domain := cg.generateDomainStruct(block.Body().Blocks(), tableName, cg.primaryKey, cg.pkType)
6767
dataType := cg.generateStruct(block.Body().Blocks(), nil, nil, cg.generateDeclarationLine)
6868
createAttrData := cg.generateStruct(block.Body().Blocks(), nil, nil, cg.generateCreateAttributionLine)
69-
editAttrData := cg.generateStruct(block.Body().Blocks(), nil, nil, cg.generateEditAttributionLine)
69+
editAttrData := cg.generateStruct(block.Body().Blocks(), nil, nil, cg.generateCreateAttributionLine)
7070
replacers := GetReplacersConfig(cg.config, cg.domainType, []string{tableName})
7171
replacers["{{domainType}}"] = domain
7272
replacers["{{dataType}}"] = dataType
@@ -88,6 +88,7 @@ func (cg *CodeGenerator) generateDomainStruct(blocks []*hclwrite.Block, tableNam
8888
*pk = cg.findPkOnBlocks(blocks)
8989
structString := "type " + PascalCase(tableName) + " struct {\n"
9090
structString += cg.generateStruct(blocks, pk, pkType, cg.generateDeclarationLine)
91+
structString += "\tclient string\n\tfilters *filters.Filters"
9192
structString += "}"
9293
return structString
9394
}
@@ -137,36 +138,20 @@ func (cg *CodeGenerator) generateDeclarationLine(str, name, goType, dbTag string
137138
)
138139
}
139140

140-
func (cg *CodeGenerator) generateCreateAttributionLine(str, name, goType, _ string) string {
141+
func (cg *CodeGenerator) generateCreateAttributionLine(str, name, _, _ string) string {
141142
if name == PascalCase(*cg.primaryKey) {
142-
if strings.Contains(goType, "int") {
143-
*cg.isIntId = true
144-
return str
145-
}
146-
return fmt.Sprintf(
147-
"%s %s: &id,\n",
148-
str,
149-
name,
150-
)
143+
return ""
151144
}
152145
return fmt.Sprintf(
153-
"%s %s: data.%s,\n",
146+
"{{domainCamelCase}}Data.%s = data.%s",
154147
str,
155148
name,
156-
name,
157149
)
158150
}
159151

160-
func (cg *CodeGenerator) generateEditAttributionLine(str, name, goType, _ string) string {
152+
func (cg *CodeGenerator) generateEditAttributionLine(str, name, _, _ string) string {
161153
if name == PascalCase(*cg.primaryKey) {
162-
if strings.Contains(goType, "int") {
163-
return str
164-
}
165-
return fmt.Sprintf(
166-
"%s %s: &id,\n",
167-
str,
168-
name,
169-
)
154+
return ""
170155
}
171156
return fmt.Sprintf(
172157
"%s %s: data.%s,\n",

tools/generator/generator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func (cg *CodeGenerator) GenerateFilesFromStubs(stubs map[string]Stubs, replacer
8989
if !stub.IsGenerated {
9090
data, err := GetFileData(stub.ToPath)
9191
if err != nil {
92-
cg.Logger.Error(err)
92+
cg.Logger.Info("File: " + stub.ToPath + " does not exist, generation in this file will be ignored")
9393
}
9494

9595
replData := Replacer(data, replacers)

tools/generator/stubs/crud/domain/{{domain}}.go.stub

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,27 @@ package {{domain}}
33
import (
44
"go-skeleton/internal/application/providers/pagination"
55
"go-skeleton/internal/repositories/base_repository"
6+
"go-skeleton/internal/application/providers/filters"
67
{{optionalImports}}
78
)
89

910
{{domainType}}
1011

12+
func (d *{{domainPascalCase}}) SetClient(client string) {
13+
d.client = client
14+
}
15+
16+
func (d *{{domainPascalCase}}) SetFilters(filters *filters.Filters) {
17+
d.filters = filters
18+
}
19+
20+
func (d {{domainPascalCase}}) GetFilters() filters.Filters {
21+
if d.filters != nil {
22+
return *d.filters
23+
}
24+
return filters.Filters{}
25+
}
26+
1127
func (d {{domainPascalCase}}) Schema() string {
1228
return "{{domain}}"
1329
}

tools/generator/stubs/crud/handlers/{{domain}}.go.stub

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package handlers
22

33
import (
4+
requestContext "go-skeleton/internal/application/context"
45
"go-skeleton/internal/application/domain/{{domain}}"
56
"go-skeleton/internal/application/providers/filters"
67
"go-skeleton/internal/application/providers/pagination"
@@ -43,6 +44,7 @@ func New{{domainPascalCase}}Handlers(reg *registry.Registry) *{{domainPascalCase
4344
// @Accept json
4445
// @Produce json
4546
// @Param {{domainCamelCase}}_id path string true "{{domainPascalCase}} ID"
47+
// @Param Tenant header string false "tenant name"
4648
// @Success 200 {object} {{domainCamelCase}}Get.Response
4749
// @Failure 400 {object} services.Error
4850
// @Failure 404 {object} services.Error
@@ -55,9 +57,12 @@ func (hs *{{domainPascalCase}}Handlers) HandleGet{{domainPascalCase}}(context ec
5557
if errors := context.Bind(data); errors != nil {
5658
return context.JSON(422, errors)
5759
}
58-
60+
tenant := context.Get("tenant").(string)
61+
request := {{domainCamelCase}}Get.NewRequest(data)
62+
ctx := requestContext.NewPrepareContext(tenant)
63+
ctx.SetContext(request.Domain)
5964
s.Execute(
60-
{{domainCamelCase}}Get.NewRequest(data),
65+
request,
6166
)
6267

6368
response, err := s.GetResponse()
@@ -73,6 +78,7 @@ func (hs *{{domainPascalCase}}Handlers) HandleGet{{domainPascalCase}}(context ec
7378
// @Accept json
7479
// @Produce json
7580
// @Param request body {{domainCamelCase}}Create.Data true "body model"
81+
// @Param Tenant header string false "tenant name"
7682
// @Success 200 {object} {{domainCamelCase}}Create.Response
7783
// @Failure 400 {object} services.Error
7884
// @Failure 404 {object} services.Error
@@ -85,9 +91,12 @@ func (hs *{{domainPascalCase}}Handlers) HandleCreate{{domainPascalCase}}(context
8591
if errors := context.Bind(data); errors != nil {
8692
return context.JSON(http.StatusBadRequest, errors)
8793
}
88-
94+
tenant := context.Get("tenant").(string)
95+
request := {{domainCamelCase}}Create.NewRequest(data, hs.validator)
96+
ctx := requestContext.NewPrepareContext(tenant)
97+
ctx.SetContext(request.Domain)
8998
s.Execute(
90-
{{domainCamelCase}}Create.NewRequest(data, hs.validator),
99+
request,
91100
)
92101

93102
response, err := s.GetResponse()
@@ -104,6 +113,7 @@ func (hs *{{domainPascalCase}}Handlers) HandleCreate{{domainPascalCase}}(context
104113
// @Produce json
105114
// @Param {{domainCamelCase}}_id path string true "{{domainPascalCase}} ID"
106115
// @Param request body {{domainCamelCase}}Edit.Data true "body model"
116+
// @Param Tenant header string false "tenant name"
107117
// @Success 200 {object} {{domainCamelCase}}Edit.Response
108118
// @Failure 400 {object} services.Error
109119
// @Failure 404 {object} services.Error
@@ -118,8 +128,12 @@ func (hs *{{domainPascalCase}}Handlers) HandleEdit{{domainPascalCase}}(context e
118128
return context.JSON(http.StatusBadRequest, errors)
119129
}
120130

131+
tenant := context.Get("tenant").(string)
132+
request := {{domainCamelCase}}Edit.NewRequest(id, data, hs.validator)
133+
ctx := requestContext.NewPrepareContext(tenant)
134+
ctx.SetContext(request.Domain)
121135
s.Execute(
122-
{{domainCamelCase}}Edit.NewRequest(id, data, hs.validator),
136+
request,
123137
)
124138

125139
response, err := s.GetResponse()
@@ -135,6 +149,7 @@ func (hs *{{domainPascalCase}}Handlers) HandleEdit{{domainPascalCase}}(context e
135149
// @Accept json
136150
// @Produce json
137151
// @Param page query int true "valid int"
152+
// @Param Tenant header string false "tenant name"
138153
// @Success 200 {object} {{domainCamelCase}}List.Response
139154
// @Failure 400 {object} services.Error
140155
// @Failure 404 {object} services.Error
@@ -159,8 +174,12 @@ func (hs *{{domainPascalCase}}Handlers) HandleList{{domainPascalCase}}(context e
159174

160175
f := filters.NewFilters()
161176

177+
tenant := context.Get("tenant").(string)
178+
request := {{domainCamelCase}}List.NewRequest(data, f)
179+
ctx := requestContext.NewPrepareContext(tenant)
180+
ctx.SetContext(request.Domain)
162181
s.Execute(
163-
{{domainCamelCase}}List.NewRequest(data, *f),
182+
request,
164183
)
165184

166185
response, err := s.GetResponse()
@@ -175,6 +194,7 @@ func (hs *{{domainPascalCase}}Handlers) HandleList{{domainPascalCase}}(context e
175194
// @Tags {{domainPascalCase}}
176195
// @Accept json
177196
// @Produce json
197+
// @Param Tenant header string false "tenant name"
178198
// @Param {{domainCamelCase}}_id path string true "{{domainPascalCase}} ID"
179199
// @Success 200 {object} {{domainCamelCase}}Delete.Response
180200
// @Failure 400 {object} services.Error
@@ -189,8 +209,12 @@ func (hs *{{domainPascalCase}}Handlers) HandleDelete{{domainPascalCase}}(context
189209
return context.JSON(http.StatusBadRequest, errors)
190210
}
191211

212+
tenant := context.Get("tenant").(string)
213+
request := {{domainCamelCase}}Delete.NewRequest(data)
214+
ctx := requestContext.NewPrepareContext(tenant)
215+
ctx.SetContext(request.Domain)
192216
s.Execute(
193-
{{domainCamelCase}}Delete.NewRequest(data),
217+
request,
194218
)
195219

196220
response, err := s.GetResponse()

tools/generator/stubs/crud/services/CREATE/request.go.stub

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,23 @@ package {{domain}}
33
import (
44
{{validatorImport}}
55
{{optionalImports}}
6+
"go-skeleton/internal/application/domain/{{domainCamelCase}}"
67
)
78

89
type Data struct {{{dataType}}}
910

1011
type Request struct {
1112
Data *Data
13+
Domain *{{domainCamelCase}}.{{domainPascalCase}}
1214
Err error
1315
{{validator}}
1416
}
1517

1618
func NewRequest(data *Data{{,validator}}) Request {
19+
domain := &{{domainCamelCase}}.{{domainPascalCase}}{}
1720
return Request{
1821
Data: data,
22+
Domain: domain,
1923
{{validatorInject}}
2024
}
2125
}

tools/generator/stubs/crud/services/CREATE/service.go.stub

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,29 +27,29 @@ func (s *Service) Execute(request Request) {
2727
s.BadRequest(err.Error())
2828
return
2929
}
30-
s.produceResponseRule(request.Data)
30+
s.produceResponseRule(request.Data, request.Domain)
3131
}
3232

3333
func (s *Service) GetResponse() (*Response, *services.Error) {
3434
return s.response, s.Error
3535
}
3636

37-
func (s *Service) produceResponseRule(data *Data) {
38-
{{idVar}}
39-
{{domainCamelCase}} := {{domain}}.{{domainPascalCase}}{{{createServiceData}}}
37+
func (s *Service) produceResponseRule(data *Data, {{domainCamelCase}}Data *{{domainCamelCase}}.{{domainPascalCase}}) {
38+
{{idVar}}
39+
{{createServiceData}}
4040

41-
tx, txErr := s.repository.InitTX()
42-
if txErr != nil {
43-
s.InternalServerError("error on create", txErr)
44-
return
45-
}
41+
tx, txErr := s.repository.InitTX()
42+
if txErr != nil {
43+
s.InternalServerError("error on create", txErr)
44+
return
45+
}
4646

47-
err := s.repository.Create({{domainCamelCase}}, tx, true)
47+
err := s.repository.Create(*{{domainCamelCase}}Data, tx, true)
4848
if err != nil {
4949
s.InternalServerError("error on create", err)
5050
return
5151
}
5252
s.response = &Response{
53-
Data: {{domainCamelCase}},
53+
Data: *{{domainCamelCase}}Data,
5454
}
5555
}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
package {{domain}}
22

3+
import "go-skeleton/internal/application/domain/{{domainCamelCase}}"
4+
35
type Data struct {
46
{{pkType}}
57
}
68

79
type Request struct {
810
Data *Data
11+
Domain *{{domainCamelCase}}.{{domainPascalCase}}
912
err error
1013
}
1114

1215
func NewRequest(data *Data) Request {
16+
domain := &{{domainCamelCase}}.{{domainPascalCase}}{}
1317
return Request{
1418
Data: data,
19+
Domain: domain,
1520
}
1621
}
1722

1823
func (r *Request) Validate() error {
19-
// Add request validations
24+
// Add request validations
2025
return nil
2126
}

tools/generator/stubs/crud/services/DELETE/service.go.stub

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,21 @@ func (s *Service) Execute(request Request) {
2525
s.BadRequest(err.Error())
2626
return
2727
}
28-
s.produceResponseRule(request.Data)
28+
s.produceResponseRule(request.Data, request.Domain)
2929
}
3030

3131
func (s *Service) GetResponse() (*Response, *services.Error) {
3232
return s.response, s.Error
3333
}
3434

35-
func (s *Service) produceResponseRule(data *Data) {
36-
{{domainCamelCase}} := {{domain}}.{{domainPascalCase}}{
37-
{{pkName}}: &data.{{pkName}},
38-
}
39-
40-
err := s.repository.Delete("{{pkDbName}}", *{{domainCamelCase}}.{{pkName}})
35+
func (s *Service) produceResponseRule(data *Data, domain *{{domainCamelCase}}.{{domainPascalCase}}) {
36+
err := s.repository.Delete(*domain, "{{pkDbName}}", data.{{pkName}})
4137
if err != nil {
42-
s.InternalServerError("error on delete", err)
43-
return
38+
s.InternalServerError("error on delete", err)
39+
return
4440
}
4541

4642
s.response = &Response{
47-
Message: "OK",
43+
Message: "OK",
4844
}
4945
}

0 commit comments

Comments
 (0)