2024-06-06 09:32:23 +00:00
|
|
|
package controllers
|
2024-06-06 09:35:19 +00:00
|
|
|
|
|
|
|
// Пример генератора токена
|
|
|
|
|
|
|
|
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"
|
|
|
|
"golang-test/validators"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
2024-06-06 09:35:19 +00:00
|
|
|
)
|
|
|
|
|
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 LoginUser(c *gin.Context, email, password string) *Token {
|
|
|
|
var user database.User
|
|
|
|
db := database.Connector()
|
|
|
|
validate := validators.Validate
|
|
|
|
if err := db.Where("email = ?", email).First(&user).Error; err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
token := &Token{
|
|
|
|
UserID: user.ID,
|
|
|
|
Token: generateToken(),
|
|
|
|
}
|
|
|
|
if err := db.Create(token).Error; err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return token
|
|
|
|
}
|
|
|
|
|
|
|
|
func generateToken() string {
|
2024-06-06 09:35:19 +00:00
|
|
|
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 EditUser(c *gin.Context, token string, user database.User) {
|
|
|
|
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 09:35:19 +00:00
|
|
|
}
|
|
|
|
|
2024-06-06 15:03:22 +00:00
|
|
|
func DeleteUser(c *gin.Context, token string) {
|
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)
|
2024-06-06 09:35:19 +00:00
|
|
|
}
|