generated from pkg/go-template
Merge remote-tracking branch 'origin/master'
# Conflicts: # go.mod # go.sum
This commit is contained in:
@@ -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)
|
||||
}
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
+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()
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user