From c771f3ff4d2ab0b6254a2e4a0df73d55055ca10b Mon Sep 17 00:00:00 2001
From: Semyon Krestyaninov <ensiouel@gmail.com>
Date: Wed, 14 Feb 2024 09:32:41 +0300
Subject: [PATCH] add log service middleware for items

---
 pkg/items/events.go                           |   3 +
 .../middleware/log_service_middleware.go      | 161 ++++++++++++++++++
 2 files changed, 164 insertions(+)
 create mode 100644 pkg/items/middleware/log_service_middleware.go

diff --git a/pkg/items/events.go b/pkg/items/events.go
index b697d607..88da05d8 100644
--- a/pkg/items/events.go
+++ b/pkg/items/events.go
@@ -12,6 +12,9 @@ const (
 	EventPublishItem   = "publish_item"
 	EventUnpublishItem = "unpublish_item"
 	EventDeleteItem    = "delete_item"
+	EventUndeleteItem  = "undelete_item"
+	EventArchiveItem   = "archive_item"
+	EventUnarchiveItem = "unarchive_item"
 
 	DefaultEventSubject = "content.{{.EventType}}.{{.SpaceID}}.{{.EnvID}}.{{.CollectionID}}.{{.ItemID}}"
 )
diff --git a/pkg/items/middleware/log_service_middleware.go b/pkg/items/middleware/log_service_middleware.go
new file mode 100644
index 00000000..48c4125e
--- /dev/null
+++ b/pkg/items/middleware/log_service_middleware.go
@@ -0,0 +1,161 @@
+package middleware
+
+import (
+	"context"
+	"fmt"
+
+	"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"
+)
+
+type logServiceMiddleware struct {
+	items.Items
+	logger *zap.Logger
+}
+
+func LogServiceMiddleware(logger *zap.Logger) Middleware {
+	return func(next items.Items) items.Items {
+		return &logServiceMiddleware{
+			Items:  next,
+			logger: logger.With(logzap.Component("Items")),
+		}
+	}
+}
+
+func (m *logServiceMiddleware) Archive(ctx context.Context, item *items.Item, options ...*items.ArchiveOptions) (err error) {
+	err = m.Items.Archive(ctx, item, options...)
+
+	fields := []zapcore.Field{
+		logzap.Event(items.EventArchiveItem),
+		logzap.CallerFromContext(ctx),
+	}
+
+	if err != nil {
+		m.logger.Error(fmt.Sprintf("Failed to archive. Error: %s", err), append(fields, logzap.Object(item))...)
+	} else {
+		m.logger.Info("Successfully archived", append(fields, logzap.Object(item))...)
+	}
+
+	return err
+}
+
+func (m *logServiceMiddleware) 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{
+		logzap.Event(items.EventCreateItem),
+		logzap.CallerFromContext(ctx),
+	}
+
+	if err != nil {
+		m.logger.Error(fmt.Sprintf("Failed to create. Error: %s", err), append(fields, logzap.Object(item))...)
+	} else {
+		m.logger.Info("Successfully created", append(fields, logzap.Object(created))...)
+	}
+
+	return created, err
+}
+
+func (m *logServiceMiddleware) Delete(ctx context.Context, item *items.Item, options ...*items.DeleteOptions) (err error) {
+	err = m.Items.Delete(ctx, item, options...)
+
+	fields := []zapcore.Field{
+		logzap.Event(items.EventDeleteItem),
+		logzap.CallerFromContext(ctx),
+	}
+
+	if err != nil {
+		m.logger.Error(fmt.Sprintf("Failed to delete. Error: %s", err), append(fields, logzap.Object(item))...)
+	} else {
+		m.logger.Info("Successfully deleted", append(fields, logzap.Object(item))...)
+	}
+
+	return err
+}
+
+func (m *logServiceMiddleware) Publish(ctx context.Context, item *items.Item, options ...*items.PublishOptions) (err error) {
+	err = m.Items.Publish(ctx, item, options...)
+
+	fields := []zapcore.Field{
+		logzap.Event(items.EventPublishItem),
+		logzap.CallerFromContext(ctx),
+	}
+
+	if err != nil {
+		m.logger.Error(fmt.Sprintf("Failed to publish. Error: %s", err), append(fields, logzap.Object(item))...)
+	} else {
+		m.logger.Info("Successfully published", append(fields, logzap.Object(item))...)
+	}
+
+	return err
+}
+
+func (m *logServiceMiddleware) Unarchive(ctx context.Context, item *items.Item, options ...*items.UnarchiveOptions) (err error) {
+	err = m.Items.Unarchive(ctx, item, options...)
+
+	fields := []zapcore.Field{
+		logzap.Event(items.EventUnarchiveItem),
+		logzap.CallerFromContext(ctx),
+	}
+
+	if err != nil {
+		m.logger.Error(fmt.Sprintf("Failed to unarchive. Error: %s", err), append(fields, logzap.Object(item))...)
+	} else {
+		m.logger.Info("Successfully unarchived", append(fields, logzap.Object(item))...)
+	}
+
+	return err
+}
+
+func (m *logServiceMiddleware) Undelete(ctx context.Context, item *items.Item, options ...*items.UndeleteOptions) (err error) {
+	err = m.Items.Undelete(ctx, item, options...)
+
+	fields := []zapcore.Field{
+		logzap.Event(items.EventUndeleteItem),
+		logzap.CallerFromContext(ctx),
+	}
+
+	if err != nil {
+		m.logger.Error(fmt.Sprintf("Failed to undelete. Error: %s", err), append(fields, logzap.Object(item))...)
+	} else {
+		m.logger.Info("Successfully undeleted", append(fields, logzap.Object(item))...)
+	}
+
+	return err
+}
+
+func (m *logServiceMiddleware) Unpublish(ctx context.Context, item *items.Item, options ...*items.UnpublishOptions) (err error) {
+	err = m.Items.Unpublish(ctx, item, options...)
+
+	fields := []zapcore.Field{
+		logzap.Event(items.EventUnpublishItem),
+		logzap.CallerFromContext(ctx),
+	}
+
+	if err != nil {
+		m.logger.Error(fmt.Sprintf("Failed to unpublish. Error: %s", err), append(fields, logzap.Object(item))...)
+	} else {
+		m.logger.Info("Successfully unpublished", append(fields, logzap.Object(item))...)
+	}
+
+	return err
+}
+
+func (m *logServiceMiddleware) Update(ctx context.Context, item *items.Item, options ...*items.UpdateOptions) (err error) {
+	err = m.Items.Update(ctx, item, options...)
+
+	fields := []zapcore.Field{
+		logzap.Event(items.EventUpdateItem),
+		logzap.CallerFromContext(ctx),
+	}
+
+	if err != nil {
+		m.logger.Error(fmt.Sprintf("Failed to update. Error: %s", err), append(fields, logzap.Object(item))...)
+	} else {
+		m.logger.Info("Successfully updated", append(fields, logzap.Object(item))...)
+	}
+
+	return err
+}
-- 
GitLab