chore: golint

This commit is contained in:
王性驊 2025-02-28 15:28:31 +08:00
parent dbdc777ed4
commit dbe6b16dce
26 changed files with 322 additions and 273 deletions

View File

@ -117,13 +117,13 @@ issues:
- gocognit - gocognit
- contextcheck - contextcheck
exclude-dirs: # exclude-dirs:
- internal/logic # - internal/logic
exclude-files: exclude-files:
- .*_test.go - .*_test.go
- permission_tree.go # - permission_tree.go
- role_permission.go # - role_permission.go

View File

@ -19,10 +19,16 @@ message AuthorizationReq {
string scope = 3; string scope = 3;
// data key-value // data key-value
map<string,string> data = 4; map<string,string> data = 4;
// expires
int32 expires = 5;
// is_refresh_token // is_refresh_token
bool is_refresh_token = 6; bool is_refresh_token = 5;
// token uid
string uid =6;
// token account
string account = 7;
// expires (unixnamo utc )
optional int64 expires = 8;
// expires (unixnamo utc )
optional int64 refreshExpire = 9;
} }
// TokenResp // TokenResp
@ -32,24 +38,14 @@ message TokenResp {
// token_type // token_type
string token_type = 2; string token_type = 2;
// expires_in // expires_in
int32 expires_in = 3; int64 expires_in = 3;
// refresh_token // refresh_token
string refresh_token = 4; string refresh_token = 4;
} }
// CreateOneTimeTokenReq 使 token,
// token
message CreateOneTimeTokenReq {
string token = 1;
}
message CreateOneTimeTokenResp {
string one_time_token = 1;
}
// RefreshTokenReq Token // RefreshTokenReq Token
message RefreshTokenReq { message RefreshTokenReq {
string token = 1; string token = 1; // refresh token
string scope = 2; string scope = 2;
int64 expires = 3; int64 expires = 3;
string device_id = 4; string device_id = 4;
@ -95,7 +91,7 @@ message Token {
// ID // ID
string id = 1; string id = 1;
// client_id ID // client_id ID
int32 client_id = 2; int64 client_id = 2;
// uid ID // uid ID
string uid = 3; string uid = 3;
// device_id ID // device_id ID
@ -103,13 +99,13 @@ message Token {
// access_token // access_token
string access_token = 5; string access_token = 5;
// expires_in // expires_in
int32 expires_in = 6; int64 expires_in = 6;
// access_create_at // access_create_at
int64 access_create_at = 7; int64 access_create_at = 7;
// refresh_token // refresh_token
string refresh_token = 8; string refresh_token = 8;
// refresh_expires_in // refresh_expires_in
int32 refresh_expires_in = 9; int64 refresh_expires_in = 9;
// refresh_create_at // refresh_create_at
int64 refresh_create_at = 10; int64 refresh_create_at = 10;
} }
@ -123,10 +119,6 @@ message Tokens{
repeated TokenResp token = 1; repeated TokenResp token = 1;
} }
message CancelOneTimeTokenReq {
repeated string token = 1;
}
// Token // Token
// Biz GW // Biz GW
// access_token -> token , refresh_token -> one_time_token // access_token -> token , refresh_token -> one_time_token
@ -141,14 +133,10 @@ service TokenService {
rpc ValidationToken(ValidationTokenReq) returns(ValidationTokenResp); rpc ValidationToken(ValidationTokenReq) returns(ValidationTokenResp);
// CancelTokens Token UID token id UID Device ID Token ID UID + Device // CancelTokens Token UID token id UID Device ID Token ID UID + Device
rpc CancelTokens(DoTokenByUIDReq) returns(OKResp); rpc CancelTokens(DoTokenByUIDReq) returns(OKResp);
// CancelTokenByDeviceId Token Device Device token Device token // CancelTokenByDeviceID Token Device Device token Device token
rpc CancelTokenByDeviceId(DoTokenByDeviceIDReq) returns(OKResp); rpc CancelTokenByDeviceID(DoTokenByDeviceIDReq) returns(OKResp);
// GetUserTokensByDeviceId DeviceID Tokens // GetUserTokensByDeviceID DeviceID Tokens
rpc GetUserTokensByDeviceId(DoTokenByDeviceIDReq) returns(Tokens); rpc GetUserTokensByDeviceID(DoTokenByDeviceIDReq) returns(Tokens);
// GetUserTokensByUid UID Tokens // GetUserTokensByUID UID Tokens
rpc GetUserTokensByUid(QueryTokenByUIDReq) returns(Tokens); rpc GetUserTokensByUID(QueryTokenByUIDReq) returns(Tokens);
// NewOneTimeToken 使RefreshToken
rpc NewOneTimeToken(CreateOneTimeTokenReq) returns(CreateOneTimeTokenResp);
// CancelOneTimeToken 使
rpc CancelOneTimeToken(CancelOneTimeTokenReq) returns(OKResp);
} }

