132 lines
3.4 KiB
Go
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)
|
|
}
|