v0.0.18.2
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
madipo2611 2025-08-17 10:23:14 +03:00
parent 2a3ae72db9
commit 15ae17189d
2 changed files with 20 additions and 34 deletions

View File

@ -3,7 +3,6 @@ package graph
import (
"context"
"fmt"
"log"
"tailly_back_v2/internal/domain"
"tailly_back_v2/proto"
"time"
@ -121,10 +120,6 @@ func (r *queryResolver) GetUserChats(ctx context.Context, userID int) ([]*domain
// MessageStream реализация подписки на новые сообщения
func (r *subscriptionResolver) MessageStream(ctx context.Context, userID int) (<-chan *domain.Message, error) {
// Создаем канал для GraphQL подписки
messageChan := make(chan *domain.Message)
// Вызываем gRPC стриминг
stream, err := r.MessageClient.StreamMessages(ctx, &proto.StreamMessagesRequest{
UserId: int32(userID),
})
@ -132,21 +127,14 @@ func (r *subscriptionResolver) MessageStream(ctx context.Context, userID int) (<
return nil, fmt.Errorf("failed to stream messages: %w", err)
}
messageChan := make(chan *domain.Message)
go func() {
defer close(messageChan)
for {
msg, err := stream.Recv()
if err != nil {
log.Printf("gRPC stream error: %v", err)
return
}
// Пропускаем heartbeat сообщения
if msg.Message.Content == "__heartbeat__" {
continue
}
select {
case <-ctx.Done():
return

View File

@ -5,9 +5,10 @@ import (
"database/sql"
"github.com/99designs/gqlgen/graphql/handler"
"github.com/99designs/gqlgen/graphql/handler/transport"
"github.com/99designs/gqlgen/graphql/playground"
"github.com/go-chi/chi/v5"
"github.com/gorilla/websocket"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/vektah/gqlparser/v2/ast"
"log"
"net/http"
"os"
@ -71,29 +72,26 @@ func (s *Server) configureRouter() {
Resolvers: resolver,
}))
srv.AddTransport(&transport.POST{})
srv.AddTransport(&transport.GET{})
srv.AddTransport(&transport.Options{})
wsTransport := transport.Websocket{
Upgrader: websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
origin := r.Header.Get("Origin")
for _, allowed := range allowedOrigins {
if origin == allowed {
return true
}
}
return false
},
},
}
// Настройка SSE транспорта (правильный способ)
sseTransport := &transport.SSE{}
srv.AddTransport(sseTransport)
srv.AddTransport(&wsTransport)
// Простейший кеш запросов (альтернатива MemoryCache)
srv.SetQueryCache(&NoopCache{})
})
s.router.Handle("/", playground.Handler("GraphQL playground", "/query"))
s.router.Handle("/query", srv)
s.router.Handle("/uploads/*", http.StripPrefix("/uploads/", http.FileServer(http.Dir("./uploads"))))
s.router.Handle("/", playground.Handler("GraphQL playground", "/query"))
s.router.Handle("/query", srv)
s.router.Handle("/uploads/*", http.StripPrefix("/uploads/", http.FileServer(http.Dir("./uploads"))))
}
type NoopCache struct{}
func (n *NoopCache) Get(ctx context.Context, key string) (*ast.QueryDocument, bool) {
return nil, false
}
func (n *NoopCache) Add(ctx context.Context, key string, value *ast.QueryDocument) {}
func (s *Server) configureMetrics() {
metricsRouter := chi.NewRouter()