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

123 lines
3.2 KiB
Go
Raw Normal View History

2021-02-04 19:02:51 +01:00
package resolvers
import (
"context"
"time"
2021-02-07 17:13:27 +01:00
"github.com/photoview/photoview/api/graphql/auth"
2021-02-04 19:02:51 +01:00
"github.com/photoview/photoview/api/graphql/models"
"gorm.io/gorm"
)
func (r *queryResolver) MyTimeline(ctx context.Context, paginate *models.Pagination, onlyFavorites *bool) ([]*models.TimelineGroup, error) {
2021-02-07 17:13:27 +01:00
user := auth.UserFromContext(ctx)
if user == nil {
return nil, auth.ErrUnauthorized
}
2021-02-04 19:02:51 +01:00
var timelineGroups []*models.TimelineGroup
transactionError := r.Database.Transaction(func(tx *gorm.DB) error {
// album_id, year, month, day
2021-02-07 17:13:27 +01:00
daysQuery := tx.Select(
2021-02-04 19:02:51 +01:00
"albums.id AS album_id",
"YEAR(media.date_shot) AS year",
"MONTH(media.date_shot) AS month",
"DAY(media.date_shot) AS day",
).
Table("media").
Joins("JOIN albums ON media.album_id = albums.id").
2021-02-07 17:13:27 +01:00
Where("albums.id IN (?)", tx.Table("user_albums").Select("user_albums.album_id").Where("user_id = ?", user.ID))
if onlyFavorites != nil && *onlyFavorites == true {
daysQuery.Where("media.id IN (?)", tx.Table("user_media_data").Select("user_media_data.media_id").Where("user_media_data.user_id = ?", user.ID).Where("user_media_data.favorite = 1"))
}
if paginate != nil {
if paginate.Limit != nil {
daysQuery.Limit(*paginate.Limit)
}
2021-02-12 17:44:32 +01:00
if paginate.Offset != nil {
daysQuery.Offset(*paginate.Offset)
}
2021-02-12 17:44:32 +01:00
}
2021-02-07 17:13:27 +01:00
rows, err := daysQuery.Group("albums.id, YEAR(media.date_shot), MONTH(media.date_shot), DAY(media.date_shot)").
2021-02-04 19:02:51 +01:00
Order("media.date_shot DESC").
Rows()
defer rows.Close()
if err != nil {
return err
}
type group struct {
albumID int
year int
month int
day int
}
dbGroups := make([]group, 0)
for rows.Next() {
var g group
rows.Scan(&g.albumID, &g.year, &g.month, &g.day)
dbGroups = append(dbGroups, g)
}
timelineGroups = make([]*models.TimelineGroup, len(dbGroups))
for i, group := range dbGroups {
// Fill album
var groupAlbum models.Album
if err := tx.First(&groupAlbum, group.albumID).Error; err != nil {
return err
}
// Fill media
var groupMedia []*models.Media
2021-02-07 17:13:27 +01:00
mediaQuery := tx.Model(&models.Media{}).
2021-02-04 19:02:51 +01:00
Where("album_id = ? AND YEAR(date_shot) = ? AND MONTH(date_shot) = ? AND DAY(date_shot) = ?", group.albumID, group.year, group.month, group.day).
2021-02-07 17:13:27 +01:00
Order("date_shot DESC")
2021-02-04 19:02:51 +01:00
2021-02-07 17:13:27 +01:00
if onlyFavorites != nil && *onlyFavorites == true {
mediaQuery.Where("media.id IN (?)", tx.Table("user_media_data").Select("user_media_data.media_id").Where("user_media_data.user_id = ?", user.ID).Where("user_media_data.favorite = 1"))
}
if err := mediaQuery.Limit(5).Find(&groupMedia).Error; err != nil {
2021-02-04 19:02:51 +01:00
return err
}
// Get total media count
var totalMedia int64
2021-02-07 17:13:27 +01:00
if err := mediaQuery.Count(&totalMedia).Error; err != nil {
2021-02-04 19:02:51 +01:00
return err
}
var date time.Time = groupMedia[0].DateShot
date = time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, date.Location())
timelineGroup := models.TimelineGroup{
Album: &groupAlbum,
Media: groupMedia,
MediaTotal: int(totalMedia),
Date: date,
}
timelineGroups[i] = &timelineGroup
}
return nil
})
if transactionError != nil {
return nil, transactionError
}
return timelineGroups, nil
}