generated from pkg/go-template
This commit is contained in:
@@ -12,14 +12,15 @@ type Lark struct {
|
||||
conf *config.Config
|
||||
}
|
||||
|
||||
func NewLark() Lark {
|
||||
appSettings := core.NewInternalAppSettings(
|
||||
core.SetAppCredentials(cfg.Config.LarkAppID, cfg.Config.LarkAppSecret))
|
||||
conf := core.NewConfig(core.DomainFeiShu, appSettings, core.SetLoggerLevel(core.LoggerLevelError))
|
||||
var lark Lark
|
||||
|
||||
return Lark{
|
||||
conf: conf,
|
||||
func Client() Lark {
|
||||
if lark.conf == nil {
|
||||
appSettings := core.NewInternalAppSettings(
|
||||
core.SetAppCredentials(cfg.Config.LarkAppID, cfg.Config.LarkAppSecret))
|
||||
lark.conf = core.NewConfig(core.DomainFeiShu, appSettings, core.SetLoggerLevel(core.LoggerLevelError))
|
||||
}
|
||||
return lark
|
||||
}
|
||||
|
||||
func (l Lark) Auth(code string) (*authen.UserAccessTokenInfo, error) {
|
||||
|
||||
+19
-5
@@ -1,6 +1,9 @@
|
||||
package model
|
||||
|
||||
import "gorm.io/gorm"
|
||||
import (
|
||||
"git.icechen.cn/monorepo/backend/pkg/orm"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type UserInfo struct {
|
||||
gorm.Model
|
||||
@@ -13,11 +16,11 @@ type UserInfo struct {
|
||||
AvatarThumb string `json:"avatar_thumb,omitempty" gorm:"avatar_thumb"`
|
||||
AvatarMiddle string `json:"avatar_middle,omitempty" gorm:"avatar_middle"`
|
||||
AvatarBig string `json:"avatar_big,omitempty" gorm:"avatar_big"`
|
||||
OpenId string `json:"open_id,omitempty" gorm:"open_id"`
|
||||
UnionId string `json:"union_id,omitempty" gorm:"union_id"`
|
||||
Email string `json:"email,omitempty" gorm:"email"`
|
||||
OpenId string `json:"open_id,omitempty" gorm:"open_id;uniqueIndex"`
|
||||
UnionId string `json:"union_id,omitempty" gorm:"union_id;uniqueIndex"`
|
||||
Email string `json:"email,omitempty" gorm:"email;uniqueIndex"`
|
||||
UserId string `json:"user_id,omitempty" gorm:"user_id"`
|
||||
Mobile string `json:"mobile,omitempty" gorm:"mobile"`
|
||||
Mobile string `json:"mobile,omitempty" gorm:"mobile;uniqueIndex"`
|
||||
TenantKey string `json:"tenant_key,omitempty" gorm:"tenant_key"`
|
||||
RefreshExpiresIn int `json:"refresh_expires_in,omitempty" gorm:"refresh_expires_in"`
|
||||
RefreshToken string `json:"refresh_token,omitempty" gorm:"refresh_token"`
|
||||
@@ -26,3 +29,14 @@ type UserInfo struct {
|
||||
func (UserInfo) TableName() string {
|
||||
return "user_info"
|
||||
}
|
||||
|
||||
// CreateUser 创建用户
|
||||
func CreateUser(user *UserInfo) error {
|
||||
return orm.DB.Where("open_id = ?", user.OpenId).Assign(user).FirstOrCreate(user).Error
|
||||
}
|
||||
|
||||
// GetUserByID 根据ID获取用户信息
|
||||
func GetUserByID(userID uint) (info UserInfo, err error) {
|
||||
err = orm.DB.First(&info, userID).Error
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"git.icechen.cn/monorepo/backend/pkg/orm"
|
||||
"github.com/gofiber/fiber/v2/utils"
|
||||
"gorm.io/gorm"
|
||||
"time"
|
||||
)
|
||||
|
||||
// TokenEffectiveTime token有效时长
|
||||
const TokenEffectiveTime = time.Hour * 2
|
||||
|
||||
type UserToken struct {
|
||||
gorm.Model
|
||||
Token string `json:"token" gorm:"token;uniqueIndex"`
|
||||
ExpiresTime time.Time `json:"expires_time" gorm:"expires_time"`
|
||||
UserInfoID uint `json:"user_info_id" gorm:"user_info_id"`
|
||||
}
|
||||
|
||||
func (UserToken) TableName() string {
|
||||
return "user_token"
|
||||
}
|
||||
|
||||
// CreateToken 创建Token
|
||||
func CreateToken(userInfoID uint) (string, error) {
|
||||
userToken := UserToken{
|
||||
Token: genToken(),
|
||||
ExpiresTime: time.Now().Add(TokenEffectiveTime),
|
||||
UserInfoID: userInfoID,
|
||||
}
|
||||
err := orm.DB.Where("user_info_id = ?", userInfoID).
|
||||
Assign(UserToken{UserInfoID: userInfoID}).
|
||||
FirstOrCreate(&userToken).Error
|
||||
return userToken.Token, err
|
||||
}
|
||||
|
||||
func genToken() string {
|
||||
return utils.UUIDv4()
|
||||
}
|
||||
|
||||
// GetToken 根据token获取token对象
|
||||
func GetToken(token string) (UserToken, error) {
|
||||
userToken := UserToken{}
|
||||
err := orm.DB.Where("token = ? AND expires_time < ?", token, time.Now()).
|
||||
First(&userToken).Error
|
||||
return userToken, err
|
||||
}
|
||||
+2
-20
@@ -1,7 +1,6 @@
|
||||
package lark
|
||||
package server
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"google.golang.org/grpc/keepalive"
|
||||
"log"
|
||||
@@ -9,7 +8,6 @@ import (
|
||||
"time"
|
||||
|
||||
"git.icechen.cn/monorepo/backend/pkg/proto/zeus/lark"
|
||||
"github.com/jinzhu/copier"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/reflection"
|
||||
)
|
||||
@@ -23,7 +21,7 @@ func RpcServer() {
|
||||
s := grpc.NewServer(grpc.KeepaliveParams(keepalive.ServerParameters{
|
||||
MaxConnectionIdle: 5 * time.Minute,
|
||||
}))
|
||||
lark.RegisterUserServer(s, &Server{})
|
||||
lark.RegisterUserServer(s, &UserServer{})
|
||||
|
||||
reflection.Register(s)
|
||||
|
||||
@@ -32,19 +30,3 @@ func RpcServer() {
|
||||
log.Fatalf("failed to serve: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
type Server struct{}
|
||||
|
||||
func (s Server) Login(ctx context.Context, in *lark.LoginRequest) (*lark.LoginResponse, error) {
|
||||
userInfo, err := NewLark().Auth(in.Code)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp := new(lark.LoginResponse)
|
||||
err = copier.Copy(resp, userInfo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"context"
|
||||
lark2 "git.icechen.cn/monorepo/backend/app/zeus/service/lark/internal/lark"
|
||||
"git.icechen.cn/monorepo/backend/app/zeus/service/lark/internal/model"
|
||||
"git.icechen.cn/monorepo/backend/pkg/proto/zeus/lark"
|
||||
"github.com/jinzhu/copier"
|
||||
)
|
||||
|
||||
type UserServer struct{}
|
||||
|
||||
func (s UserServer) Login(ctx context.Context, in *lark.LoginRequest) (*lark.LoginResponse, error) {
|
||||
userInfo, err := lark2.Client().Auth(in.Code)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// userInfo to db
|
||||
user := model.UserInfo{}
|
||||
err = copier.Copy(&user, userInfo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = model.CreateUser(&user)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// gen token
|
||||
token, err := model.CreateToken(user.ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// return token
|
||||
resp := &lark.LoginResponse{
|
||||
Token: token,
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (s UserServer) Info(ctx context.Context, in *lark.InfoRequest) (*lark.InfoResponse, error) {
|
||||
// token to user info
|
||||
_ = in.Token
|
||||
info, err := getUserByToken(in.Token)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp := new(lark.InfoResponse)
|
||||
err = copier.Copy(resp, info)
|
||||
return resp, err
|
||||
}
|
||||
|
||||
func getUserByToken(token string) (model.UserInfo, error) {
|
||||
userToken, err := model.GetToken(token)
|
||||
if err != nil {
|
||||
return model.UserInfo{}, err
|
||||
}
|
||||
|
||||
return model.GetUserByID(userToken.UserInfoID)
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"git.icechen.cn/monorepo/backend/app/zeus/service/lark/internal/lark"
|
||||
"git.icechen.cn/monorepo/backend/app/zeus/service/lark/internal/server"
|
||||
)
|
||||
|
||||
func main() {
|
||||
lark.RpcServer()
|
||||
server.RpcServer()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user