add media service
This commit is contained in:
59
internal/infrastructure/grpc/interceptor.go
Normal file
59
internal/infrastructure/grpc/interceptor.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package grpc
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"lendry-erp/media/pkg/logger"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/metadata"
|
||||
)
|
||||
|
||||
// RequestLoggerInterceptor логирует время выполнения каждого gRPC запроса
|
||||
func RequestLoggerInterceptor(
|
||||
ctx context.Context,
|
||||
req interface{},
|
||||
info *grpc.UnaryServerInfo,
|
||||
handler grpc.UnaryHandler,
|
||||
) (interface{}, error) {
|
||||
|
||||
start := time.Now()
|
||||
resp, err := handler(ctx, req)
|
||||
|
||||
status := "✅"
|
||||
if err != nil {
|
||||
status = "❌"
|
||||
}
|
||||
|
||||
logger.Info("%s %s %v", status, info.FullMethod, time.Since(start))
|
||||
return resp, err
|
||||
}
|
||||
|
||||
// TraceIDInterceptor добавляет уникальный ID для отслеживания запроса
|
||||
func TraceIDInterceptor(
|
||||
ctx context.Context,
|
||||
req interface{},
|
||||
info *grpc.UnaryServerInfo,
|
||||
handler grpc.UnaryHandler,
|
||||
) (interface{}, error) {
|
||||
md, ok := metadata.FromIncomingContext(ctx)
|
||||
if !ok {
|
||||
md = metadata.New(nil)
|
||||
}
|
||||
|
||||
ids := md.Get("x-trace-id")
|
||||
var traceID string
|
||||
if len(ids) == 0 {
|
||||
traceID = uuid.New().String()
|
||||
md.Set("x-trace-id", traceID)
|
||||
} else {
|
||||
traceID = ids[0]
|
||||
}
|
||||
|
||||
ctx = metadata.NewIncomingContext(ctx, md)
|
||||
ctx = context.WithValue(ctx, "traceID", traceID)
|
||||
|
||||
return handler(ctx, req)
|
||||
}
|
||||
31
internal/infrastructure/grpc/server.go
Normal file
31
internal/infrastructure/grpc/server.go
Normal file
@@ -0,0 +1,31 @@
|
||||
package grpc
|
||||
|
||||
import (
|
||||
pb "git.lendry.ru/lendry-erp/contracts.git/gen/go/media"
|
||||
|
||||
"lendry-erp/media/internal/application/usecases"
|
||||
handler "lendry-erp/media/internal/interfaces/grpc"
|
||||
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
// NewServer создает и настраивает gRPC сервер с нужными перехватчиками и лимитами
|
||||
func NewServer(uploadUC *usecases.UploadUseCase, presignUC *usecases.PresignUseCase) *grpc.Server {
|
||||
|
||||
server := grpc.NewServer(
|
||||
grpc.ChainUnaryInterceptor(
|
||||
RequestLoggerInterceptor,
|
||||
TraceIDInterceptor,
|
||||
),
|
||||
// Увеличиваем лимит размера пакета до 50 МБ для больших файлов
|
||||
grpc.MaxRecvMsgSize(50*1024*1024),
|
||||
)
|
||||
|
||||
// Создаем обработчик
|
||||
h := handler.NewMediaHandler(uploadUC, presignUC)
|
||||
|
||||
// Регистрируем наш сервис (здесь используется функция из media_grpc.pb.go)
|
||||
pb.RegisterMediaServiceServer(server, h)
|
||||
|
||||
return server
|
||||
}
|
||||
Reference in New Issue
Block a user