2026-02-18 19:57:50 +03:00
|
|
|
package taskAgent
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
|
"google.golang.org/protobuf/types/known/emptypb"
|
|
|
|
|
"io"
|
2026-02-21 16:59:38 +03:00
|
|
|
"task-processor/internal/structs"
|
2026-02-18 19:57:50 +03:00
|
|
|
tt "task-processor/pkg/taskTransport/v1"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type service struct {
|
|
|
|
|
client tt.TaskProcessorClient
|
|
|
|
|
timeout time.Duration
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newService(c tt.TaskProcessorClient, timeout time.Duration) *service {
|
|
|
|
|
return &service{
|
|
|
|
|
client: c,
|
|
|
|
|
timeout: timeout,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-21 16:59:38 +03:00
|
|
|
func (s *service) FetchTasks(ctx context.Context) (received []structs.Task, err error) {
|
2026-02-18 19:57:50 +03:00
|
|
|
fetchCtx, cancel := context.WithTimeout(ctx, s.timeout)
|
|
|
|
|
defer cancel()
|
|
|
|
|
|
|
|
|
|
stream, err := s.client.RequestTasks(fetchCtx, &emptypb.Empty{})
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.WithError(err).Errorf("%v failed to open stream", pkgLogHeader)
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-02 18:01:12 +03:00
|
|
|
log.Infof("%v Receiving tasks", pkgLogHeader)
|
2026-02-18 19:57:50 +03:00
|
|
|
for {
|
|
|
|
|
task, err := stream.Recv()
|
|
|
|
|
if err == io.EOF {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.WithError(err).Errorf("%v failed to receive task", pkgLogHeader)
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-21 16:59:38 +03:00
|
|
|
received = append(received, structs.Task{
|
2026-02-18 19:57:50 +03:00
|
|
|
MerchUuid: task.MerchUuid,
|
|
|
|
|
Origins: task.Origins,
|
|
|
|
|
})
|
|
|
|
|
}
|
2026-04-02 18:01:12 +03:00
|
|
|
log.WithField("Count", len(received)).Infof("%v End receiving tasks", pkgLogHeader)
|
2026-02-18 19:57:50 +03:00
|
|
|
|
|
|
|
|
return received, nil
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-21 16:59:38 +03:00
|
|
|
func (s *service) SendResults(ctx context.Context, results []structs.Result) error {
|
2026-02-18 19:57:50 +03:00
|
|
|
sendCtx, cancel := context.WithTimeout(ctx, s.timeout)
|
|
|
|
|
defer cancel()
|
|
|
|
|
|
|
|
|
|
stream, err := s.client.SendResults(sendCtx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.WithError(err).Errorf("%v Failed to send results", pkgLogHeader)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, result := range results {
|
|
|
|
|
toSend := tt.Result{
|
|
|
|
|
MerchUuid: result.MerchUuid,
|
|
|
|
|
OriginName: result.OriginName,
|
|
|
|
|
Price: result.Price,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err = stream.Send(&toSend); err != nil {
|
|
|
|
|
log.WithError(err).Errorf("%v Failed to send results", pkgLogHeader)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err = stream.CloseSend(); err != nil {
|
|
|
|
|
log.WithError(err).Errorf("%v Failed to close send stream", pkgLogHeader)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-02 18:01:12 +03:00
|
|
|
if _, err = stream.CloseAndRecv(); err != nil {
|
|
|
|
|
log.WithError(err).Errorf("%v Failed to receive server response", pkgLogHeader)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.Debugf("%v End send results", pkgLogHeader)
|
2026-02-18 19:57:50 +03:00
|
|
|
return nil
|
|
|
|
|
}
|