diff --git a/pkg/invitations/events.go b/pkg/invitations/events.go new file mode 100644 index 0000000000000000000000000000000000000000..622f744796d5a24cac0bc078a48d62a6ba36a522 --- /dev/null +++ b/pkg/invitations/events.go @@ -0,0 +1,7 @@ +package invitations + +const ( + EventCreate = "invitations.create" + EventDelete = "invitations.delete" + EventAccept = "invitations.accept" +) diff --git a/pkg/invitations/middleware/logging_middleware.go b/pkg/invitations/middleware/logging_middleware.go new file mode 100644 index 0000000000000000000000000000000000000000..ab2354aa65d93f26ff0aabc1781a34fd37ca1112 --- /dev/null +++ b/pkg/invitations/middleware/logging_middleware.go @@ -0,0 +1,119 @@ +package middleware + +import ( + "context" + "fmt" + + "git.perx.ru/perxis/perxis-go/id" + "git.perx.ru/perxis/perxis-go/pkg/errors" + "git.perx.ru/perxis/perxis-go/pkg/invitations" + "git.perx.ru/perxis/perxis-go/pkg/options" + logzap "git.perx.ru/perxis/perxis-go/zap" + "go.uber.org/zap" +) + +type loggingMiddleware struct { + logger *zap.Logger + next invitations.Invitations +} + +func LoggingMiddleware(logger *zap.Logger) Middleware { + return func(next invitations.Invitations) invitations.Invitations { + return &loggingMiddleware{ + next: next, + logger: logger.With(logzap.Component("Invitations")), + } + } +} + +func (m *loggingMiddleware) Create(ctx context.Context, invitation *invitations.Invitation) (created *invitations.Invitation, err error) { + logger := m.logger.With( + logzap.Caller(ctx), + logzap.Event(invitations.EventCreate), + logzap.Object(id.NewSpaceId(invitation.SpaceID)), + ) + + created, err = m.next.Create(ctx, invitation) + if err != nil { + logger.Error(fmt.Sprintf("Failed to create invitation '%s'", invitation.ID), zap.Error(err), logzap.Channels(logzap.Userlog, logzap.Syslog)) + return + } + + logger.Info(fmt.Sprintf("User create invitation '%s'", created.ID), logzap.Channels(logzap.Userlog)) + + return created, err +} + +func (m *loggingMiddleware) Get(ctx context.Context, invitationId string) (invitation *invitations.Invitation, err error) { + logger := m.logger.With( + logzap.Caller(ctx), + ) + + invitation, err = m.next.Get(ctx, invitationId) + if err != nil { + logger.Error("Failed to get", zap.Error(err)) + return + } + + return invitation, err +} + +func (m *loggingMiddleware) Accept(ctx context.Context, invitationId, userId string) (err error) { + invitation, err := m.next.Get(ctx, invitationId) + if err != nil { + return errors.Wrap(err, "failed to get invitation") + } + + logger := m.logger.With( + logzap.Caller(ctx), + logzap.Event(invitations.EventAccept), + logzap.Object(id.NewSpaceId(invitation.SpaceID)), + ) + + err = m.next.Accept(ctx, invitationId, userId) + if err != nil { + logger.Error(fmt.Sprintf("Failed to accept invitation '%s'", invitationId), zap.Error(err), logzap.Channels(logzap.Userlog, logzap.Syslog)) + return + } + + logger.Info(fmt.Sprintf("Invitation '%s' accepted by user '%s'", invitationId, userId), logzap.Channels(logzap.Userlog)) + + return err +} + +func (m *loggingMiddleware) Find(ctx context.Context, filter *invitations.Filter, opts *options.FindOptions) (invitations []*invitations.Invitation, total int, err error) { + logger := m.logger.With( + logzap.Caller(ctx), + ) + + invitations, total, err = m.next.Find(ctx, filter, opts) + if err != nil { + logger.Error("Failed to find", zap.Error(err)) + return + } + + return invitations, total, err +} + +func (m *loggingMiddleware) Delete(ctx context.Context, invitationId string) (err error) { + invitation, err := m.next.Get(ctx, invitationId) + if err != nil { + return errors.Wrap(err, "failed to get invitation") + } + + logger := m.logger.With( + logzap.Caller(ctx), + logzap.Event(invitations.EventDelete), + logzap.Object(id.NewSpaceId(invitation.SpaceID)), + ) + + err = m.next.Delete(ctx, invitationId) + if err != nil { + logger.Error(fmt.Sprintf("Failed to delete invitation '%s' ", invitationId), zap.Error(err), logzap.Channels(logzap.Userlog, logzap.Syslog)) + return + } + + logger.Info(fmt.Sprintf("Invitation '%s' deleted", invitationId), logzap.Channels(logzap.Userlog)) + + return err +} diff --git a/pkg/invitations/middleware/middleware.go b/pkg/invitations/middleware/middleware.go index f59604ba948ade1b4fe03bc3e3cadd8de6f7cfcd..47a2d84b987fcd760086ff6837cd25867945e574 100644 --- a/pkg/invitations/middleware/middleware.go +++ b/pkg/invitations/middleware/middleware.go @@ -21,7 +21,7 @@ func WithLog(s invitations.Invitations, logger *zap.Logger, log_access bool) inv if log_access { s = AccessLoggingMiddleware(logger)(s) } - s = ErrorLoggingMiddleware(logger)(s) + s = LoggingMiddleware(logger)(s) s = RecoveringMiddleware(logger)(s) return s