From 2ca2f4145f681bb74009e9bd3666ac2a3d0e1f4a Mon Sep 17 00:00:00 2001
From: Semyon Krestyaninov <ensiouel@gmail.com>
Date: Tue, 13 Feb 2024 16:46:02 +0300
Subject: [PATCH] refactor

---
 pkg/log/zap/field.go | 33 +++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/pkg/log/zap/field.go b/pkg/log/zap/field.go
index c6db5101..e7041a9f 100644
--- a/pkg/log/zap/field.go
+++ b/pkg/log/zap/field.go
@@ -1,8 +1,10 @@
 package zap
 
 import (
+	"context"
 	"fmt"
 
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
 	"go.uber.org/zap"
 	"go.uber.org/zap/zapcore"
 )
@@ -24,38 +26,49 @@ func Event(event string) zapcore.Field {
 	return zap.String("event", event)
 }
 
-// Object возвращает поле и устанавливает передаваемый аргумент в качестве идентификатора объекта в формате GlobalID.
-// Поддерживает один из типов: string, fmt.Stringer. Если передан аргумент другого типа, в качестве идентификатора объекта
-// будет установлен "unknown".
+// Object возвращает поле и устанавливает передаваемый аргумент в качестве идентификатора объекта в формате ObjectID.
+// Поддерживаемые типы: string, fmt.Stringer.
+// Если передан аргумент другого типа, будет произведена попытка привести переданное значение к ObjectID.
 func Object(v any) zapcore.Field {
-	var object string
+	var object = unknownObject
 	switch value := v.(type) {
 	case string:
 		object = value
 	case fmt.Stringer:
 		object = value.String()
 	default:
-		object = unknownObject
+		oid, err := id.FromObject(v)
+		if err == nil {
+			object = oid.String()
+		}
 	}
 	return zap.String("object", object)
 }
 
-// Caller возвращает поле и устанавливает передаваемый аргумент в качестве "вызывающего" в формате GlobalID.
-// Поддерживает один из типов: string, fmt.Stringer. Если передан аргумент другого типа, в качестве вызывающего
-// будет установлен "unknown".
+// Caller возвращает поле и устанавливает передаваемый аргумент в качестве "вызывающего" в формате ObjectID.
+// Поддерживаемые типы: string, fmt.Stringer.
+// Если передан аргумент другого типа, будет произведена попытка привести переданное значение к ObjectID.
 func Caller(v any) zapcore.Field {
-	var caller string
+	var caller = unknownCaller
 	switch value := v.(type) {
 	case string:
 		caller = value
 	case fmt.Stringer:
 		caller = value.String()
 	default:
-		caller = unknownCaller
+		oid, err := id.FromObject(v)
+		if err == nil {
+			caller = oid.String()
+		}
 	}
 	return zap.String("caller", caller)
 }
 
+// CallerFromContext извлекает auth.Principal из контекста и устанавливает его в качестве "вызывающего" в формате ObjectID.
+func CallerFromContext(ctx context.Context) zapcore.Field {
+	return Caller(auth.GetPrincipal(ctx))
+}
+
 func Attr(attr any) zapcore.Field {
 	return zap.Any("attr", attr)
 }
-- 
GitLab