2017-06-28 13:42:38 +02:00
package controllers
import (
"fmt"
"net/http"
"strconv"
"time"
2017-06-29 13:15:23 +02:00
"github.com/NyaaPantsu/nyaa/models"
"github.com/NyaaPantsu/nyaa/models/notifications"
2017-07-02 16:54:55 +02:00
"github.com/NyaaPantsu/nyaa/utils/captcha"
"github.com/NyaaPantsu/nyaa/utils/cookies"
"github.com/NyaaPantsu/nyaa/utils/crypto"
msg "github.com/NyaaPantsu/nyaa/utils/messages"
"github.com/NyaaPantsu/nyaa/utils/publicSettings"
"github.com/NyaaPantsu/nyaa/utils/search"
2017-06-28 13:42:38 +02:00
"github.com/gin-gonic/gin"
)
// UserRegisterFormHandler : Getting View User Registration
func UserRegisterFormHandler ( c * gin . Context ) {
_ , errorUser := userService . CurrentUser ( c )
// User is already connected, redirect to home
if errorUser == nil {
SearchHandler ( c )
return
}
registrationForm := form . RegistrationForm { }
c . Bind ( & registrationForm )
registrationForm . CaptchaID = captcha . GetID ( )
formTemplate ( c , "site/user/register.jet.html" , registrationForm )
}
// UserLoginFormHandler : Getting View User Login
func UserLoginFormHandler ( c * gin . Context ) {
_ , errorUser := userService . CurrentUser ( c )
// User is already connected, redirect to home
if errorUser == nil {
SearchHandler ( c )
return
}
loginForm := form . LoginForm { }
formTemplate ( c , "site/user/login.jet.html" , loginForm )
}
// UserProfileHandler : Getting User Profile
func UserProfileHandler ( c * gin . Context ) {
id := c . Param ( "id" )
fmt . Printf ( "User ID: %s" , id )
Ts , _ := publicSettings . GetTfuncAndLanguageFromRequest ( c )
messages := msg . GetMessages ( c )
userProfile , _ , errorUser := userService . RetrieveUserForAdmin ( id )
if errorUser == nil {
currentUser := getUser ( c )
follow := c . Request . URL . Query ( ) [ "followed" ]
unfollow := c . Request . URL . Query ( ) [ "unfollowed" ]
deleteVar := c . Request . URL . Query ( ) [ "delete" ]
if ( deleteVar != nil ) && ( userPermission . CurrentOrAdmin ( currentUser , userProfile . ID ) ) {
_ = userService . DeleteUser ( c , currentUser , id )
staticTemplate ( c , "site/delete_success.jet.html" )
} else {
if follow != nil {
messages . AddInfof ( "infos" , Ts ( "user_followed_msg" ) , userProfile . Username )
}
if unfollow != nil {
messages . AddInfof ( "infos" , Ts ( "user_unfollowed_msg" ) , userProfile . Username )
}
userProfile . ParseSettings ( )
query := c . Request . URL . Query ( )
query . Set ( "userID" , id )
query . Set ( "max" , "16" )
c . Request . URL . RawQuery = query . Encode ( )
2017-07-01 23:09:35 +02:00
var torrents [ ] models . Torrent
2017-06-28 13:42:38 +02:00
var err error
if userPermission . CurrentOrAdmin ( currentUser , userProfile . ID ) {
_ , torrents , _ , err = search . SearchByQuery ( c , 1 )
} else {
_ , torrents , _ , err = search . SearchByQueryNoHidden ( c , 1 )
}
if err != nil {
messages . AddErrorT ( "errors" , "retrieve_torrents_error" )
}
userProfile . Torrents = torrents
userProfileTemplate ( c , & userProfile )
}
} else {
NotFoundHandler ( c )
}
}
// UserDetailsHandler : Getting User Profile Details View
func UserDetailsHandler ( c * gin . Context ) {
id := c . Param ( "id" )
currentUser := getUser ( c )
userProfile , _ , errorUser := userService . RetrieveUserForAdmin ( id )
if errorUser == nil && userPermission . CurrentOrAdmin ( currentUser , userProfile . ID ) {
if userPermission . CurrentOrAdmin ( currentUser , userProfile . ID ) {
b := form . UserForm { }
c . Bind ( & b )
availableLanguages := publicSettings . GetAvailableLanguages ( )
userProfile . ParseSettings ( )
userProfileEditTemplate ( c , & userProfile , b , availableLanguages )
}
} else {
NotFoundHandler ( c )
}
}
// UserProfileFormHandler : Getting View User Profile Update
func UserProfileFormHandler ( c * gin . Context ) {
id := c . Param ( "id" )
currentUser := getUser ( c )
userProfile , _ , errorUser := userService . RetrieveUserForAdmin ( id )
if errorUser != nil || ! userPermission . CurrentOrAdmin ( currentUser , userProfile . ID ) || userProfile . ID == 0 {
NotFoundHandler ( c )
return
}
userProfile . ParseSettings ( )
messages := msg . GetMessages ( c )
userForm := form . UserForm { }
userSettingsForm := form . UserSettingsForm { }
if len ( c . PostForm ( "email" ) ) > 0 {
form . EmailValidation ( c . PostForm ( "email" ) , messages )
}
if len ( c . PostForm ( "username" ) ) > 0 {
form . ValidateUsername ( c . PostForm ( "username" ) , messages )
}
if ! messages . HasErrors ( ) {
c . Bind ( & userForm )
c . Bind ( & userSettingsForm )
if ! userPermission . HasAdmin ( currentUser ) {
userForm . Username = userProfile . Username
userForm . Status = userProfile . Status
} else {
if userProfile . Status != userForm . Status && userForm . Status == 2 {
messages . AddErrorT ( "errors" , "elevating_user_error" )
}
}
modelHelper . ValidateForm ( & userForm , messages )
if ! messages . HasErrors ( ) {
if userForm . Email != userProfile . Email {
userService . SendVerificationToUser ( * currentUser , userForm . Email )
messages . AddInfoTf ( "infos" , "email_changed" , userForm . Email )
userForm . Email = userProfile . Email // reset, it will be set when user clicks verification
}
userProfile , _ = userService . UpdateUser ( c , & userForm , & userSettingsForm , currentUser , id )
if ! messages . HasErrors ( ) {
messages . AddInfoT ( "infos" , "profile_updated" )
}
}
}
availableLanguages := publicSettings . GetAvailableLanguages ( )
userProfileEditTemplate ( c , & userProfile , userForm , availableLanguages )
}
// UserRegisterPostHandler : Post Registration controller, we do some check on the form here, the rest on user service
func UserRegisterPostHandler ( c * gin . Context ) {
b := form . RegistrationForm { }
messages := msg . GetMessages ( c )
if ! captcha . Authenticate ( captcha . Extract ( c ) ) {
messages . AddErrorT ( "errors" , "bad_captcha" )
}
if ! messages . HasErrors ( ) {
if len ( c . PostForm ( "email" ) ) > 0 {
form . EmailValidation ( c . PostForm ( "email" ) , messages )
}
form . ValidateUsername ( c . PostForm ( "username" ) , messages )
if ! messages . HasErrors ( ) {
c . Bind ( & b )
modelHelper . ValidateForm ( & b , messages )
if ! messages . HasErrors ( ) {
_ = userService . CreateUser ( c )
if ! messages . HasErrors ( ) {
staticTemplate ( c , "site/static/signup_success.jet.html" )
}
}
}
}
if messages . HasErrors ( ) {
UserRegisterFormHandler ( c )
}
}
// UserVerifyEmailHandler : Controller when verifying email, needs a token
func UserVerifyEmailHandler ( c * gin . Context ) {
token := c . Param ( "token" )
messages := msg . GetMessages ( c )
_ , errEmail := userService . EmailVerification ( token , c )
if errEmail != nil {
messages . ImportFromError ( "errors" , errEmail )
}
staticTemplate ( c , "site/static/verify_success.jet.html" )
}
// UserLoginPostHandler : Post Login controller
func UserLoginPostHandler ( c * gin . Context ) {
b := form . LoginForm { }
c . Bind ( & b )
messages := msg . GetMessages ( c )
modelHelper . ValidateForm ( & b , messages )
if ! messages . HasErrors ( ) {
_ , errorUser := userService . CreateUserAuthentication ( c )
if errorUser == nil {
c . Redirect ( http . StatusSeeOther , "/" )
return
}
messages . ErrorT ( errorUser )
}
UserLoginFormHandler ( c )
}
// UserLogoutHandler : Controller to logout users
func UserLogoutHandler ( c * gin . Context ) {
logout := c . PostForm ( "logout" )
if logout != "" {
userService . ClearCookie ( c )
url := c . DefaultPostForm ( "redirectTo" , "/" )
c . Redirect ( http . StatusSeeOther , url )
} else {
NotFoundHandler ( c )
}
}
// UserFollowHandler : Controller to follow/unfollow users, need user id to follow
func UserFollowHandler ( c * gin . Context ) {
var followAction string
id := c . Param ( "id" )
currentUser := getUser ( c )
user , _ , errorUser := userService . RetrieveUserForAdmin ( id )
if errorUser == nil && user . ID > 0 {
if ! userPermission . IsFollower ( & user , currentUser ) {
followAction = "followed"
userService . SetFollow ( & user , currentUser )
} else {
followAction = "unfollowed"
userService . RemoveFollow ( & user , currentUser )
}
}
url := "/user/" + strconv . Itoa ( int ( user . ID ) ) + "/" + user . Username + "?" + followAction
c . Redirect ( http . StatusSeeOther , url )
}
// UserNotificationsHandler : Controller to show user notifications
func UserNotificationsHandler ( c * gin . Context ) {
currentUser := getUser ( c )
if currentUser . ID > 0 {
messages := msg . GetMessages ( c )
if c . Request . URL . Query ( ) [ "clear" ] != nil {
notifierService . DeleteAllNotifications ( currentUser . ID )
messages . AddInfoT ( "infos" , "notifications_cleared" )
2017-07-01 23:09:35 +02:00
currentUser . Notifications = [ ] models . Notification { }
2017-06-28 13:42:38 +02:00
}
userProfileNotificationsTemplate ( c , currentUser )
} else {
NotFoundHandler ( c )
}
}
// UserAPIKeyResetHandler : Controller to reset user api key
func UserAPIKeyResetHandler ( c * gin . Context ) {
id := c . Param ( "id" )
currentUser := getUser ( c )
messages := msg . GetMessages ( c )
userProfile , _ , errorUser := userService . RetrieveUserForAdmin ( id )
if errorUser != nil || ! userPermission . CurrentOrAdmin ( currentUser , userProfile . ID ) || userProfile . ID == 0 {
NotFoundHandler ( c )
return
}
userProfile . APIToken , _ = crypto . GenerateRandomToken32 ( )
userProfile . APITokenExpiry = time . Unix ( 0 , 0 )
_ , errorUser = userService . UpdateRawUser ( & userProfile )
if errorUser != nil {
messages . Error ( errorUser )
} else {
messages . AddInfoT ( "infos" , "profile_updated" )
}
UserProfileHandler ( c )
}