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
|
|
|
)
|
|
|
|
|
2020-07-10 14:26:19 +02: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
|
|
|
|
2021-03-12 14:26:51 +01:00
|
|
|
userSubquery := r.Database.Table("user_albums").Where("user_id = ?", user.ID)
|
|
|
|
if r.Database.Dialector.Name() == "postgres" {
|
|
|
|
userSubquery = userSubquery.Where("album_id = \"Album\".id")
|
|
|
|
} else {
|
|
|
|
userSubquery = userSubquery.Where("album_id = Album.id")
|
|
|
|
}
|
|
|
|
|
2020-12-19 09:45:43 +01:00
|
|
|
err := r.Database.Joins("Album").
|
2021-03-12 14:26:51 +01:00
|
|
|
Where("EXISTS (?)", userSubquery).
|
2021-01-26 14:34:28 +01:00
|
|
|
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},
|
|
|
|
}).
|
2021-03-12 14:26:51 +01:00
|
|
|
Limit(limitMedia).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
|
|
|
}
|