95 lignes
2,4 Kio
Go
95 lignes
2,4 Kio
Go
package apiService
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
"net/url"
|
|
"reflect"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/ewhal/nyaa/service/torrent"
|
|
)
|
|
|
|
type torrentsQuery struct {
|
|
Category int `json:"category"`
|
|
SubCategory int `json:"sub_category"`
|
|
Status int `json:"status"`
|
|
Uploader int `json:"uploader"`
|
|
Downloads int `json:"downloads"`
|
|
}
|
|
|
|
type TorrentsRequest struct {
|
|
Query torrentsQuery `json:"search"`
|
|
Page int `json:"page"`
|
|
MaxPerPage int `json:"limit"`
|
|
}
|
|
|
|
//accept torrent files?
|
|
type UploadRequest struct {
|
|
Name string `json:"name"`
|
|
Hash string `json:"hash"`
|
|
Magnet string `json:"magnet"`
|
|
Category int `json:"category"`
|
|
SubCategory int `json:"sub_category"`
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
func (r *TorrentsRequest) ToParams() torrentService.WhereParams {
|
|
res := torrentService.WhereParams{}
|
|
conditions := ""
|
|
v := reflect.ValueOf(r.Query)
|
|
|
|
for i := 0; i < v.NumField(); i++ {
|
|
field := v.Field(i)
|
|
if field.Interface() != reflect.Zero(field.Type()).Interface() {
|
|
if i != 0 {
|
|
conditions += " AND "
|
|
}
|
|
conditions += v.Type().Field(i).Tag.Get("json") + " = ?"
|
|
res.Params = append(res.Params, field.Interface())
|
|
}
|
|
}
|
|
res.Conditions = conditions
|
|
return res
|
|
}
|
|
|
|
var ErrShortName = errors.New("file name should be at least 100 characters long")
|
|
var ErrCategory = errors.New("this category doesn't exist")
|
|
var ErrSubCategory = errors.New("this sub category doesn't exist")
|
|
var ErrMagnet = errors.New("incorrect magnet")
|
|
var ErrHash = errors.New("incorrect hash")
|
|
|
|
func (r *UploadRequest) Validate() (error, int) {
|
|
if len(r.Name) < 100 {
|
|
return ErrShortName, http.StatusNotAcceptable
|
|
}
|
|
if r.Category == 0 {
|
|
return ErrCategory, http.StatusNotAcceptable
|
|
}
|
|
if r.SubCategory == 0 {
|
|
return ErrSubCategory, http.StatusNotAcceptable
|
|
}
|
|
|
|
if r.Hash == "" {
|
|
magnetUrl, err := url.Parse(string(r.Magnet)) //?
|
|
if err != nil {
|
|
return err, http.StatusInternalServerError
|
|
}
|
|
exactTopic := magnetUrl.Query().Get("xt")
|
|
if !strings.HasPrefix(exactTopic, "urn:btih:") {
|
|
return ErrMagnet, http.StatusNotAcceptable
|
|
}
|
|
r.Hash = strings.ToUpper(strings.TrimPrefix(exactTopic, "urn:btih:"))
|
|
}
|
|
|
|
matched, err := regexp.MatchString("^[0-9A-F]{40}$", r.Hash)
|
|
if err != nil {
|
|
return err, http.StatusInternalServerError
|
|
}
|
|
if !matched {
|
|
return ErrHash, http.StatusNotAcceptable
|
|
}
|
|
|
|
return nil, http.StatusOK
|
|
}
|