package runner import ( "context" "errors" "fmt" "log/slog" "queryorchestration/internal/serviceconfig/queue" "github.com/aws/aws-sdk-go-v2/service/sqs/types" ) type Server struct { cleanup func() error cfg ListenerConfig } func (c *Server) Listen(ctx context.Context) { slog.Info("Listening to queue") defer func() { if err := c.cleanup(); err != nil { fmt.Printf("Error during cleanup: %v", err) } }() for { select { case <-ctx.Done(): return default: err := c.pollMessage(ctx) if err != nil { slog.Error(err.Error()) } } } } func (c *Server) pollMessage(ctx context.Context) error { result, err := c.cfg.ReceiveFromQueue(ctx, &queue.ReceiveParams{ QueueURL: c.cfg.GetQueueURL(), }) if err != nil { return fmt.Errorf("message fetch fail: %v", err) } for _, message := range result.Messages { err := c.processMessage(ctx, &message) if err != nil { slog.Error("message process fail", "id", *message.MessageId, "err", err) } } return nil } func (c *Server) processMessage(ctx context.Context, message *types.Message) error { slog.Debug("processing message", "id", *message.MessageId, "body", *message.Body) isProcessed := c.cfg.GetController().Process(ctx, message) if !isProcessed { return errors.New("message process fail") } err := c.cfg.DeleteFromQueue(ctx, &queue.DeleteParams{ QueueURL: c.cfg.GetQueueURL(), ReceiptHandle: message.ReceiptHandle, }) if err != nil { return fmt.Errorf("message delete fail: %v", err) } return nil }