You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
276 lines
6.6 KiB
276 lines
6.6 KiB
package controllers
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/akhilrex/podgrab/model"
|
|
"github.com/akhilrex/podgrab/service"
|
|
|
|
"github.com/akhilrex/podgrab/db"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
const (
|
|
DateAdded = "dateadded"
|
|
Name = "name"
|
|
LastEpisode = "lastepisode"
|
|
)
|
|
|
|
const (
|
|
Asc = "asc"
|
|
Desc = "desc"
|
|
)
|
|
|
|
type SearchQuery struct {
|
|
Q string `binding:"required" form:"q"`
|
|
Type string `form:"type"`
|
|
}
|
|
|
|
type PodcastListQuery struct {
|
|
Sort string `uri:"sort" query:"sort" json:"sort" form:"sort" default:"created_at"`
|
|
Order string `uri:"order" query:"order" json:"order" form:"order" default:"asc"`
|
|
}
|
|
|
|
type SearchByIdQuery struct {
|
|
Id string `binding:"required" uri:"id" json:"id" form:"id"`
|
|
}
|
|
|
|
type Pagination struct {
|
|
Page int `uri:"page" query:"page" json:"page" form:"page"`
|
|
Count int `uri:"count" query:"count" json:"count" form:"count"`
|
|
DownloadedOnly bool `uri:"downloadedOnly" query:"downloadedOnly" json:"downloadedOnly" form:"downloadedOnly"`
|
|
}
|
|
|
|
type PatchPodcastItem struct {
|
|
IsPlayed bool `json:"isPlayed" form:"isPlayed" query:"isPlayed"`
|
|
Title string `form:"title" json:"title" query:"title"`
|
|
}
|
|
|
|
type AddPodcastData struct {
|
|
Url string `binding:"required" form:"url" json:"url"`
|
|
}
|
|
|
|
func GetAllPodcasts(c *gin.Context) {
|
|
var podcastListQuery PodcastListQuery
|
|
|
|
if c.ShouldBindQuery(&podcastListQuery) == nil {
|
|
var order = strings.ToLower(podcastListQuery.Order)
|
|
var sorting = "created_at"
|
|
switch sort := strings.ToLower(podcastListQuery.Sort); sort {
|
|
case DateAdded:
|
|
sorting = "created_at"
|
|
case Name:
|
|
sorting = "title"
|
|
case LastEpisode:
|
|
sorting = "last_episode"
|
|
}
|
|
if order == Desc {
|
|
sorting = fmt.Sprintf("%s desc", sorting)
|
|
}
|
|
|
|
c.JSON(200, service.GetAllPodcasts(sorting))
|
|
}
|
|
}
|
|
|
|
func GetPodcastById(c *gin.Context) {
|
|
var searchByIdQuery SearchByIdQuery
|
|
|
|
if c.ShouldBindUri(&searchByIdQuery) == nil {
|
|
|
|
var podcast db.Podcast
|
|
|
|
err := db.GetPodcastById(searchByIdQuery.Id, &podcast)
|
|
fmt.Println(err)
|
|
c.JSON(200, podcast)
|
|
} else {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
}
|
|
}
|
|
func DeletePodcastById(c *gin.Context) {
|
|
var searchByIdQuery SearchByIdQuery
|
|
|
|
if c.ShouldBindUri(&searchByIdQuery) == nil {
|
|
|
|
service.DeletePodcast(searchByIdQuery.Id)
|
|
c.JSON(http.StatusNoContent, gin.H{})
|
|
} else {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
}
|
|
}
|
|
func DeletePodcastEpisodesById(c *gin.Context) {
|
|
var searchByIdQuery SearchByIdQuery
|
|
|
|
if c.ShouldBindUri(&searchByIdQuery) == nil {
|
|
|
|
service.DeletePodcastEpisodes(searchByIdQuery.Id)
|
|
c.JSON(http.StatusNoContent, gin.H{})
|
|
} else {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
}
|
|
}
|
|
|
|
func GetPodcastItemsByPodcastId(c *gin.Context) {
|
|
var searchByIdQuery SearchByIdQuery
|
|
|
|
if c.ShouldBindUri(&searchByIdQuery) == nil {
|
|
|
|
var podcastItems []db.PodcastItem
|
|
|
|
err := db.GetAllPodcastItemsByPodcastId(searchByIdQuery.Id, &podcastItems)
|
|
fmt.Println(err)
|
|
c.JSON(200, podcastItems)
|
|
} else {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
}
|
|
}
|
|
|
|
func DownloadAllEpisodesByPodcastId(c *gin.Context) {
|
|
var searchByIdQuery SearchByIdQuery
|
|
|
|
if c.ShouldBindUri(&searchByIdQuery) == nil {
|
|
|
|
err := service.SetAllEpisodesToDownload(searchByIdQuery.Id)
|
|
fmt.Println(err)
|
|
go service.RefreshEpisodes()
|
|
c.JSON(200, gin.H{})
|
|
} else {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
}
|
|
}
|
|
|
|
func GetAllPodcastItems(c *gin.Context) {
|
|
var podcasts []db.PodcastItem
|
|
db.GetAllPodcastItems(&podcasts)
|
|
c.JSON(200, podcasts)
|
|
}
|
|
|
|
func GetPodcastItemById(c *gin.Context) {
|
|
var searchByIdQuery SearchByIdQuery
|
|
|
|
if c.ShouldBindUri(&searchByIdQuery) == nil {
|
|
|
|
var podcast db.PodcastItem
|
|
|
|
err := db.GetPodcastItemById(searchByIdQuery.Id, &podcast)
|
|
fmt.Println(err)
|
|
c.JSON(200, podcast)
|
|
} else {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
}
|
|
}
|
|
|
|
func MarkPodcastItemAsUnplayed(c *gin.Context) {
|
|
var searchByIdQuery SearchByIdQuery
|
|
|
|
if c.ShouldBindUri(&searchByIdQuery) == nil {
|
|
service.SetPodcastItemPlayedStatus(searchByIdQuery.Id, false)
|
|
} else {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
}
|
|
}
|
|
func MarkPodcastItemAsPlayed(c *gin.Context) {
|
|
var searchByIdQuery SearchByIdQuery
|
|
|
|
if c.ShouldBindUri(&searchByIdQuery) == nil {
|
|
service.SetPodcastItemPlayedStatus(searchByIdQuery.Id, true)
|
|
} else {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
}
|
|
}
|
|
func PatchPodcastItemById(c *gin.Context) {
|
|
var searchByIdQuery SearchByIdQuery
|
|
|
|
if c.ShouldBindUri(&searchByIdQuery) == nil {
|
|
|
|
var podcast db.PodcastItem
|
|
|
|
err := db.GetPodcastItemById(searchByIdQuery.Id, &podcast)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
return
|
|
}
|
|
|
|
var input PatchPodcastItem
|
|
|
|
if err := c.ShouldBindJSON(&input); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
db.DB.Model(&podcast).Updates(input)
|
|
c.JSON(200, podcast)
|
|
|
|
} else {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
}
|
|
}
|
|
|
|
func DownloadPodcastItem(c *gin.Context) {
|
|
var searchByIdQuery SearchByIdQuery
|
|
|
|
if c.ShouldBindUri(&searchByIdQuery) == nil {
|
|
go service.DownloadSingleEpisode(searchByIdQuery.Id)
|
|
c.JSON(200, gin.H{})
|
|
} else {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
}
|
|
}
|
|
func DeletePodcastItem(c *gin.Context) {
|
|
var searchByIdQuery SearchByIdQuery
|
|
|
|
if c.ShouldBindUri(&searchByIdQuery) == nil {
|
|
|
|
go service.DeleteEpisodeFile(searchByIdQuery.Id)
|
|
c.JSON(200, gin.H{})
|
|
} else {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
|
|
}
|
|
}
|
|
|
|
func AddPodcast(c *gin.Context) {
|
|
var addPodcastData AddPodcastData
|
|
err := c.ShouldBindJSON(&addPodcastData)
|
|
if err == nil {
|
|
pod, err := service.AddPodcast(addPodcastData.Url)
|
|
if err == nil {
|
|
go service.RefreshEpisodes()
|
|
c.JSON(200, pod)
|
|
} else {
|
|
if v, ok := err.(*model.PodcastAlreadyExistsError); ok {
|
|
c.JSON(409, gin.H{"message": v.Error()})
|
|
} else {
|
|
log.Println(err.Error())
|
|
c.JSON(http.StatusBadRequest, gin.H{"message": err.Error()})
|
|
}
|
|
}
|
|
} else {
|
|
log.Println(err.Error())
|
|
c.JSON(http.StatusBadRequest, gin.H{"message": err.Error()})
|
|
}
|
|
}
|
|
|
|
func UpdateSetting(c *gin.Context) {
|
|
var model SettingModel
|
|
err := c.ShouldBind(&model)
|
|
|
|
if err == nil {
|
|
|
|
err = service.UpdateSettings(model.DownloadOnAdd, model.InitialDownloadCount, model.AutoDownload, model.AppendDateToFileName, model.AppendEpisodeNumberToFileName, model.DarkMode)
|
|
if err == nil {
|
|
c.JSON(200, gin.H{"message": "Success"})
|
|
|
|
} else {
|
|
|
|
c.JSON(http.StatusBadRequest, err)
|
|
|
|
}
|
|
} else {
|
|
fmt.Println(err.Error())
|
|
c.JSON(http.StatusBadRequest, err)
|
|
}
|
|
|
|
}
|