Skip to content

Commit

Permalink
Wrap business logic in transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
MarcGrol committed Feb 15, 2018
1 parent fad91b2 commit d430633
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 32 deletions.
19 changes: 19 additions & 0 deletions generator/rest/generateForRest.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ var customTemplateFuncs = template.FuncMap{
"HasInput": HasInput,
"GetInputArgType": GetInputArgType,
"GetOutputArgDeclaration": GetOutputArgDeclaration,
"GetOutputArgInitialisation": GetOutputArgInitialisation,
"GetOutputArgName": GetOutputArgName,
"HasAnyPathParam": HasAnyPathParam,
"IsSliceParam": IsSliceParam,
Expand Down Expand Up @@ -617,6 +618,24 @@ func GetOutputArgDeclaration(o model.Operation) string {
return ""
}

func GetOutputArgInitialisation(o model.Operation) string {
for _, arg := range o.OutputArgs {
if !IsErrorArg(arg) {
pointer := ""
slice := ""
if arg.IsPointer {
pointer = "*"
}

if arg.IsSlice {
slice = "[]"
}
return fmt.Sprintf("%s%s%s", slice, pointer, arg.TypeName)
}
}
return ""
}

func GetOutputArgName(o model.Operation) string {
for _, arg := range o.OutputArgs {
if !IsErrorArg(arg) {
Expand Down
55 changes: 23 additions & 32 deletions generator/rest/httpHandlers.tmpl.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,23 +154,29 @@ func {{$oper.Name}}( service *{{$serviceName}} ) http.HandlerFunc {
rest.HandleHttpError(c, credentials, errorh.NewInvalidInputErrorf(1, "Error parsing request body: %s", err), w, r)
return
}
{{end -}}
{{end}}
{{if HasMetaOutput . -}}
// call business logic
// call business logic
{{if HasMetaOutput . -}}
result, meta, err := service.{{$oper.Name}}({{GetInputParamString . }})
{{else if HasOutput . -}}
// call business logic
result, err := service.{{$oper.Name}}({{GetInputParamString . }})
var result {{GetOutputArgInitialisation . }}
err = eventStore.RunInTransaction(c, func(c context.Context) error {
result, err = service.{{$oper.Name}}({{GetInputParamString . }})
if err != nil {
return err
}
return nil
})
{{else -}}
// call business logic
err = service.{{$oper.Name}}({{GetInputParamString . }})
err = eventStore.RunInTransaction(c, func(c context.Context) error {
err = service.{{$oper.Name}}({{GetInputParamString . }})
{{end -}}
if err != nil {
rest.HandleHttpError(c, credentials, err, w, r)
return
}
{{if HasMetaOutput . -}}
{{if HasMetaOutput .}}
if meta != nil {
{{if IsMetaCallback . -}}
err = meta(c, w, r)
Expand All @@ -192,7 +198,7 @@ func {{$oper.Name}}( service *{{$serviceName}} ) http.HandlerFunc {
}
{{end -}}
{{if NeedsContext $oper -}}
{{if NeedsContext $oper}}
postLogicHook( c, w, r, credentials )
{{else -}}
postLogicHook( nil, w, r, credentials )
Expand All @@ -204,47 +210,32 @@ func {{$oper.Name}}( service *{{$serviceName}} ) http.HandlerFunc {
{{end -}}
{{if IsRestOperationJSON . -}}
{{if HasOutput . -}}
err = json.NewEncoder(w).Encode(result)
if err != nil {
log.Printf("Error encoding response payload %+v", err)
}
json.NewEncoder(w).Encode(result)
{{end -}}
{{else if IsRestOperationHTML . -}}
{{if HasOutput . -}}
err = service.{{$oper.Name}}WriteHTML(w, result)
service.{{$oper.Name}}WriteHTML(w, result)
{{else -}}
err = service.{{$oper.Name}}WriteHTML(w)
service.{{$oper.Name}}WriteHTML(w)
{{end -}}
if err != nil {
log.Printf("Error encoding response payload %+v", err)
}
{{else if IsRestOperationCSV . -}}
w.Header().Set("Content-Disposition", "attachment;filename={{ GetRestOperationFilename .}}")
{{if HasOutput . -}}
err = service.{{$oper.Name}}WriteCSV(w, result)
service.{{$oper.Name}}WriteCSV(w, result)
{{else -}}
err = {{$oper.Name}}WriteCSV(w)
{{$oper.Name}}WriteCSV(w)
{{end -}}
if err != nil {
log.Printf("Error encoding response payload %+v", err)
}
{{else if IsRestOperationTXT . -}}
_, err = fmt.Fprint(w, result)
if err != nil {
log.Printf("Error encoding response payload %+v", err)
}
fmt.Fprint(w, result)
{{else if IsRestOperationMD . -}}
_, err = fmt.Fprint(w, result)
if err != nil {
log.Printf("Error encoding response payload %+v", err)
}
fmt.Fprint(w, result)
{{else if IsRestOperationNoContent . -}}
w.WriteHeader(http.StatusNoContent)
{{else if IsRestOperationCustom . -}}
service.{{$oper.Name}}HandleResult({{GetContextName $oper }}, w, r, result)
{{else -}}
errorh.NewInternalErrorf(0, "Not implemented")
{{end -}}// call business logic
{{end -}}
}
}
{{else -}}
Expand Down

0 comments on commit d430633

Please sign in to comment.