From a7e62d848c5c930d072b60ec84a6ed8c05f8fd0d Mon Sep 17 00:00:00 2001
From: "a.petraki" <a.petraki@perx.ru>
Date: Wed, 14 Feb 2024 10:50:18 +0300
Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BD=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20=D0=B4=D0=BB?=
 =?UTF-8?q?=D1=8F=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8?=
 =?UTF-8?q?=20LogInfoMiddleware.=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?=
 =?UTF-8?q?=D1=82=D0=B0=D0=BD=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20?=
 =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?=
 =?UTF-8?q?=D0=B8=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20Wit?=
 =?UTF-8?q?hLog=20=D1=82=D0=B0=D0=BA,=20=D1=87=D1=82=D0=BE=D0=B1=D1=8B=20?=
 =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D1=82=D1=8C=20LogInf?=
 =?UTF-8?q?oMiddleware=20=D0=B2=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=20I?=
 =?UTF-8?q?tems?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 assets/templates/middleware/info_log.tmpl     | 79 +++++++++++++++++++
 assets/templates/middleware/middleware        | 21 -----
 assets/templates/middleware/middleware.tmpl   | 29 +++++++
 ...e_middleware.go => log_info_middleware.go} | 22 +++---
 pkg/items/middleware/middleware.go            | 13 ++-
 5 files changed, 128 insertions(+), 36 deletions(-)
 create mode 100644 assets/templates/middleware/info_log.tmpl
 delete mode 100755 assets/templates/middleware/middleware
 create mode 100755 assets/templates/middleware/middleware.tmpl
 rename pkg/items/middleware/{log_service_middleware.go => log_info_middleware.go} (74%)

