Go-TestAPI/controllers/userController.go

280 lines
6.4 KiB
Go
Raw Normal View History

package controllers
// Пример генератора токена
import (
"crypto/rand"
2024-06-06 15:03:22 +00:00
"encoding/base64"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"golang-test/database"
"golang-test/libs"
"golang-test/message"
2024-06-06 16:02:59 +00:00
"golang-test/types"
2024-06-06 15:03:22 +00:00
"golang-test/validators"
"golang.org/x/crypto/bcrypt"
2024-06-06 16:07:06 +00:00
"strings"
)
2024-06-06 15:03:22 +00:00
//func tokenGenerator() string {
// b := make([]byte, 4)
// rand.Read(b)
// return fmt.Sprintf("%x", b)
//}
// func main() {
// a := tokenGenerator()
// fmt.Println(a)
// }
2024-06-06 15:21:25 +00:00
type TokenStruct struct {
2024-06-06 15:03:22 +00:00
UserID uint
token string
}
//func RegisterUser(c *gin.Context, user database.User) {
// db := database.Connector()
// validate := validators.Validate
// response := message.Response{Status: 200}
// if err := validate.Struct(user); err != nil {
// response.Error = libs.GetValidationErrors(err.(validator.ValidationErrors))
// response.Status = 400
// message.SendResponse(c, response)
// return
// }
// hash, err := bcrypt.GenerateFromPassword([]byte(user.Password), 12)
// if err != nil {
// return
// }
// user.Password = string(hash)
// if err := db.Create(user).Error; err != nil {
// return
// }
// return
//}
func RegisterUser(c *gin.Context, register database.User) {
var user database.User
2024-06-06 15:03:22 +00:00
db := database.Connector()
validate := validators.Validate
response := message.Response{Status: 201}
var token *database.Token
if err := validate.Struct(register); err != nil {
2024-06-06 15:03:22 +00:00
response.Error = libs.GetValidationErrors(err.(validator.ValidationErrors))
response.Status = 400
message.SendResponse(c, response)
return
}
if err := db.Where("email =?", register.Email).First(&user).Error; err == nil {
response.Status = 400
response.Error = gin.H{
"error": "User already exists",
}
message.SendResponse(c, response)
return
}
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(register.Password), 12)
2024-06-06 15:03:22 +00:00
if err != nil {
response.Status = 500
response.Error = gin.H{
"error": "Internal Server Error",
}
message.SendResponse(c, response)
2024-06-06 15:03:22 +00:00
return
}
user.Email = register.Email
user.Password = string(hashedPassword)
user.Name = register.Name
if err := db.Create(&user).Error; err != nil {
response.Status = 500
response.Error = gin.H{
"error": "Internal Server Error",
}
message.SendResponse(c, response)
2024-06-06 15:03:22 +00:00
return
}
token.Token = generateToken()
token.UserID = user.ID
user.Tokens = append(user.Tokens, token)
response.Message = gin.H{
"message": "Registration Success",
}
message.SendResponse(c, response)
2024-06-06 15:03:22 +00:00
}
2024-06-06 16:02:59 +00:00
func LoginUser(c *gin.Context, login types.LoginRequest) {
2024-06-06 15:03:22 +00:00
var user database.User
db := database.Connector()
validate := validators.Validate
2024-06-06 16:02:59 +00:00
response := message.Response{Status: 200}
var token *database.Token
if err := validate.Struct(login); err != nil {
response.Error = libs.GetValidationErrors(err.(validator.ValidationErrors))
response.Status = 400
message.SendResponse(c, response)
return
2024-06-06 15:03:22 +00:00
}
2024-06-06 16:02:59 +00:00
if err := db.Where("email = ?", login.Email).First(&user).Error; err != nil {
response.Status = 404
response.Error = gin.H{
"error": "User not found",
}
2024-06-06 15:03:22 +00:00
}
2024-06-06 16:02:59 +00:00
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(login.Password)); err != nil {
response.Status = 404
response.Error = gin.H{
"error": "User not found",
}
2024-06-06 15:03:22 +00:00
}
2024-06-06 16:02:59 +00:00
token.Token = generateToken()
token.UserID = user.ID
user.Tokens = append(user.Tokens, token)
response.Message = gin.H{
"message": "Login Success",
2024-06-06 15:03:22 +00:00
}
2024-06-06 16:02:59 +00:00
message.SendResponse(c, response)
2024-06-06 15:03:22 +00:00
}
func generateToken() string {
b := make([]byte, 4)
2024-06-06 15:03:22 +00:00
if _, err := rand.Read(b); err != nil {
return ""
}
return base64.StdEncoding.EncodeToString(b)
}
2024-06-06 15:41:41 +00:00
func GetUserByToken(token string) (database.User, error) {
2024-06-06 15:21:25 +00:00
var tokenObject TokenStruct
var err error
var user database.User
2024-06-06 15:03:22 +00:00
db := database.Connector()
2024-06-06 15:21:25 +00:00
if err := db.Where("token = ?", token).First(&tokenObject).Error; err != nil {
return user, err
2024-06-06 15:03:22 +00:00
}
2024-06-06 15:21:25 +00:00
if err := db.First(&user, tokenObject.UserID).Error; err != nil {
return user, err
2024-06-06 15:03:22 +00:00
}
2024-06-06 15:21:25 +00:00
return user, err
2024-06-06 15:03:22 +00:00
}
func GetUser(c *gin.Context, user database.User) {
token := strings.Split(c.Request.Header["Bearer"][0], " ")[1]
validate := validators.Validate
response := message.Response{Status: 200}
u, err := GetUserByToken(token)
if err != nil {
response.Status = 401
response.Error = gin.H{
"error": "Token is invalid, please login",
}
message.SendResponse(c, response)
return
}
if err := validate.Struct(user); err != nil {
response.Error = libs.GetValidationErrors(err.(validator.ValidationErrors))
response.Status = 400
message.SendResponse(c, response)
return
}
response.Message = gin.H{
"message": "User data successfully received",
"user": u,
}
message.SendResponse(c, response)
}
2024-06-06 16:07:06 +00:00
func EditUser(c *gin.Context, user database.User) {
token := strings.Split(c.Request.Header["Bearer"][0], " ")[1]
2024-06-06 15:03:22 +00:00
db := database.Connector()
validate := validators.Validate
2024-06-06 15:36:14 +00:00
response := message.Response{Status: 200}
2024-06-06 15:41:41 +00:00
u, err := GetUserByToken(token)
2024-06-06 15:36:14 +00:00
if err != nil {
response.Status = 401
response.Error = gin.H{
"error": "Token is invalid, please login",
}
message.SendResponse(c, response)
2024-06-06 15:03:22 +00:00
return
}
2024-06-06 15:36:14 +00:00
if err := validate.Struct(user); err != nil {
response.Error = libs.GetValidationErrors(err.(validator.ValidationErrors))
response.Status = 400
message.SendResponse(c, response)
return
2024-06-06 15:03:22 +00:00
}
2024-06-06 15:36:14 +00:00
hash, err := bcrypt.GenerateFromPassword([]byte(user.Password), 12)
if err != nil {
response.Status = 500
response.Error = gin.H{
"error": err,
2024-06-06 15:03:22 +00:00
}
2024-06-06 15:36:14 +00:00
message.SendResponse(c, response)
return
2024-06-06 15:03:22 +00:00
}
2024-06-06 15:36:14 +00:00
u.Password = string(hash)
2024-06-06 15:03:22 +00:00
if err := db.Save(u).Error; err != nil {
2024-06-06 15:36:14 +00:00
response.Status = 500
response.Error = gin.H{
"error": err,
}
message.SendResponse(c, response)
2024-06-06 15:03:22 +00:00
return
}
2024-06-06 15:41:41 +00:00
response.Message = gin.H{
"message": "User successfully updated",
}
message.SendResponse(c, response)
}
2024-06-06 16:07:06 +00:00
func DeleteUser(c *gin.Context) {
token := strings.Split(c.Request.Header["Bearer"][0], " ")[1]
2024-06-06 15:41:41 +00:00
db := database.Connector()
u, err := GetUserByToken(token)
response := message.Response{Status: 200}
2024-06-06 15:03:22 +00:00
if err != nil {
2024-06-06 15:41:41 +00:00
response.Status = 401
response.Error = gin.H{
"error": "Token is invalid, please login",
}
message.SendResponse(c, response)
2024-06-06 15:03:22 +00:00
return
}
2024-06-06 15:41:41 +00:00
2024-06-06 15:03:22 +00:00
if err := db.Delete(u).Error; err != nil {
2024-06-06 15:41:41 +00:00
response.Status = 500
response.Error = gin.H{
"error": err,
}
message.SendResponse(c, response)
2024-06-06 15:03:22 +00:00
return
}
2024-06-06 15:41:41 +00:00
response.Message = gin.H{
"message": "User successfully deleted",
}
message.SendResponse(c, response)
}