120 lines
4.3 KiB
Go
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
|
|
}
|