mirror of
https://git.vectorsigma.ru/public/photoview.git
synced 2026-08-03 21:09:05 +00:00
Replace database, resolve all build-time errors
This commit is contained in:
@@ -2,7 +2,8 @@ package resolvers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
api "github.com/viktorstrate/photoview/api/graphql"
|
||||
"github.com/viktorstrate/photoview/api/graphql/auth"
|
||||
@@ -15,41 +16,26 @@ func (r *queryResolver) MyAlbums(ctx context.Context, filter *models.Filter, onl
|
||||
return nil, auth.ErrUnauthorized
|
||||
}
|
||||
|
||||
filterSQL, err := filter.FormatSQL("album")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
query := r.Database.Where("owner_id = ?", user.ID)
|
||||
|
||||
if onlyRoot != nil && *onlyRoot == true {
|
||||
query = query.Where("parent_album = ()", query.Model(&models.Album{})).Select("id").Where("parent_album IS NULL AND owner_id = ?", user.ID)
|
||||
}
|
||||
|
||||
var rows *sql.Rows
|
||||
if showEmpty == nil || *showEmpty == false {
|
||||
subQuery := r.Database.Model(&models.Media{}).Where("album_id = album.album_id")
|
||||
|
||||
filterFavorites := " AND favorite = 1"
|
||||
if onlyWithFavorites == nil || *onlyWithFavorites == false {
|
||||
filterFavorites = ""
|
||||
}
|
||||
|
||||
filterEmpty := " AND EXISTS (SELECT * FROM media WHERE album_id = album.album_id" + filterFavorites + ") "
|
||||
if showEmpty != nil && *showEmpty == true && (onlyWithFavorites == nil || *onlyWithFavorites == false) {
|
||||
filterEmpty = ""
|
||||
}
|
||||
|
||||
if onlyRoot == nil || *onlyRoot == false {
|
||||
rows, err = r.Database.Query("SELECT * FROM album WHERE owner_id = ?"+filterEmpty+filterSQL, user.UserID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
rows, err = r.Database.Query(`
|
||||
SELECT * FROM album WHERE owner_id = ? AND parent_album = (
|
||||
SELECT album_id FROM album WHERE parent_album IS NULL AND owner_id = ?
|
||||
)
|
||||
`+filterEmpty+filterSQL, user.UserID, user.UserID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
if onlyWithFavorites != nil && *onlyWithFavorites == true {
|
||||
subQuery = subQuery.Where("favorite = 1")
|
||||
}
|
||||
|
||||
query = query.Where("EXISTS (?)", subQuery)
|
||||
}
|
||||
|
||||
albums, err := models.NewAlbumsFromRows(rows)
|
||||
if err != nil {
|
||||
// TODO: Incorporate models.FormatSQL
|
||||
|
||||
var albums []*models.Album
|
||||
if err := query.Find(albums).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -62,13 +48,12 @@ func (r *queryResolver) Album(ctx context.Context, id int) (*models.Album, error
|
||||
return nil, auth.ErrUnauthorized
|
||||
}
|
||||
|
||||
row := r.Database.QueryRow("SELECT * FROM album WHERE album_id = ? AND owner_id = ?", id, user.UserID)
|
||||
album, err := models.NewAlbumFromRow(row)
|
||||
if err != nil {
|
||||
var album models.Album
|
||||
if err := r.Database.Where("owner_id = ?", user.ID).First(&album, id).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return album, nil
|
||||
return &album, nil
|
||||
}
|
||||
|
||||
func (r *Resolver) Album() api.AlbumResolver {
|
||||
@@ -77,32 +62,21 @@ func (r *Resolver) Album() api.AlbumResolver {
|
||||
|
||||
type albumResolver struct{ *Resolver }
|
||||
|
||||
func (r *albumResolver) Media(ctx context.Context, obj *models.Album, filter *models.Filter, onlyFavorites *bool) ([]*models.Media, error) {
|
||||
func (r *albumResolver) Media(ctx context.Context, album *models.Album, filter *models.Filter, onlyFavorites *bool) ([]*models.Media, error) {
|
||||
|
||||
filterSQL, err := filter.FormatSQL("media")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
query := r.Database.
|
||||
Joins("Album").
|
||||
Where("Album.id = ?", album.ID).
|
||||
Where("media.id IN (?)", r.Database.Model(&models.MediaURL{})).Select("media_id").Where("media_url.media_id = media.id")
|
||||
|
||||
if onlyFavorites != nil && *onlyFavorites == true {
|
||||
query = query.Where("media.favorite = 1")
|
||||
}
|
||||
|
||||
filterFavorites := " AND media.favorite = 1 "
|
||||
if onlyFavorites == nil || *onlyFavorites == false {
|
||||
filterFavorites = ""
|
||||
}
|
||||
// TODO: Incorporate filter.FormatSQL
|
||||
|
||||
mediaRows, err := r.Database.Query(`
|
||||
SELECT media.* FROM album, media
|
||||
WHERE album.album_id = ? AND media.album_id = album.album_id
|
||||
AND media.media_id IN (
|
||||
SELECT media_id FROM media_url WHERE media_url.media_id = media.media_id
|
||||
)
|
||||
`+filterFavorites+filterSQL, obj.AlbumID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer mediaRows.Close()
|
||||
|
||||
media, err := models.NewMediaFromRows(mediaRows)
|
||||
if err != nil {
|
||||
var media []*models.Media
|
||||
if err := query.Find(&media).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -111,47 +85,44 @@ func (r *albumResolver) Media(ctx context.Context, obj *models.Album, filter *mo
|
||||
|
||||
func (r *albumResolver) Thumbnail(ctx context.Context, obj *models.Album) (*models.Media, error) {
|
||||
|
||||
row := r.Database.QueryRow(`
|
||||
WITH recursive sub_albums AS (
|
||||
SELECT * FROM album AS root WHERE album_id = ?
|
||||
UNION ALL
|
||||
SELECT child.* FROM album AS child JOIN sub_albums ON child.parent_album = sub_albums.album_id
|
||||
)
|
||||
log.Println("TODO: Album thumbnail migrated yet")
|
||||
|
||||
SELECT * FROM media WHERE media.album_id IN (
|
||||
SELECT album_id FROM sub_albums
|
||||
) AND media.media_id IN (
|
||||
SELECT media_id FROM media_url WHERE media_url.media_id = media.media_id
|
||||
) LIMIT 1
|
||||
`, obj.AlbumID)
|
||||
return nil, nil
|
||||
|
||||
media, err := models.NewMediaFromRow(row)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, nil
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
// row := r.Database.QueryRow(`
|
||||
// WITH recursive sub_albums AS (
|
||||
// SELECT * FROM album AS root WHERE album_id = ?
|
||||
// UNION ALL
|
||||
// SELECT child.* FROM album AS child JOIN sub_albums ON child.parent_album = sub_albums.album_id
|
||||
// )
|
||||
|
||||
return media, nil
|
||||
// SELECT * FROM media WHERE media.album_id IN (
|
||||
// SELECT album_id FROM sub_albums
|
||||
// ) AND media.media_id IN (
|
||||
// SELECT media_id FROM media_url WHERE media_url.media_id = media.media_id
|
||||
// ) LIMIT 1
|
||||
// `, obj.AlbumID)
|
||||
|
||||
// media, err := models.NewMediaFromRow(row)
|
||||
// if err != nil {
|
||||
// if err == sql.ErrNoRows {
|
||||
// return nil, nil
|
||||
// } else {
|
||||
// return nil, err
|
||||
// }
|
||||
// }
|
||||
|
||||
// return media, nil
|
||||
}
|
||||
|
||||
func (r *albumResolver) SubAlbums(ctx context.Context, obj *models.Album, filter *models.Filter) ([]*models.Album, error) {
|
||||
filterSQL, err := filter.FormatSQL("album")
|
||||
if err != nil {
|
||||
func (r *albumResolver) SubAlbums(ctx context.Context, parent *models.Album, filter *models.Filter) ([]*models.Album, error) {
|
||||
|
||||
var albums []*models.Album
|
||||
if err := r.Database.Where("parent_album = ?", parent.ID).Find(albums).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rows, err := r.Database.Query("SELECT * FROM album WHERE parent_album = ?"+filterSQL, obj.AlbumID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
albums, err := models.NewAlbumsFromRows(rows)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// TODO: Incorporate filter.FormatSQL
|
||||
|
||||
return albums, nil
|
||||
}
|
||||
@@ -164,34 +135,38 @@ func (r *albumResolver) Owner(ctx context.Context, obj *models.Album) (*models.U
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
func (r *albumResolver) Shares(ctx context.Context, obj *models.Album) ([]*models.ShareToken, error) {
|
||||
rows, err := r.Database.Query("SELECT * FROM share_token WHERE album_id = ?", obj.ID())
|
||||
if err != nil {
|
||||
func (r *albumResolver) Shares(ctx context.Context, album *models.Album) ([]*models.ShareToken, error) {
|
||||
|
||||
var shareTokens []*models.ShareToken
|
||||
if err := r.Database.Where("album_id = ?", album.ID).Find(shareTokens).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
return models.NewShareTokensFromRows(rows)
|
||||
return shareTokens, nil
|
||||
}
|
||||
|
||||
func (r *albumResolver) Path(ctx context.Context, obj *models.Album) ([]*models.Album, error) {
|
||||
user := auth.UserFromContext(ctx)
|
||||
if user == nil {
|
||||
empty := make([]*models.Album, 0)
|
||||
return empty, nil
|
||||
}
|
||||
|
||||
rows, err := r.Database.Query(`
|
||||
WITH recursive path_albums AS (
|
||||
SELECT * FROM album anchor WHERE anchor.album_id = ?
|
||||
UNION
|
||||
SELECT parent.* FROM path_albums child JOIN album parent ON parent.album_id = child.parent_album
|
||||
)
|
||||
SELECT * FROM path_albums WHERE album_id != ? AND owner_id = ?
|
||||
`, obj.AlbumID, obj.AlbumID, user.UserID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fmt.Println("TODO: Album path not migrated yet")
|
||||
|
||||
return models.NewAlbumsFromRows(rows)
|
||||
return make([]*models.Album, 0), nil
|
||||
// user := auth.UserFromContext(ctx)
|
||||
// if user == nil {
|
||||
// empty := make([]*models.Album, 0)
|
||||
// return empty, nil
|
||||
// }
|
||||
|
||||
// rows, err := r.Database.Query(`
|
||||
// WITH recursive path_albums AS (
|
||||
// SELECT * FROM album anchor WHERE anchor.album_id = ?
|
||||
// UNION
|
||||
// SELECT parent.* FROM path_albums child JOIN album parent ON parent.album_id = child.parent_album
|
||||
// )
|
||||
// SELECT * FROM path_albums WHERE album_id != ? AND owner_id = ?
|
||||
// `, obj.AlbumID, obj.AlbumID, user.UserID)
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
|
||||
// return models.NewAlbumsFromRows(rows)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user