2017-05-06 21:21:39 +02:00
package router
2017-05-07 01:20:13 +02:00
import (
2017-05-10 03:15:29 +02:00
"fmt"
2017-05-06 21:21:39 +02:00
"net/http"
2017-05-10 03:15:29 +02:00
"strconv"
2017-05-07 00:10:40 +02:00
2017-05-10 00:04:07 +02:00
"github.com/ewhal/nyaa/model"
2017-05-07 14:53:01 +02:00
"github.com/ewhal/nyaa/service/captcha"
2017-05-07 05:04:55 +02:00
"github.com/ewhal/nyaa/service/user"
2017-05-07 00:10:40 +02:00
"github.com/ewhal/nyaa/service/user/form"
2017-05-09 03:36:48 +02:00
"github.com/ewhal/nyaa/service/user/permission"
2017-05-07 02:32:32 +02:00
"github.com/ewhal/nyaa/util/languages"
2017-05-07 00:10:40 +02:00
"github.com/ewhal/nyaa/util/modelHelper"
"github.com/gorilla/mux"
2017-05-06 21:21:39 +02:00
)
2017-05-07 00:10:40 +02:00
//var viewTemplate = template.Must(template.New("view").Funcs(FuncMap).ParseFiles("templates/index.html", "templates/view.html"))
//var viewTemplate = template.Must(template.New("view").Funcs(FuncMap).ParseFiles("templates/index.html", "templates/view.html"))
2017-05-06 21:21:39 +02:00
// Getting View User Registration
func UserRegisterFormHandler ( w http . ResponseWriter , r * http . Request ) {
2017-05-07 22:00:45 +02:00
_ , errorUser := userService . CurrentUser ( r )
if ( errorUser != nil ) {
b := form . RegistrationForm { }
modelHelper . BindValueForm ( & b , r )
b . CaptchaID = captcha . GetID ( )
2017-05-07 23:05:41 +02:00
languages . SetTranslationFromRequest ( viewRegisterTemplate , r , "en-us" )
2017-05-08 01:46:30 +02:00
htv := UserRegisterTemplateVariables { b , form . NewErrors ( ) , NewSearchForm ( ) , Navigation { } , GetUser ( r ) , r . URL , mux . CurrentRoute ( r ) }
2017-05-07 22:00:45 +02:00
err := viewRegisterTemplate . ExecuteTemplate ( w , "index.html" , htv )
if err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
}
} else {
HomeHandler ( w , r )
2017-05-07 00:10:40 +02:00
}
2017-05-06 21:21:39 +02:00
}
// Getting View User Login
func UserLoginFormHandler ( w http . ResponseWriter , r * http . Request ) {
2017-05-07 04:02:57 +02:00
b := form . LoginForm { }
modelHelper . BindValueForm ( & b , r )
2017-05-08 00:22:57 +02:00
2017-05-07 23:05:41 +02:00
languages . SetTranslationFromRequest ( viewLoginTemplate , r , "en-us" )
2017-05-08 01:46:30 +02:00
htv := UserLoginFormVariables { b , form . NewErrors ( ) , NewSearchForm ( ) , Navigation { } , GetUser ( r ) , r . URL , mux . CurrentRoute ( r ) }
2017-05-08 00:22:57 +02:00
2017-05-07 04:02:57 +02:00
err := viewLoginTemplate . ExecuteTemplate ( w , "index.html" , htv )
if err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
}
2017-05-06 21:21:39 +02:00
}
// Getting User Profile
func UserProfileHandler ( w http . ResponseWriter , r * http . Request ) {
2017-05-09 03:36:48 +02:00
vars := mux . Vars ( r )
id := vars [ "id" ]
userProfile , _ , errorUser := userService . RetrieveUserForAdmin ( id )
2017-05-09 04:23:45 +02:00
if ( errorUser == nil ) {
2017-05-09 03:36:48 +02:00
currentUser := GetUser ( r )
2017-05-09 17:47:06 +02:00
view := r . URL . Query ( ) [ "edit" ]
2017-05-10 03:15:29 +02:00
follow := r . URL . Query ( ) [ "followed" ]
unfollow := r . URL . Query ( ) [ "unfollowed" ]
infosForm := form . NewInfos ( )
2017-05-09 17:47:06 +02:00
deleteVar := r . URL . Query ( ) [ "delete" ]
if ( ( view != nil ) && ( userPermission . CurrentOrAdmin ( currentUser , userProfile . Id ) ) ) {
b := form . UserForm { }
modelHelper . BindValueForm ( & b , r )
languages . SetTranslationFromRequest ( viewProfileEditTemplate , r , "en-us" )
htv := UserProfileEditVariables { & userProfile , b , form . NewErrors ( ) , form . NewInfos ( ) , NewSearchForm ( ) , Navigation { } , currentUser , r . URL , mux . CurrentRoute ( r ) }
err := viewProfileEditTemplate . ExecuteTemplate ( w , "index.html" , htv )
if err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
}
} else if ( ( deleteVar != nil ) && ( userPermission . CurrentOrAdmin ( currentUser , userProfile . Id ) ) ) {
err := form . NewErrors ( )
_ , errUser := userService . DeleteUser ( w , currentUser , id )
if ( errUser != nil ) {
err [ "errors" ] = append ( err [ "errors" ] , errUser . Error ( ) )
}
languages . SetTranslationFromRequest ( viewUserDeleteTemplate , r , "en-us" )
htv := UserVerifyTemplateVariables { err , NewSearchForm ( ) , Navigation { } , GetUser ( r ) , r . URL , mux . CurrentRoute ( r ) }
errorTmpl := viewUserDeleteTemplate . ExecuteTemplate ( w , "index.html" , htv )
if errorTmpl != nil {
http . Error ( w , errorTmpl . Error ( ) , http . StatusInternalServerError )
}
} else {
2017-05-10 03:15:29 +02:00
T := languages . SetTranslationFromRequest ( viewProfileTemplate , r , "en-us" )
if ( follow != nil ) {
infosForm [ "infos" ] = append ( infosForm [ "infos" ] , fmt . Sprintf ( T ( "user_followed_msg" ) , userProfile . Username ) )
}
if ( unfollow != nil ) {
infosForm [ "infos" ] = append ( infosForm [ "infos" ] , fmt . Sprintf ( T ( "user_unfollowed_msg" ) , userProfile . Username ) )
}
htv := UserProfileVariables { & userProfile , infosForm , NewSearchForm ( ) , Navigation { } , currentUser , r . URL , mux . CurrentRoute ( r ) }
2017-05-06 21:21:39 +02:00
2017-05-09 03:36:48 +02:00
err := viewProfileTemplate . ExecuteTemplate ( w , "index.html" , htv )
if err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
}
}
} else {
2017-05-09 04:23:45 +02:00
searchForm := NewSearchForm ( )
searchForm . HideAdvancedSearch = true
languages . SetTranslationFromRequest ( notFoundTemplate , r , "en-us" )
err := notFoundTemplate . ExecuteTemplate ( w , "index.html" , NotFoundTemplateVariables { Navigation { } , searchForm , GetUser ( r ) , r . URL , mux . CurrentRoute ( r ) } )
if err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
}
2017-05-09 03:36:48 +02:00
}
2017-05-06 21:21:39 +02:00
}
2017-05-07 01:20:13 +02:00
// Getting View User Profile Update
2017-05-06 21:21:39 +02:00
func UserProfileFormHandler ( w http . ResponseWriter , r * http . Request ) {
2017-05-09 17:47:06 +02:00
vars := mux . Vars ( r )
id := vars [ "id" ]
currentUser := GetUser ( r )
userProfile , _ , errorUser := userService . RetrieveUserForAdmin ( id )
if ( errorUser == nil ) {
if ( userPermission . CurrentOrAdmin ( currentUser , userProfile . Id ) ) {
b := form . UserForm { }
err := form . NewErrors ( )
infos := form . NewInfos ( )
T := languages . SetTranslationFromRequest ( viewProfileEditTemplate , r , "en-us" )
if len ( r . PostFormValue ( "email" ) ) > 0 {
_ , err = form . EmailValidation ( r . PostFormValue ( "email" ) , err )
}
if len ( r . PostFormValue ( "username" ) ) > 0 {
_ , err = form . ValidateUsername ( r . PostFormValue ( "username" ) , err )
}
if ( len ( err ) == 0 ) {
modelHelper . BindValueForm ( & b , r )
err = modelHelper . ValidateForm ( & b , err )
if ( len ( err ) == 0 ) {
userProfile , _ , errorUser = userService . UpdateUser ( w , & b , currentUser , id )
if ( errorUser != nil ) {
err [ "errors" ] = append ( err [ "errors" ] , errorUser . Error ( ) )
}
if ( len ( err ) == 0 ) {
infos [ "infos" ] = append ( infos [ "infos" ] , T ( "profile_updated" ) )
}
}
}
htv := UserProfileEditVariables { & userProfile , b , err , infos , NewSearchForm ( ) , Navigation { } , currentUser , r . URL , mux . CurrentRoute ( r ) }
errorTmpl := viewProfileEditTemplate . ExecuteTemplate ( w , "index.html" , htv )
if errorTmpl != nil {
http . Error ( w , errorTmpl . Error ( ) , http . StatusInternalServerError )
}
} else {
searchForm := NewSearchForm ( )
searchForm . HideAdvancedSearch = true
2017-05-06 21:21:39 +02:00
2017-05-09 17:47:06 +02:00
languages . SetTranslationFromRequest ( notFoundTemplate , r , "en-us" )
err := notFoundTemplate . ExecuteTemplate ( w , "index.html" , NotFoundTemplateVariables { Navigation { } , searchForm , GetUser ( r ) , r . URL , mux . CurrentRoute ( r ) } )
if err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
}
}
} else {
searchForm := NewSearchForm ( )
searchForm . HideAdvancedSearch = true
languages . SetTranslationFromRequest ( notFoundTemplate , r , "en-us" )
err := notFoundTemplate . ExecuteTemplate ( w , "index.html" , NotFoundTemplateVariables { Navigation { } , searchForm , GetUser ( r ) , r . URL , mux . CurrentRoute ( r ) } )
if err != nil {
http . Error ( w , err . Error ( ) , http . StatusInternalServerError )
}
}
2017-05-06 21:21:39 +02:00
}
2017-05-07 14:53:01 +02:00
// Post Registration controller, we do some check on the form here, the rest on user service
2017-05-06 21:21:39 +02:00
func UserRegisterPostHandler ( w http . ResponseWriter , r * http . Request ) {
2017-05-07 05:04:55 +02:00
// Check same Password
2017-05-07 19:59:38 +02:00
b := form . RegistrationForm { }
err := form . NewErrors ( )
2017-05-07 14:53:01 +02:00
if ! captcha . Authenticate ( captcha . Extract ( r ) ) {
2017-05-07 19:59:38 +02:00
err [ "errors" ] = append ( err [ "errors" ] , "Wrong captcha!" )
}
if ( len ( err ) == 0 ) {
2017-05-08 22:12:57 +02:00
if len ( r . PostFormValue ( "email" ) ) > 0 {
_ , err = form . EmailValidation ( r . PostFormValue ( "email" ) , err )
}
2017-05-07 19:59:38 +02:00
_ , err = form . ValidateUsername ( r . PostFormValue ( "username" ) , err )
if ( len ( err ) == 0 ) {
modelHelper . BindValueForm ( & b , r )
err = modelHelper . ValidateForm ( & b , err )
if ( len ( err ) == 0 ) {
_ , errorUser := userService . CreateUser ( w , r )
2017-05-07 20:47:29 +02:00
if ( errorUser != nil ) {
err [ "errors" ] = append ( err [ "errors" ] , errorUser . Error ( ) )
}
2017-05-07 19:59:38 +02:00
if ( len ( err ) == 0 ) {
2017-05-07 23:05:41 +02:00
languages . SetTranslationFromRequest ( viewRegisterSuccessTemplate , r , "en-us" )
2017-05-10 00:04:07 +02:00
u := model . User {
Email : r . PostFormValue ( "email" ) , // indicate whether user had email set
}
htv := UserRegisterTemplateVariables { b , err , NewSearchForm ( ) , Navigation { } , & u , r . URL , mux . CurrentRoute ( r ) }
2017-05-07 19:59:38 +02:00
errorTmpl := viewRegisterSuccessTemplate . ExecuteTemplate ( w , "index.html" , htv )
if errorTmpl != nil {
http . Error ( w , errorTmpl . Error ( ) , http . StatusInternalServerError )
}
}
}
}
2017-05-07 14:53:01 +02:00
}
2017-05-07 19:59:38 +02:00
if ( len ( err ) > 0 ) {
b . CaptchaID = captcha . GetID ( )
2017-05-07 23:05:41 +02:00
languages . SetTranslationFromRequest ( viewRegisterTemplate , r , "en-us" )
2017-05-08 01:46:30 +02:00
htv := UserRegisterTemplateVariables { b , err , NewSearchForm ( ) , Navigation { } , GetUser ( r ) , r . URL , mux . CurrentRoute ( r ) }
2017-05-07 19:59:38 +02:00
errorTmpl := viewRegisterTemplate . ExecuteTemplate ( w , "index.html" , htv )
if errorTmpl != nil {
http . Error ( w , errorTmpl . Error ( ) , http . StatusInternalServerError )
2017-05-07 05:04:55 +02:00
}
}
2017-05-06 21:21:39 +02:00
}
2017-05-07 22:00:45 +02:00
func UserVerifyEmailHandler ( w http . ResponseWriter , r * http . Request ) {
vars := mux . Vars ( r )
token := vars [ "token" ]
err := form . NewErrors ( )
_ , errEmail := userService . EmailVerification ( token , w )
if ( errEmail != nil ) {
err [ "errors" ] = append ( err [ "errors" ] , errEmail . Error ( ) )
}
2017-05-07 23:05:41 +02:00
languages . SetTranslationFromRequest ( viewVerifySuccessTemplate , r , "en-us" )
2017-05-08 01:46:30 +02:00
htv := UserVerifyTemplateVariables { err , NewSearchForm ( ) , Navigation { } , GetUser ( r ) , r . URL , mux . CurrentRoute ( r ) }
2017-05-07 22:00:45 +02:00
errorTmpl := viewVerifySuccessTemplate . ExecuteTemplate ( w , "index.html" , htv )
if errorTmpl != nil {
http . Error ( w , errorTmpl . Error ( ) , http . StatusInternalServerError )
}
}
2017-05-06 21:21:39 +02:00
// Post Login controller
func UserLoginPostHandler ( w http . ResponseWriter , r * http . Request ) {
2017-05-08 00:21:31 +02:00
b := form . LoginForm { }
modelHelper . BindValueForm ( & b , r )
err := form . NewErrors ( )
err = modelHelper . ValidateForm ( & b , err )
if ( len ( err ) == 0 ) {
_ , errorUser := userService . CreateUserAuthentication ( w , r )
if ( errorUser != nil ) {
err [ "errors" ] = append ( err [ "errors" ] , errorUser . Error ( ) )
2017-05-08 00:32:41 +02:00
languages . SetTranslationFromRequest ( viewLoginTemplate , r , "en-us" )
2017-05-08 01:46:30 +02:00
htv := UserLoginFormVariables { b , err , NewSearchForm ( ) , Navigation { } , GetUser ( r ) , r . URL , mux . CurrentRoute ( r ) }
2017-05-08 00:21:31 +02:00
errorTmpl := viewLoginTemplate . ExecuteTemplate ( w , "index.html" , htv )
if errorTmpl != nil {
http . Error ( w , errorTmpl . Error ( ) , http . StatusInternalServerError )
}
} else {
url , _ := Router . Get ( "home" ) . URL ( )
http . Redirect ( w , r , url . String ( ) , http . StatusSeeOther )
}
}
2017-05-06 21:21:39 +02:00
}
2017-05-09 03:36:48 +02:00
// Logout
func UserLogoutHandler ( w http . ResponseWriter , r * http . Request ) {
_ , _ = userService . ClearCookie ( w )
url , _ := Router . Get ( "home" ) . URL ( )
http . Redirect ( w , r , url . String ( ) , http . StatusSeeOther )
}
2017-05-10 03:15:29 +02:00
func UserFollowHandler ( w http . ResponseWriter , r * http . Request ) {
var followAction string
vars := mux . Vars ( r )
id := vars [ "id" ]
currentUser := GetUser ( r )
user , _ , errorUser := userService . RetrieveUserForAdmin ( id )
if ( errorUser == nil ) {
if ( ! userPermission . IsFollower ( & user , currentUser ) ) {
followAction = "followed"
userService . SetFollow ( & user , currentUser )
} else {
followAction = "unfollowed"
userService . RemoveFollow ( & user , currentUser )
}
}
url , _ := Router . Get ( "user_profile" ) . URL ( "id" , strconv . Itoa ( int ( user . Id ) ) , "username" , user . Username )
http . Redirect ( w , r , url . String ( ) + "?" + followAction , http . StatusSeeOther )
}