diff --git a/app/app.go b/app/app.go index 4605254..384975b 100644 --- a/app/app.go +++ b/app/app.go @@ -12,12 +12,12 @@ import ( "github.com/themakers/hlog" "go.uber.org/zap" dalBS "penahub.gitlab.yandexcloud.net/backend/quiz/answerer.git/dal" + "penahub.gitlab.yandexcloud.net/backend/quiz/answerer.git/savewc" "penahub.gitlab.yandexcloud.net/backend/quiz/answerer.git/service" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/healthchecks" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/middleware" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model" - "penahub.gitlab.yandexcloud.net/backend/quiz/worker.git/savewc" ) type App struct { diff --git a/go.mod b/go.mod index af843bc..1eee35a 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,6 @@ require ( github.com/themakers/hlog v0.0.0-20191205140925-235e0e4baddf go.uber.org/zap v1.26.0 penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240313164312-4560248259a0 - penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240219182009-751c74a08732 ) require ( diff --git a/go.sum b/go.sum index 1a6bbf1..1565b29 100644 --- a/go.sum +++ b/go.sum @@ -193,5 +193,3 @@ penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240313164312-456 penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240313164312-4560248259a0/go.mod h1:JgbH8cdAJBr3jx3BuY5nnuTyMdZ1XkRxo8a3w4Y3C0Y= penahub.gitlab.yandexcloud.net/backend/quiz/core.git v0.0.0-20240313165712-63460dc78d4f h1:bb6dpmEKUOA6XjNyW66A8lPNRl4pISrZ2q/7J0C3mkk= penahub.gitlab.yandexcloud.net/backend/quiz/core.git v0.0.0-20240313165712-63460dc78d4f/go.mod h1:1L60BR27jRadx5JtRKZHYPM5Lilz5Yg+geFSgY7eCnM= -penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240219182009-751c74a08732 h1:FiUWe2OkFZsTFyoKZIE2uMMEPS0JRetHDG1CWdmayvs= -penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240219182009-751c74a08732/go.mod h1:AV230HAt2MMzZVdBNxyBaOFmZ4KY4ieDBpBhokIPlPs= diff --git a/savewc/for_client.go b/savewc/for_client.go new file mode 100644 index 0000000..173c950 --- /dev/null +++ b/savewc/for_client.go @@ -0,0 +1,72 @@ +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 DepsForClient struct { + WorkerSendClientCh chan model.Answer + Redis *redis.Client +} + +type SaveForClient struct { + deps DepsForClient + errChan chan<- error + logger hlog.Logger +} + +func NewSaveClientWorker(deps DepsForClient, errChan chan<- error, logger hlog.Logger) *SaveForClient { + return &SaveForClient{ + deps: deps, + errChan: errChan, + logger: logger, + } +} + +func (w *SaveForClient) Start(ctx context.Context) { + + for { + select { + case answer, ok := <-w.deps.WorkerSendClientCh: + if !ok { + return + } + fmt.Println("SAVECLINT") + err := w.saveAnswer(ctx, answer) + if err != nil { + fmt.Println("Error save answer") + w.errChan <- err + } + + case <-ctx.Done(): + fmt.Println("Save for client worker terminated") + return + } + } +} + +func (w *SaveForClient) saveAnswer(ctx context.Context, answer model.Answer) error { + answerJSON, err := json.Marshal(answer) + if err != nil { + fmt.Println("Error marshal answer to redis", err) + w.errChan <- err + return err + } + + key := fmt.Sprintf("answer:%d", time.Now().UnixNano()) + + err = w.deps.Redis.Set(ctx, key, answerJSON, 0).Err() + if err != nil { + fmt.Println("Error saving answer to redis", err) + w.errChan <- err + return err + } + + return nil +} diff --git a/savewc/for_respondent.go b/savewc/for_respondent.go new file mode 100644 index 0000000..954ddab --- /dev/null +++ b/savewc/for_respondent.go @@ -0,0 +1,71 @@ +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 +}