2017-05-18 22:55:59 -04:00
package router
import (
2017-05-21 00:02:57 +02:00
"fmt"
2017-05-18 22:55:59 -04:00
"net/http"
"strconv"
"time"
2017-05-21 20:20:40 +02:00
"github.com/NyaaPantsu/nyaa/config"
2017-05-18 22:55:59 -04:00
"github.com/NyaaPantsu/nyaa/db"
"github.com/NyaaPantsu/nyaa/model"
"github.com/NyaaPantsu/nyaa/service/captcha"
2017-05-20 20:53:05 +02:00
"github.com/NyaaPantsu/nyaa/service/notifier"
2017-05-19 19:10:16 -04:00
"github.com/NyaaPantsu/nyaa/service/upload"
2017-05-20 20:53:05 +02:00
"github.com/NyaaPantsu/nyaa/service/user"
2017-05-18 22:55:59 -04:00
"github.com/NyaaPantsu/nyaa/service/user/permission"
"github.com/NyaaPantsu/nyaa/util/languages"
2017-05-20 17:01:13 +02:00
msg "github.com/NyaaPantsu/nyaa/util/messages"
2017-05-18 22:55:59 -04:00
)
func UploadHandler ( w http . ResponseWriter , r * http . Request ) {
2017-05-19 19:10:16 -04:00
user := GetUser ( r )
if ! uploadService . IsUploadEnabled ( * user ) {
http . Error ( w , "Error uploads are disabled" , http . StatusBadRequest )
return
2017-05-18 22:55:59 -04:00
}
if r . Method == "POST" {
UploadPostHandler ( w , r )
}
2017-05-20 17:01:13 +02:00
UploadGetHandler ( w , r )
2017-05-18 22:55:59 -04:00
}
func UploadPostHandler ( w http . ResponseWriter , r * http . Request ) {
var uploadForm UploadForm
defer r . Body . Close ( )
user := GetUser ( r )
2017-05-20 17:01:13 +02:00
messages := msg . GetMessages ( r ) // new util for errors and infos
2017-05-18 22:55:59 -04:00
if userPermission . NeedsCaptcha ( user ) {
userCaptcha := captcha . Extract ( r )
if ! captcha . Authenticate ( userCaptcha ) {
2017-05-20 17:01:13 +02:00
messages . AddError ( "errors" , captcha . ErrInvalidCaptcha . Error ( ) )
2017-05-18 22:55:59 -04:00
}
}
// validation is done in ExtractInfo()
err := uploadForm . ExtractInfo ( r )
if err != nil {
2017-05-20 17:01:13 +02:00
messages . AddError ( "errors" , err . Error ( ) )
2017-05-18 22:55:59 -04:00
}
2017-05-19 19:10:16 -04:00
status := model . TorrentStatusNormal
2017-05-18 22:55:59 -04:00
if uploadForm . Remake { // overrides trusted
2017-05-19 19:10:16 -04:00
status = model . TorrentStatusRemake
} else if user . IsTrusted ( ) {
status = model . TorrentStatusTrusted
2017-05-18 22:55:59 -04:00
}
var sameTorrents int
2017-05-20 16:26:22 +02:00
db . ORM . Model ( & model . Torrent { } ) . Where ( "torrent_hash = ?" , uploadForm . Infohash ) . Count ( & sameTorrents )
2017-05-20 17:01:13 +02:00
if sameTorrents > 0 {
messages . AddError ( "errors" , "Torrent already in database !" )
}
if ! messages . HasErrors ( ) {
2017-05-18 22:55:59 -04:00
// add to db and redirect
torrent := model . Torrent {
Name : uploadForm . Name ,
Category : uploadForm . CategoryID ,
SubCategory : uploadForm . SubCategoryID ,
Status : status ,
Hash : uploadForm . Infohash ,
Date : time . Now ( ) ,
Filesize : uploadForm . Filesize ,
Description : uploadForm . Description ,
2017-05-20 17:02:34 +02:00
WebsiteLink : uploadForm . WebsiteLink ,
2017-05-18 22:55:59 -04:00
UploaderID : user . ID }
2017-05-20 16:26:22 +02:00
db . ORM . Create ( & torrent )
2017-05-18 22:55:59 -04:00
2017-05-21 00:02:57 +02:00
url , err := Router . Get ( "view_torrent" ) . URL ( "id" , strconv . FormatUint ( uint64 ( torrent . ID ) , 10 ) )
2017-05-21 19:38:39 +02:00
if ( user . ID > 0 && config . DefaultUserSettings [ "new_torrent" ] ) { // If we are a member and notifications for new torrents are enabled
2017-05-21 00:02:57 +02:00
userService . GetLikings ( user ) // We populate the liked field for users
if len ( user . Likings ) > 0 { // If we are followed by at least someone
for _ , follower := range user . Likings {
2017-05-21 18:13:28 +02:00
follower . ParseSettings ( ) // We need to call it before checking settings
2017-05-22 00:22:42 +02:00
if follower . Settings . Get ( "new_torrent" ) {
T , _ , _ := languages . TfuncAndLanguageWithFallback ( follower . Language , follower . Language ) // We need to send the notification to every user in their language
2017-05-20 20:53:05 +02:00
2017-05-22 00:22:42 +02:00
notifierService . NotifyUser ( & follower , torrent . Identifier ( ) , fmt . Sprintf ( T ( "new_torrent_uploaded" ) , torrent . Name , user . Username ) , url . String ( ) , follower . Settings . Get ( "new_torrent_email" ) )
2017-05-21 18:13:28 +02:00
}
2017-05-20 20:53:05 +02:00
}
}
}
2017-05-18 22:55:59 -04:00
// add filelist to files db, if we have one
if len ( uploadForm . FileList ) > 0 {
for _ , uploadedFile := range uploadForm . FileList {
file := model . File { TorrentID : torrent . ID , Filesize : uploadedFile . Filesize }
err := file . SetPath ( uploadedFile . Path )
if err != nil {
2017-05-20 17:01:13 +02:00
messages . AddError ( "errors" , err . Error ( ) )
2017-05-18 22:55:59 -04:00
}
db . ORM . Create ( & file )
}
}
if err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
return
}
2017-05-20 17:01:13 +02:00
http . Redirect ( w , r , url . String ( ) + "?success" , 302 )
2017-05-18 22:55:59 -04:00
}
}
func UploadGetHandler ( w http . ResponseWriter , r * http . Request ) {
2017-05-20 17:01:13 +02:00
messages := msg . GetMessages ( r ) // new util for errors and infos
2017-05-18 22:55:59 -04:00
var uploadForm UploadForm
2017-05-20 17:13:43 +02:00
_ = uploadForm . ExtractInfo ( r )
2017-05-18 22:55:59 -04:00
user := GetUser ( r )
if userPermission . NeedsCaptcha ( user ) {
uploadForm . CaptchaID = captcha . GetID ( )
} else {
uploadForm . CaptchaID = ""
}
utv := UploadTemplateVariables {
2017-05-21 04:10:19 -03:00
CommonTemplateVariables : NewCommonVariables ( r ) ,
2017-05-18 22:55:59 -04:00
Upload : uploadForm ,
2017-05-20 17:01:13 +02:00
FormErrors : messages . GetAllErrors ( ) ,
2017-05-18 22:55:59 -04:00
}
err := uploadTemplate . ExecuteTemplate ( w , "index.html" , utv )
if err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
return
}
}