Merge remote-tracking branch 'origin/master'

# Conflicts:
#	go.mod
#	go.sum
This commit is contained in:
2022-01-12 15:25:05 +08:00
19 changed files with 547 additions and 160 deletions
+31
View File
@@ -0,0 +1,31 @@
package user
import (
"git.icechen.cn/monorepo/backend/pkg/proto/zeus/lark"
"git.icechen.cn/monorepo/backend/pkg/rpc"
"github.com/gofiber/fiber/v2"
ctxLogger "github.com/luizsuper/ctxLoggers"
"go.uber.org/zap"
)
var ErrorUser = fiber.NewError(0, "错误")
func LoginHandle(c *fiber.Ctx) error {
var p = struct {
Code string `json:"code"`
}{}
err := c.BodyParser(&p)
if err != nil {
return err
}
response, err := lark.NewUserClient(rpc.GetServiceConn("lark")).Login(c.Context(), &lark.LoginRequest{
Code: p.Code,
})
if err != nil {
return err
}
ctxLogger.FInfo(c, "response", zap.Any("resp", response))
return c.JSON(response)
}
+58 -5
View File
@@ -1,11 +1,64 @@
package main
import "github.com/gofiber/fiber/v2"
import (
"encoding/json"
"git.icechen.cn/monorepo/backend/app/zeus/api/lark/internal/user"
"github.com/gofiber/fiber/v2"
ctxLogger "github.com/luizsuper/ctxLoggers"
)
func main() {
router := fiber.New()
router.Get("/user", func(ctx *fiber.Ctx) error {
return ctx.SendString("user")
router := fiber.New(fiber.Config{
AppName: "api-lark",
ErrorHandler: middlewareError,
})
// router.Use(middlewareResp)
userRouter := router.Group("/user")
userRouter.Post("/login", user.LoginHandle)
err := router.Listen(":8080")
if err != nil {
ctxLogger.Error(nil, err.Error())
}
}
func middlewareResp(c *fiber.Ctx) error {
err := c.Next()
if err != nil {
return err
}
resp := Response{
Code: 0,
Message: "",
Data: c.Response().Body(),
}
return c.JSON(resp)
}
type Response struct {
Code int `json:"code"`
Message string `json:"message"`
Data json.RawMessage `json:"data"`
}
func middlewareError(ctx *fiber.Ctx, err error) error {
code := fiber.StatusInternalServerError
msg := ""
if e, ok := err.(*fiber.Error); ok {
code = e.Code
msg = e.Message
}
if err != nil {
msg = err.Error()
}
return ctx.Status(code).JSON(Response{
Code: code,
Message: msg,
Data: nil,
})
router.Listen(":8080")
}
+20
View File
@@ -0,0 +1,20 @@
package lark
import (
"context"
"github.com/larksuite/oapi-sdk-go/core"
im "github.com/larksuite/oapi-sdk-go/service/im/v1"
)
func (l Lark) SendMessage(code string) error {
coreCtx := core.WrapContext(context.Background())
reqCall := l.imService.Messages.Create(coreCtx, &im.MessageCreateReqBody{
ReceiveId: "ou_a11d2bcc7d852afbcaf37e5b3ad01f7e",
Content: `{"text":"<at user_id="ou_a11d2bcc7d852afbcaf37e5b3ad01f7e">Tom</at> test content"}`,
MsgType: "text",
})
reqCall.SetReceiveIdType("user_id")
_, err := reqCall.Do()
return err
}
+13 -16
View File
@@ -1,31 +1,28 @@
package lark
import (
"context"
cfg "git.icechen.cn/monorepo/backend/app/zeus/service/lark/internal/config"
"github.com/larksuite/oapi-sdk-go/core"
"github.com/larksuite/oapi-sdk-go/core/config"
authen "github.com/larksuite/oapi-sdk-go/service/authen/v1"
im "github.com/larksuite/oapi-sdk-go/service/im/v1"
)
type Lark struct {
conf *config.Config
conf *config.Config
userService *authen.Service
imService *im.Service
}
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 || lark.userService == nil {
appSettings := core.NewInternalAppSettings(
core.SetAppCredentials(cfg.Config.LarkAppID, cfg.Config.LarkAppSecret))
lark.conf = core.NewConfig(core.DomainFeiShu, appSettings, core.SetLoggerLevel(core.LoggerLevelError))
lark.userService = authen.NewService(lark.conf)
lark.imService = im.NewService(lark.conf)
}
}
func (l Lark) Auth(code string) (*authen.UserAccessTokenInfo, error) {
s := authen.NewService(l.conf)
return s.Authens.AccessToken(core.WrapContext(context.Background()), &authen.AuthenAccessTokenReqBody{
GrantType: "",
Code: code,
}).Do()
return lark
}
@@ -0,0 +1,14 @@
package lark
import (
"context"
"github.com/larksuite/oapi-sdk-go/core"
authen "github.com/larksuite/oapi-sdk-go/service/authen/v1"
)
func (l Lark) Auth(code string) (*authen.UserAccessTokenInfo, error) {
return l.userService.Authens.AccessToken(core.WrapContext(context.Background()), &authen.AuthenAccessTokenReqBody{
GrantType: "",
Code: code,
}).Do()
}
@@ -0,0 +1,12 @@
package model
import (
"git.icechen.cn/monorepo/backend/pkg/orm"
)
func init() {
err := orm.DB.AutoMigrate(&UserInfo{})
if err != nil {
panic(err)
}
}
@@ -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
}
@@ -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)
}
+2 -2
View File
@@ -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()
}
-14
View File
@@ -1,14 +0,0 @@
package model
import (
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
err := db.AutoMigrate(&UserInfo{})
if err != nil {
panic(err)
}
}