package problem import ( "git.0x7f.app/WOJ/woj-server/internal/e" "git.0x7f.app/WOJ/woj-server/internal/model" "go.uber.org/zap" "gorm.io/gorm/clause" ) type QueryData struct { // precise ID uint // fuzz Keyword string Tag string // common Associations bool ShouldEnable bool // paging Offset int Limit int Count *int64 } func (s *service) QueryFuzz(data *QueryData) ([]*model.Problem, e.Status) { problems := make([]*model.Problem, 0) query := s.db.Get() if data.Associations { query = query.Preload(clause.Associations) } if data.ShouldEnable { query = query.Where("is_enabled = true") } if data.Keyword != "" { query = query. Where(s.db.Get().Where("title LIKE ?", "%"+data.Keyword+"%"). Or("statement LIKE ?", "%"+data.Keyword+"%")) } if data.Tag != "" { query = query.Where("EXISTS(SELECT 1 FROM unnest(tags) AS elem WHERE elem LIKE ?)", "%"+data.Tag+"%") } err := query.Order("created_at ASC"). Offset(data.Offset).Limit(data.Limit).Find(&problems). Offset(-1).Limit(-1).Count(data.Count). Error if err != nil { s.log.Warn("DatabaseError", zap.Error(err), zap.Any("QueryData", data)) return nil, e.DatabaseError } return problems, e.Success }