block-accounting/backend/internal/infrastructure/workers/workers.go

105 lines
2.1 KiB
Go
Raw Normal View History

2024-06-10 18:37:04 +00:00
package workers
2024-06-20 19:39:31 +00:00
import (
2024-06-20 21:12:58 +00:00
"context"
2024-06-20 19:39:31 +00:00
"encoding/json"
2024-06-20 21:23:48 +00:00
"fmt"
2024-06-20 19:39:31 +00:00
"log/slog"
"github.com/emochka2007/block-accounting/internal/infrastructure/queue"
"github.com/emochka2007/block-accounting/internal/pkg/logger"
amqp "github.com/rabbitmq/amqp091-go"
)
type Worker struct {
id string
log *slog.Logger
rmqc *amqp.Connection
queueName string
}
func (w *Worker) Run() {
w.log = w.log.With(slog.String("worker-id", w.id), slog.String("worker-queue", w.queueName))
defer func() {
if p := recover(); p != nil {
w.log.Error(
"worker paniced!",
slog.String("worker id", w.id),
slog.Any("panic", p),
)
} else {
w.log.Info("worker stoped. bye bye 0w0", slog.String("worker id", w.id))
}
}()
channel, err := w.rmqc.Channel()
if err != nil {
w.log.Error("error create rmq channel", logger.Err(err))
return
}
delivery, err := channel.Consume(
w.queueName,
w.id,
true,
false,
false,
false,
nil,
)
if err != nil {
w.log.Error("error consume from rmq channel", logger.Err(err))
return
}
w.handleJobs(delivery)
}
func (w *Worker) handleJobs(ch <-chan amqp.Delivery) {
for msg := range ch {
w.log.Debug("job received", slog.Any("job", msg.MessageId))
var job queue.Job
if err := json.Unmarshal(msg.Body, &job); err != nil {
w.log.Error("error parse message body. %w", err)
continue
}
// TODO check job.IdempotentKey for duplicate
// TODO dispatch job
2024-06-20 21:23:48 +00:00
switch job.Payload.(type) {
case *queue.JobDeployMultisig:
jdm, ok := job.Payload.(*queue.JobDeployMultisig)
if !ok {
w.log.Error(
"error invalid job type",
slog.String("job_id", job.ID),
slog.String("job_key", job.IdempotencyKey),
)
continue
}
if err := w.handleDeployMultisig(job.Context, jdm); err != nil {
w.log.Error(
"error handle deploy multisig job",
slog.String("job_id", job.ID),
slog.String("job_key", job.IdempotencyKey),
logger.Err(err),
)
}
}
2024-06-20 19:39:31 +00:00
}
}
2024-06-20 21:12:58 +00:00
func (w *Worker) handleDeployMultisig(
ctx context.Context,
2024-06-20 21:23:48 +00:00
dm *queue.JobDeployMultisig,
) error {
return fmt.Errorf("error unimplemented")
}