package apiv3 import ( "fmt" "net/http" "strconv" "strings" . "git.1750studios.com/gronkhDE/gogronkh/gserver/utlis" "git.1750studios.com/gronkhDE/gogronkh/database" "github.com/jinzhu/copier" "github.com/gin-gonic/gin" ) func GetAuthors(c *gin.Context) { var ATs []database.Author var AATs []Author if author, ok := CleanParam(c.Param("aid")); ok { database.Db.Where(author).Find(&ATs) if len(ATs) > 0 { copier.Copy(&AATs, &ATs) if HandleEtag(c, fmt.Sprintf("%#v", AATs[0])) { return } c.JSON(http.StatusOK, AATs[0]) } else { if HandleEtag(c, "{}") { return } c.JSON(http.StatusOK, gin.H{}) } } else { database.Db.Find(&ATs) copier.Copy(&AATs, &ATs) if HandleEtag(c, fmt.Sprintf("%#v", AATs)) { return } c.JSON(http.StatusOK, AATs) } } func GetAuthorTests(c *gin.Context) { var AT database.Author var LTs []database.LetsTest var ALTs []LetsTest if author, ok := CleanParam(c.Param("aid")); ok { database.Db.Where(author).Find(&AT) database.Db.Model(&AT).Related(<s) } else { c.AbortWithStatus(404) } copier.Copy(&ALTs, <s) if HandleEtag(c, fmt.Sprintf("%#v", ALTs)) { return } c.JSON(http.StatusOK, ALTs) } func GetAuthorLps(c *gin.Context) { var AT database.Author var LPs []database.LetsPlay var ALPs []LetsPlay if author, ok := CleanParam(c.Param("aid")); ok { database.Db.Where(author).Find(&AT) database.Db.Model(&AT).Where("aired IS NOT NULL AND merge_id IS NULL").Related(&LPs) } else { c.AbortWithStatus(404) } copier.Copy(&ALPs, &LPs) if HandleEtag(c, fmt.Sprintf("%#v", ALPs)) { return } c.JSON(http.StatusOK, ALPs) } func GetTests(c *gin.Context) { var LTs []database.LetsTest var ALTs []LetsTest if lt, ok := CleanParam(c.Param("tid")); ok { database.Db.Where(lt).Find(<s) if len(LTs) > 0 { copier.Copy(&ALTs, <s) if HandleEtag(c, fmt.Sprintf("%#v", ALTs[0])) { return } c.JSON(http.StatusOK, ALTs[0]) } else { if HandleEtag(c, "{}") { return } c.JSON(http.StatusOK, gin.H{}) } } else { database.Db.Find(<s) copier.Copy(&ALTs, <s) if HandleEtag(c, fmt.Sprintf("%#v", ALTs)) { return } c.JSON(http.StatusOK, ALTs) } } func GetLps(c *gin.Context) { var LPs []database.LetsPlay var ALPs []LetsPlay if lp, ok := CleanParam(c.Param("lid")); ok { database.Db.Where("id=? AND aired IS NOT NULL and merge_id IS NULL", lp).Find(&LPs) if len(LPs) > 0 { copier.Copy(&ALPs, &LPs) if HandleEtag(c, fmt.Sprintf("%#v", ALPs[0])) { return } c.JSON(http.StatusOK, ALPs[0]) } else { if HandleEtag(c, "{}") { return } c.JSON(http.StatusOK, gin.H{}) } } else { database.Db.Where("aired IS NOT NULL AND merge_id IS NULL").Find(&LPs) copier.Copy(&ALPs, &LPs) if HandleEtag(c, fmt.Sprintf("%#v", ALPs)) { return } c.JSON(http.StatusOK, ALPs) } } func GetLpEpisodes(c *gin.Context) { if lp, ok := CleanParam(c.Param("lid")); ok { if ep, ok := CleanParam(c.Param("eid")); ok { var EP database.Episode var AEP Episode database.Db.Where(ep).First(&EP) copier.Copy(&AEP, &EP) if HandleEtag(c, fmt.Sprintf("%#v", AEP)) { return } c.JSON(http.StatusOK, AEP) } else { var LP database.LetsPlay var EPs []database.Episode var AEPs []Episode database.Db.Where(lp).First(&LP) database.Db.Model(&LP).Related(&EPs) copier.Copy(&AEPs, &EPs) if HandleEtag(c, fmt.Sprintf("%#v", AEPs)) { return } c.JSON(http.StatusOK, AEPs) } } else { c.AbortWithStatus(404) } } func GetRecent(c *gin.Context) { var EPs []database.Episode var AEPs []Episode if limit, ok := CleanParam(c.Param("limit")); ok { lim, _ := strconv.Atoi(limit) database.Db.Order("aired desc").Limit(lim).Find(&EPs) } else { database.Db.Order("aired desc").Limit(20).Find(&EPs) } copier.Copy(&AEPs, &EPs) if HandleEtag(c, fmt.Sprintf("%#v", AEPs)) { return } c.JSON(http.StatusOK, AEPs) } func GetSearch(c *gin.Context) { if term, ok := CleanParam(c.Param("query")); ok { term = strings.Replace(term, " ", "&", -1) term = strings.Replace(term, "+", "&", -1) if kind, ok := CleanParam(c.Param("type")); ok { if kind == "count" { lps := 0 lts := 0 eps := 0 database.Db.Model(database.LetsPlay{}).Where("to_tsvector('german', name) @@ to_tsquery('german', ?) AND aired IS NOT NULL AND merge_id IS NULL", term).Count(&lps) database.Db.Model(database.LetsTest{}).Where("to_tsvector('german', name) @@ to_tsquery('german', ?)", term).Count(<s) database.Db.Model(database.Episode{}).Where("to_tsvector('german', name) @@ to_tsquery('german', ?)", term).Count(&eps) response := gin.H{"lets-plays": lps, "tests": lts, "episodes": eps} if HandleEtag(c, fmt.Sprintf("%#v", response)) { return } c.JSON(http.StatusOK, response) } else if kind == "lets-plays" { var lps []database.LetsPlay var ALPs []LetsPlay database.Db.Where("to_tsvector('german', name) @@ to_tsquery('german', ?) AND aired IS NOT NULL AND merge_id IS NULL", term).Find(&lps) copier.Copy(&ALPs, &lps) if HandleEtag(c, fmt.Sprintf("%#v", ALPs)) { return } c.JSON(http.StatusOK, ALPs) } else if kind == "tests" { var lts []database.LetsTest var ALTs []LetsTest database.Db.Where("to_tsvector('german', name) @@ to_tsquery('german', ?)", term).Find(<s) copier.Copy(&ALTs, <s) if HandleEtag(c, fmt.Sprintf("%#v", ALTs)) { return } c.JSON(http.StatusOK, ALTs) } else if kind == "episodes" { var eps []database.Episode var AEPs []Episode database.Db.Where("to_tsvector('german', name) @@ to_tsquery('german', ?)", term).Find(&eps) copier.Copy(&AEPs, &eps) if HandleEtag(c, fmt.Sprintf("%#v", AEPs)) { return } c.JSON(http.StatusOK, AEPs) } else { c.AbortWithStatus(400) } } else { c.AbortWithStatus(400) } } else { c.AbortWithStatus(400) } }