2021-02-04 19:02:51 +01:00
|
|
|
package resolvers
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2021-02-14 10:11:10 +01:00
|
|
|
"fmt"
|
2021-02-04 19:02:51 +01:00
|
|
|
"time"
|
|
|
|
|
2021-02-14 10:11:10 +01:00
|
|
|
"github.com/photoview/photoview/api/database"
|
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"
|
|
|
|
)
|
|
|
|
|
2021-02-13 15:08:05 +01:00
|
|
|
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",
|
2021-02-14 10:11:10 +01:00
|
|
|
fmt.Sprintf("%s AS year", database.DateExtract(tx, database.DateCompYear, "media.date_shot")),
|
|
|
|
fmt.Sprintf("%s AS month", database.DateExtract(tx, database.DateCompMonth, "media.date_shot")),
|
|
|
|
fmt.Sprintf("%s AS day", database.DateExtract(tx, database.DateCompDay, "media.date_shot")),
|
2021-02-04 19:02:51 +01:00
|
|
|
).
|
|
|
|
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"))
|
|
|
|
}
|
|
|
|
|
2021-02-13 15:08:05 +01:00
|
|
|
if paginate != nil {
|
|
|
|
if paginate.Limit != nil {
|
|
|
|
daysQuery.Limit(*paginate.Limit)
|
|
|
|
}
|
2021-02-12 17:44:32 +01:00
|
|
|
|
2021-02-13 15:08:05 +01:00
|
|
|
if paginate.Offset != nil {
|
|
|
|
daysQuery.Offset(*paginate.Offset)
|
|
|
|
}
|
2021-02-12 17:44:32 +01:00
|
|
|
}
|
|
|
|
|
2021-02-14 11:40:13 +01:00
|
|
|
rows, err := daysQuery.Group("albums.id").Group(
|
|
|
|
fmt.Sprintf("%s, %s, %s",
|
|
|
|
database.DateExtract(tx, database.DateCompYear, "media.date_shot"),
|
|
|
|
database.DateExtract(tx, database.DateCompMonth, "media.date_shot"),
|
|
|
|
database.DateExtract(tx, database.DateCompDay, "media.date_shot")),
|
|
|
|
).
|
|
|
|
Order(
|
|
|
|
fmt.Sprintf("%s DESC, %s DESC, %s DESC",
|
|
|
|
database.DateExtract(tx, database.DateCompYear, "media.date_shot"),
|
|
|
|
database.DateExtract(tx, database.DateCompMonth, "media.date_shot"),
|
|
|
|
database.DateExtract(tx, database.DateCompDay, "media.date_shot")),
|
|
|
|
).Rows()
|
2021-02-04 19:02:51 +01:00
|
|
|
|
|
|
|
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-14 10:11:10 +01:00
|
|
|
Where("album_id = ?", group.albumID).
|
|
|
|
Where(fmt.Sprintf("%s = ?", database.DateExtract(tx, database.DateCompYear, "media.date_shot")), group.year).
|
|
|
|
Where(fmt.Sprintf("%s = ?", database.DateExtract(tx, database.DateCompMonth, "media.date_shot")), group.month).
|
|
|
|
Where(fmt.Sprintf("%s = ?", database.DateExtract(tx, database.DateCompDay, "media.date_shot")), 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
|
|
|
|
}
|