138 lines
4.2 KiB
Go
138 lines
4.2 KiB
Go
|
|
package users
|
||
|
|
|
||
|
|
import (
|
||
|
|
"errors"
|
||
|
|
"github.com/gin-gonic/gin"
|
||
|
|
"github.com/gothinkster/golang-gin-realworld-example-app/common"
|
||
|
|
"net/http"
|
||
|
|
)
|
||
|
|
|
||
|
|
func UsersRegister(router *gin.RouterGroup) {
|
||
|
|
router.POST("", UsersRegistration)
|
||
|
|
router.POST("/", UsersRegistration)
|
||
|
|
router.POST("/login", UsersLogin)
|
||
|
|
}
|
||
|
|
|
||
|
|
func UserRegister(router *gin.RouterGroup) {
|
||
|
|
router.GET("", UserRetrieve)
|
||
|
|
router.GET("/", UserRetrieve)
|
||
|
|
router.PUT("", UserUpdate)
|
||
|
|
router.PUT("/", UserUpdate)
|
||
|
|
}
|
||
|
|
|
||
|
|
func ProfileRetrieveRegister(router *gin.RouterGroup) {
|
||
|
|
router.GET("/:username", ProfileRetrieve)
|
||
|
|
}
|
||
|
|
|
||
|
|
func ProfileRegister(router *gin.RouterGroup) {
|
||
|
|
router.POST("/:username/follow", ProfileFollow)
|
||
|
|
router.DELETE("/:username/follow", ProfileUnfollow)
|
||
|
|
}
|
||
|
|
|
||
|
|
func ProfileRetrieve(c *gin.Context) {
|
||
|
|
username := c.Param("username")
|
||
|
|
userModel, err := FindOneUser(&UserModel{Username: username})
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(http.StatusNotFound, common.NewError("profile", errors.New("Invalid username")))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
profileSerializer := ProfileSerializer{c, userModel}
|
||
|
|
c.JSON(http.StatusOK, gin.H{"profile": profileSerializer.Response()})
|
||
|
|
}
|
||
|
|
|
||
|
|
func ProfileFollow(c *gin.Context) {
|
||
|
|
username := c.Param("username")
|
||
|
|
userModel, err := FindOneUser(&UserModel{Username: username})
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(http.StatusNotFound, common.NewError("profile", errors.New("Invalid username")))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
myUserModel := c.MustGet("my_user_model").(UserModel)
|
||
|
|
err = myUserModel.following(userModel)
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(http.StatusUnprocessableEntity, common.NewError("database", err))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
serializer := ProfileSerializer{c, userModel}
|
||
|
|
c.JSON(http.StatusOK, gin.H{"profile": serializer.Response()})
|
||
|
|
}
|
||
|
|
|
||
|
|
func ProfileUnfollow(c *gin.Context) {
|
||
|
|
username := c.Param("username")
|
||
|
|
userModel, err := FindOneUser(&UserModel{Username: username})
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(http.StatusNotFound, common.NewError("profile", errors.New("Invalid username")))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
myUserModel := c.MustGet("my_user_model").(UserModel)
|
||
|
|
|
||
|
|
err = myUserModel.unFollowing(userModel)
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(http.StatusUnprocessableEntity, common.NewError("database", err))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
serializer := ProfileSerializer{c, userModel}
|
||
|
|
c.JSON(http.StatusOK, gin.H{"profile": serializer.Response()})
|
||
|
|
}
|
||
|
|
|
||
|
|
func UsersRegistration(c *gin.Context) {
|
||
|
|
userModelValidator := NewUserModelValidator()
|
||
|
|
if err := userModelValidator.Bind(c); err != nil {
|
||
|
|
c.JSON(http.StatusUnprocessableEntity, common.NewValidatorError(err))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
if err := SaveOne(&userModelValidator.userModel); err != nil {
|
||
|
|
c.JSON(http.StatusUnprocessableEntity, common.NewError("database", err))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
c.Set("my_user_model", userModelValidator.userModel)
|
||
|
|
serializer := UserSerializer{c}
|
||
|
|
c.JSON(http.StatusCreated, gin.H{"user": serializer.Response()})
|
||
|
|
}
|
||
|
|
|
||
|
|
func UsersLogin(c *gin.Context) {
|
||
|
|
loginValidator := NewLoginValidator()
|
||
|
|
if err := loginValidator.Bind(c); err != nil {
|
||
|
|
c.JSON(http.StatusUnprocessableEntity, common.NewValidatorError(err))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
userModel, err := FindOneUser(&UserModel{Email: loginValidator.userModel.Email})
|
||
|
|
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(http.StatusUnauthorized, common.NewError("login", errors.New("Not Registered email or invalid password")))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
if userModel.checkPassword(loginValidator.User.Password) != nil {
|
||
|
|
c.JSON(http.StatusUnauthorized, common.NewError("login", errors.New("Not Registered email or invalid password")))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
UpdateContextUserModel(c, userModel.ID)
|
||
|
|
serializer := UserSerializer{c}
|
||
|
|
c.JSON(http.StatusOK, gin.H{"user": serializer.Response()})
|
||
|
|
}
|
||
|
|
|
||
|
|
func UserRetrieve(c *gin.Context) {
|
||
|
|
serializer := UserSerializer{c}
|
||
|
|
c.JSON(http.StatusOK, gin.H{"user": serializer.Response()})
|
||
|
|
}
|
||
|
|
|
||
|
|
func UserUpdate(c *gin.Context) {
|
||
|
|
myUserModel := c.MustGet("my_user_model").(UserModel)
|
||
|
|
userModelValidator := NewUserModelValidatorFillWith(myUserModel)
|
||
|
|
if err := userModelValidator.Bind(c); err != nil {
|
||
|
|
c.JSON(http.StatusUnprocessableEntity, common.NewValidatorError(err))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
userModelValidator.userModel.ID = myUserModel.ID
|
||
|
|
if err := myUserModel.Update(userModelValidator.userModel); err != nil {
|
||
|
|
c.JSON(http.StatusUnprocessableEntity, common.NewError("database", err))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
UpdateContextUserModel(c, myUserModel.ID)
|
||
|
|
serializer := UserSerializer{c}
|
||
|
|
c.JSON(http.StatusOK, gin.H{"user": serializer.Response()})
|
||
|
|
}
|