2020-03-05 11:53:42 +01:00
|
|
|
package resolvers
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"log"
|
|
|
|
|
|
|
|
"github.com/viktorstrate/photoview/api/graphql/auth"
|
|
|
|
"github.com/viktorstrate/photoview/api/graphql/models"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (r *Resolver) Search(ctx context.Context, query string, _limitPhotos *int, _limitAlbums *int) (*models.SearchResult, error) {
|
|
|
|
user := auth.UserFromContext(ctx)
|
|
|
|
if user == nil {
|
|
|
|
return nil, auth.ErrUnauthorized
|
|
|
|
}
|
|
|
|
|
|
|
|
limitPhotos := 10
|
|
|
|
limitAlbums := 10
|
|
|
|
|
|
|
|
if _limitPhotos != nil {
|
|
|
|
limitPhotos = *_limitPhotos
|
|
|
|
}
|
|
|
|
|
|
|
|
if _limitAlbums != nil {
|
|
|
|
limitAlbums = *_limitAlbums
|
|
|
|
}
|
|
|
|
|
|
|
|
wildQuery := "%" + query + "%"
|
|
|
|
|
|
|
|
photoRows, err := r.Database.Query(`
|
|
|
|
SELECT photo.* FROM photo JOIN album ON photo.album_id = album.album_id
|
2020-03-05 20:46:50 +01:00
|
|
|
WHERE album.owner_id = ? AND ( photo.title LIKE ? OR photo.path LIKE ? )
|
2020-03-05 11:53:42 +01:00
|
|
|
ORDER BY (
|
|
|
|
case when photo.title LIKE ? then 2
|
|
|
|
when photo.path LIKE ? then 1
|
|
|
|
end ) DESC
|
|
|
|
LIMIT ?
|
|
|
|
`, user.UserID, wildQuery, wildQuery, wildQuery, wildQuery, limitPhotos)
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("ERROR: searching photos %s", err)
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
photos, err := models.NewPhotosFromRows(photoRows)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
albumRows, err := r.Database.Query(`
|
|
|
|
SELECT * FROM album
|
2020-03-05 20:46:50 +01:00
|
|
|
WHERE owner_id = ? AND ( title LIKE ? OR path LIKE ? )
|
2020-03-05 11:53:42 +01:00
|
|
|
ORDER BY (
|
|
|
|
case when title LIKE ? then 2
|
|
|
|
when path LIKE ? then 1
|
|
|
|
end ) DESC
|
|
|
|
LIMIT ?
|
|
|
|
`, user.UserID, wildQuery, wildQuery, wildQuery, wildQuery, limitAlbums)
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("ERROR: searching albums %s", err)
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
albums, err := models.NewAlbumsFromRows(albumRows)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
result := models.SearchResult{
|
|
|
|
Query: query,
|
|
|
|
Photos: photos,
|
|
|
|
Albums: albums,
|
|
|
|
}
|
|
|
|
|
|
|
|
return &result, nil
|
|
|
|
}
|