package task import ( "errors" "fmt" "git.0x7f.app/WOJ/woj-server/internal/e" "git.0x7f.app/WOJ/woj-server/internal/misc/config" "git.0x7f.app/WOJ/woj-server/internal/misc/log" "git.0x7f.app/WOJ/woj-server/internal/model" "git.0x7f.app/WOJ/woj-server/internal/service/runner" "github.com/hibiken/asynq" "github.com/samber/do" "go.uber.org/zap" ) var _ Service = (*service)(nil) type Service interface { ProblemBuild(data *model.ProblemBuildPayload) (string, e.Status) ProblemUpdate(data *model.ProblemUpdatePayload) (string, e.Status) SubmitJudge(data *model.SubmitJudgePayload) (string, e.Status) SubmitUpdate(data *model.SubmitUpdatePayload, ctx runner.JudgeStatus) (string, e.Status) GetTaskInfo(string, string) (*asynq.TaskInfo, e.Status) HealthCheck() error } func NewService(i *do.Injector) (Service, error) { conf := do.MustInvoke[config.Service](i).GetConfig() redisOpt := asynq.RedisClientOpt{ Addr: fmt.Sprintf("%s:%d", conf.Redis.Address, conf.Redis.Port), Password: conf.Redis.Password, DB: conf.Redis.QueueDb, } return &service{ log: do.MustInvoke[log.Service](i).GetLogger("task"), queue: asynq.NewClient(redisOpt), inspector: asynq.NewInspector(redisOpt), }, nil } type service struct { log *zap.Logger queue *asynq.Client inspector *asynq.Inspector } func (s *service) HealthCheck() error { servers, err := s.inspector.Servers() if err != nil { return err } if len(servers) == 0 { return errors.New("no asynq server found") } return nil }