mirror of
https://github.com/zitadel/zitadel.git
synced 2024-12-12 11:04:25 +00:00
ed80a8bb1e
* feat(actions): begin api * feat(actions): begin api * api and projections * fix: handle multiple statements for a single event in projections * export func type * fix test * update to new reduce interface * flows in login * feat: jwt idp * feat: command side * feat: add tests * actions and flows * fill idp views with jwt idps and return apis * add jwtEndpoint to jwt idp * begin jwt request handling * add feature * merge * merge * handle jwt idp * cleanup * bug fixes * autoregister * get token from specific header name * fix: proto * fixes * i18n * begin tests * fix and log http proxy * remove docker cache * fixes * usergrants in actions api * tests adn cleanup * cleanup * fix add user grant * set login context * i18n Co-authored-by: fabi <fabienne.gerschwiler@gmail.com>
150 lines
3.0 KiB
Go
150 lines
3.0 KiB
Go
package query
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
sq "github.com/Masterminds/squirrel"
|
|
)
|
|
|
|
type SearchRequest struct {
|
|
Offset uint64
|
|
Limit uint64
|
|
SortingColumn string
|
|
Asc bool
|
|
}
|
|
|
|
func (req *SearchRequest) ToQuery(query sq.SelectBuilder) sq.SelectBuilder {
|
|
if req.Offset > 0 {
|
|
query = query.Offset(req.Offset)
|
|
}
|
|
if req.Limit > 0 {
|
|
query = query.Limit(req.Limit)
|
|
}
|
|
|
|
if req.SortingColumn != "" {
|
|
clause := "LOWER(?)"
|
|
if !req.Asc {
|
|
clause += " DESC"
|
|
}
|
|
query.OrderByClause(clause, req.SortingColumn)
|
|
}
|
|
|
|
return query
|
|
}
|
|
|
|
const sqlPlaceholder = "?"
|
|
|
|
type SearchQuery interface {
|
|
ToQuery(sq.SelectBuilder) sq.SelectBuilder
|
|
}
|
|
|
|
type TextQuery struct {
|
|
Column string
|
|
Text string
|
|
Compare TextComparison
|
|
}
|
|
|
|
func NewTextQuery(column, value string, compare TextComparison) (*TextQuery, error) {
|
|
if compare < 0 || compare >= textMax {
|
|
return nil, errors.New("invalid compare")
|
|
}
|
|
if column == "" {
|
|
return nil, errors.New("missing column")
|
|
}
|
|
return &TextQuery{
|
|
Column: column,
|
|
Text: value,
|
|
Compare: compare,
|
|
}, nil
|
|
}
|
|
|
|
func (q *TextQuery) ToQuery(query sq.SelectBuilder) sq.SelectBuilder {
|
|
query = query.Where(q.comp())
|
|
return query
|
|
}
|
|
|
|
func (s *TextQuery) comp() map[string]interface{} {
|
|
switch s.Compare {
|
|
case TextEquals:
|
|
return sq.Eq{s.Column: s.Text}
|
|
case TextEqualsIgnore:
|
|
return sq.Eq{"LOWER(" + s.Column + ")": strings.ToLower(s.Text)}
|
|
case TextStartsWith:
|
|
return sq.Like{s.Column: s.Text + sqlPlaceholder}
|
|
case TextStartsWithIgnore:
|
|
return sq.Like{"LOWER(" + s.Column + ")": strings.ToLower(s.Text) + sqlPlaceholder}
|
|
case TextEndsWith:
|
|
return sq.Like{s.Column: sqlPlaceholder + s.Text}
|
|
case TextEndsWithIgnore:
|
|
return sq.Like{"LOWER(" + s.Column + ")": sqlPlaceholder + strings.ToLower(s.Text)}
|
|
case TextContains:
|
|
return sq.Like{s.Column: sqlPlaceholder + s.Text + sqlPlaceholder}
|
|
case TextContainsIgnore:
|
|
return sq.Like{"LOWER(" + s.Column + ")": sqlPlaceholder + strings.ToLower(s.Text) + sqlPlaceholder}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type TextComparison int
|
|
|
|
const (
|
|
TextEquals TextComparison = iota
|
|
TextEqualsIgnore
|
|
TextStartsWith
|
|
TextStartsWithIgnore
|
|
TextEndsWith
|
|
TextEndsWithIgnore
|
|
TextContains
|
|
TextContainsIgnore
|
|
|
|
textMax
|
|
)
|
|
|
|
type IntQuery struct {
|
|
Column string
|
|
Int int
|
|
Compare IntComparison
|
|
}
|
|
|
|
func NewIntQuery(column string, value int, compare IntComparison) (*IntQuery, error) {
|
|
if compare < 0 || compare >= intMax {
|
|
return nil, errors.New("invalid compare")
|
|
}
|
|
if column == "" {
|
|
return nil, errors.New("missing column")
|
|
}
|
|
return &IntQuery{
|
|
Column: column,
|
|
Int: value,
|
|
Compare: compare,
|
|
}, nil
|
|
}
|
|
|
|
func (q *IntQuery) ToQuery(query sq.SelectBuilder) sq.SelectBuilder {
|
|
query = query.Where(q.comp())
|
|
return query
|
|
}
|
|
|
|
func (s *IntQuery) comp() sq.Sqlizer {
|
|
switch s.Compare {
|
|
case IntEquals:
|
|
return sq.Eq{s.Column: s.Int}
|
|
case IntGreater:
|
|
return sq.Gt{s.Column: s.Int}
|
|
case IntLess:
|
|
return sq.Lt{s.Column: s.Int}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type IntComparison int
|
|
|
|
const (
|
|
IntEquals IntComparison = iota
|
|
IntGreater
|
|
IntLess
|
|
|
|
intMax
|
|
)
|