2017-05-05 16:39:15 +02:00
package router
2017-05-08 11:18:49 +02:00
import (
"encoding/json"
"fmt"
2017-05-05 16:39:15 +02:00
"html"
2017-05-08 11:18:49 +02:00
"net/http"
2017-05-09 18:37:40 +02:00
//"sort"
2017-05-05 16:39:15 +02:00
"strconv"
2017-05-08 11:18:49 +02:00
"time"
2017-05-09 19:58:35 +02:00
"github.com/ewhal/nyaa/config"
"github.com/ewhal/nyaa/db"
2017-05-05 16:39:15 +02:00
"github.com/ewhal/nyaa/model"
2017-05-09 18:37:40 +02:00
"github.com/ewhal/nyaa/service/api"
2017-05-05 16:39:15 +02:00
"github.com/ewhal/nyaa/service/torrent"
2017-05-09 13:31:58 +02:00
"github.com/ewhal/nyaa/util"
2017-05-08 11:18:49 +02:00
"github.com/gorilla/mux"
2017-05-05 16:39:15 +02:00
)
func ApiHandler ( w http . ResponseWriter , r * http . Request ) {
vars := mux . Vars ( r )
page := vars [ "page" ]
2017-05-09 17:09:45 +02:00
whereParams := torrentService . WhereParams { }
2017-05-09 18:54:12 +02:00
req := apiService . TorrentsRequest { }
2017-05-05 16:39:15 +02:00
2017-05-09 17:09:45 +02:00
contentType := r . Header . Get ( "Content-Type" )
if contentType == "application/json" {
d := json . NewDecoder ( r . Body )
2017-05-09 18:37:40 +02:00
if err := d . Decode ( & req ) ; err != nil {
2017-05-09 17:09:45 +02:00
util . SendError ( w , err , 502 )
}
2017-05-09 18:54:12 +02:00
if req . MaxPerPage == 0 {
req . MaxPerPage = 50
}
if req . Page == 0 {
req . Page = 1
}
2017-05-09 18:37:40 +02:00
whereParams = req . ToParams ( )
2017-05-09 18:54:12 +02:00
} else {
var errConv error
req . MaxPerPage , errConv = strconv . Atoi ( r . URL . Query ( ) . Get ( "max" ) )
if errConv != nil || req . MaxPerPage == 0 {
req . MaxPerPage = 50 // default Value maxPerPage
}
req . Page , _ = strconv . Atoi ( html . EscapeString ( page ) )
if req . Page == 0 {
req . Page = 1
}
2017-05-09 17:09:45 +02:00
}
nbTorrents := 0
2017-05-09 18:54:12 +02:00
torrents , nbTorrents , err := torrentService . GetTorrents ( whereParams , req . MaxPerPage , req . MaxPerPage * ( req . Page - 1 ) )
2017-05-09 13:31:58 +02:00
if err != nil {
util . SendError ( w , err , 400 )
return
}
2017-05-08 11:18:49 +02:00
2017-05-09 01:56:57 +02:00
b := model . ApiResultJson {
Torrents : model . TorrentsToJSON ( torrents ) ,
2017-05-05 16:39:15 +02:00
}
2017-05-09 18:54:12 +02:00
b . QueryRecordCount = req . MaxPerPage
2017-05-05 16:39:15 +02:00
b . TotalRecordCount = nbTorrents
w . Header ( ) . Set ( "Content-Type" , "application/json" )
2017-05-09 13:31:58 +02:00
err = json . NewEncoder ( w ) . Encode ( b )
2017-05-05 16:39:15 +02:00
if err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
return
}
}
func ApiViewHandler ( w http . ResponseWriter , r * http . Request ) {
vars := mux . Vars ( r )
id := vars [ "id" ]
torrent , err := torrentService . GetTorrentById ( id )
2017-05-09 19:37:39 +02:00
b := torrent . ToJson ( )
2017-05-05 16:39:15 +02:00
w . Header ( ) . Set ( "Content-Type" , "application/json" )
err = json . NewEncoder ( w ) . Encode ( b )
if err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
return
}
2017-05-06 23:46:53 +02:00
}
2017-05-08 11:18:49 +02:00
func ApiUploadHandler ( w http . ResponseWriter , r * http . Request ) {
if config . UploadsDisabled == 1 {
http . Error ( w , "Error uploads are disabled" , http . StatusInternalServerError )
return
}
2017-05-09 20:54:50 +02:00
contentType := r . Header . Get ( "Content-Type" )
2017-05-09 19:37:39 +02:00
if contentType == "application/json" {
2017-05-09 19:58:35 +02:00
token := r . Header . Get ( "Authorization" )
user := model . User { }
db . ORM . Where ( "api_token = ?" , token ) . First ( & user ) //i don't like this
if user . Id == 0 {
2017-05-09 22:24:32 +02:00
http . Error ( w , apiService . ErrApiKey . Error ( ) , http . StatusForbidden )
2017-05-09 19:58:35 +02:00
return
}
2017-05-08 11:18:49 +02:00
2017-05-09 19:37:39 +02:00
defer r . Body . Close ( )
2017-05-08 11:18:49 +02:00
2017-05-09 20:54:50 +02:00
upload := apiService . TorrentRequest { }
2017-05-09 19:37:39 +02:00
d := json . NewDecoder ( r . Body )
if err := d . Decode ( & upload ) ; err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
return
}
2017-05-09 20:54:50 +02:00
err , code := upload . ValidateUpload ( )
2017-05-09 19:37:39 +02:00
if err != nil {
2017-05-09 19:58:35 +02:00
http . Error ( w , err . Error ( ) , code )
2017-05-09 19:37:39 +02:00
return
}
2017-05-08 11:18:49 +02:00
2017-05-09 19:37:39 +02:00
torrent := model . Torrents {
Name : upload . Name ,
Category : upload . Category ,
Sub_Category : upload . SubCategory ,
Status : 1 ,
Hash : upload . Hash ,
Date : time . Now ( ) ,
Filesize : 0 , //?
Description : upload . Description ,
2017-05-09 19:58:35 +02:00
UploaderId : user . Id ,
Uploader : & user ,
2017-05-09 19:37:39 +02:00
}
db . ORM . Create ( & torrent )
2017-05-09 23:21:15 +02:00
if err != nil {
util . SendError ( w , err , 500 )
return
}
2017-05-09 19:37:39 +02:00
fmt . Printf ( "%+v\n" , torrent )
}
2017-05-08 11:18:49 +02:00
}
2017-05-09 19:37:39 +02:00
2017-05-09 19:58:35 +02:00
func ApiUpdateHandler ( w http . ResponseWriter , r * http . Request ) {
2017-05-09 20:54:50 +02:00
if config . UploadsDisabled == 1 {
http . Error ( w , "Error uploads are disabled" , http . StatusInternalServerError )
return
}
contentType := r . Header . Get ( "Content-Type" )
if contentType == "application/json" {
token := r . Header . Get ( "Authorization" )
user := model . User { }
db . ORM . Where ( "api_token = ?" , token ) . First ( & user ) //i don't like this
if user . Id == 0 {
2017-05-09 22:24:32 +02:00
http . Error ( w , apiService . ErrApiKey . Error ( ) , http . StatusForbidden )
2017-05-09 20:54:50 +02:00
return
}
defer r . Body . Close ( )
update := apiService . UpdateRequest { }
d := json . NewDecoder ( r . Body )
if err := d . Decode ( & update ) ; err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
return
}
id := update . Id
torrent := model . Torrents { }
db . ORM . Where ( "torrent_id = ?" , id ) . First ( & torrent )
if torrent . Id == 0 {
2017-05-09 22:24:32 +02:00
http . Error ( w , apiService . ErrTorrentId . Error ( ) , http . StatusBadRequest )
2017-05-09 20:54:50 +02:00
return
}
2017-05-09 22:24:32 +02:00
if torrent . UploaderId != 0 && torrent . UploaderId != user . Id { //&& user.Status != mod
http . Error ( w , apiService . ErrRights . Error ( ) , http . StatusForbidden )
2017-05-09 20:54:50 +02:00
return
}
2017-05-09 22:24:32 +02:00
2017-05-09 20:54:50 +02:00
err , code := update . Update . ValidateUpdate ( )
if err != nil {
http . Error ( w , err . Error ( ) , code )
return
}
update . UpdateTorrent ( & torrent )
2017-05-09 19:58:35 +02:00
2017-05-09 20:54:50 +02:00
db . ORM . Save ( & torrent )
2017-05-09 23:21:15 +02:00
if err != nil {
util . SendError ( w , err , 500 )
return
}
2017-05-09 20:54:50 +02:00
fmt . Printf ( "%+v\n" , torrent )
}
2017-05-09 19:58:35 +02:00
}