61 lines
1.2 KiB
Go
61 lines
1.2 KiB
Go
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
|
|
}
|