This commit is contained in:
2026-02-11 17:46:22 +03:00
commit eacfacb13b
266 changed files with 51337 additions and 0 deletions

276
svc/repository/user_repo.go Normal file
View File

@@ -0,0 +1,276 @@
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
}