add playlists and profiles init/pull/push

This commit is contained in:
Simon Vieille 2024-08-29 00:47:17 +02:00
commit fe5eb2db34
15 changed files with 305 additions and 114 deletions

View file

@ -11,26 +11,26 @@ import (
)
func InitPush(c echo.Context) error {
payload := []model.WatchedVideo{}
err := c.Bind(&payload)
watchedVideos := []model.WatchedVideo{}
err := c.Bind(&watchedVideos)
manager := database.GetManager()
if err != nil {
return helper.Ko(c, err)
}
for _, item := range payload {
manager.Db.Where(item).FirstOrCreate(&item)
for _, watchedVideo := range watchedVideos {
manager.Db.Where(watchedVideo).FirstOrCreate(&watchedVideo)
}
return helper.Ok(c)
}
func Pull(c echo.Context) error {
entities := []model.WatchedVideo{}
watchedVideos := []model.WatchedVideo{}
manager := database.GetManager()
manager.Db.Find(&entities)
manager.Db.Find(&watchedVideos)
pull := model.Pull{
Hostname: c.Request().Header.Get("X-Machine"),
@ -41,7 +41,7 @@ func Pull(c echo.Context) error {
pull.PullAt = time.Now()
manager.Db.Save(&pull)
return c.JSON(200, entities)
return c.JSON(200, watchedVideos)
}
func Register(e *echo.Echo) {

View file

@ -1,58 +1,121 @@
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 Ko(c echo.Context, err error) error {
return c.JSON(400, map[string]any{
"code": 400,
"message": err,
})
}
func Init(c echo.Context) error {
playlists := []model.Playlist{}
err := c.Bind(&playlists)
manager := database.GetManager()
func Ok(c echo.Context) error {
return c.JSON(201, map[string]any{
"code": 201,
"message": "ok",
})
}
func OkKo(c echo.Context, err error) error {
if err != nil {
return Ko(c, err)
return helper.Ko(c, err)
}
return Ok(c)
}
for _, playlist := range playlists {
manager.Db.Create(&playlist)
}
func Init(c echo.Context) error {
// payload := []model.Video{}
// err := c.Bind(&payload)
var err error
return OkKo(c, err)
return helper.Ok(c)
}
func Push(c echo.Context) error {
// payload := []model.Video{}
// err := c.Bind(&payload)
var err error
playlists := []model.Playlist{}
err := c.Bind(&playlists)
manager := database.GetManager()
return OkKo(c, err)
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 {
// payload := []model.Video{}
// err := c.Bind(&payload)
var err error
playlists := []model.Playlist{}
manager := database.GetManager()
return OkKo(c, err)
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.PlaylistInit, Init)
e.POST(route.PlaylistPush, Push)
e.GET(route.PlaylistPull, Pull)
e.POST(route.PlaylistsInit, Init)
e.POST(route.PlaylistsPush, Push)
e.GET(route.PlaylistsPull, Pull)
}

View file

@ -1,58 +1,117 @@
package profile
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 Ko(c echo.Context, err error) error {
return c.JSON(400, map[string]any{
"code": 400,
"message": err,
})
}
func Init(c echo.Context) error {
profiles := []model.Profile{}
err := c.Bind(&profiles)
manager := database.GetManager()
func Ok(c echo.Context) error {
return c.JSON(201, map[string]any{
"code": 201,
"message": "ok",
})
}
func OkKo(c echo.Context, err error) error {
if err != nil {
return Ko(c, err)
return helper.Ko(c, err)
}
return Ok(c)
}
for _, profile := range profiles {
manager.Db.Create(&profile)
}
func Init(c echo.Context) error {
// payload := []model.Video{}
// err := c.Bind(&payload)
var err error
return OkKo(c, err)
return helper.Ok(c)
}
func Push(c echo.Context) error {
// payload := []model.Video{}
// err := c.Bind(&payload)
var err error
profiles := []model.Profile{}
err := c.Bind(&profiles)
manager := database.GetManager()
return OkKo(c, err)
if err != nil {
return helper.Ko(c, err)
}
hostname := c.Request().Header.Get("X-Machine")
pull := model.Pull{
Hostname: hostname,
Database: "playlist",
}
manager.Db.Where(pull).First(&pull)
ids := []string{}
for _, profile := range profiles {
if profile.Name == "" {
continue
}
var existingProfile model.Profile
manager.Db.Preload("Subscriptions").Where(model.Profile{
RemoteId: profile.RemoteId,
}).First(&existingProfile)
if existingProfile.ID == 0 {
manager.Db.Create(&profile)
ids = append(ids, profile.Name)
} else {
existingProfile.Name = profile.Name
existingProfile.BgColor = profile.BgColor
existingProfile.TextColor = profile.TextColor
for _, v := range existingProfile.Subscriptions {
manager.Db.Select(clause.Associations).Delete(v)
}
existingProfile.Subscriptions = profile.Subscriptions
manager.Db.Save(&existingProfile)
ids = append(ids, existingProfile.Name)
}
}
if len(ids) > 0 {
var profilesToDelete []model.Profile
manager.Db.Find(
&profilesToDelete,
"name not in (?)",
ids,
)
for _, entity := range profilesToDelete {
manager.Db.Select(clause.Associations).Delete(&entity)
}
}
return helper.Ok(c)
}
func Pull(c echo.Context) error {
// payload := []model.Video{}
// err := c.Bind(&payload)
var err error
profiles := []model.Profile{}
manager := database.GetManager()
return OkKo(c, err)
manager.Db.Preload("Subscriptions").Find(&profiles)
pull := model.Pull{
Hostname: c.Request().Header.Get("X-Machine"),
Database: "profiles",
}
manager.Db.Where(pull).FirstOrCreate(&pull)
pull.PullAt = time.Now()
manager.Db.Save(&pull)
return c.JSON(200, profiles)
}
func Register(e *echo.Echo) {
e.POST(route.ProfileInit, Init)
e.POST(route.ProfilePush, Push)
e.GET(route.ProfilePull, Pull)
e.POST(route.ProfilesInit, Init)
e.POST(route.ProfilesPush, Push)
e.GET(route.ProfilesPull, Pull)
}