Medication Update
This commit is contained in:
+50
-21
@@ -14,6 +14,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
type StoredToken struct {
|
||||
@@ -53,25 +54,39 @@ func NewService(cmdRepo CommandRepository, queryRepo QueryRepository, cache *cac
|
||||
|
||||
// Login mengimplementasikan otentikasi menggunakan data dummy untuk keperluan testing.
|
||||
func (s *service) Login(ctx context.Context, req LoginRequest) (*LoginResponse, error) {
|
||||
// Simulasi pengecekan kredensial dengan beberapa akun dummy
|
||||
type dummyUser struct {
|
||||
Password string
|
||||
UserID string
|
||||
RoleID string
|
||||
Name string
|
||||
// Prioritaskan pengecekan dummy users untuk development, terutama untuk akun sistem seperti worker.
|
||||
if dummyUser, exists := dummyUsers[req.Email]; exists {
|
||||
if dummyUser.Password == req.Password {
|
||||
// Jika kredensial cocok dengan dummy user, langsung generate token.
|
||||
return s.generateTokens(dummyUser.UserID, req.Email, dummyUser.RoleID, dummyUser.Name)
|
||||
}
|
||||
}
|
||||
|
||||
dummyUsers := map[string]dummyUser{
|
||||
"[email protected]": {"password123", "1001", "admin", "Admin Dummy"},
|
||||
"[email protected]": {"password123", "1002", "user", "User Dummy"},
|
||||
"[email protected]": {"password123", "1003", "manager", "Manager Dummy"},
|
||||
// Jika tidak ditemukan di dummy users atau password salah, lanjutkan pengecekan ke database.
|
||||
user, err := s.queryRepo.FindUserByEmail(ctx, req.Email)
|
||||
if err != nil {
|
||||
// Jika terjadi error saat query, kembalikan internal error
|
||||
return nil, errors.InternalError().Cause(err).Message("Gagal mencari pengguna").Build()
|
||||
}
|
||||
|
||||
user, exists := dummyUsers[req.Email]
|
||||
if !exists || user.Password != req.Password {
|
||||
return nil, errors.UnauthorizedError().Message("Email atau password salah. Coba: [email protected], [email protected], [email protected] (password123)").Build()
|
||||
// Jika pengguna tidak ditemukan di mana pun (dummy atau DB).
|
||||
if user == nil {
|
||||
return nil, errors.UnauthorizedError().Message("Email atau password salah.").Build()
|
||||
}
|
||||
|
||||
// Jika pengguna ditemukan di database, validasi password
|
||||
// Asumsi password di database di-hash menggunakan bcrypt
|
||||
err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password))
|
||||
if err != nil {
|
||||
// Jika password tidak cocok
|
||||
return nil, errors.UnauthorizedError().Message("Email atau password salah.").Build()
|
||||
}
|
||||
|
||||
// Jika login berhasil, generate token
|
||||
return s.generateTokens(fmt.Sprintf("%d", user.Id), user.Email, fmt.Sprintf("%d", *user.RoleID), user.Email)
|
||||
}
|
||||
|
||||
func (s *service) generateTokens(userID, email, roleID, name string) (*LoginResponse, error) {
|
||||
secret := os.Getenv("JWT_SECRET")
|
||||
if secret == "" {
|
||||
secret = "fallback_secret_key_change_in_production"
|
||||
@@ -79,20 +94,20 @@ func (s *service) Login(ctx context.Context, req LoginRequest) (*LoginResponse,
|
||||
|
||||
// Buat Access Token baru (Umur pendek, misal 15 Menit)
|
||||
accessToken := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
||||
"user_id": user.UserID,
|
||||
"email": req.Email,
|
||||
"role_id": user.RoleID,
|
||||
"name": user.Name,
|
||||
"user_id": userID,
|
||||
"email": email,
|
||||
"role_id": roleID,
|
||||
"name": name,
|
||||
"exp": time.Now().Add(60 * time.Minute).Unix(),
|
||||
})
|
||||
newAccessTokenStr, _ := accessToken.SignedString([]byte(secret))
|
||||
|
||||
// Buat Refresh Token baru (Umur panjang, misal 7 Hari)
|
||||
refreshToken := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
||||
"user_id": user.UserID,
|
||||
"email": req.Email,
|
||||
"role_id": user.RoleID,
|
||||
"name": user.Name,
|
||||
"user_id": userID,
|
||||
"email": email,
|
||||
"role_id": roleID,
|
||||
"name": name,
|
||||
"exp": time.Now().Add(7 * 24 * time.Hour).Unix(),
|
||||
})
|
||||
newRefreshTokenStr, _ := refreshToken.SignedString([]byte(secret))
|
||||
@@ -106,6 +121,20 @@ func (s *service) Login(ctx context.Context, req LoginRequest) (*LoginResponse,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type dummyUser struct {
|
||||
Password string
|
||||
UserID string
|
||||
RoleID string
|
||||
Name string
|
||||
}
|
||||
|
||||
var dummyUsers = map[string]dummyUser{
|
||||
"[email protected]": {"password123", "1001", "admin", "Admin Dummy"},
|
||||
"[email protected]": {"password123", "1002", "user", "User Dummy"},
|
||||
"[email protected]": {"password123", "1003", "manager", "Manager Dummy"},
|
||||
"[email protected]": {"password123", "1004", "worker", "Worker Dummy"},
|
||||
}
|
||||
|
||||
// Register mengimplementasikan pendaftaran user dengan respons data json dummy.
|
||||
func (s *service) Register(ctx context.Context, req RegisterRequest) (interface{}, error) {
|
||||
// Mengembalikan response dummy seolah-olah user berhasil dibuat di DB
|
||||
|
||||
Reference in New Issue
Block a user