GoGronkh/gserver/apiv3/apiv3.go

230 lines
7.2 KiB
Go
Raw Permalink Normal View History

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(&LTs)
} else {
c.AbortWithStatus(404)
}
copier.Copy(&ALTs, &LTs)
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(&LTs)
if len(LTs) > 0 {
copier.Copy(&ALTs, &LTs)
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(&LTs)
copier.Copy(&ALTs, &LTs)
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(&lts)
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(&lts)
copier.Copy(&ALTs, &lts)
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)
}
}