2017-05-10 04:03:25 +02:00
// hurry mod panel to get it faaaaaaaaaaaast
package router
import (
2017-05-10 21:29:59 +02:00
"fmt"
2017-05-10 19:17:07 +02:00
"html"
2017-05-10 04:03:25 +02:00
"html/template"
2017-05-10 05:54:12 +02:00
"net/http"
2017-05-10 05:24:18 +02:00
"path/filepath"
2017-05-10 05:54:12 +02:00
"strconv"
2017-05-10 23:53:25 +02:00
"time"
2017-05-10 04:03:25 +02:00
2017-05-10 23:53:25 +02:00
"github.com/ewhal/nyaa/config"
"github.com/ewhal/nyaa/db"
2017-05-10 20:42:20 +02:00
"github.com/ewhal/nyaa/model"
2017-05-10 21:29:59 +02:00
"github.com/ewhal/nyaa/service"
2017-05-10 05:24:18 +02:00
"github.com/ewhal/nyaa/service/comment"
2017-05-10 20:42:20 +02:00
"github.com/ewhal/nyaa/service/report"
2017-05-10 05:24:18 +02:00
"github.com/ewhal/nyaa/service/torrent"
2017-05-10 05:54:12 +02:00
"github.com/ewhal/nyaa/service/user"
form "github.com/ewhal/nyaa/service/user/form"
"github.com/ewhal/nyaa/service/user/permission"
2017-05-10 05:24:18 +02:00
"github.com/ewhal/nyaa/util/languages"
2017-05-10 19:17:07 +02:00
"github.com/ewhal/nyaa/util/log"
"github.com/ewhal/nyaa/util/search"
2017-05-10 16:43:50 +02:00
"github.com/gorilla/mux"
2017-05-10 04:03:25 +02:00
)
2017-05-10 20:42:20 +02:00
var panelIndex , panelTorrentList , panelUserList , panelCommentList , panelTorrentEd , panelTorrentReportList * template . Template
2017-05-10 05:54:12 +02:00
2017-05-10 04:03:25 +02:00
func init ( ) {
2017-05-10 05:24:18 +02:00
panelTorrentList = template . Must ( template . New ( "torrentlist" ) . Funcs ( FuncMap ) . ParseFiles ( filepath . Join ( TemplateDir , "admin_index.html" ) , filepath . Join ( TemplateDir , "admin/torrentlist.html" ) ) )
2017-05-10 17:37:49 +02:00
panelTorrentList = template . Must ( panelTorrentList . ParseGlob ( filepath . Join ( "templates" , "_*.html" ) ) )
2017-05-10 05:24:18 +02:00
panelUserList = template . Must ( template . New ( "userlist" ) . Funcs ( FuncMap ) . ParseFiles ( filepath . Join ( TemplateDir , "admin_index.html" ) , filepath . Join ( TemplateDir , "admin/userlist.html" ) ) )
2017-05-10 19:17:07 +02:00
panelUserList = template . Must ( panelUserList . ParseGlob ( filepath . Join ( "templates" , "_*.html" ) ) )
2017-05-10 04:03:25 +02:00
panelCommentList = template . Must ( template . New ( "commentlist" ) . Funcs ( FuncMap ) . ParseFiles ( filepath . Join ( TemplateDir , "admin_index.html" ) , filepath . Join ( TemplateDir , "admin/commentlist.html" ) ) )
2017-05-10 19:17:07 +02:00
panelCommentList = template . Must ( panelCommentList . ParseGlob ( filepath . Join ( "templates" , "_*.html" ) ) )
2017-05-10 05:24:18 +02:00
panelIndex = template . Must ( template . New ( "indexPanel" ) . Funcs ( FuncMap ) . ParseFiles ( filepath . Join ( TemplateDir , "admin_index.html" ) , filepath . Join ( TemplateDir , "admin/panelindex.html" ) ) )
2017-05-10 19:17:07 +02:00
panelIndex = template . Must ( panelIndex . ParseGlob ( filepath . Join ( "templates" , "_*.html" ) ) )
2017-05-10 17:37:49 +02:00
panelTorrentEd = template . Must ( template . New ( "torrent_ed" ) . Funcs ( FuncMap ) . ParseFiles ( filepath . Join ( TemplateDir , "admin_index.html" ) , filepath . Join ( TemplateDir , "admin/paneltorrentedit.html" ) ) )
2017-05-10 19:17:07 +02:00
panelTorrentEd = template . Must ( panelTorrentEd . ParseGlob ( filepath . Join ( "templates" , "_*.html" ) ) )
2017-05-10 20:42:20 +02:00
panelTorrentReportList = template . Must ( template . New ( "torrent_report" ) . Funcs ( FuncMap ) . ParseFiles ( filepath . Join ( TemplateDir , "admin_index.html" ) , filepath . Join ( TemplateDir , "admin/torrent_report.html" ) ) )
panelTorrentReportList = template . Must ( panelTorrentReportList . ParseGlob ( filepath . Join ( "templates" , "_*.html" ) ) )
2017-05-10 04:03:25 +02:00
}
2017-05-10 05:24:18 +02:00
func IndexModPanel ( w http . ResponseWriter , r * http . Request ) {
currentUser := GetUser ( r )
2017-05-10 05:54:12 +02:00
if userPermission . HasAdmin ( currentUser ) {
offset := 10
2017-05-10 05:24:18 +02:00
2017-05-10 16:43:50 +02:00
torrents , _ , _ := torrentService . GetAllTorrents ( offset , 0 )
users , _ := userService . RetrieveUsersForAdmin ( offset , 0 )
comments , _ := commentService . GetAllComments ( offset , 0 , "" , "" )
2017-05-10 20:42:20 +02:00
torrentReports , _ , _ := reportService . GetAllTorrentReports ( offset , 0 )
2017-05-10 05:54:12 +02:00
languages . SetTranslationFromRequest ( panelIndex , r , "en-us" )
2017-05-10 19:17:07 +02:00
htv := PanelIndexVbs { torrents , torrentReports , users , comments , NewSearchForm ( ) , currentUser , r . URL }
2017-05-10 05:54:12 +02:00
_ = panelIndex . ExecuteTemplate ( w , "admin_index.html" , htv )
2017-05-10 08:18:58 +02:00
} else {
http . Error ( w , "admins only" , http . StatusForbidden )
2017-05-10 05:54:12 +02:00
}
2017-05-10 05:24:18 +02:00
}
2017-05-10 20:42:20 +02:00
2017-05-10 05:24:18 +02:00
func TorrentsListPanel ( w http . ResponseWriter , r * http . Request ) {
currentUser := GetUser ( r )
2017-05-10 05:54:12 +02:00
if userPermission . HasAdmin ( currentUser ) {
2017-05-10 16:43:50 +02:00
vars := mux . Vars ( r )
2017-05-10 19:17:07 +02:00
page := vars [ "page" ]
var err error
pagenum := 1
if page != "" {
pagenum , err = strconv . Atoi ( html . EscapeString ( page ) )
if ! log . CheckError ( err ) {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
return
}
}
2017-05-10 05:54:12 +02:00
offset := 100
2017-05-10 05:24:18 +02:00
2017-05-10 19:17:07 +02:00
searchParam , torrents , _ , err := search . SearchByQuery ( r , pagenum )
2017-05-10 17:37:49 +02:00
searchForm := SearchForm {
SearchParam : searchParam ,
Category : searchParam . Category . String ( ) ,
HideAdvancedSearch : false ,
}
2017-05-10 05:54:12 +02:00
languages . SetTranslationFromRequest ( panelTorrentList , r , "en-us" )
2017-05-10 19:17:07 +02:00
htv := PanelTorrentListVbs { torrents , searchForm , Navigation { int ( searchParam . Max ) , offset , pagenum , "mod_tlist_page" } , currentUser , r . URL }
2017-05-10 17:37:49 +02:00
err = panelTorrentList . ExecuteTemplate ( w , "admin_index.html" , htv )
2017-05-10 21:09:37 +02:00
log . CheckError ( err )
2017-05-10 08:18:58 +02:00
} else {
http . Error ( w , "admins only" , http . StatusForbidden )
2017-05-10 05:54:12 +02:00
}
2017-05-10 05:24:18 +02:00
}
2017-05-10 20:42:20 +02:00
func TorrentReportListPanel ( w http . ResponseWriter , r * http . Request ) {
currentUser := GetUser ( r )
if userPermission . HasAdmin ( currentUser ) {
vars := mux . Vars ( r )
page := vars [ "page" ]
var err error
pagenum := 1
if page != "" {
pagenum , err = strconv . Atoi ( html . EscapeString ( page ) )
if ! log . CheckError ( err ) {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
return
}
}
offset := 100
torrentReports , nbReports , _ := reportService . GetAllTorrentReports ( offset , ( pagenum - 1 ) * offset )
reportJSON := model . TorrentReportsToJSON ( torrentReports )
2017-05-10 21:09:37 +02:00
languages . SetTranslationFromRequest ( panelTorrentReportList , r , "en-us" )
2017-05-10 20:42:20 +02:00
htv := PanelTorrentReportListVbs { reportJSON , NewSearchForm ( ) , Navigation { nbReports , offset , pagenum , "mod_trlist_page" } , currentUser , r . URL }
err = panelTorrentReportList . ExecuteTemplate ( w , "admin_index.html" , htv )
2017-05-10 21:09:37 +02:00
log . CheckError ( err )
2017-05-10 20:42:20 +02:00
} else {
http . Error ( w , "admins only" , http . StatusForbidden )
}
}
2017-05-10 05:24:18 +02:00
func UsersListPanel ( w http . ResponseWriter , r * http . Request ) {
currentUser := GetUser ( r )
2017-05-10 05:54:12 +02:00
if userPermission . HasAdmin ( currentUser ) {
2017-05-10 16:43:50 +02:00
vars := mux . Vars ( r )
2017-05-10 19:17:07 +02:00
page := vars [ "page" ]
var err error
pagenum := 1
if page != "" {
pagenum , err = strconv . Atoi ( html . EscapeString ( page ) )
if ! log . CheckError ( err ) {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
return
}
}
2017-05-10 05:54:12 +02:00
offset := 100
2017-05-10 05:24:18 +02:00
2017-05-10 19:17:07 +02:00
users , nbUsers := userService . RetrieveUsersForAdmin ( offset , ( pagenum - 1 ) * offset )
2017-05-10 05:54:12 +02:00
languages . SetTranslationFromRequest ( panelUserList , r , "en-us" )
2017-05-10 19:17:07 +02:00
htv := PanelUserListVbs { users , NewSearchForm ( ) , Navigation { nbUsers , offset , pagenum , "mod_ulist_page" } , currentUser , r . URL }
err = panelUserList . ExecuteTemplate ( w , "admin_index.html" , htv )
2017-05-10 21:09:37 +02:00
log . CheckError ( err )
2017-05-10 08:18:58 +02:00
} else {
http . Error ( w , "admins only" , http . StatusForbidden )
2017-05-10 05:54:12 +02:00
}
2017-05-10 05:24:18 +02:00
}
2017-05-10 20:42:20 +02:00
2017-05-10 04:03:25 +02:00
func CommentsListPanel ( w http . ResponseWriter , r * http . Request ) {
2017-05-10 05:24:18 +02:00
currentUser := GetUser ( r )
2017-05-10 05:54:12 +02:00
if userPermission . HasAdmin ( currentUser ) {
2017-05-10 16:43:50 +02:00
vars := mux . Vars ( r )
2017-05-10 19:17:07 +02:00
page := vars [ "page" ]
var err error
pagenum := 1
if page != "" {
pagenum , err = strconv . Atoi ( html . EscapeString ( page ) )
if ! log . CheckError ( err ) {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
return
}
}
2017-05-10 05:54:12 +02:00
offset := 100
2017-05-10 15:08:38 +02:00
userid := r . URL . Query ( ) . Get ( "userid" )
var conditions string
var values [ ] interface { }
2017-05-10 19:17:07 +02:00
if userid != "" {
2017-05-10 15:08:38 +02:00
conditions = "user_id = ?"
values = append ( values , userid )
}
2017-05-10 19:17:07 +02:00
comments , nbComments := commentService . GetAllComments ( offset , ( pagenum - 1 ) * offset , conditions , values ... )
2017-05-10 05:54:12 +02:00
languages . SetTranslationFromRequest ( panelCommentList , r , "en-us" )
2017-05-10 19:17:07 +02:00
htv := PanelCommentListVbs { comments , NewSearchForm ( ) , Navigation { nbComments , offset , pagenum , "mod_clist_page" } , currentUser , r . URL }
err = panelCommentList . ExecuteTemplate ( w , "admin_index.html" , htv )
2017-05-10 21:09:37 +02:00
log . CheckError ( err )
2017-05-10 08:18:58 +02:00
} else {
http . Error ( w , "admins only" , http . StatusForbidden )
2017-05-10 05:54:12 +02:00
}
2017-05-10 04:03:25 +02:00
}
func TorrentEditModPanel ( w http . ResponseWriter , r * http . Request ) {
2017-05-10 05:24:18 +02:00
currentUser := GetUser ( r )
2017-05-10 05:54:12 +02:00
if userPermission . HasAdmin ( currentUser ) {
id := r . URL . Query ( ) . Get ( "id" )
torrent , _ := torrentService . GetTorrentById ( id )
languages . SetTranslationFromRequest ( panelTorrentEd , r , "en-us" )
2017-05-10 23:53:25 +02:00
torrentJson := torrent . ToJSON ( )
uploadForm := NewUploadForm ( )
uploadForm . Name = torrentJson . Name
uploadForm . Category = torrentJson . Category + "_" + torrentJson . SubCategory
uploadForm . Magnet = string ( torrentJson . Magnet )
uploadForm . Status = torrentJson . Status
uploadForm . Description = string ( torrentJson . Description )
2017-05-11 00:02:36 +02:00
htv := PanelTorrentEdVbs { uploadForm , NewSearchForm ( ) , currentUser , form . NewErrors ( ) , form . NewInfos ( ) , r . URL }
2017-05-10 07:56:02 +02:00
err := panelTorrentEd . ExecuteTemplate ( w , "admin_index.html" , htv )
2017-05-10 21:09:37 +02:00
log . CheckError ( err )
2017-05-10 23:53:25 +02:00
2017-05-10 08:18:58 +02:00
} else {
http . Error ( w , "admins only" , http . StatusForbidden )
2017-05-10 05:54:12 +02:00
}
2017-05-10 05:24:18 +02:00
}
func TorrentPostEditModPanel ( w http . ResponseWriter , r * http . Request ) {
currentUser := GetUser ( r )
2017-05-10 05:54:12 +02:00
if userPermission . HasAdmin ( currentUser ) {
2017-05-10 23:53:25 +02:00
if config . UploadsDisabled {
http . Error ( w , "Error uploads are disabled" , http . StatusInternalServerError )
return
}
var uploadForm UploadForm
id := r . URL . Query ( ) . Get ( "id" )
err := form . NewErrors ( )
infos := form . NewInfos ( )
torrent , _ := torrentService . GetTorrentById ( id )
if ( torrent . ID > 0 ) {
// validation is done in ExtractInfo()
errUp := uploadForm . ExtractInfo ( r )
if errUp != nil {
err [ "errors" ] = append ( err [ "errors" ] , "Failed to upload!" )
2017-05-10 05:54:12 +02:00
}
2017-05-10 23:53:25 +02:00
if ( len ( err ) > 0 ) {
//add to db and redirect depending on result
torrent . Name = uploadForm . Name
torrent . Category = uploadForm . CategoryID
torrent . SubCategory = uploadForm . SubCategoryID
torrent . Status = uploadForm . Status
torrent . Hash = uploadForm . Infohash
torrent . Date = time . Now ( )
torrent . Filesize = uploadForm . Filesize
torrent . Description = uploadForm . Description
db . ORM . Save ( & torrent )
infos [ "infos" ] = append ( infos [ "infos" ] , "Torrent details updated!" )
}
}
2017-05-10 05:54:12 +02:00
languages . SetTranslationFromRequest ( panelTorrentEd , r , "en-us" )
2017-05-11 00:02:36 +02:00
htv := PanelTorrentEdVbs { uploadForm , NewSearchForm ( ) , currentUser , err , infos , r . URL }
2017-05-10 05:54:12 +02:00
_ = panelTorrentEd . ExecuteTemplate ( w , "admin_index.html" , htv )
2017-05-10 08:18:58 +02:00
} else {
http . Error ( w , "admins only" , http . StatusForbidden )
2017-05-10 05:24:18 +02:00
}
2017-05-10 23:53:25 +02:00
2017-05-10 05:24:18 +02:00
}
2017-05-10 04:03:25 +02:00
func CommentDeleteModPanel ( w http . ResponseWriter , r * http . Request ) {
currentUser := GetUser ( r )
2017-05-10 05:24:18 +02:00
id := r . URL . Query ( ) . Get ( "id" )
2017-05-10 05:54:12 +02:00
if userPermission . HasAdmin ( currentUser ) {
_ = form . NewErrors ( )
2017-05-10 05:24:18 +02:00
_ , _ = userService . DeleteComment ( id )
2017-05-10 09:10:23 +02:00
url , _ := Router . Get ( "mod_clist" ) . URL ( )
2017-05-10 04:03:25 +02:00
http . Redirect ( w , r , url . String ( ) + "?deleted" , http . StatusSeeOther )
2017-05-10 08:18:58 +02:00
} else {
http . Error ( w , "admins only" , http . StatusForbidden )
2017-05-10 04:03:25 +02:00
}
}
2017-05-10 22:05:56 +02:00
2017-05-10 04:03:25 +02:00
func TorrentDeleteModPanel ( w http . ResponseWriter , r * http . Request ) {
currentUser := GetUser ( r )
2017-05-10 05:24:18 +02:00
id := r . URL . Query ( ) . Get ( "id" )
2017-05-10 05:54:12 +02:00
if userPermission . HasAdmin ( currentUser ) {
_ = form . NewErrors ( )
2017-05-10 05:24:18 +02:00
_ , _ = torrentService . DeleteTorrent ( id )
2017-05-10 21:29:59 +02:00
//delete reports of torrent
whereParams := serviceBase . CreateWhereParams ( "torrent_id = ?" , id )
reports , _ , _ := reportService . GetTorrentReportsOrderBy ( & whereParams , "" , 0 , 0 )
for _ , report := range reports {
reportService . DeleteTorrentReport ( report . ID )
}
2017-05-10 09:10:23 +02:00
url , _ := Router . Get ( "mod_tlist" ) . URL ( )
2017-05-10 04:03:25 +02:00
http . Redirect ( w , r , url . String ( ) + "?deleted" , http . StatusSeeOther )
2017-05-10 08:18:58 +02:00
} else {
http . Error ( w , "admins only" , http . StatusForbidden )
2017-05-10 04:03:25 +02:00
}
2017-05-10 19:17:07 +02:00
}
2017-05-10 22:05:56 +02:00
func TorrentReportDeleteModPanel ( w http . ResponseWriter , r * http . Request ) {
currentUser := GetUser ( r )
if userPermission . HasAdmin ( currentUser ) {
id := r . URL . Query ( ) . Get ( "id" )
fmt . Println ( id )
idNum , _ := strconv . ParseUint ( id , 10 , 64 )
_ = form . NewErrors ( )
_ , _ = reportService . DeleteTorrentReport ( uint ( idNum ) )
url , _ := Router . Get ( "mod_trlist" ) . URL ( )
http . Redirect ( w , r , url . String ( ) + "?deleted" , http . StatusSeeOther )
} else {
http . Error ( w , "admins only" , http . StatusForbidden )
}
}