GoRacerr/api.go
2024-09-01 08:13:28 +07:00

132 lines
3.4 KiB
Go

package main
import (
"encoding/json"
"log"
"net/http"
"strings"
"time"
"github.com/gorilla/mux"
)
type APIServer struct {
Host string
Port string
Db SQLiteDatabase
Cfg *Config
}
type APIError struct {
Status string
Error string
}
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("/race", s.CreateRace).Methods("POST")
router.HandleFunc("/races", s.GetPreRaces).Methods("GET")
router.HandleFunc("/race/{id}", s.DeletePreRace).Methods("DELETE")
router.HandleFunc("/race/{id}", s.UpdatePreRace).Methods("PUT")
router.HandleFunc("/race/{id}", s.GetPreRaceByID).Methods("GET")
router.HandleFunc("/race/{title}", s.CreateRace).Methods("POST")
router.HandleFunc("/releases", s.GetReleases).Methods("GET")
log.Println("Listening for new Races")
http.ListenAndServe(s.Host, router)
}
func (s *APIServer) GetPreRaceByID(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id := vars["id"]
race := s.Db.FindRaceByID(id)
WriteJSON(w, http.StatusOK, race)
}
func (s *APIServer) GetPreRaces(w http.ResponseWriter, r *http.Request) {
races, err := s.Db.FindRaces()
if err != nil {
log.Println("Could not get races: ", err)
}
WriteJSON(w, http.StatusOK, races)
}
func (s *APIServer) CreateRace(w http.ResponseWriter, r *http.Request) {
race := NewRace()
_ = json.NewDecoder(r.Body).Decode(&race)
defer r.Body.Close()
race.OriginalPath = ""
race.TorrentFile = ""
race.NFOFile = ""
// Race only for movie and serie
if race.Type == "movie" || race.Type == "episode" && !strings.Contains(race.Category, "XXX") {
race.PreRace = 1
race.PreRaceStarted = time.Time.Unix(time.Now())
log.Printf("New PreRace [%s] from [%s] started at [%s]", race.TorrentName, race.Indexer, time.Unix(race.PreRaceStarted, 0))
raceExist := s.Db.FindRace(race.TorrentName, race.Indexer)
if raceExist.ID == 0 {
err := s.Db.CreateRace(race)
if err != nil {
log.Println("Could not create new race in db", err)
WriteJSON(w, http.StatusForbidden, "{Error: Could not add prerace to database}")
}
WriteJSON(w, http.StatusOK, race)
log.Printf("Adding prerace [%s] from [%s] to database", race.TorrentName, race.Indexer)
} else {
WriteJSON(w, http.StatusOK, APIError{Status: "ok", Error: "Race already in database"})
}
rls := NewRelease(*race, *s.Cfg, s.Db)
rls.ProcessRelease(*s.Cfg)
rlsExist := s.Db.FindRelease(*rls)
if rlsExist.ID == 0 {
err := s.Db.CreateRelease(*rls)
if err != nil {
log.Printf("Could not create new release [%s] in dbm error: %s", rls.TorrentName, err)
WriteJSON(w, http.StatusForbidden, APIError{Status: "Not OK", Error: "Could not add release in db"})
}
log.Printf("Adding release [%s] to database", rls.Title)
}
}
}
func (s *APIServer) DeletePreRace(w http.ResponseWriter, r *http.Request) {
}
func (s *APIServer) UpdatePreRace(w http.ResponseWriter, r *http.Request) {
}
func (s *APIServer) GetReleases(w http.ResponseWriter, r *http.Request) {
releases, err := s.Db.FindReleases()
if err != nil {
log.Println("Could not get releases: ", err)
}
WriteJSON(w, http.StatusOK, releases)
}