prepair to using go concurrent

This commit is contained in:
linhdevtran99 committed 2023-12-06 20:27:34 +07:00
1 parent ce0508294c
commit 47816debd3
10 files changed
+222 -139

No files matched your search

+71 -50
View File
@@ -3,8 +3,8 @@ package services
import (
"context"
"encoding/base32"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"github.com/go-playground/validator/v10"
"github.com/pquerna/otp"
@@ -15,10 +15,16 @@ import (
"linhdevtran99/rest-api/models"
"linhdevtran99/rest-api/utils"
"net/http"
"time"
)
// Check the user register field is valid or not
func CheckAndValidRegisterFiled(registerData *models.CreateUser, w http.ResponseWriter) bool {
type ResponseError struct {
Code int
Err error
}
// CheckAndValidRegisterFiled Check the user register field is valid or not
func CheckAndValidRegisterFiled(registerData *models.CreateUser) (bool, *ResponseError) {
_ = models.Validate.RegisterValidation("customPassword", models.PasswordValidator)
errs := models.Validate.Struct(registerData)
var errStack []string
@@ -27,49 +33,45 @@ func CheckAndValidRegisterFiled(registerData *models.CreateUser, w http.Response
switch err.Field() {
case "Email":
{
fmt.Println("Email không hợp lệ")
fmt.Println("Internal Log: Email không hợp lệ")
errStack = append(errStack, "Email")
}
case "Username":
{
fmt.Println("User không hợp lệ")
fmt.Println("Internal Log: User không hợp lệ")
errStack = append(errStack, "User")
}
case "Password":
{
fmt.Println("Password không hợp lệ")
fmt.Println("Internal Log: Password không hợp lệ")
errStack = append(errStack, "Password")
}
case "ConfirmPassword":
{
fmt.Println("Nhập lại mật khẩu sai")
fmt.Println("Internal Log: Nhập lại mật khẩu sai")
errStack = append(errStack, "ConfirmPassword")
}
case "PhoneNumber":
{
fmt.Println("SĐT không hợp lệ")
fmt.Println("Internal Log: SĐT không hợp lệ")
errStack = append(errStack, "PhoneNumber")
}
}
}
//handle repose error
w.WriteHeader(http.StatusBadRequest)
err := json.NewEncoder(w).Encode(errStack)
if err != nil {
fmt.Println("There is error in write reponse at checking info user")
}
return false
jsonData, _ := json.Marshal(errStack)
return false, &ResponseError{Code: http.StatusBadRequest, Err: errors.New(string(jsonData))}
}
return true
return true, nil
}
// Checking in db is user input same data in
func CheckAccountExist(mongoClient *mongo.Client, userName string, email string, w http.ResponseWriter) bool {
// CheckAccountExist Checking in db is user input same data in
func CheckAccountExist(mongoClient *mongo.Client, userName string, email string) (bool, *ResponseError) {
//filter in mongodb
var isValid bool
var errAPI *ResponseError
filter := bson.D{
{"$or", bson.A{
@@ -78,27 +80,24 @@ func CheckAccountExist(mongoClient *mongo.Client, userName string, email string,
}},
}
userData := mongoClient.Database("Totoday-shop").Collection("users")
var result models.UsersMongo
err := userData.FindOne(context.TODO(), filter).Decode(&result)
_, err := utils.PreUserData.FindOne(context.TODO(), filter).Raw()
if err != nil {
isValid = true
}
if err == nil {
fmt.Println("Email or username already had register")
w.WriteHeader(http.StatusBadRequest)
err := json.NewEncoder(w).Encode("Your username or email had been register before")
if err != nil {
fmt.Println("There is error in write reponse at checking data user register")
}
errAPI = nil
} else {
fmt.Println("Internal Log: Email or username already had register")
isValid = false
errAPI = &ResponseError{
Code: http.StatusBadRequest,
Err: errors.New("your username or email had been register before"),
}
}
return isValid
return isValid, errAPI
}
// Generate HOtp for confirm infomation
// GeneratorOtp Generate HOtp for confirm information
func GeneratorOtp(userName string, email string, counter uint64, serect string) (bool, *models.OtpGenerate) {
serectBase32 := base32.StdEncoding.EncodeToString([]byte(serect + userName + email))
@@ -109,19 +108,13 @@ func GeneratorOtp(userName string, email string, counter uint64, serect string)
if err != nil {
fmt.Println("Fail to create OTP")
return false, &models.OtpGenerate{
PureOTP: "none",
HashOTP: "none",
}
return false, nil
}
hashed, err := bcrypt.GenerateFromPassword([]byte(passCode), 5)
if err != nil {
fmt.Println("Fail to create OTP")
return false, &models.OtpGenerate{
PureOTP: "none",
HashOTP: "none",
}
return false, nil
}
return true, &models.OtpGenerate{
@@ -130,15 +123,43 @@ func GeneratorOtp(userName string, email string, counter uint64, serect string)
}
}
// Create a alternative verify link
func CreateLinkVerify(registerInfo *models.CreateUser, secrect string) string {
// CreateLinkVerify Create a alternative verify link
func CreateLinkVerify(registerInfo string, secrect string) string {
return "linh"
}
// check and write pre use into mongo db
func CheckAndWritePreuser(registerInfo *models.PreusersMongo) {
//checking
email := registerInfo.Email
filter := bson.D{{"email", email}}
_, err := utils.PreUserData.FindOne(context.Background(), filter).Raw()
if err != nil {
hashed, err := bcrypt.GenerateFromPassword([]byte(registerInfo.HashPassword), 10)
if err != nil {
fmt.Println("Fail to create OTP")
}
registerInfo.HashPassword = string(hashed)
_, err = utils.PreUserData.InsertOne(context.Background(), registerInfo)
if err != nil {
fmt.Println("Something Went Wrong")
}
} else {
update := bson.D{
{"$inc", bson.D{
{"verify_sent_count", 1},
}},
{"$set", bson.D{
{"update_date", time.Now()},
},
}}
_, err := utils.PreUserData.UpdateOne(context.Background(), filter, update)
if err != nil {
fmt.Println("Internal log: update document fail")
}
}
data, _ := json.Marshal(registerInfo)
key := []byte(secrect)
ciphertext, _ := utils.EncryptAES(data, key)
cipherTextBase64 := base64.StdEncoding.EncodeToString(ciphertext)
return cipherTextBase64
}