accounts/internal/xrayconfig/source_gorm.go
Haitao Pan 07e31ff6bd feat: move account service to repo root
# Conflicts:
#	account/Makefile
#	account/go.mod
#	docs/account-admin-settings.md
#	docs/account-svc-plus.md
2026-01-16 16:15:23 +08:00

58 lines
1.3 KiB
Go

package xrayconfig
import (
"context"
"errors"
"strings"
"gorm.io/gorm"
)
// GormClientSource reads Xray client credentials from the users table using GORM.
type GormClientSource struct {
DB *gorm.DB
}
// NewGormClientSource constructs a ClientSource backed by the provided GORM instance.
func NewGormClientSource(db *gorm.DB) (*GormClientSource, error) {
if db == nil {
return nil, errors.New("gorm db is required")
}
return &GormClientSource{DB: db}, nil
}
// ListClients returns all users ordered by creation time.
func (s *GormClientSource) ListClients(ctx context.Context) ([]Client, error) {
if s == nil || s.DB == nil {
return nil, errors.New("gorm client source is not configured")
}
type row struct {
UUID string `gorm:"column:uuid"`
Email *string `gorm:"column:email"`
}
var rows []row
if err := s.DB.WithContext(ctx).
Table("users").
Select("uuid, email").
Order("created_at ASC, uuid ASC").
Find(&rows).Error; err != nil {
return nil, err
}
clients := make([]Client, 0, len(rows))
for _, r := range rows {
id := strings.TrimSpace(r.UUID)
if id == "" {
continue
}
client := Client{ID: id}
if r.Email != nil {
client.Email = strings.TrimSpace(*r.Email)
}
clients = append(clients, client)
}
return clients, nil
}