114 lines
2.2 KiB
Go
Raw Normal View History

2017-10-19 19:43:42 +00:00
package database
import (
"net/http"
"github.com/aerogo/aero"
"github.com/aerogo/mirror"
"github.com/animenotifier/arn"
)
// QueryResponse ..
type QueryResponse struct {
Results []interface{} `json:"results"`
}
// Select ...
func Select(ctx *aero.Context) string {
dataTypeName := ctx.Get("data-type")
field := ctx.Get("field")
searchValue := ctx.Get("field-value")
// Empty values
if dataTypeName == "+" {
dataTypeName = ""
}
if field == "+" {
field = ""
}
if searchValue == "+" {
searchValue = ""
}
// Check empty parameters
if dataTypeName == "" || field == "" {
return ctx.Error(http.StatusBadRequest, "Not enough parameters", nil)
}
// Check data type parameter
_, found := arn.DB.Types()[dataTypeName]
if !found {
return ctx.Error(http.StatusBadRequest, "Invalid type", nil)
}
response := &QueryResponse{
Results: []interface{}{},
}
stream, err := arn.DB.All(dataTypeName)
if err != nil {
return ctx.Error(http.StatusInternalServerError, "Error fetching data from the database", err)
}
process := func(obj interface{}) {
_, _, value, _ := mirror.GetField(obj, field)
if value.String() == searchValue {
response.Results = append(response.Results, obj)
}
}
switch dataTypeName {
case "Analytics":
for obj := range stream.(chan *arn.Analytics) {
process(obj)
}
case "Anime":
for obj := range stream.(chan *arn.Anime) {
process(obj)
}
case "AnimeList":
for obj := range stream.(chan *arn.AnimeList) {
process(obj)
}
case "Character":
for obj := range stream.(chan *arn.Character) {
process(obj)
}
case "Group":
for obj := range stream.(chan *arn.Group) {
process(obj)
}
case "Post":
for obj := range stream.(chan *arn.Post) {
process(obj)
}
case "Settings":
for obj := range stream.(chan *arn.Settings) {
process(obj)
}
case "SoundTrack":
for obj := range stream.(chan *arn.SoundTrack) {
process(obj)
}
case "Thread":
for obj := range stream.(chan *arn.Thread) {
process(obj)
}
case "User":
for obj := range stream.(chan *arn.User) {
process(obj)
}
}
for _, obj := range response.Results {
mirror.GetField(obj, field)
}
return ctx.JSON(response)
}