diff --git a/assets/templates/middleware/info_log.tmpl b/assets/templates/middleware/info_log.tmpl
new file mode 100644
index 00000000..195caef8
--- /dev/null
+++ b/assets/templates/middleware/info_log.tmpl
@@ -0,0 +1,79 @@
+import (
+    "fmt"
+    "time"
+    "context"
+
+    "git.perx.ru/perxis/perxis-go/pkg/items"
+    logzap "git.perx.ru/perxis/perxis-go/pkg/log/zap"
+    "go.uber.org/zap"
+    "go.uber.org/zap/zapcore"
+)
+
+{{ $funcName := (or .Vars.FuncName ("LogMiddleware")) }}
+{{ $decorator := (or .Vars.DecoratorName ("logMiddleware")) }}
+{{ $packageName := (split "." .Interface.Type)._0 }}
+{{ $serviceName := (split "." .Interface.Type)._1 }}
+{{ $objectName := (trimSuffix "s" (split "." .Interface.Type)._1) }}
+{{ $writeMethods :=  list "Archive" "Create" "Delete" "Publish" "Unarchive" "Undelete" "Unpublish" "Update" }}
+
+type {{ $decorator }} struct {
+    logger *zap.Logger
+    next {{ .Interface.Type }}
+}
+
+func {{ $funcName }} (logger *zap.Logger) Middleware {
+    return func(next {{ .Interface.Type }}) {{ .Interface.Type }} {
+        return &{{ $decorator }}{
+            next: next,
+            logger: logger.With(logzap.Component("{{ $serviceName }}")),
+        }
+    }
+}
+
+{{ range $method := .Interface.Methods }}
+    func (m *{{ $decorator }}) {{ $method.Declaration }} {
+    {{- if has $method.Name $writeMethods }}
+        {{ $method.ResultsNames }} = m.next.{{ $method.Call }}
+
+        {{ $inputObject := "" }}
+        {{ $outputObject := "" }}
+
+        {{ if gt (len $method.Results) 1 }}
+            {{ $outputObject = (first $method.Results).Name }}
+        {{ end }}
+
+        {{ if $method.AcceptsContext }}
+            {{ $inputObject = (first (rest $method.Params)).Name }}
+        {{ else if not $method.ReturnsError }}
+            {{ $inputObject = (first $method.Params).Name }}
+        {{ end }}
+
+        fields := []zapcore.Field{
+        logzap.Event({{ $packageName }}.Event{{ $method.Name }}{{ $objectName }}),
+        logzap.CallerFromContext(ctx),
+        {{/*            {{ if eq $outputObject "" }} logzap.Object({{ $inputObject }}), {{- end }}*/}}
+        }
+
+        {{ if $method.ReturnsError }}
+            if err != nil {
+            {{- if not (eq $inputObject "") }}
+                fields = append(fields, logzap.Object({{ $inputObject }}))
+            {{- end }}
+            m.logger.Error(fmt.Sprintf("Failed to {{ (lower $method.Name) }}. Error: %s", err), fields...)
+            } else {
+            {{- if not (eq $outputObject "") }}
+                fields = append(fields, logzap.Object({{ $inputObject }}))
+            {{- else if not (eq $inputObject "") }}
+                fields = append(fields, logzap.Object({{ $inputObject }}))
+            {{- end }}
+            m.logger.Info("Successfully {{ (lower (trimSuffix "e" $method.Name)) }}ed", fields...)
+            }
+        {{ end }}
+
+        m.logger.Info("{{ $method.Name }}", fields...)
+        return {{ $method.ResultsNames }}
+    {{- else }}
+        return m.next.{{ $method.Call }}
+    {{- end }}
+    }
+{{ end }}
diff --git a/assets/templates/middleware/middleware b/assets/templates/middleware/middleware
deleted file mode 100755
index 89877774..00000000
--- a/assets/templates/middleware/middleware
+++ /dev/null
@@ -1,21 +0,0 @@
-import (
-	"go.uber.org/zap"
-)
-
-type Middleware func({{.Interface.Type}}) {{.Interface.Type}}
-
-
-func WithLog(s {{.Interface.Type}}, logger *zap.Logger, log_access bool) {{.Interface.Type}} {
-	if logger == nil {
-		logger = zap.NewNop()
-	}
-
-	logger = logger.Named("{{ .Interface.Name }}")
-	s = ErrorLoggingMiddleware(logger)(s)
-	if log_access {
-		s = LoggingMiddleware(logger)(s)
-	}
-	s = RecoveringMiddleware(logger)(s)
-	return s
-}
-
diff --git a/assets/templates/middleware/middleware.tmpl b/assets/templates/middleware/middleware.tmpl
new file mode 100755
index 00000000..bbbc20e5
--- /dev/null
+++ b/assets/templates/middleware/middleware.tmpl
@@ -0,0 +1,29 @@
+import (
+	"go.uber.org/zap"
+)
+
+{{ $serviceName := (split "." .Interface.Type)._1 }}
+
+type Middleware func({{.Interface.Type}}) {{.Interface.Type}}
+
+func WithLog(s {{.Interface.Type}}, logger, svcLogger *zap.Logger, log_access bool) {{.Interface.Type}} {
+	if logger == nil {
+		logger = zap.NewNop()
+	}
+    logger = logger.Named("{{ .Interface.Name }}")
+
+    {{ if (eq $serviceName "Items") }}
+    if svcLogger == nil {
+	    svcLogger = zap.NewNop()
+    }
+	s = LogInfoMiddleware(svcLogger)(s)
+	{{ end }}
+
+	s = ErrorLoggingMiddleware(logger)(s)
+	if log_access {
+		s = LoggingMiddleware(logger)(s)
+	}
+	s = RecoveringMiddleware(logger)(s)
+	return s
+}
+
diff --git a/pkg/items/middleware/log_service_middleware.go b/pkg/items/middleware/log_info_middleware.go
similarity index 74%
rename from pkg/items/middleware/log_service_middleware.go
rename to pkg/items/middleware/log_info_middleware.go
index 48c4125e..c80d51d4 100644
--- a/pkg/items/middleware/log_service_middleware.go
+++ b/pkg/items/middleware/log_info_middleware.go
@@ -10,21 +10,21 @@ import (
 	"go.uber.org/zap/zapcore"
 )
 
