worker/savewc/for_respondent.go
2024-02-19 21:20:09 +03:00

72 lines
1.4 KiB
Go

package savewc
import (
"context"
"encoding/json"
"fmt"
"github.com/go-redis/redis/v8"
"github.com/themakers/hlog"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"time"
)
type DepsForResp struct {
WorkerRespondentCh chan []model.Answer
Redis *redis.Client
}
type SaveForRespondent struct {
deps DepsForResp
errChan chan<- error
logger hlog.Logger
}
func NewSaveRespWorker(deps DepsForResp, errChan chan<- error, logger hlog.Logger) *SaveForRespondent {
return &SaveForRespondent{
deps: deps,
errChan: errChan,
logger: logger,
}
}
func (w *SaveForRespondent) Start(ctx context.Context) {
for {
select {
case answer, ok := <-w.deps.WorkerRespondentCh:
if !ok {
return
}
fmt.Println("SAVERESP")
err := w.saveAnswers(ctx, answer)
if err != nil {
w.logger.Module("Error save answers")
w.errChan <- err
}
case <-ctx.Done():
w.logger.Module("Save for respondent worker terminated")
return
}
}
}
func (w *SaveForRespondent) saveAnswers(ctx context.Context, answers []model.Answer) error {
for _, answer := range answers {
answerJSON, err := json.Marshal(answer)
if err != nil {
fmt.Println("Error marshal answer", err)
w.errChan <- err
}
key := fmt.Sprintf("toRespondent:%d", time.Now().UnixNano())
err = w.deps.Redis.Set(ctx, key, answerJSON, 0).Err()
if err != nil {
fmt.Println("Error setting to redis", err)
w.errChan <- err
}
}
return nil
}