chore: update id order
This commit is contained in:
@@ -1,167 +1,127 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func (d *Database) SaveToken(userID int, userType string, token string, expiresAt time.Time) error {
|
||||
// Valider le user_type
|
||||
validTypes := map[string]bool{
|
||||
"client": true,
|
||||
"admin": true,
|
||||
"cabine": true,
|
||||
"livreur": true,
|
||||
}
|
||||
type jwtToken struct {
|
||||
ID int `gorm:"primaryKey;autoIncrement"`
|
||||
UserID int `gorm:"column:user_id;index"`
|
||||
UserType string `gorm:"column:user_type"`
|
||||
Token string `gorm:"column:token;uniqueIndex"`
|
||||
DateSave time.Time `gorm:"column:date_save;autoCreateTime"`
|
||||
DateFin time.Time `gorm:"column:date_fin"`
|
||||
}
|
||||
|
||||
if !validTypes[userType] {
|
||||
func (jwtToken) TableName() string { return "jwt_tokens" }
|
||||
|
||||
var validTokenTypes = map[string]bool{
|
||||
"client": true, "admin": true, "cabine": true, "livreur": true,
|
||||
}
|
||||
|
||||
func (d *Database) SaveToken(userID int, userType string, token string, expiresAt time.Time) error {
|
||||
if !validTokenTypes[userType] {
|
||||
return fmt.Errorf("type d'utilisateur invalide: %s", userType)
|
||||
}
|
||||
|
||||
query := `INSERT INTO jwt_tokens (user_id, user_type, token, date_save, date_fin)
|
||||
VALUES ($1, $2, $3, CURRENT_TIMESTAMP, $4)`
|
||||
|
||||
_, err := d.Exec(query, userID, userType, token, expiresAt)
|
||||
if err != nil {
|
||||
t := jwtToken{UserID: userID, UserType: userType, Token: token, DateFin: expiresAt}
|
||||
if err := d.GDB.Create(&t).Error; err != nil {
|
||||
return fmt.Errorf("erreur lors de l'enregistrement du token: %w", err)
|
||||
}
|
||||
|
||||
log.Printf("✅ Token enregistré pour %s ID: %d", userType, userID)
|
||||
return nil
|
||||
}
|
||||
|
||||
// IsTokenValid vérifie si un token existe et n'est pas expiré
|
||||
func (d *Database) IsTokenValid(token string) (bool, error) {
|
||||
query := `SELECT COUNT(*) FROM jwt_tokens
|
||||
WHERE token = $1 AND date_fin > $2`
|
||||
|
||||
var count int
|
||||
err := d.QueryRow(query, token, time.Now()).Scan(&count)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("erreur lors de la vérification du token: %w", err)
|
||||
}
|
||||
|
||||
return count > 0, nil
|
||||
var count int64
|
||||
err := d.GDB.Model(&jwtToken{}).
|
||||
Where("token = ? AND date_fin > ?", token, time.Now()).
|
||||
Count(&count).Error
|
||||
return count > 0, err
|
||||
}
|
||||
|
||||
// RevokeToken révoque un token (le supprime de la base)
|
||||
func (d *Database) RevokeToken(token string) error {
|
||||
query := `DELETE FROM jwt_tokens WHERE token = $1`
|
||||
|
||||
result, err := d.Exec(query, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("erreur lors de la révocation du token: %w", err)
|
||||
result := d.GDB.Where("token = ?", token).Delete(&jwtToken{})
|
||||
if result.Error != nil {
|
||||
return fmt.Errorf("erreur lors de la révocation du token: %w", result.Error)
|
||||
}
|
||||
|
||||
rowsAffected, _ := result.RowsAffected()
|
||||
if rowsAffected > 0 {
|
||||
if result.RowsAffected > 0 {
|
||||
log.Printf("✅ Token révoqué avec succès")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RevokeAllUserTokens révoque tous les tokens d'un utilisateur
|
||||
func (d *Database) RevokeAllUserTokens(userID int, userType string) error {
|
||||
query := `DELETE FROM jwt_tokens WHERE user_id = $1 AND user_type = $2`
|
||||
|
||||
result, err := d.Exec(query, userID, userType)
|
||||
if err != nil {
|
||||
return fmt.Errorf("erreur lors de la révocation des tokens: %w", err)
|
||||
result := d.GDB.Where("user_id = ? AND user_type = ?", userID, userType).Delete(&jwtToken{})
|
||||
if result.Error != nil {
|
||||
return fmt.Errorf("erreur lors de la révocation des tokens: %w", result.Error)
|
||||
}
|
||||
|
||||
rowsAffected, _ := result.RowsAffected()
|
||||
log.Printf("✅ %d token(s) révoqué(s) pour %s ID: %d", rowsAffected, userType, userID)
|
||||
|
||||
log.Printf("✅ %d token(s) révoqué(s) pour %s ID: %d", result.RowsAffected, userType, userID)
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetUserActiveTokens récupère tous les tokens actifs d'un utilisateur
|
||||
func (d *Database) GetUserActiveTokens(userID int, userType string) ([]map[string]any, error) {
|
||||
query := `SELECT id, token, date_save, date_fin
|
||||
FROM jwt_tokens
|
||||
WHERE user_id = $1 AND user_type = $2 AND date_fin > $3
|
||||
ORDER BY date_save DESC`
|
||||
|
||||
rows, err := d.Query(query, userID, userType, time.Now())
|
||||
var tokens []jwtToken
|
||||
err := d.GDB.Where("user_id = ? AND user_type = ? AND date_fin > ?", userID, userType, time.Now()).
|
||||
Order("date_save DESC").Find(&tokens).Error
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("erreur lors de la récupération des tokens: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var tokens []map[string]any
|
||||
for rows.Next() {
|
||||
var id int
|
||||
var token string
|
||||
var dateSave, dateFin time.Time
|
||||
|
||||
err := rows.Scan(&id, &token, &dateSave, &dateFin)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("erreur lors du scan: %w", err)
|
||||
result := make([]map[string]any, len(tokens))
|
||||
for i, t := range tokens {
|
||||
truncated := t.Token
|
||||
if len(truncated) > 20 {
|
||||
truncated = truncated[:20] + "..."
|
||||
}
|
||||
result[i] = map[string]any{
|
||||
"id": t.ID,
|
||||
"token": truncated,
|
||||
"date_save": t.DateSave,
|
||||
"date_fin": t.DateFin,
|
||||
"user_type": t.UserType,
|
||||
}
|
||||
|
||||
tokens = append(tokens, map[string]any{
|
||||
"id": id,
|
||||
"token": token[:20] + "...", // Tronquer pour la sécurité
|
||||
"date_save": dateSave,
|
||||
"date_fin": dateFin,
|
||||
"user_type": userType,
|
||||
})
|
||||
}
|
||||
|
||||
return tokens, nil
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (d *Database) GetTokenInfo(token string) (map[string]any, error) {
|
||||
query := `SELECT user_id, user_type, date_save, date_fin
|
||||
FROM jwt_tokens
|
||||
WHERE token = $1 AND date_fin > $2`
|
||||
|
||||
var userID int
|
||||
var userType string
|
||||
var dateSave, dateFin time.Time
|
||||
|
||||
err := d.QueryRow(query, token, time.Now()).Scan(&userID, &userType, &dateSave, &dateFin)
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, fmt.Errorf("token non trouvé ou expiré")
|
||||
}
|
||||
var t jwtToken
|
||||
err := d.GDB.Where("token = ? AND date_fin > ?", token, time.Now()).First(&t).Error
|
||||
if err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return nil, fmt.Errorf("token non trouvé ou expiré")
|
||||
}
|
||||
return nil, fmt.Errorf("erreur lors de la récupération des infos du token: %w", err)
|
||||
}
|
||||
|
||||
tokenInfo := map[string]any{
|
||||
"user_id": userID,
|
||||
"user_type": userType,
|
||||
"date_save": dateSave,
|
||||
"date_fin": dateFin,
|
||||
}
|
||||
|
||||
return tokenInfo, nil
|
||||
return map[string]any{
|
||||
"user_id": t.UserID,
|
||||
"user_type": t.UserType,
|
||||
"date_save": t.DateSave,
|
||||
"date_fin": t.DateFin,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (d *Database) CountActiveTokensByType() (map[string]int, error) {
|
||||
query := `SELECT user_type, COUNT(*) as count
|
||||
FROM jwt_tokens
|
||||
WHERE date_fin > $1
|
||||
GROUP BY user_type`
|
||||
|
||||
rows, err := d.Query(query, time.Now())
|
||||
type row struct {
|
||||
UserType string
|
||||
Count int
|
||||
}
|
||||
var rows []row
|
||||
err := d.GDB.Model(&jwtToken{}).
|
||||
Select("user_type, COUNT(*) as count").
|
||||
Where("date_fin > ?", time.Now()).
|
||||
Group("user_type").
|
||||
Scan(&rows).Error
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("erreur lors du comptage des tokens: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
counts := make(map[string]int)
|
||||
for rows.Next() {
|
||||
var userType string
|
||||
var count int
|
||||
if err := rows.Scan(&userType, &count); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
counts[userType] = count
|
||||
counts := make(map[string]int, len(rows))
|
||||
for _, r := range rows {
|
||||
counts[r.UserType] = r.Count
|
||||
}
|
||||
|
||||
return counts, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user