geoGo/internal/biz/auth.go

76 lines
1.8 KiB
Go

package biz
import (
"context"
"geo/internal/config"
"geo/internal/data/impl"
"geo/internal/data/model"
"geo/tmpl/errcode"
"xorm.io/builder"
)
type AuthBiz struct {
cfg *config.Config
userImpl *impl.UserImpl
tokenImpl *impl.TokenImpl
}
func NewAuthBiz(
cfg *config.Config,
tokenImpl *impl.TokenImpl,
userImpl *impl.UserImpl,
) *AuthBiz {
return &AuthBiz{
cfg: cfg,
tokenImpl: tokenImpl,
userImpl: userImpl,
}
}
func (a *AuthBiz) ValidateAccessToken(ctx context.Context, accessToken string) (*model.Token, error) {
cond := builder.NewCond().
And(builder.Eq{"access_token": accessToken}).
And(builder.Eq{"status": 1})
tokenInfo := &model.Token{}
err := a.tokenImpl.GetOneBySearchStruct(ctx, &cond, tokenInfo)
if err != nil {
return nil, errcode.Forbidden("密钥无效或已禁用")
}
if tokenInfo.ID == 0 {
return nil, errcode.Forbidden("密钥无效或已禁用")
}
return tokenInfo, nil
}
func (a *AuthBiz) UserValid(ctx context.Context, userIndex string, tokenId int32) (*model.User, error) {
cond := builder.NewCond().
And(builder.Eq{"user_index": userIndex}).
And(builder.Eq{"status": 1})
if tokenId != 0 {
cond.And(builder.Eq{"tokenId": tokenId})
}
userInfo := &model.User{}
err := a.userImpl.GetOneBySearchStruct(ctx, &cond, userInfo)
if err != nil {
return nil, errcode.Forbidden("未找到用户")
}
if userInfo.ID == 0 {
return nil, errcode.Forbidden("未找到用户")
}
return userInfo, nil
}
func (a *AuthBiz) UserAndTokenValid(ctx context.Context, accessToken, userIndex string) (*model.User, *model.Token, error) {
tokenInfo, err := a.ValidateAccessToken(ctx, accessToken)
if err != nil {
return nil, nil, err
}
userInfo, err := a.UserValid(ctx, userIndex, tokenInfo.ID)
if err != nil {
return nil, nil, err
}
return userInfo, tokenInfo, err
}