1
Fork 0
photoview/api/graphql/resolvers/search.go

76 lines
1.9 KiB
Go
Raw Normal View History

2020-03-05 11:53:42 +01:00
package resolvers
import (
"context"
2020-12-19 09:45:43 +01:00
2020-12-18 23:50:29 +01:00
"github.com/photoview/photoview/api/graphql/auth"
"github.com/pkg/errors"
"gorm.io/gorm/clause"
2020-03-05 11:53:42 +01:00
2020-12-17 22:51:43 +01:00
"github.com/photoview/photoview/api/graphql/models"
2020-03-05 11:53:42 +01:00
)
func (r *Resolver) Search(ctx context.Context, query string, _limitMedia *int, _limitAlbums *int) (*models.SearchResult, error) {
2020-12-18 23:50:29 +01:00
user := auth.UserFromContext(ctx)
if user == nil {
return nil, auth.ErrUnauthorized
}
2020-03-05 11:53:42 +01:00
2020-12-18 23:50:29 +01:00
limitMedia := 10
limitAlbums := 10
2020-03-05 11:53:42 +01:00
2020-12-18 23:50:29 +01:00
if _limitMedia != nil {
limitMedia = *_limitMedia
}
2020-03-05 11:53:42 +01:00
2020-12-18 23:50:29 +01:00
if _limitAlbums != nil {
limitAlbums = *_limitAlbums
}
2020-03-05 11:53:42 +01:00
2020-12-18 23:50:29 +01:00
wildQuery := "%" + query + "%"
2020-03-05 11:53:42 +01:00
2020-12-19 09:45:43 +01:00
var media []*models.Media
2020-03-05 11:53:42 +01:00
2020-12-19 09:45:43 +01:00
err := r.Database.Joins("Album").
2021-01-26 14:34:28 +01:00
Where("EXISTS (?)", r.Database.Table("user_albums").Where("user_id = ?", user.ID).Where("album_id = Album.id")).
Where("media.title LIKE ? OR media.path LIKE ?", wildQuery, wildQuery).
2020-12-18 23:50:29 +01:00
Clauses(clause.OrderBy{
Expression: clause.Expr{
SQL: "(CASE WHEN media.title LIKE ? THEN 2 WHEN media.path LIKE ? THEN 1 END) DESC",
Vars: []interface{}{wildQuery, wildQuery},
WithoutParentheses: true},
}).
Limit(limitMedia).
2020-12-19 09:45:43 +01:00
Find(&media).Error
2020-03-05 11:53:42 +01:00
2020-12-18 23:50:29 +01:00
if err != nil {
return nil, errors.Wrapf(err, "searching media")
}
2020-03-05 11:53:42 +01:00
2020-12-18 23:50:29 +01:00
var albums []*models.Album
2020-03-05 11:53:42 +01:00
2021-01-26 14:34:28 +01:00
err = r.Database.
Where("EXISTS (?)", r.Database.Table("user_albums").Where("user_id = ?", user.ID).Where("album_id = albums.id")).
Where("albums.title LIKE ? OR albums.path LIKE ?", wildQuery, wildQuery).
2020-12-18 23:50:29 +01:00
Clauses(clause.OrderBy{
Expression: clause.Expr{
2021-01-26 14:34:28 +01:00
SQL: "(CASE WHEN albums.title LIKE ? THEN 2 WHEN albums.path LIKE ? THEN 1 END) DESC",
2020-12-18 23:50:29 +01:00
Vars: []interface{}{wildQuery, wildQuery},
WithoutParentheses: true},
}).
Limit(limitAlbums).
Find(&albums).Error
2020-03-05 11:53:42 +01:00
2020-12-18 23:50:29 +01:00
if err != nil {
return nil, errors.Wrapf(err, "searching albums")
}
result := models.SearchResult{
Query: query,
2020-12-19 09:45:43 +01:00
Media: media,
2020-12-18 23:50:29 +01:00
Albums: albums,
}
return &result, nil
2020-03-05 11:53:42 +01:00
}