cargo-platform/internal/usecases/auth.go
teguh nugroho 8354634117
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ubah struktur
2026-08-25 16:49:27 +07:00

76 lines
2.0 KiB
Go

package usecases
import (
"cargo-erp-backend/internal/domain"
"cargo-erp-backend/pkg/helpers"
"cargo-erp-backend/pkg/jwt"
"context"
"fmt"
"strconv"
"strings"
"time"
)
type AuthUsecaseInterface interface {
Login(email string, password string) (token string, err error)
}
type AuthUsecase struct {
Helper helpers.HelperInterface
}
func NewAuthUsecase(helper helpers.HelperInterface) AuthUsecaseInterface {
return &AuthUsecase{
Helper: helper,
}
}
func (u *AuthUsecase) Login(email string, password string) (token string, err error) {
var user []domain.User
db := u.Helper.GetDB("slave")
if err := db.Model(&user).Where("email=?", email).Preload("UsersRole_Relation").Find(&user).Error; err != nil {
return "", fmt.Errorf("User Not Found")
}
for _, v := range user {
pass := u.Helper.StringFromPtr(v.Password)
if u.Helper.VerifyPassword(pass, password) {
ctx := context.Background()
rd := u.Helper.GetRedis("master")
secretJwt := jwt.NewJWT(u.Helper.Config(), u.Helper.Log())
token, err := secretJwt.GenerateToken(v.ID)
if err != nil {
return "", err
}
extime_str := fmt.Sprintf("%v", u.Helper.Config().Get("jwt.expiry_time"))
t, err := strconv.Atoi(extime_str)
if err != nil {
return "", err
}
//
key := fmt.Sprintf("session_login:%v:*", v.ID)
iter := u.Helper.GetRedis("master").Scan(ctx, 0, key, 1000).Iterator()
for iter.Next(ctx) {
keys := iter.Val()
keys_ex := strings.Split(keys, ":")
//change to del if using single login
if keys_ex[1] == v.ID {
u.Helper.GetRedis("master").Expire(ctx, keys, time.Duration(t)*time.Second)
return keys_ex[2], nil
}
}
key = fmt.Sprintf("session_login:%v:%v", v.ID, token)
clonner, err := u.Helper.CloneStructWithoutField(v, "password")
if err != nil {
return "", err
}
bdata, _ := u.Helper.StructTobyte(clonner)
status := rd.Set(ctx, key, bdata, time.Duration(t)*time.Second)
if status.Err() != nil {
return "", status.Err()
}
return token, nil
}
}
return "", fmt.Errorf("User Not Found")
}