121 lines
2.5 KiB
Go
121 lines
2.5 KiB
Go
package playlist
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
"gitnet.fr/deblan/freetube-sync/model"
|
|
"gitnet.fr/deblan/freetube-sync/store/database"
|
|
"gitnet.fr/deblan/freetube-sync/web/helper"
|
|
"gitnet.fr/deblan/freetube-sync/web/route"
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
func Init(c echo.Context) error {
|
|
playlists := []model.Playlist{}
|
|
err := c.Bind(&playlists)
|
|
manager := database.GetManager()
|
|
|
|
if err != nil {
|
|
return helper.Ko(c, err)
|
|
}
|
|
|
|
for _, playlist := range playlists {
|
|
manager.Db.Create(&playlist)
|
|
}
|
|
|
|
return helper.Ok(c)
|
|
}
|
|
|
|
func Push(c echo.Context) error {
|
|
playlists := []model.Playlist{}
|
|
err := c.Bind(&playlists)
|
|
manager := database.GetManager()
|
|
|
|
if err != nil {
|
|
return helper.Ko(c, err)
|
|
}
|
|
|
|
hostname := c.Request().Header.Get("X-Machine")
|
|
|
|
pull := model.Pull{
|
|
Hostname: hostname,
|
|
Database: "playlists",
|
|
}
|
|
|
|
manager.Db.Where(pull).First(&pull)
|
|
|
|
ids := []string{}
|
|
|
|
for _, playlist := range playlists {
|
|
if playlist.PlaylistName == "" {
|
|
continue
|
|
}
|
|
|
|
var existingPlaylist model.Playlist
|
|
manager.Db.Preload("Videos").Where(model.Playlist{
|
|
RemoteId: playlist.RemoteId,
|
|
}).First(&existingPlaylist)
|
|
|
|
if existingPlaylist.ID == 0 {
|
|
playlist.Hostname = hostname
|
|
manager.Db.Create(&playlist)
|
|
ids = append(ids, playlist.RemoteId)
|
|
} else {
|
|
existingPlaylist.Description = playlist.Description
|
|
existingPlaylist.LastUpdatedAt = playlist.LastUpdatedAt
|
|
existingPlaylist.PlaylistName = playlist.PlaylistName
|
|
existingPlaylist.Protected = playlist.Protected
|
|
|
|
for _, v := range existingPlaylist.Videos {
|
|
manager.Db.Delete(v)
|
|
}
|
|
|
|
existingPlaylist.Videos = playlist.Videos
|
|
manager.Db.Save(&existingPlaylist)
|
|
ids = append(ids, existingPlaylist.RemoteId)
|
|
}
|
|
}
|
|
|
|
if len(ids) > 0 {
|
|
var playlistsToDelete []model.Playlist
|
|
|
|
manager.Db.Find(
|
|
&playlistsToDelete,
|
|
"remote_id not in (?) and (created_at < ? or hostname = ?)",
|
|
ids,
|
|
pull.PullAt,
|
|
hostname,
|
|
)
|
|
|
|
for _, entity := range playlistsToDelete {
|
|
manager.Db.Select(clause.Associations).Delete(&entity)
|
|
}
|
|
}
|
|
|
|
return helper.Ok(c)
|
|
}
|
|
|
|
func Pull(c echo.Context) error {
|
|
playlists := []model.Playlist{}
|
|
manager := database.GetManager()
|
|
|
|
manager.Db.Preload("Videos").Find(&playlists)
|
|
|
|
pull := model.Pull{
|
|
Hostname: c.Request().Header.Get("X-Machine"),
|
|
Database: "playlist",
|
|
}
|
|
|
|
manager.Db.Where(pull).FirstOrCreate(&pull)
|
|
pull.PullAt = time.Now()
|
|
manager.Db.Save(&pull)
|
|
|
|
return c.JSON(200, playlists)
|
|
}
|
|
|
|
func Register(e *echo.Echo) {
|
|
e.POST(route.PlaylistsInit, Init)
|
|
e.POST(route.PlaylistsPush, Push)
|
|
e.GET(route.PlaylistsPull, Pull)
|
|
}
|