package main import ( "encoding/json" "log" "net/http" "github.com/gorilla/mux" ) type APIServer struct { Host string Port string Db SQLiteDatabase Cfg *Config } type APIError struct { Status string Error string } func NewAPIError(status string, error string) *APIError { return &APIError{ Status: status, Error: error, } } func WriteJSON(w http.ResponseWriter, status int, v any) error { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) return json.NewEncoder(w).Encode(v) } func NewAPIServer(database SQLiteDatabase, cfg Config) *APIServer { return &APIServer{ Host: cfg.Host, Db: database, Cfg: &cfg, } } func (s *APIServer) Start() { router := mux.NewRouter() router.HandleFunc("/prerace", s.handleCreatePreRace).Methods("POST") router.HandleFunc("/preraces", s.handleGetPreRaces).Methods("GET") router.HandleFunc("/prerace/{id}", s.handleDeletePreRace).Methods("DELETE") router.HandleFunc("/prerace/{id}", s.handleUpdatePreRace).Methods("PUT") router.HandleFunc("/prerace/{id}", s.handleGetPreRaceByID).Methods("GET") router.HandleFunc("/race/{title}", s.handleCreateRace).Methods("POST") log.Println("Listening for new Preraces / Races") http.ListenAndServe(s.Host, router) } func (s *APIServer) handleGetPreRaceByID(w http.ResponseWriter, r *http.Request) { WriteJSON(w, http.StatusOK, mux.Vars(r)) } func (s *APIServer) handleGetPreRaces(w http.ResponseWriter, r *http.Request) { } func (s *APIServer) handleCreatePreRace(w http.ResponseWriter, r *http.Request) { race := NewRace() _ = json.NewDecoder(r.Body).Decode(&race) defer r.Body.Close() race.PreRace = true exist := s.Db.FindRelease(race.TorrentName, race.Indexer) if exist.TorrentName == "" { err := s.Db.CreatePreRace(race) if err != nil { log.Println("Could not create new race in db", err) WriteJSON(w, http.StatusForbidden, "{Error: Could not add to database}") } WriteJSON(w, http.StatusOK, race) } else { er := NewAPIError("ok", "already in database") WriteJSON(w, http.StatusOK, er) } rls := NewRelease(race.TorrentName, race.Title, race.Year, *s.Cfg) rls.ProcessRelease() } func (s *APIServer) handleDeletePreRace(w http.ResponseWriter, r *http.Request) { } func (s *APIServer) handleUpdatePreRace(w http.ResponseWriter, r *http.Request) { } func (s *APIServer) handleCreateRace(w http.ResponseWriter, r *http.Request) { }