Kaynağa Gözat

feat(model): add protocol-number fields to TgAccount (device, 2fa, origin_dir, ...)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dot 2 hafta önce
ebeveyn
işleme
9185f17d55
1 değiştirilmiş dosya ile 48 ekleme ve 0 silme
  1. 48 0
      internal/model/user.go

+ 48 - 0
internal/model/user.go

@@ -0,0 +1,48 @@
+package model
+
+import "time"
+
+// User represents a system user with role-based access control.
+type User struct {
+	ID          uint       `gorm:"primaryKey;autoIncrement" json:"id"`
+	Username    string     `gorm:"uniqueIndex;size:50;not null" json:"username"`
+	Password    string     `gorm:"size:255;not null" json:"-"` // bcrypt hash, never exposed in JSON
+	Nickname    string     `gorm:"size:100" json:"nickname"`
+	Role        string     `gorm:"size:20;not null;default:'viewer'" json:"role"` // admin / operator / viewer
+	Enabled            bool       `gorm:"default:true" json:"enabled"`
+	MustChangePassword bool       `gorm:"default:false" json:"must_change_password"`
+	LastLoginAt        *time.Time `json:"last_login_at"`
+	LastLoginIP string     `gorm:"size:45" json:"last_login_ip"`
+	CreatedAt   time.Time  `json:"created_at"`
+	UpdatedAt   time.Time  `json:"updated_at"`
+}
+
+// TgAccount represents a Telegram account managed via the admin panel.
+type TgAccount struct {
+	ID          uint      `gorm:"primaryKey;autoIncrement" json:"id"`
+	Phone       string    `gorm:"uniqueIndex;size:50;not null" json:"phone"`
+	SessionFile string    `gorm:"size:500;not null" json:"session_file"`
+	AppID       int       `gorm:"not null" json:"app_id"`
+	AppHash     string    `gorm:"size:100;not null" json:"app_hash"`
+	Remark      string    `gorm:"size:255" json:"remark"`
+	Enabled     bool      `gorm:"default:true" json:"enabled"`
+	Status      string    `gorm:"size:20;default:'idle'" json:"status"` // idle / online / cooling
+
+	// Protocol-number import additions (all nullable to keep legacy rows valid).
+	TwoFAEnc       []byte `gorm:"type:varbinary(255)" json:"-"`                         // AES-GCM ciphertext; never emitted in JSON
+	Device         string `gorm:"size:100" json:"device"`                                // e.g. "Xiaomi Mix 4"
+	AppVersion     string `gorm:"size:50" json:"app_version"`                            // e.g. "12.0.0 (6163)"
+	SDK            string `gorm:"size:100" json:"sdk"`                                   // e.g. "Android 13 (33)"
+	LangPack       string `gorm:"size:50" json:"lang_pack"`                              // e.g. "android"
+	LangCode       string `gorm:"size:20" json:"lang_code"`                              // e.g. "en"
+	SystemLangCode string `gorm:"size:20" json:"system_lang_code"`                       // e.g. "en-US"
+	FirstName      string `gorm:"size:100" json:"first_name"`
+	LastName       string `gorm:"size:100" json:"last_name"`
+	TgUsername     string `gorm:"size:100;column:tg_username" json:"tg_username"`
+	OriginDir      string `gorm:"size:500" json:"origin_dir"`                            // sessions/<phone>.origin/ absolute path
+	ImportStatus   string `gorm:"size:20" json:"import_status"`                          // ok / session_invalid / dead
+	Source         string `gorm:"size:20" json:"source"`                                 // protocol / manual
+
+	CreatedAt time.Time `json:"created_at"`
+	UpdatedAt time.Time `json:"updated_at"`
+}