277 lines
5.5 KiB
Go
277 lines
5.5 KiB
Go
package repository
|
||
|
||
import (
|
||
"bssapp-backend/models"
|
||
"database/sql"
|
||
"errors"
|
||
"fmt"
|
||
"log"
|
||
"strings"
|
||
)
|
||
|
||
// UserRepository → kullanıcı işlemleri için repository katmanı
|
||
type UserRepository struct {
|
||
DB *sql.DB
|
||
}
|
||
|
||
// NewUserRepository → yeni bir UserRepository döner
|
||
func NewUserRepository(db *sql.DB) *UserRepository {
|
||
return &UserRepository{DB: db}
|
||
}
|
||
|
||
// -------------------------------------------------------
|
||
// 📋 GetUserList (User Management)
|
||
// -------------------------------------------------------
|
||
func (r *UserRepository) GetUserList() ([]models.User, error) {
|
||
|
||
query := `
|
||
SELECT
|
||
u.id,
|
||
u.code,
|
||
COALESCE(u.upass,'') as upass,
|
||
u.is_active,
|
||
COALESCE(u.email,''),
|
||
COALESCE(uru.dfrole_id, 0) AS role_id,
|
||
COALESCE(dr.code, '') AS role_code
|
||
FROM dfusr u
|
||
LEFT JOIN dfrole_usr uru ON u.id = uru.dfusr_id
|
||
LEFT JOIN dfrole dr ON dr.id = uru.dfrole_id
|
||
ORDER BY u.code
|
||
`
|
||
|
||
rows, err := r.DB.Query(query)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer rows.Close()
|
||
|
||
var users []models.User
|
||
for rows.Next() {
|
||
var u models.User
|
||
if err := rows.Scan(
|
||
&u.ID,
|
||
&u.Username,
|
||
&u.Upass, // ✅ dfusr.upass
|
||
&u.IsActive,
|
||
&u.Email,
|
||
&u.RoleID,
|
||
&u.RoleCode,
|
||
); err != nil {
|
||
return nil, err
|
||
}
|
||
users = append(users, u)
|
||
}
|
||
return users, nil
|
||
}
|
||
|
||
// -------------------------------------------------------
|
||
// ➕ CreateUser (legacy dfusr insert) [kullanıyorsan kalsın]
|
||
// -------------------------------------------------------
|
||
func (r *UserRepository) CreateUser(u *models.User) (int, error) {
|
||
|
||
query := `
|
||
INSERT INTO dfusr (
|
||
code,
|
||
upass,
|
||
is_active,
|
||
email,
|
||
v3_username,
|
||
v3usergroup
|
||
)
|
||
VALUES ($1, $2, $3, $4, $5, $6)
|
||
RETURNING id
|
||
`
|
||
|
||
var newID int
|
||
err := r.DB.QueryRow(
|
||
query,
|
||
u.Username,
|
||
u.Upass, // ✅ upass
|
||
u.IsActive,
|
||
u.Email,
|
||
u.V3Username,
|
||
u.V3UserGroup,
|
||
).Scan(&newID)
|
||
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
return newID, nil
|
||
}
|
||
|
||
// -------------------------------------------------------
|
||
// 🔍 GetUserByUsername (legacy) [login için şart değil ama düzelttim]
|
||
// -------------------------------------------------------
|
||
func (r *UserRepository) GetUserByUsername(username string) (*models.User, error) {
|
||
|
||
clean := strings.TrimSpace(username)
|
||
|
||
query := `
|
||
SELECT
|
||
u.id,
|
||
u.code,
|
||
COALESCE(u.upass,'') as upass,
|
||
u.is_active,
|
||
COALESCE(u.email,''),
|
||
|
||
COALESCE(uru.dfrole_id,0) AS role_id,
|
||
COALESCE(dr.code,'') AS role_code,
|
||
|
||
COALESCE(u.v3_username,'') as v3_username,
|
||
COALESCE(u.v3_usergroup,0) as v3_usergroup,
|
||
COALESCE(u.force_password_change,false) as force_password_change
|
||
|
||
FROM dfusr u
|
||
|
||
LEFT JOIN dfrole_usr uru
|
||
ON uru.dfusr_id = u.id
|
||
|
||
LEFT JOIN dfrole dr
|
||
ON dr.id = uru.dfrole_id
|
||
|
||
WHERE u.is_active = true
|
||
AND (
|
||
LOWER(u.code) = LOWER($1)
|
||
OR LOWER(u.email) = LOWER($1)
|
||
)
|
||
|
||
LIMIT 1;
|
||
`
|
||
|
||
row := r.DB.QueryRow(query, clean)
|
||
|
||
var user models.User
|
||
|
||
err := row.Scan(
|
||
&user.ID,
|
||
&user.Username,
|
||
&user.Upass,
|
||
&user.IsActive,
|
||
&user.Email,
|
||
|
||
&user.RoleID,
|
||
&user.RoleCode,
|
||
|
||
&user.V3Username,
|
||
&user.V3UserGroup,
|
||
&user.ForcePasswordChange,
|
||
)
|
||
|
||
if err != nil {
|
||
|
||
if errors.Is(err, sql.ErrNoRows) {
|
||
return nil, errors.New("kullanıcı bulunamadı")
|
||
}
|
||
|
||
return nil, err
|
||
}
|
||
|
||
return &user, nil
|
||
}
|
||
|
||
// -------------------------------------------------------
|
||
// 🧪 DebugListUsers
|
||
// -------------------------------------------------------
|
||
func (r *UserRepository) DebugListUsers() {
|
||
rows, err := r.DB.Query(`SELECT id, code FROM dfusr ORDER BY id LIMIT 10`)
|
||
if err != nil {
|
||
fmt.Println("❌ [DEBUG] Listeleme hatası:", err)
|
||
return
|
||
}
|
||
defer rows.Close()
|
||
|
||
fmt.Println("📋 [DEBUG] İlk 10 kullanıcı:")
|
||
for rows.Next() {
|
||
var id int
|
||
var code string
|
||
if err := rows.Scan(&id, &code); err == nil {
|
||
fmt.Printf(" - %d : %s\n", id, code)
|
||
}
|
||
}
|
||
}
|
||
|
||
// -------------------------------------------------------
|
||
// 🔁 SetUserRoles
|
||
// -------------------------------------------------------
|
||
func (r *UserRepository) SetUserRoles(userID int, roleIDs []int) error {
|
||
|
||
tx, err := r.DB.Begin()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer tx.Rollback()
|
||
|
||
if _, err := tx.Exec(`DELETE FROM dfrole_usr WHERE dfusr_id = $1`, userID); err != nil {
|
||
return err
|
||
}
|
||
|
||
for _, roleID := range roleIDs {
|
||
if _, err := tx.Exec(
|
||
`INSERT INTO dfrole_usr (dfrole_id, dfusr_id) VALUES ($1, $2)`,
|
||
roleID, userID,
|
||
); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
|
||
return tx.Commit()
|
||
}
|
||
|
||
// -------------------------------------------------------
|
||
// 🔐 GetLegacyUserForLogin ✅ LOGIN İÇİN TEK DOĞRU FONKSİYON
|
||
// -------------------------------------------------------
|
||
func (r *UserRepository) GetLegacyUserForLogin(login string) (*models.User, error) {
|
||
log.Println("🟡 LEGACY LOGIN QUERY HIT:", login)
|
||
|
||
login = strings.TrimSpace(login)
|
||
|
||
var u models.User
|
||
|
||
err := r.DB.QueryRow(`
|
||
SELECT
|
||
u.id,
|
||
u.code,
|
||
COALESCE(u.upass,'') as upass,
|
||
u.is_active,
|
||
COALESCE(u.email,''),
|
||
COALESCE(u.dfrole_id,0) as role_id,
|
||
COALESCE(dr.code,'') as role_code,
|
||
COALESCE(u.force_password_change,false)
|
||
FROM dfusr u
|
||
LEFT JOIN dfrole dr ON dr.id = u.dfrole_id
|
||
WHERE u.is_active = true
|
||
AND (
|
||
LOWER(u.code) = LOWER($1)
|
||
OR LOWER(u.email) = LOWER($1)
|
||
)
|
||
LIMIT 1
|
||
`, login).Scan(
|
||
&u.ID,
|
||
&u.Username,
|
||
&u.Upass,
|
||
&u.IsActive,
|
||
&u.Email,
|
||
&u.RoleID,
|
||
&u.RoleCode,
|
||
&u.ForcePasswordChange,
|
||
)
|
||
|
||
if err != nil {
|
||
log.Printf("❌ LEGACY SCAN ERROR: %v", err)
|
||
return nil, err
|
||
}
|
||
|
||
prefix := u.Upass
|
||
if len(prefix) > 4 {
|
||
prefix = prefix[:4]
|
||
}
|
||
|
||
log.Printf(
|
||
"🧪 LEGACY UPASS OK len=%d prefix=%s",
|
||
len(u.Upass),
|
||
prefix,
|
||
)
|
||
|
||
return &u, nil
|
||
}
|