View File

@ -1,7 +1,21 @@
package config package config
import "github.com/zeromicro/go-zero/zrpc" import (
"time"
"github.com/zeromicro/go-zero/core/stores/redis"
"github.com/zeromicro/go-zero/zrpc"
)
type Config struct { type Config struct {
zrpc.RpcServerConf zrpc.RpcServerConf
// Redis Cluster
RedisCluster redis.RedisConf
Token struct {
RefreshExpires time.Duration
Expired time.Duration
Secret string
}
} }

View File

@ -1,31 +0,0 @@
package tokenservicelogic
import (
"context"
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type CancelOneTimeTokenLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewCancelOneTimeTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CancelOneTimeTokenLogic {
return &CancelOneTimeTokenLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
// CancelOneTimeToken 取消一次性使用
func (l *CancelOneTimeTokenLogic) CancelOneTimeToken(in *permission.CancelOneTimeTokenReq) (*permission.OKResp, error) {
// todo: add your logic here and delete this line
return &permission.OKResp{}, nil
}

View File

@ -9,23 +9,26 @@ import (
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
type CancelTokenByDeviceIdLogic struct { type CancelTokenByDeviceIDLogic struct {
ctx context.Context ctx context.Context
svcCtx *svc.ServiceContext svcCtx *svc.ServiceContext
logx.Logger logx.Logger
} }
func NewCancelTokenByDeviceIdLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CancelTokenByDeviceIdLogic { func NewCancelTokenByDeviceIDLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CancelTokenByDeviceIDLogic {
return &CancelTokenByDeviceIdLogic{ return &CancelTokenByDeviceIDLogic{
ctx: ctx, ctx: ctx,
svcCtx: svcCtx, svcCtx: svcCtx,
Logger: logx.WithContext(ctx), Logger: logx.WithContext(ctx),
} }
} }
// CancelTokenByDeviceId 取消 Token 從 Device 視角出發可以選登出這個Device 下所有 token 登出這個Device 下指定token // CancelTokenByDeviceID 取消 Token 從 Device 視角出發可以選登出這個Device 下所有 token 登出這個Device 下指定token
func (l *CancelTokenByDeviceIdLogic) CancelTokenByDeviceId(in *permission.DoTokenByDeviceIDReq) (*permission.OKResp, error) { func (l *CancelTokenByDeviceIDLogic) CancelTokenByDeviceID(in *permission.DoTokenByDeviceIDReq) (*permission.OKResp, error) {
// todo: add your logic here and delete this line err := l.svcCtx.TokenUseCase.RevokeTokensByDeviceID(l.ctx, in.GetDeviceId())
if err != nil {
return nil, err
}
return &permission.OKResp{}, nil return &permission.OKResp{}, nil
} }

View File

@ -3,6 +3,8 @@ package tokenservicelogic
import ( import (
"context" "context"
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/usecase"
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission" "code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc" "code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
@ -25,7 +27,12 @@ func NewCancelTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Cance
// CancelToken 取消 Token也包含他裡面的 One Time Toke // CancelToken 取消 Token也包含他裡面的 One Time Toke
func (l *CancelTokenLogic) CancelToken(in *permission.CancelTokenReq) (*permission.OKResp, error) { func (l *CancelTokenLogic) CancelToken(in *permission.CancelTokenReq) (*permission.OKResp, error) {
// todo: add your logic here and delete this line err := l.svcCtx.TokenUseCase.RevokeToken(l.ctx, usecase.TokenRequest{
Token: in.GetToken(),
})
if err != nil {
return nil, err
}
return &permission.OKResp{}, nil return &permission.OKResp{}, nil
} }

View File

@ -3,6 +3,8 @@ package tokenservicelogic
import ( import (
"context" "context"
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/usecase"
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission" "code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc" "code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
@ -25,7 +27,19 @@ func NewCancelTokensLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Canc
// CancelTokens 取消 Token 從UID 視角,以及 token id 視角出發, UID 登出,底下所有 Device ID 也要登出, Token ID 登出, 所有 UID + Device 都要登出 // CancelTokens 取消 Token 從UID 視角,以及 token id 視角出發, UID 登出,底下所有 Device ID 也要登出, Token ID 登出, 所有 UID + Device 都要登出
func (l *CancelTokensLogic) CancelTokens(in *permission.DoTokenByUIDReq) (*permission.OKResp, error) { func (l *CancelTokensLogic) CancelTokens(in *permission.DoTokenByUIDReq) (*permission.OKResp, error) {
// todo: add your logic here and delete this line req := usecase.RevokeTokensByUIDRequest{}
if in.GetUid() != "" {
req.UID = in.GetUid()
}
if len(in.GetIds()) > 0 {
req.IDs = in.GetIds()
}
err := l.svcCtx.TokenUseCase.RevokeTokensByUID(l.ctx, req)
if err != nil {
return nil, err
}
return &permission.OKResp{}, nil return &permission.OKResp{}, nil
} }

View File

@ -0,0 +1,49 @@
package tokenservicelogic
import (
"context"
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/token"
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type GetUserTokensByDeviceIDLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewGetUserTokensByDeviceIDLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserTokensByDeviceIDLogic {
return &GetUserTokensByDeviceIDLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
// GetUserTokensByDeviceID 取得目前所對應的 DeviceID 所存在的 Tokens
func (l *GetUserTokensByDeviceIDLogic) GetUserTokensByDeviceID(in *permission.DoTokenByDeviceIDReq) (*permission.Tokens, error) {
id, err := l.svcCtx.TokenUseCase.GetUserTokensByDeviceID(l.ctx, in.GetDeviceId())
if err != nil {
return nil, err
}
tokenType := token.Bearer
result := make([]*permission.TokenResp, 0, len(id))
for _, v := range id {
result = append(result, &permission.TokenResp{
AccessToken: v.AccessToken,
ExpiresIn: v.ExpiresIn,
RefreshToken: v.RefreshToken,
TokenType: tokenType.ToString(),
})
}
return &permission.Tokens{
Token: result,
}, nil
}

View File

@ -1,31 +0,0 @@
package tokenservicelogic
import (
"context"
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type GetUserTokensByDeviceIdLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewGetUserTokensByDeviceIdLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserTokensByDeviceIdLogic {
return &GetUserTokensByDeviceIdLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
// GetUserTokensByDeviceId 取得目前所對應的 DeviceID 所存在的 Tokens
func (l *GetUserTokensByDeviceIdLogic) GetUserTokensByDeviceId(in *permission.DoTokenByDeviceIDReq) (*permission.Tokens, error) {
// todo: add your logic here and delete this line
return &permission.Tokens{}, nil
}

View File

@ -0,0 +1,50 @@
package tokenservicelogic
import (
"context"
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/token"
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type GetUserTokensByUIDLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewGetUserTokensByUIDLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserTokensByUIDLogic {
return &GetUserTokensByUIDLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
// GetUserTokensByUid 取得目前所對應的 UID 所存在的 Tokens
func (l *GetUserTokensByUIDLogic) GetUserTokensByUID(in *permission.QueryTokenByUIDReq) (*permission.Tokens, error) {
uid, err := l.svcCtx.TokenUseCase.GetUserTokensByUID(l.ctx, in.GetUid())
if err != nil {
return nil, err
}
tokenType := token.Bearer
result := make([]*permission.TokenResp, 0, len(uid))
for _, v := range uid {
result = append(result, &permission.TokenResp{
AccessToken: v.AccessToken,
ExpiresIn: v.ExpiresIn,
RefreshToken: v.RefreshToken,
TokenType: tokenType.ToString(),
})
}
return &permission.Tokens{
Token: result,
}, nil
}

View File

@ -1,31 +0,0 @@
package tokenservicelogic
import (
"context"
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type GetUserTokensByUidLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewGetUserTokensByUidLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserTokensByUidLogic {
return &GetUserTokensByUidLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
// GetUserTokensByUid 取得目前所對應的 UID 所存在的 Tokens
func (l *GetUserTokensByUidLogic) GetUserTokensByUid(in *permission.QueryTokenByUIDReq) (*permission.Tokens, error) {
// todo: add your logic here and delete this line
return &permission.Tokens{}, nil
}

View File

@ -1,31 +0,0 @@
package tokenservicelogic
import (
"context"
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type NewOneTimeTokenLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewNewOneTimeTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *NewOneTimeTokenLogic {
return &NewOneTimeTokenLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
// NewOneTimeToken 建立一次性使用例如RefreshToken
func (l *NewOneTimeTokenLogic) NewOneTimeToken(in *permission.CreateOneTimeTokenReq) (*permission.CreateOneTimeTokenResp, error) {
// todo: add your logic here and delete this line
return &permission.CreateOneTimeTokenResp{}, nil
}

View File

@ -2,9 +2,12 @@ package tokenservicelogic
import ( import (
"context" "context"
"time"
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission" "code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc" "code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/token"
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/usecase"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -25,7 +28,42 @@ func NewNewTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *NewToken
// NewToken 建立一個新的 Token例如AccessToken // NewToken 建立一個新的 Token例如AccessToken
func (l *NewTokenLogic) NewToken(in *permission.AuthorizationReq) (*permission.TokenResp, error) { func (l *NewTokenLogic) NewToken(in *permission.AuthorizationReq) (*permission.TokenResp, error) {
// todo: add your logic here and delete this line tokenType := token.Bearer
// TODO 要去拿 talbe
role := "user"
return &permission.TokenResp{}, nil var expired, refreshExpired int64
if in.GetExpires() > 0 {
expired = in.GetExpires()
} else {
expired = time.Now().UTC().Add(l.svcCtx.Config.Token.Expired).UnixNano()
}
if in.GetRefreshExpire() > 0 {
refreshExpired = in.GetRefreshExpire()
} else {
refreshExpired = time.Now().UTC().Add(l.svcCtx.Config.Token.RefreshExpires).UnixNano()
}
t, err := l.svcCtx.TokenUseCase.GenerateAccessToken(l.ctx, usecase.GenerateTokenRequest{
TokenType: tokenType.ToString(),
DeviceID: in.GetDeviceId(),
Scope: in.GetScope(),
Expires: expired,
RefreshExpires: refreshExpired,
Role: role,
Account: in.GetAccount(),
UID: in.GetUid(),
Data: in.Data,
})
if err != nil {
return nil, err
}
return &permission.TokenResp{
AccessToken: t.AccessToken,
RefreshToken: t.RefreshToken,
ExpiresIn: t.ExpiresIn,
TokenType: tokenType.ToString(),
}, nil
} }

View File

@ -2,6 +2,10 @@ package tokenservicelogic
import ( import (
"context" "context"
"time"
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/token"
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/usecase"
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission" "code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc" "code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
@ -25,7 +29,31 @@ func NewRefreshTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Refr
// RefreshToken 更新目前的token 以及裡面包含的一次性 Token // RefreshToken 更新目前的token 以及裡面包含的一次性 Token
func (l *RefreshTokenLogic) RefreshToken(in *permission.RefreshTokenReq) (*permission.RefreshTokenResp, error) { func (l *RefreshTokenLogic) RefreshToken(in *permission.RefreshTokenReq) (*permission.RefreshTokenResp, error) {
// todo: add your logic here and delete this line tokenType := token.Bearer
var expired int64
if in.GetExpires() > 0 {
expired = in.GetExpires()
} else {
expired = time.Now().UTC().Add(l.svcCtx.Config.Token.Expired).UnixNano()
}
return &permission.RefreshTokenResp{}, nil refreshExpired := time.Now().UTC().Add(l.svcCtx.Config.Token.RefreshExpires).UnixNano()
t, err := l.svcCtx.TokenUseCase.RefreshAccessToken(l.ctx, usecase.RefreshTokenRequest{
Token: in.GetToken(), // refresh token
Scope: in.GetScope(),
Expires: expired,
RefreshExpires: refreshExpired,
DeviceID: in.GetDeviceId(),
})
if err != nil {
return nil, err
}
return &permission.RefreshTokenResp{
Token: t.AccessToken,
OneTimeToken: t.RefreshToken,
ExpiresIn: t.ExpiresIn,
TokenType: tokenType.ToString(),
}, nil
} }

View File

@ -5,6 +5,7 @@ import (
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission" "code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc" "code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/usecase"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -25,7 +26,25 @@ func NewValidationTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *V
// ValidationToken 驗證這個 Token 有沒有效 // ValidationToken 驗證這個 Token 有沒有效
func (l *ValidationTokenLogic) ValidationToken(in *permission.ValidationTokenReq) (*permission.ValidationTokenResp, error) { func (l *ValidationTokenLogic) ValidationToken(in *permission.ValidationTokenReq) (*permission.ValidationTokenResp, error) {
// todo: add your logic here and delete this line token, err := l.svcCtx.TokenUseCase.VerifyToken(l.ctx, usecase.TokenRequest{
Token: in.GetToken(),
})
if err != nil {
return nil, err
}
return &permission.ValidationTokenResp{}, nil return &permission.ValidationTokenResp{
Token: &permission.Token{
Id: token.Token.ID,
ClientId: 1,
DeviceId: token.Token.DeviceID,
AccessToken: token.Token.AccessToken,
ExpiresIn: token.Token.ExpiresIn,
AccessCreateAt: token.Token.AccessCreateAt,
RefreshToken: token.Token.RefreshToken,
RefreshExpiresIn: token.Token.RefreshExpiresIn,
RefreshCreateAt: token.Token.RefreshCreateAt,
},
Data: token.Data,
}, nil
} }

View File

@ -7,9 +7,8 @@ package server
import ( import (
"context" "context"
tokenservicelogic "code.30cm.net/digimon/app-cloudep-permission-server/internal/logic/tokenservice"
"code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission" "code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission"
tokenservicelogic "code.30cm.net/digimon/app-cloudep-permission-server/internal/logic/tokenservice"
"code.30cm.net/digimon/app-cloudep-permission-server/internal/svc" "code.30cm.net/digimon/app-cloudep-permission-server/internal/svc"
) )
@ -54,32 +53,20 @@ func (s *TokenServiceServer) CancelTokens(ctx context.Context, in *permission.Do
return l.CancelTokens(in) return l.CancelTokens(in)
} }
// CancelTokenByDeviceId 取消 Token 從 Device 視角出發可以選登出這個Device 下所有 token 登出這個Device 下指定token // CancelTokenByDeviceID 取消 Token 從 Device 視角出發可以選登出這個Device 下所有 token 登出這個Device 下指定token
func (s *TokenServiceServer) CancelTokenByDeviceId(ctx context.Context, in *permission.DoTokenByDeviceIDReq) (*permission.OKResp, error) { func (s *TokenServiceServer) CancelTokenByDeviceID(ctx context.Context, in *permission.DoTokenByDeviceIDReq) (*permission.OKResp, error) {
l := tokenservicelogic.NewCancelTokenByDeviceIdLogic(ctx, s.svcCtx) l := tokenservicelogic.NewCancelTokenByDeviceIDLogic(ctx, s.svcCtx)
return l.CancelTokenByDeviceId(in) return l.CancelTokenByDeviceID(in)
} }
// GetUserTokensByDeviceId 取得目前所對應的 DeviceID 所存在的 Tokens // GetUserTokensByDeviceID 取得目前所對應的 DeviceID 所存在的 Tokens
func (s *TokenServiceServer) GetUserTokensByDeviceId(ctx context.Context, in *permission.DoTokenByDeviceIDReq) (*permission.Tokens, error) { func (s *TokenServiceServer) GetUserTokensByDeviceID(ctx context.Context, in *permission.DoTokenByDeviceIDReq) (*permission.Tokens, error) {
l := tokenservicelogic.NewGetUserTokensByDeviceIdLogic(ctx, s.svcCtx) l := tokenservicelogic.NewGetUserTokensByDeviceIDLogic(ctx, s.svcCtx)
return l.GetUserTokensByDeviceId(in) return l.GetUserTokensByDeviceID(in)
} }
// GetUserTokensByUid 取得目前所對應的 UID 所存在的 Tokens // GetUserTokensByUID 取得目前所對應的 UID 所存在的 Tokens
func (s *TokenServiceServer) GetUserTokensByUid(ctx context.Context, in *permission.QueryTokenByUIDReq) (*permission.Tokens, error) { func (s *TokenServiceServer) GetUserTokensByUID(ctx context.Context, in *permission.QueryTokenByUIDReq) (*permission.Tokens, error) {
l := tokenservicelogic.NewGetUserTokensByUidLogic(ctx, s.svcCtx) l := tokenservicelogic.NewGetUserTokensByUIDLogic(ctx, s.svcCtx)
return l.GetUserTokensByUid(in) return l.GetUserTokensByUID(in)
}
// NewOneTimeToken 建立一次性使用例如RefreshToken
func (s *TokenServiceServer) NewOneTimeToken(ctx context.Context, in *permission.CreateOneTimeTokenReq) (*permission.CreateOneTimeTokenResp, error) {
l := tokenservicelogic.NewNewOneTimeTokenLogic(ctx, s.svcCtx)
return l.NewOneTimeToken(in)
}
// CancelOneTimeToken 取消一次性使用
func (s *TokenServiceServer) CancelOneTimeToken(ctx context.Context, in *permission.CancelOneTimeTokenReq) (*permission.OKResp, error) {
l := tokenservicelogic.NewCancelOneTimeTokenLogic(ctx, s.svcCtx)
return l.CancelOneTimeToken(in)
} }

View File

@ -1,13 +1,32 @@
package svc package svc
import "code.30cm.net/digimon/app-cloudep-permission-server/internal/config" import (
"code.30cm.net/digimon/app-cloudep-permission-server/internal/config"
duc "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/usecase"
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/repository"
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/usecase"
"github.com/zeromicro/go-zero/core/stores/redis"
)
type ServiceContext struct { type ServiceContext struct {
Config config.Config Config config.Config
TokenUseCase duc.TokenUseCase
} }
func NewServiceContext(c config.Config) *ServiceContext { func NewServiceContext(c config.Config) *ServiceContext {
newRedis, err := redis.NewRedis(c.RedisCluster)
if err != nil {
panic(err)
}
repo := repository.NewTokenRepository(repository.TokenRepositoryParam{Redis: newRedis})
return &ServiceContext{ return &ServiceContext{
Config: c, Config: c,
TokenUseCase: usecase.NewTokenUseCase(usecase.TokenUseCaseParam{
TokenRepo: repo,
RefreshExpires: c.Token.RefreshExpires,
Expired: c.Token.Expired,
Secret: c.Token.Secret,
}),
} }
} }

View File

@ -11,8 +11,8 @@ type RolePermissionUseCase interface {
Create(ctx context.Context, roleID string, permissions permission.Permissions) error Create(ctx context.Context, roleID string, permissions permission.Permissions) error
Delete(ctx context.Context, roleID string, permissions permission.Permissions) error Delete(ctx context.Context, roleID string, permissions permission.Permissions) error
List(ctx context.Context, req ListQuery) (RoleResp, error) List(ctx context.Context, req ListQuery) (RoleResp, error)
//GetByRoleUID(ctx context.Context, uid string) (permission.Permissions, error) // GetByRoleUID(ctx context.Context, uid string) (permission.Permissions, error)
//GetByUser(ctx context.Context, uid string) (UserPermission, error) // GetByUser(ctx context.Context, uid string) (UserPermission, error)
} }
type UserPermission struct { type UserPermission struct {

View File

@ -43,7 +43,7 @@ func (m *MockRolePermissionRepository) EXPECT() *MockRolePermissionRepositoryMoc
} }
// Create mocks base method. // Create mocks base method.
func (m *MockRolePermissionRepository) Create(ctx context.Context, entity entity.RolePermission) error { func (m *MockRolePermissionRepository) Create(ctx context.Context, entity []entity.RolePermission) error {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Create", ctx, entity) ret := m.ctrl.Call(m, "Create", ctx, entity)
ret0, _ := ret[0].(error) ret0, _ := ret[0].(error)
@ -57,17 +57,17 @@ func (mr *MockRolePermissionRepositoryMockRecorder) Create(ctx, entity any) *gom
} }
// Delete mocks base method. // Delete mocks base method.
func (m *MockRolePermissionRepository) Delete(ctx context.Context, roleID, permission string) error { func (m *MockRolePermissionRepository) Delete(ctx context.Context, roleID string, permissions []string) error {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Delete", ctx, roleID, permission) ret := m.ctrl.Call(m, "Delete", ctx, roleID, permissions)
ret0, _ := ret[0].(error) ret0, _ := ret[0].(error)
return ret0 return ret0
} }
// Delete indicates an expected call of Delete. // Delete indicates an expected call of Delete.
func (mr *MockRolePermissionRepositoryMockRecorder) Delete(ctx, roleID, permission any) *gomock.Call { func (mr *MockRolePermissionRepositoryMockRecorder) Delete(ctx, roleID, permissions any) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockRolePermissionRepository)(nil).Delete), ctx, roleID, permission) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockRolePermissionRepository)(nil).Delete), ctx, roleID, permissions)
} }
// Get mocks base method. // Get mocks base method.

View File

@ -67,7 +67,7 @@ func (repo *RolePermissionRepository) Create(ctx context.Context, roles []entity
now := time.Now().UTC().UnixNano() now := time.Now().UTC().UnixNano()
// 將 []entity.RolePermission 轉換為 []interface{} // 將 []entity.RolePermission 轉換為 []interface{}
var roleInterfaces []interface{} roleInterfaces := make([]any, 0, len(roles))
for i := range roles { for i := range roles {
if roles[i].ID.IsZero() { if roles[i].ID.IsZero() {
roles[i].ID = primitive.NewObjectID() roles[i].ID = primitive.NewObjectID()

View File

@ -91,7 +91,6 @@ func (repo *TokenRepository) retrieveToken(ctx context.Context, key string) (ent
if err != nil { if err != nil {
return entity.Token{}, err return entity.Token{}, err
} }
if body == "" { if body == "" {
return entity.Token{}, fmt.Errorf("failed to found token") return entity.Token{}, fmt.Errorf("failed to found token")
} }
@ -224,7 +223,16 @@ func (repo *TokenRepository) CreateOneTimeToken(ctx context.Context, key string,
// GetAccessTokenByOneTimeToken 根據一次性 token 獲取 access token // GetAccessTokenByOneTimeToken 根據一次性 token 獲取 access token
func (repo *TokenRepository) GetAccessTokenByOneTimeToken(ctx context.Context, oneTimeToken string) (entity.Token, error) { func (repo *TokenRepository) GetAccessTokenByOneTimeToken(ctx context.Context, oneTimeToken string) (entity.Token, error) {
return repo.retrieveToken(ctx, domain.GetRefreshTokenRedisKey(oneTimeToken)) rk := domain.GetRefreshTokenRedisKey(oneTimeToken)
tokenID, err := repo.Redis.GetCtx(ctx, rk)
if err != nil {
return entity.Token{}, err
}
if tokenID == "" {
return entity.Token{}, fmt.Errorf("failed to found token")
}
return repo.retrieveToken(ctx, domain.GetAccessTokenRedisKey(tokenID))
} }
// GetAccessTokenByID 根據 token ID 獲取 access token // GetAccessTokenByID 根據 token ID 獲取 access token

View File

@ -890,7 +890,7 @@ func TestTokenRepository_GetAccessTokenByOneTimeToken(t *testing.T) {
// 在 Redis 中設置模擬的數據 // 在 Redis 中設置模擬的數據
_ = mr.Set(domain.GetRefreshTokenRedisKey(oneTimeToken), accessTokenID) _ = mr.Set(domain.GetRefreshTokenRedisKey(oneTimeToken), accessTokenID)
tokenData, _ := json.Marshal(expectedToken) tokenData, _ := json.Marshal(expectedToken)
_ = mr.Set(domain.GetRefreshTokenRedisKey(oneTimeToken), string(tokenData)) _ = mr.Set(domain.GetAccessTokenRedisKey(accessTokenID), string(tokenData))
// 定義測試場景 // 定義測試場景
tests := []struct { tests := []struct {

View File

@ -79,7 +79,6 @@ func TestUserRoleRepository_CreateUserRole(t *testing.T) {
// 檢查資料是否真的被插入 // 檢查資料是否真的被插入
var inserted entity.UserRole var inserted entity.UserRole
inserted, err = repo.GetByUserID(context.Background(), tc.input.UID) inserted, err = repo.GetByUserID(context.Background(), tc.input.UID)
fmt.Println(inserted)
assert.NoError(t, err, "應該能找到插入的資料") assert.NoError(t, err, "應該能找到插入的資料")
assert.Equal(t, tc.input.UID, inserted.UID, "UID 應該匹配") assert.Equal(t, tc.input.UID, inserted.UID, "UID 應該匹配")
assert.Equal(t, tc.input.RoleID, inserted.RoleID, "RoleID 應該匹配") assert.Equal(t, tc.input.RoleID, inserted.RoleID, "RoleID 應該匹配")
@ -263,7 +262,6 @@ func TestUserRoleRepository_GetUsersByRoleID(t *testing.T) {
assert.Error(t, err, "應該返回錯誤") assert.Error(t, err, "應該返回錯誤")
} else { } else {
assert.NoError(t, err, "不應該返回錯誤") assert.NoError(t, err, "不應該返回錯誤")
fmt.Println(result)
compute := make([]entity.UserRole, 0, len(result)) compute := make([]entity.UserRole, 0, len(result))
res := make([]entity.UserRole, 0, len(result)) res := make([]entity.UserRole, 0, len(result))

View File

@ -75,9 +75,11 @@ func GeneratePermissionTree(permissions []entity.Permission) *PermissionTree {
func (tree *PermissionTree) getNode(id string) *PermissionNode { func (tree *PermissionTree) getNode(id string) *PermissionNode {
tree.mu.RLock() tree.mu.RLock()
defer tree.mu.RUnlock() defer tree.mu.RUnlock()
return tree.nodes[id] return tree.nodes[id]
} }
//nolint:unused
func (tree *PermissionTree) put(node entity.Permission) { func (tree *PermissionTree) put(node entity.Permission) {
parentNode := tree.getNode(node.Parent) parentNode := tree.getNode(node.Parent)
if parentNode == nil { if parentNode == nil {
@ -118,6 +120,7 @@ func (tree *PermissionTree) filterOpenNodes() (map[string]entity.Permission, err
for _, child := range node.Children { for _, child := range node.Children {
dfs(child) dfs(child)
} }
return true return true
} }
@ -159,7 +162,6 @@ func (tree *PermissionTree) getFullParentPermission(rolePermissions []*entity.Ro
status[parent.Data.Name] = permission.StatusCode(parent.Data.Status.String()) status[parent.Data.Name] = permission.StatusCode(parent.Data.Status.String())
} }
} }
return status return status
@ -213,7 +215,6 @@ func (tree *PermissionTree) getFullParentPermissionIDs(permissions permission.Pe
exist[np.Data.ID.Hex()] = true exist[np.Data.ID.Hex()] = true
} }
} }
} }
} }

View File

@ -13,7 +13,7 @@ type RolePermissionUseCaseParam struct {
rolePermissionRepository repository.RolePermissionRepository rolePermissionRepository repository.RolePermissionRepository
permissionRepository repository.PermissionRepository permissionRepository repository.PermissionRepository
roleRepository repository.RoleRepository roleRepository repository.RoleRepository
userRoleRepository repository.UserRoleRepository // userRoleRepository repository.UserRoleRepository
} }
type RolePermissionUseCase struct { type RolePermissionUseCase struct {
@ -79,12 +79,8 @@ func (use *RolePermissionUseCase) Delete(ctx context.Context, roleID string, per
if err != nil { if err != nil {
return err return err
} }
del := make([]string, 0, len(permissions))
for _, permissionID := range permissionIDs {
del = append(del, permissionID)
}
err = use.rolePermissionRepository.Delete(ctx, roleID, del) err = use.rolePermissionRepository.Delete(ctx, roleID, permissionIDs)
if err != nil { if err != nil {
return err return err
} }
@ -121,49 +117,3 @@ func (use *RolePermissionUseCase) List(ctx context.Context, req usecase.ListQuer
Roles: result, Roles: result,
}, nil }, nil
} }
//// GetByRoleUID 拿到這個 UID 底下有哪些權限是開的
//func (use *RolePermissionUseCase) GetByRoleUID(ctx context.Context, uid string) (permission.Permissions, error) {
// permissions := make(permission.Permissions)
//
// // admin權限
// if uid == permission.AdminRoleUID {
// data, err := use.permissionRepository.GetAll(ctx, nil)
// if err != nil {
// return nil, err
// }
//
// for _, v := range data {
// permissions[v.Name] = permission.OpenPermission
// }
// } else {
// role, err := use.roleRepository.GetByUID(ctx, uid)
// if err != nil {
// return nil, err
// }
//
// permissions, err = use.Get(ctx, role.ID.Hex())
// if err != nil {
// return nil, err
// }
// }
//
// return permissions, nil
//}
//
//func (use *RolePermissionUseCase) GetByUser(ctx context.Context, uid string) (usecase.UserPermission, error) {
// userRole, err := use.userRoleRepository.GetByUserID(ctx, uid)
// if err != nil {
// return usecase.UserPermission{}, err
// }
//
// p, err := use.Get(ctx, userRole.RoleID)
// if err != nil {
// return usecase.UserPermission{}, err
// }
//
// return usecase.UserPermission{
// RoleID: userRole.RoleID,
// Permissions: p,
// }, nil
//}

View File

@ -20,9 +20,9 @@ import (
type TokenUseCaseParam struct { type TokenUseCaseParam struct {
TokenRepo repository.TokenRepo TokenRepo repository.TokenRepo
RefreshExpires time.Duration RefreshExpires time.Duration // refresh token 過期時間(比較長)
Expired time.Duration Expired time.Duration // token 過期時間(比較短)
Secret string Secret string // 加密Token
} }
type TokenUseCase struct { type TokenUseCase struct {