Files
YouduWiki/backend/domain/auth.go
2026-05-21 19:52:45 +08:00

120 lines
4.3 KiB
Go

package domain
import (
"database/sql/driver"
"encoding/json"
"errors"
"fmt"
"time"
"github.com/labstack/echo/v4"
"github.com/lib/pq"
"github.com/chaitin/panda-wiki/consts"
)
const (
SessionCacheKey = "_session_store"
SessionName = "_pw_auth_session"
)
type Auth struct {
ID uint `gorm:"primaryKey;column:id" json:"id,omitempty"` // Unique identifier for the authentication record
IP string `gorm:"column:ip;not null" json:"ip,omitempty"` // IP address from which the login occurred (nullable)
KBID string `gorm:"column:kb_id;not null" json:"kb_id,omitempty"`
UnionID string `gorm:"column:union_id;not null" json:"union_id,omitempty"` // Union ID for the user, used in OAuth scenarios
SourceType consts.SourceType `gorm:"column:source_type;not null" json:"source_type,omitempty"` // Type of authentication source (e.g., "local", "oauth")
LastLoginTime time.Time `gorm:"column:last_login_time;not null" json:"last_login_time,omitempty"` // Timestamp of the last successful login (nullable)
CreatedAt time.Time `gorm:"column:created_at;not null;default:now()" json:"created_at"` // Timestamp when the record was created
UpdatedAt time.Time `gorm:"column:updated_at;not null;default:now()" json:"updated_at"` // Timestamp when the record was last updated
UserInfo AuthUserInfo `json:"user_info" gorm:"type:jsonb"`
}
func (Auth) TableName() string {
return "auths"
}
type AuthGroup struct {
ID uint `json:"id" gorm:"primaryKey;autoIncrement"`
Name string `json:"name" gorm:"uniqueIndex;size:100;not null"`
KbID string `json:"kb_id,omitempty" gorm:"column:kb_id;not null"`
ParentID *uint `json:"parent_id" gorm:"column:parent_id"`
Position float64 `json:"position"`
AuthIDs pq.Int64Array `json:"auth_ids" gorm:"type:int[]"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
SyncId string `json:"sync_id"`
SyncParentId string `json:"sync_parent_id"`
SourceType consts.SourceType `json:"source_type" gorm:"column:source_type;not null"`
// 关联字段
Parent *AuthGroup `json:"parent,omitempty" gorm:"-"`
Children []AuthGroup `json:"children,omitempty" gorm:"-"`
}
func (AuthGroup) TableName() string {
return "auth_groups"
}
type AuthConfig struct {
ID uint `gorm:"primaryKey;column:id"` // Unique identifier for the authentication configuration
KbID string `gorm:"column:kb_id;not null" json:"kb_id"`
AuthSetting AuthSetting `gorm:"type:jsonb" json:"auth_setting"`
SourceType consts.SourceType `gorm:"column:source_type;not null;unique"` // Unique type of authentication source (e.g., "github", "google")
CreatedAt time.Time `gorm:"column:created_at;not null;default:now()"` // Timestamp when the record was created
UpdatedAt time.Time `gorm:"column:updated_at;not null;default:now()"` // Timestamp when the record was last updated
}
func (s *AuthSetting) Scan(value any) error {
bytes, ok := value.([]byte)
if !ok {
return errors.New(fmt.Sprint("invalid AuthSetting type:", value))
}
return json.Unmarshal(bytes, s)
}
func (s AuthSetting) Value() (driver.Value, error) {
return json.Marshal(s)
}
func (AuthConfig) TableName() string {
return "auth_configs"
}
type AuthSetting struct {
ClientID string `json:"client_id,omitempty"`
ClientSecret string `json:"client_secret,omitempty"`
Proxy string `json:"proxy,omitempty"`
}
type AuthInfo struct {
ID uint `gorm:"column:id" json:"id,omitempty"`
AuthUserInfo AuthUserInfo `json:"auth_user_info" gorm:"type:jsonb"`
}
type AuthUserInfo struct {
Username string `json:"username,omitempty"`
AvatarUrl string `json:"avatar_url,omitempty"`
Email string `json:"email,omitempty"`
}
func (s *AuthUserInfo) Scan(value any) error {
bytes, ok := value.([]byte)
if !ok {
return errors.New(fmt.Sprint("invalid user info type:", value))
}
return json.Unmarshal(bytes, s)
}
func (s *AuthUserInfo) Value() (driver.Value, error) {
return json.Marshal(s)
}
func GetAuthID(c echo.Context) uint {
userId, ok := c.Get("user_id").(uint)
if !ok {
return 0
}
return userId
}