BeeBot/api.go

155 lines
3.6 KiB
Go

package beebot
import (
"encoding/json"
"io/ioutil"
"net/http"
"os"
"github.com/go-chi/chi"
"github.com/rs/zerolog/log"
)
func (b *BeeBot) apiEndpoints() http.Handler {
r := chi.NewRouter()
r.Route("/nav", func(r chi.Router) {
r.Get("/", b.getNav)
})
r.Route("/config", func(r chi.Router) {
r.Get("/", b.getConfig)
r.Post("/", b.setConfig)
r.Delete("/", b.deleteConfig)
})
r.Route("/filters", func(r chi.Router) {
r.Get("/", b.getFilters)
r.Post("/", b.postFilters)
r.Put("/{name}", b.putFilters)
r.Delete("/", b.deleteFilters)
})
r.Route("/log", func(r chi.Router) {
r.Get("/", b.getLog)
})
return r
}
type configEntry struct {
Key string `json:"key"`
Value string `json:"value"`
}
func (b *BeeBot) getNav(w http.ResponseWriter, r *http.Request) {
j, _ := json.Marshal(b.nav)
w.Write(j)
}
func (b *BeeBot) getConfig(w http.ResponseWriter, r *http.Request) {
entries := []configEntry{}
err := b.db.Select(&entries, `select key, value from config`)
if err != nil {
log.Error().Err(err).Msg("Could not get configuration entries")
w.WriteHeader(500)
j, _ := json.Marshal(err)
w.Write(j)
}
j, _ := json.Marshal(entries)
w.Write(j)
}
func (b *BeeBot) setConfig(w http.ResponseWriter, r *http.Request) {
config := configEntry{}
body, _ := ioutil.ReadAll(r.Body)
err := json.Unmarshal(body, &config)
if err != nil {
log.Error().Err(err).Msg("Could not get configuration entries")
w.WriteHeader(400)
j, _ := json.Marshal(err)
w.Write(j)
}
err = b.c.Set(config.Key, config.Value)
if err != nil {
log.Error().Err(err).Msg("Could not set configuration entry")
w.WriteHeader(400)
j, _ := json.Marshal(err)
w.Write(j)
}
}
func (b *BeeBot) deleteConfig(w http.ResponseWriter, r *http.Request) {
config := configEntry{}
body, _ := ioutil.ReadAll(r.Body)
err := json.Unmarshal(body, &config)
if err != nil {
log.Error().Err(err).Msg("Could not get configuration entries")
w.WriteHeader(400)
j, _ := json.Marshal(err)
w.Write(j)
}
log.Info().Msgf("Deleting config: %s", config.Key)
err = b.c.Unset(config.Key)
if err != nil {
log.Error().Err(err).Msg("Could not unset configuration entry")
w.WriteHeader(400)
j, _ := json.Marshal(err)
w.Write(j)
}
resp, _ := json.Marshal(struct {
Status string `json:"status"`
}{"ok"})
w.Write(resp)
}
func (b *BeeBot) getFilters(w http.ResponseWriter, r *http.Request) {
filters, err := b.AllFilters()
if err != nil {
log.Error().Err(err).Msg("Could not get filters")
}
j, _ := json.Marshal(filters)
w.Write(j)
}
func (b *BeeBot) postFilters(w http.ResponseWriter, r *http.Request) {
filter := Filter{}
body, _ := ioutil.ReadAll(r.Body)
err := json.Unmarshal(body, &filter)
filter.populate(b.db)
if err != nil {
log.Error().Err(err).Msg("Could not read filter entry")
w.WriteHeader(400)
j, _ := json.Marshal(err)
w.Write(j)
}
err = filter.Save()
if err != nil {
log.Error().Err(err).Msg("Could not save filter")
w.WriteHeader(400)
j, _ := json.Marshal(err)
w.Write(j)
}
out, err := json.Marshal(filter)
if err != nil {
log.Error().Err(err).Msg("Could not marshal filter output")
w.WriteHeader(500)
j, _ := json.Marshal(err)
w.Write(j)
}
w.Write(out)
}
func (b *BeeBot) putFilters(w http.ResponseWriter, r *http.Request) {
}
func (b *BeeBot) deleteFilters(w http.ResponseWriter, r *http.Request) {
}
func (b *BeeBot) getLog(w http.ResponseWriter, r *http.Request) {
f, _ := os.Open(b.logPath)
logs, err := ioutil.ReadAll(f)
if err != nil {
log.Error().Err(err).Msg("Could not open logs")
w.WriteHeader(500)
j, _ := json.Marshal(err)
w.Write(j)
}
w.Write(logs)
}