-type logServiceMiddleware struct {
+type logInfoMiddleware struct {
 	items.Items
 	logger *zap.Logger
 }
 
-func LogServiceMiddleware(logger *zap.Logger) Middleware {
+func LogInfoMiddleware(logger *zap.Logger) Middleware {
 	return func(next items.Items) items.Items {
-		return &logServiceMiddleware{
+		return &logInfoMiddleware{
 			Items:  next,
 			logger: logger.With(logzap.Component("Items")),
 		}
 	}
 }
 
-func (m *logServiceMiddleware) Archive(ctx context.Context, item *items.Item, options ...*items.ArchiveOptions) (err error) {
+func (m *logInfoMiddleware) Archive(ctx context.Context, item *items.Item, options ...*items.ArchiveOptions) (err error) {
 	err = m.Items.Archive(ctx, item, options...)
 
 	fields := []zapcore.Field{
@@ -41,7 +41,7 @@ func (m *logServiceMiddleware) Archive(ctx context.Context, item *items.Item, op
 	return err
 }
 
-func (m *logServiceMiddleware) Create(ctx context.Context, item *items.Item, opts ...*items.CreateOptions) (created *items.Item, err error) {
+func (m *logInfoMiddleware) Create(ctx context.Context, item *items.Item, opts ...*items.CreateOptions) (created *items.Item, err error) {
 	created, err = m.Items.Create(ctx, item, opts...)
 
 	fields := []zapcore.Field{
@@ -58,7 +58,7 @@ func (m *logServiceMiddleware) Create(ctx context.Context, item *items.Item, opt
 	return created, err
 }
 
-func (m *logServiceMiddleware) Delete(ctx context.Context, item *items.Item, options ...*items.DeleteOptions) (err error) {
+func (m *logInfoMiddleware) Delete(ctx context.Context, item *items.Item, options ...*items.DeleteOptions) (err error) {
 	err = m.Items.Delete(ctx, item, options...)
 
 	fields := []zapcore.Field{
@@ -75,7 +75,7 @@ func (m *logServiceMiddleware) Delete(ctx context.Context, item *items.Item, opt
 	return err
 }
 
-func (m *logServiceMiddleware) Publish(ctx context.Context, item *items.Item, options ...*items.PublishOptions) (err error) {
+func (m *logInfoMiddleware) Publish(ctx context.Context, item *items.Item, options ...*items.PublishOptions) (err error) {
 	err = m.Items.Publish(ctx, item, options...)
 
 	fields := []zapcore.Field{
@@ -92,7 +92,7 @@ func (m *logServiceMiddleware) Publish(ctx context.Context, item *items.Item, op
 	return err
 }
 
-func (m *logServiceMiddleware) Unarchive(ctx context.Context, item *items.Item, options ...*items.UnarchiveOptions) (err error) {
+func (m *logInfoMiddleware) Unarchive(ctx context.Context, item *items.Item, options ...*items.UnarchiveOptions) (err error) {
 	err = m.Items.Unarchive(ctx, item, options...)
 
 	fields := []zapcore.Field{
@@ -109,7 +109,7 @@ func (m *logServiceMiddleware) Unarchive(ctx context.Context, item *items.Item,
 	return err
 }
 
-func (m *logServiceMiddleware) Undelete(ctx context.Context, item *items.Item, options ...*items.UndeleteOptions) (err error) {
+func (m *logInfoMiddleware) Undelete(ctx context.Context, item *items.Item, options ...*items.UndeleteOptions) (err error) {
 	err = m.Items.Undelete(ctx, item, options...)
 
 	fields := []zapcore.Field{
@@ -126,7 +126,7 @@ func (m *logServiceMiddleware) Undelete(ctx context.Context, item *items.Item, o
 	return err
 }
 
-func (m *logServiceMiddleware) Unpublish(ctx context.Context, item *items.Item, options ...*items.UnpublishOptions) (err error) {
+func (m *logInfoMiddleware) Unpublish(ctx context.Context, item *items.Item, options ...*items.UnpublishOptions) (err error) {
 	err = m.Items.Unpublish(ctx, item, options...)
 
 	fields := []zapcore.Field{
@@ -143,7 +143,7 @@ func (m *logServiceMiddleware) Unpublish(ctx context.Context, item *items.Item,
 	return err
 }
 
-func (m *logServiceMiddleware) Update(ctx context.Context, item *items.Item, options ...*items.UpdateOptions) (err error) {
+func (m *logInfoMiddleware) Update(ctx context.Context, item *items.Item, options ...*items.UpdateOptions) (err error) {
 	err = m.Items.Update(ctx, item, options...)
 
 	fields := []zapcore.Field{
diff --git a/pkg/items/middleware/middleware.go b/pkg/items/middleware/middleware.go
index 52a1c121..70a642a2 100644
--- a/pkg/items/middleware/middleware.go
+++ b/pkg/items/middleware/middleware.go
@@ -1,10 +1,10 @@
 // Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/middleware
+// template: ../../../assets/templates/middleware/middleware.tmpl
 // gowrap: http://github.com/hexdigest/gowrap
 
 package middleware
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/items -i Items -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/items -i Items -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/items"
@@ -13,12 +13,17 @@ import (
 
 type Middleware func(items.Items) items.Items
 
-func WithLog(s items.Items, logger *zap.Logger, log_access bool) items.Items {
+func WithLog(s items.Items, logger, svcLogger *zap.Logger, log_access bool) items.Items {
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Items")
+
+	if svcLogger == nil {
+		svcLogger = zap.NewNop()
+	}
+	s = LogInfoMiddleware(svcLogger)(s)
+
 	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
 		s = LoggingMiddleware(logger)(s)
-- 
GitLab