chore: add readme md

This commit is contained in:
王性驊 2025-02-08 14:07:13 +08:00
commit 714163bbe6
64 changed files with 827 additions and 355 deletions

View File

@ -104,7 +104,7 @@ issues:
- contextcheck - contextcheck
exclude-dirs: exclude-dirs:
- internal/logic - gen_result/
exclude-files: exclude-files:
- .*_test.go - .*_test.go

View File

@ -16,7 +16,8 @@ COPY . .
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y git apt-get install -y git && \
mkdir /root/.ssh
# Make the root foler for our ssh # Make the root foler for our ssh
RUN --mount=type=secret,id=ssh_key,dst=/root/.ssh/id_rsa \ RUN --mount=type=secret,id=ssh_key,dst=/root/.ssh/id_rsa \

View File

View File

@ -27,10 +27,6 @@ services:
environment: environment:
MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example MONGO_INITDB_ROOT_PASSWORD: example
networks:
- app-network
volumes:
- mongo-data:/data/db
etcd: etcd:
image: quay.io/coreos/etcd:v3.5.5 image: quay.io/coreos/etcd:v3.5.5
@ -45,27 +41,10 @@ services:
ports: ports:
- "2379:2379" - "2379:2379"
- "2380:2380" - "2380:2380"
networks:
- app-network
volumes:
- etcd-data:/etcd-data
redis: redis:
image: redis:7.0 image: redis:7.0
container_name: redis container_name: redis
restart: always restart: always
ports: ports:
- "6379:6379" - "6379:6379"
networks:
- app-network
volumes:
- redis-data:/data
networks:
app-network:
driver: bridge
volumes:
mongo-data:
etcd-data:
redis-data:

View File

@ -2,7 +2,7 @@ Name: member.rpc
ListenOn: 0.0.0.0:8080 ListenOn: 0.0.0.0:8080
Etcd: Etcd:
Hosts: Hosts:
- 127.0.0.1:2379 - 127.0.0.1:2379
Key: member.rpc Key: member.rpc
Cache: Cache:
@ -11,12 +11,18 @@ Cache:
CacheExpireTime: 1s CacheExpireTime: 1s
CacheWithNotFoundExpiry: 1s CacheWithNotFoundExpiry: 1s
Redis:
Host: 127.0.0.1:6379
Type: node
Tls: false
Key: ""
Mongo: Mongo:
Schema: mongodb Schema: mongodb
Host: 127.0.0.1 Host: "127.0.0.1:27017"
User: "admin" User: "root"
Password: "123" Password: "example"
Port: "27017" Port: ""
Database: digimon_member Database: digimon_member
ReplicaName: "rs0" ReplicaName: "rs0"
MaxStaleness: 30m MaxStaleness: 30m
@ -32,12 +38,12 @@ Bcrypt:
Cost: 10 Cost: 10
GoogleAuth: GoogleAuth:
ClientID: ClientID: xxx.apps.googleusercontent.com
AuthURL: AuthURL: x
LineAuth: LineAuth:
ClientID : ClientID : "200000000"
ClientSecret : ClientSecret : xxxxx
RedirectURI : RedirectURI : http://localhost:8080/line.html
Host: 127.0.0.1 Host: 127.0.0.1

View File

@ -9,12 +9,6 @@ message OKResp {}
message NoneReq {} message NoneReq {}
// ================ enum ================ // ================ enum ================
enum VerifyType {
VERIFY_NONE = 0; //
VERIFY_OK = 1;
VERIFY_NOT = 2; //
}
enum AlarmType { enum AlarmType {
ALARM_NONE = 0; // ALARM_NONE = 0; //
ALARM_NOT = 1; // ALARM_NOT = 1; //
@ -61,19 +55,18 @@ message BindingUserResp {
message CreateUserInfoReq { message CreateUserInfoReq {
string uid = 1; string uid = 1;
VerifyType verify_type = 2; AlarmType alarm_type = 2;
AlarmType alarm_type = 3; MemberStatus status = 3;
MemberStatus status = 4; string language = 4;
string language = 5; string currency = 5;
string currency = 6; optional string avatar= 6;
optional string avatar= 7; optional string nick_name = 7;
optional string nick_name = 8; optional string full_name = 8;
optional string full_name = 9; optional int64 gender = 9;
optional int64 gender = 10; optional int64 birthdate = 10;
optional int64 birthdate = 11; optional string phone_number = 11;
optional string phone_number = 12; optional string email = 12;
optional string email = 13; optional string address = 13;
optional string address = 14;
} }
message GetAccountInfoResp { message GetAccountInfoResp {
@ -87,15 +80,12 @@ message UpdateUserInfoReq {
optional string currency = 3; optional string currency = 3;
optional string nick_name = 4; optional string nick_name = 4;
optional string avatar = 5; optional string avatar = 5;
optional VerifyType verify_type = 6; optional AlarmType alarm_type = 6;
optional AlarmType alarm_type = 7; optional MemberStatus status = 7;
optional MemberStatus status = 8; optional string full_name = 8;
optional string full_name = 9; optional int64 gender = 9;
optional int64 gender = 10; optional int64 birthdate = 10;
optional int64 birthdate = 11; optional string address = 11;
optional string phone_number = 12;
optional string email = 13;
optional string address = 14;
} }
message GetUIDByAccountReq { message GetUIDByAccountReq {
@ -144,15 +134,20 @@ message GetUserInfoReq {
message UserInfo { message UserInfo {
string uid = 1; string uid = 1;
VerifyType verify_type = 2; optional string avatar_url = 2;
AlarmType alarm_type = 3; optional string full_name = 3;
MemberStatus status = 4; optional string nick_name = 4;
string language = 5; optional int64 gender_code = 5;
string currency = 6; optional int64 birthday = 6;
string avatar = 7; optional string phone =7;
int64 create_time=8; optional string email=8;
int64 update_time=9; optional string address=9;
optional string nick_name = 10; AlarmType alarm_type = 10;
MemberStatus status = 11;
string language = 12;
string currency = 13;
int64 create_time=14;
int64 update_time=15;
} }
message GetUserInfoResp { message GetUserInfoResp {
@ -160,13 +155,12 @@ message GetUserInfoResp {
} }
message ListUserInfoReq { message ListUserInfoReq {
optional VerifyType verify_type = 1; optional AlarmType alarm_type = 1;
optional AlarmType alarm_type = 2; optional MemberStatus status = 2;
optional MemberStatus status = 3; optional int64 create_start_time = 3;
optional int64 create_start_time = 4; optional int64 create_end_time = 4;
optional int64 create_end_time = 5; int64 page_size =5;
int64 page_size =6; int64 page_index=6;
int64 page_index=7;
} }
message ListUserInfoResp { message ListUserInfoResp {
@ -183,6 +177,19 @@ message VerifyAuthResultResp {
bool status = 1; bool status = 1;
} }
message VerifyGoogleAuthResultResp {
bool status = 1;
optional string iss =2; // (issuer) "https://accounts.google.com"
optional string sub =3; // 使 ID
optional string aud =4; // Audience Client ID
optional string exp =5; // (UNIX timestamp)
optional string iat =6; // (UNIX timestamp)
optional string email =7; // 使
optional string email_verified =8; //
optional string name =9; // 使
optional string picture =10; // 使 URL
}
message TwitterAccessTokenResp { message TwitterAccessTokenResp {
string token = 1; string token = 1;
} }
@ -201,8 +208,18 @@ message LineAccessTokenResp {
} }
message LineUserProfile { message LineUserProfile {
string name = 1; string display_name = 1;
string email = 2; string user_id = 2;
string picture_url = 3;
string status_message = 4;
}
message LineGetTokenReq {
string code = 1;
}
message LineGetUserInfoReq {
string token = 1;
} }
service Account { service Account {
@ -237,12 +254,12 @@ service Account {
// CheckRefreshCode token ) // CheckRefreshCode token )
rpc CheckRefreshCode(VerifyRefreshCodeReq) returns(OKResp); rpc CheckRefreshCode(VerifyRefreshCodeReq) returns(OKResp);
// VerifyGoogleAuthResult google // VerifyGoogleAuthResult google
rpc VerifyGoogleAuthResult(VerifyAuthResultReq)returns(VerifyAuthResultResp); rpc VerifyGoogleAuthResult(VerifyAuthResultReq)returns(VerifyGoogleAuthResultResp);
// VerifyPlatformAuthResult google // VerifyPlatformAuthResult google
rpc VerifyPlatformAuthResult(VerifyAuthResultReq)returns(VerifyAuthResultResp); rpc VerifyPlatformAuthResult(VerifyAuthResultReq)returns(VerifyAuthResultResp);
// LineCodeToAccessToken Line // LineCodeToAccessToken Line
rpc LineCodeToAccessToken(NoneReq) returns (LineAccessTokenResp); rpc LineCodeToAccessToken(LineGetTokenReq) returns (LineAccessTokenResp);
// LineGetProfileByAccessToken Line // LineGetProfileByAccessToken Line
rpc LineGetProfileByAccessToken(NoneReq) returns (LineUserProfile); rpc LineGetProfileByAccessToken(LineGetUserInfoReq) returns (LineUserProfile);
} }
// ================ account ================ // ================ account ================

2
go.mod
View File

@ -1,4 +1,4 @@
module app-cloudep-member-server module code.30cm.net/digimon/app-cloudep-member-server
go 1.23.4 go 1.23.4

View File

@ -1,15 +1,14 @@
package config package config
import ( import (
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/core/stores/redis"
"github.com/zeromicro/go-zero/zrpc"
"time" "time"
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/zrpc"
) )
type Config struct { type Config struct {
zrpc.RpcServerConf zrpc.RpcServerConf
redis.RedisConf
// Redis Cluster // Redis Cluster
Cache cache.CacheConf Cache cache.CacheConf
CacheExpireTime time.Duration CacheExpireTime time.Duration

View File

@ -1,15 +1,16 @@
package accountlogic package accountlogic
import ( import (
domain "app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs"
"context" "context"
"fmt" "fmt"
"math" "math"
"app-cloudep-member-server/gen_result/pb/member" domain "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -43,43 +44,30 @@ func (l *BindAccountLogic) BindAccount(in *member.BindingUserReq) (*member.Bindi
}); err != nil { }); err != nil {
return nil, errs.InvalidFormat(err.Error()) return nil, errs.InvalidFormat(err.Error())
} }
s, err := safeInt64ToInt32(in.GetType())
// 先確定有這個Account
if _, err := l.svcCtx.AccountUseCase.GetUserAccountInfo(l.ctx, usecase.GetUIDByAccountRequest{Account: in.GetLoginId()}); err != nil {
return nil, err
}
var err error
uid := in.GetUid()
// 有 UID 綁看看沒帶UID 近來,確認沒重複就直接綁一個給他
if in.GetUid() == "" {
uid, err = l.svcCtx.AccountUseCase.Generate(l.ctx)
if err != nil {
return nil, err
}
}
t, err := int64ToInt32Safe(in.GetType())
if err != nil { if err != nil {
return nil, err return nil, err
} }
if _, err := l.svcCtx.AccountUseCase.BindAccount(l.ctx, usecase.BindingUser{ account, err := l.svcCtx.AccountUseCase.BindAccount(l.ctx, usecase.BindingUser{
LoginID: in.LoginId, UID: in.GetUid(),
UID: uid, LoginID: in.GetLoginId(),
Type: domain.AccountType(t), Type: domain.AccountType(s),
}); err != nil { })
if err != nil {
return nil, err return nil, err
} }
return &member.BindingUserResp{ return &member.BindingUserResp{
LoginId: in.LoginId, LoginId: account.LoginID,
Uid: uid, Uid: account.UID,
Type: in.GetType(), Type: in.GetType(),
}, nil }, nil
} }
func int64ToInt32Safe(value int64) (int32, error) { func safeInt64ToInt32(n int64) (int32, error) {
if value > math.MaxInt32 || value < math.MinInt32 { if n < math.MinInt32 || n > math.MaxInt32 {
return 0, fmt.Errorf("value %d is out of int32 range", value) return 0, fmt.Errorf("int64 value %d out of int8 range", n)
} }
return int32(value), nil
return int32(n), nil
} }

View File

@ -1,11 +1,15 @@
package accountlogic package accountlogic
import ( import (
"app-cloudep-member-server/gen_result/pb/member"
"app-cloudep-member-server/internal/svc"
"context" "context"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
domain "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
"google.golang.org/protobuf/proto"
) )
type BindUserInfoLogic struct { type BindUserInfoLogic struct {
@ -22,25 +26,42 @@ func NewBindUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Bind
} }
} }
type createUserInfo struct { // 必要的還是在這邊驗一次好了
Uid string `validate:"required"`
VerifyType int32 `validate:"required,oneof=0 1 2 3"`
AlarmType int32 `validate:"required,oneof=0 1 2"`
Status int32 `validate:"required,oneof=1 2 3 4 5 6"`
RoleId string `validate:"required"`
Language string `validate:"required"`
Currency string `validate:"required"`
NickName string `validate:"required"`
}
type createUserInfoReq struct { type createUserInfoReq struct {
Uid string `validate:"required"` // 唯一辨識碼 UID string `validate:"required"` // 唯一辨識碼
Language string `validate:"required"` Language string `validate:"required"`
Currency string `validate:"required"` Currency string `validate:"required"`
} }
// BindUserInfo 初次,綁定 User Info // BindUserInfo 初次,綁定 User Info
func (l *BindUserInfoLogic) BindUserInfo(in *member.CreateUserInfoReq) (*member.OKResp, error) { func (l *BindUserInfoLogic) BindUserInfo(in *member.CreateUserInfoReq) (*member.OKResp, error) {
// 驗證資料
if err := l.svcCtx.Validate.ValidateAll(&createUserInfoReq{
UID: in.GetUid(),
Language: in.GetLanguage(),
Currency: in.GetCurrency(),
}); err != nil {
return nil, errs.InvalidFormat(err.Error())
}
err := l.svcCtx.AccountUseCase.BindUserInfo(l.ctx, usecase.CreateUserInfoRequest{
UID: in.GetUid(),
AvatarURL: proto.String(in.GetAvatar()),
FullName: proto.String(in.GetFullName()),
Nickname: proto.String(in.GetNickName()),
GenderCode: proto.Int64(in.GetGender()),
Birthdate: proto.Int64(in.GetBirthdate()),
PhoneNumber: proto.String(in.GetPhoneNumber()),
Email: proto.String(in.GetEmail()),
Address: proto.String(in.GetAddress()),
PreferredLanguage: in.GetLanguage(),
Currency: in.GetCurrency(),
AlarmCategory: domain.AlarmType(in.GetAlarmType().Number()),
UserStatus: domain.Status(in.GetStatus().Number()),
})
if err != nil {
return nil, err
}
return &member.OKResp{}, nil return &member.OKResp{}, nil
} }

View File

@ -3,8 +3,10 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/library-go/errs"
"app-cloudep-member-server/internal/svc"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -23,9 +25,24 @@ func NewBindVerifyEmailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *B
} }
} }
type bindEmailVerifyReq struct {
UID string `validate:"required"` // 唯一辨識碼
Email string `validate:"required"` // 唯一辨識碼
}
// BindVerifyEmail 綁定 Email // BindVerifyEmail 綁定 Email
func (l *BindVerifyEmailLogic) BindVerifyEmail(in *member.BindVerifyEmailReq) (*member.OKResp, error) { func (l *BindVerifyEmailLogic) BindVerifyEmail(in *member.BindVerifyEmailReq) (*member.OKResp, error) {
// todo: add your logic here and delete this line if err := l.svcCtx.Validate.ValidateAll(&bindEmailVerifyReq{
UID: in.GetUid(),
Email: in.GetEmail(),
}); err != nil {
return nil, errs.InvalidFormat(err.Error())
}
err := l.svcCtx.AccountUseCase.BindVerifyEmail(l.ctx, in.GetUid(), in.GetEmail())
if err != nil {
return nil, err
}
return &member.OKResp{}, nil return &member.OKResp{}, nil
} }

View File

@ -3,8 +3,10 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/library-go/errs"
"app-cloudep-member-server/internal/svc"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -23,9 +25,24 @@ func NewBindVerifyPhoneLogic(ctx context.Context, svcCtx *svc.ServiceContext) *B
} }
} }
type bindPhoneVerifyReq struct {
UID string `validate:"required"` // 唯一辨識碼
Phone string `validate:"required"` // 唯一辨識碼
}
// BindVerifyPhone 綁定 Phone // BindVerifyPhone 綁定 Phone
func (l *BindVerifyPhoneLogic) BindVerifyPhone(in *member.BindVerifyPhoneReq) (*member.OKResp, error) { func (l *BindVerifyPhoneLogic) BindVerifyPhone(in *member.BindVerifyPhoneReq) (*member.OKResp, error) {
// todo: add your logic here and delete this line if err := l.svcCtx.Validate.ValidateAll(&bindPhoneVerifyReq{
UID: in.GetUid(),
Phone: in.GetPhone(),
}); err != nil {
return nil, errs.InvalidFormat(err.Error())
}
err := l.svcCtx.AccountUseCase.BindVerifyPhone(l.ctx, in.GetUid(), in.GetPhone())
if err != nil {
return nil, err
}
return &member.OKResp{}, nil return &member.OKResp{}, nil
} }

View File

@ -3,8 +3,12 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" domain "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -23,9 +27,35 @@ func NewCheckRefreshCodeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *
} }
} }
type checkRefreshCodeReq struct {
LoginID string `validate:"required"`
VerifyCode string `validate:"required"`
}
// CheckRefreshCode 驗證忘記密碼 token 不刪除,只確認) // CheckRefreshCode 驗證忘記密碼 token 不刪除,只確認)
func (l *CheckRefreshCodeLogic) CheckRefreshCode(in *member.VerifyRefreshCodeReq) (*member.OKResp, error) { func (l *CheckRefreshCodeLogic) CheckRefreshCode(in *member.VerifyRefreshCodeReq) (*member.OKResp, error) {
// todo: add your logic here and delete this line // 驗證資料
if err := l.svcCtx.Validate.ValidateAll(&checkRefreshCodeReq{
LoginID: in.GetAccount(),
VerifyCode: in.GetVerifyCode(),
}); err != nil {
return nil, errs.InvalidFormat(err.Error())
}
code := domain.GenerateCodeType(in.GetCodeType())
_, status := domain.GetCodeNameByCode(code)
if !status {
return nil, errs.InvalidFormat("codeType is invalid")
}
// 執行
err := l.svcCtx.AccountUseCase.CheckRefreshCode(l.ctx, usecase.VerifyRefreshCodeRequest{
LoginID: in.GetAccount(),
VerifyCode: in.GetVerifyCode(),
CodeType: code,
})
if err != nil {
return nil, err
}
return &member.OKResp{}, nil return &member.OKResp{}, nil
} }

View File

@ -2,9 +2,15 @@ package accountlogic
import ( import (
"context" "context"
"fmt"
"math"
"app-cloudep-member-server/gen_result/pb/member" domain "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -23,9 +29,47 @@ func NewCreateUserAccountLogic(ctx context.Context, svcCtx *svc.ServiceContext)
} }
} }
type createUserAccountReq struct {
LoginID string `validate:"required"`
Token string `validate:"required"`
}
// CreateUserAccount 建立帳號與密碼 -> 可登入,但可不可以做其他事情看業務流程,也可以只註冊就好 // CreateUserAccount 建立帳號與密碼 -> 可登入,但可不可以做其他事情看業務流程,也可以只註冊就好
func (l *CreateUserAccountLogic) CreateUserAccount(in *member.CreateLoginUserReq) (*member.OKResp, error) { func (l *CreateUserAccountLogic) CreateUserAccount(in *member.CreateLoginUserReq) (*member.OKResp, error) {
// todo: add your logic here and delete this line // 驗證資料
if err := l.svcCtx.Validate.ValidateAll(&createUserAccountReq{
LoginID: in.GetLoginId(),
Token: in.GetToken(),
}); err != nil {
return nil, errs.InvalidFormat(err.Error())
}
toInt8, err := safeInt64ToInt8(in.GetPlatform())
if err != nil {
return nil, err
}
platform := domain.Platform(toInt8)
if platform.ToString() == "" {
return nil, errs.InvalidFormat("platform not found")
}
err = l.svcCtx.AccountUseCase.CreateUserAccount(l.ctx, usecase.CreateLoginUserRequest{
LoginID: in.GetLoginId(),
Platform: platform,
Token: in.GetToken(),
})
if err != nil {
return nil, err
}
return &member.OKResp{}, nil return &member.OKResp{}, nil
} }
func safeInt64ToInt8(n int64) (int8, error) {
if n < math.MinInt8 || n > math.MaxInt8 {
return 0, fmt.Errorf("int64 value %d out of int8 range", n)
}
return int8(n), nil
}

View File

@ -3,8 +3,11 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
domain "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -23,9 +26,34 @@ func NewGenerateRefreshCodeLogic(ctx context.Context, svcCtx *svc.ServiceContext
} }
} }
type generateRefreshCodeReq struct {
LoginID string `validate:"required"`
}
// GenerateRefreshCode 這個帳號驗證碼(十分鐘),通用的 // GenerateRefreshCode 這個帳號驗證碼(十分鐘),通用的
func (l *GenerateRefreshCodeLogic) GenerateRefreshCode(in *member.GenerateRefreshCodeReq) (*member.GenerateRefreshCodeResp, error) { func (l *GenerateRefreshCodeLogic) GenerateRefreshCode(in *member.GenerateRefreshCodeReq) (*member.GenerateRefreshCodeResp, error) {
// todo: add your logic here and delete this line // 驗證資料
if err := l.svcCtx.Validate.ValidateAll(&generateRefreshCodeReq{
LoginID: in.GetAccount(),
}); err != nil {
return nil, errs.InvalidFormat(err.Error())
}
ct := domain.GenerateCodeType(in.GetCodeType())
_, status := domain.GetCodeNameByCode(ct)
if !status {
return nil, errs.InvalidFormat("codeType is invalid")
}
return &member.GenerateRefreshCodeResp{}, nil // 產生
code, err := l.svcCtx.AccountUseCase.GenerateRefreshCode(l.ctx, usecase.GenerateRefreshCodeRequest{
LoginID: in.GetAccount(),
CodeType: ct,
})
if err != nil {
return nil, err
}
return &member.GenerateRefreshCodeResp{
Data: &member.VerifyCode{VerifyCode: code.Data.VerifyCode},
}, nil
} }

View File

@ -3,8 +3,11 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -23,9 +26,27 @@ func NewGetUIDByAccountLogic(ctx context.Context, svcCtx *svc.ServiceContext) *G
} }
} }
type getUIDByAccountReq struct {
Account string `validate:"required"`
}
// GetUIDByAccount 用帳號換取 UID // GetUIDByAccount 用帳號換取 UID
func (l *GetUIDByAccountLogic) GetUIDByAccount(in *member.GetUIDByAccountReq) (*member.GetUIDByAccountResp, error) { func (l *GetUIDByAccountLogic) GetUIDByAccount(in *member.GetUIDByAccountReq) (*member.GetUIDByAccountResp, error) {
// todo: add your logic here and delete this line if err := l.svcCtx.Validate.ValidateAll(&getUIDByAccountReq{
Account: in.GetAccount(),
}); err != nil {
return nil, errs.InvalidFormat(err.Error())
}
return &member.GetUIDByAccountResp{}, nil account, err := l.svcCtx.AccountUseCase.GetUIDByAccount(l.ctx, usecase.GetUIDByAccountRequest{
Account: in.GetAccount(),
})
if err != nil {
return nil, err
}
return &member.GetUIDByAccountResp{
Account: account.Account,
Uid: account.UID,
}, nil
} }

View File

@ -3,8 +3,11 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -23,9 +26,30 @@ func NewGetUserAccountInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext)
} }
} }
type getUserAccountInfoReq struct {
Account string `validate:"required"`
}
// GetUserAccountInfo 取得帳號密碼資料 // GetUserAccountInfo 取得帳號密碼資料
func (l *GetUserAccountInfoLogic) GetUserAccountInfo(in *member.GetUIDByAccountReq) (*member.GetAccountInfoResp, error) { func (l *GetUserAccountInfoLogic) GetUserAccountInfo(in *member.GetUIDByAccountReq) (*member.GetAccountInfoResp, error) {
// todo: add your logic here and delete this line if err := l.svcCtx.Validate.ValidateAll(&getUserAccountInfoReq{
Account: in.GetAccount(),
}); err != nil {
return nil, errs.InvalidFormat(err.Error())
}
return &member.GetAccountInfoResp{}, nil info, err := l.svcCtx.AccountUseCase.GetUserAccountInfo(l.ctx, usecase.GetUIDByAccountRequest{
Account: in.GetAccount(),
})
if err != nil {
return nil, err
}
return &member.GetAccountInfoResp{
Data: &member.CreateLoginUserReq{
LoginId: info.Data.LoginID,
Token: info.Data.Token,
Platform: info.Data.Platform.ToInt64(),
},
}, nil
} }

View File

@ -3,8 +3,9 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -25,7 +26,31 @@ func NewGetUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUs
// GetUserInfo 取得會員資訊 // GetUserInfo 取得會員資訊
func (l *GetUserInfoLogic) GetUserInfo(in *member.GetUserInfoReq) (*member.GetUserInfoResp, error) { func (l *GetUserInfoLogic) GetUserInfo(in *member.GetUserInfoReq) (*member.GetUserInfoResp, error) {
// todo: add your logic here and delete this line info, err := l.svcCtx.AccountUseCase.GetUserInfo(l.ctx, usecase.GetUserInfoRequest{
UID: in.GetUid(),
NickName: in.GetNickName(),
})
if err != nil {
return nil, err
}
return &member.GetUserInfoResp{}, nil return &member.GetUserInfoResp{
Data: &member.UserInfo{
Uid: info.UID,
AvatarUrl: info.AvatarURL,
NickName: info.Nickname,
FullName: info.FullName,
GenderCode: info.GenderCode,
Birthday: info.Birthdate,
Phone: info.PhoneNumber,
Email: info.Email,
Address: info.Address,
AlarmType: member.AlarmType(info.AlarmCategory),
Status: member.MemberStatus(info.UserStatus),
Language: info.PreferredLanguage,
Currency: info.Currency,
CreateTime: info.CreateTime,
UpdateTime: info.UpdateTime,
},
}, nil
} }

View File

@ -3,8 +3,8 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -24,8 +24,13 @@ func NewLineCodeToAccessTokenLogic(ctx context.Context, svcCtx *svc.ServiceConte
} }
// LineCodeToAccessToken Line 驗證相關 // LineCodeToAccessToken Line 驗證相關
func (l *LineCodeToAccessTokenLogic) LineCodeToAccessToken(in *member.NoneReq) (*member.LineAccessTokenResp, error) { func (l *LineCodeToAccessTokenLogic) LineCodeToAccessToken(in *member.LineGetTokenReq) (*member.LineAccessTokenResp, error) {
// todo: add your logic here and delete this line token, err := l.svcCtx.AccountUseCase.LineCodeToAccessToken(l.ctx, in.GetCode())
if err != nil {
return nil, err
}
return &member.LineAccessTokenResp{}, nil return &member.LineAccessTokenResp{
Token: token.AccessToken,
}, nil
} }

View File

@ -3,8 +3,8 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -24,8 +24,16 @@ func NewLineGetProfileByAccessTokenLogic(ctx context.Context, svcCtx *svc.Servic
} }
// LineGetProfileByAccessToken Line 驗證相關 // LineGetProfileByAccessToken Line 驗證相關
func (l *LineGetProfileByAccessTokenLogic) LineGetProfileByAccessToken(in *member.NoneReq) (*member.LineUserProfile, error) { func (l *LineGetProfileByAccessTokenLogic) LineGetProfileByAccessToken(in *member.LineGetUserInfoReq) (*member.LineUserProfile, error) {
// todo: add your logic here and delete this line user, err := l.svcCtx.AccountUseCase.LineGetProfileByAccessToken(l.ctx, in.GetToken())
if err != nil {
return nil, err
}
return &member.LineUserProfile{}, nil return &member.LineUserProfile{
DisplayName: user.DisplayName,
UserId: user.UserID,
PictureUrl: user.PictureURL,
StatusMessage: user.StatusMessage,
}, nil
} }

View File

@ -3,8 +3,11 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" pb "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"google.golang.org/protobuf/proto"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -24,8 +27,72 @@ func NewListMemberLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ListMe
} }
// ListMember 取得會員列表 // ListMember 取得會員列表
func (l *ListMemberLogic) ListMember(in *member.ListUserInfoReq) (*member.ListUserInfoResp, error) { func (l *ListMemberLogic) ListMember(in *pb.ListUserInfoReq) (*pb.ListUserInfoResp, error) {
// todo: add your logic here and delete this line q := usecase.ListUserInfoRequest{
PageSize: in.GetPageSize(),
PageIndex: in.GetPageIndex(),
}
if in.CreateStartTime != nil {
q.CreateStartTime = proto.Int64(in.GetCreateStartTime())
}
return &member.ListUserInfoResp{}, nil if in.CreateEndTime != nil {
q.CreateEndTime = proto.Int64(in.GetCreateEndTime())
}
if in.AlarmType != nil {
a := member.AlarmType(in.GetAlarmType().Number())
q.AlarmCategory = &a
}
if in.Status != nil {
s := member.Status(in.GetStatus().Number())
q.UserStatus = &s
}
members, err := l.svcCtx.AccountUseCase.ListMember(l.ctx, q)
if err != nil {
return nil, err
}
res := make([]*pb.UserInfo, 0, members.Page.Size)
if len(members.Data) == 0 {
return &pb.ListUserInfoResp{
Data: res,
Page: &pb.Pager{
Total: 0,
Size: members.Page.Size,
Index: members.Page.Index,
},
}, nil
}
at := pb.AlarmType(members.Data[0].AlarmCategory)
status := pb.MemberStatus(members.Data[0].UserStatus)
for _, m := range members.Data {
res = append(res, &pb.UserInfo{
Uid: m.UID,
AvatarUrl: m.AvatarURL,
FullName: m.FullName,
NickName: m.Nickname,
GenderCode: m.GenderCode,
Birthday: m.Birthdate,
Address: m.Address,
Email: m.Email,
Phone: m.PhoneNumber,
Language: m.PreferredLanguage,
Currency: m.Currency,
AlarmType: at,
Status: status,
CreateTime: m.CreateTime,
UpdateTime: m.UpdateTime,
})
}
return &pb.ListUserInfoResp{
Data: res,
Page: &pb.Pager{
Total: members.Page.Total,
Size: members.Page.Size,
Index: members.Page.Index,
},
}, nil
} }

View File

@ -3,8 +3,12 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs"
pb "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -24,8 +28,16 @@ func NewUpdateStatusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Upda
} }
// UpdateStatus 修改狀態 // UpdateStatus 修改狀態
func (l *UpdateStatusLogic) UpdateStatus(in *member.UpdateStatusReq) (*member.OKResp, error) { func (l *UpdateStatusLogic) UpdateStatus(in *pb.UpdateStatusReq) (*pb.OKResp, error) {
// todo: add your logic here and delete this line if in.Status == pb.MemberStatus_STATUS_NONE {
return nil, errs.InvalidFormat("failed to get correct status")
}
return &member.OKResp{}, nil s := member.Status(in.GetStatus().Number())
err := l.svcCtx.AccountUseCase.UpdateStatus(l.ctx, usecase.UpdateStatusRequest{Status: s, UID: in.GetUid()})
if err != nil {
return nil, err
}
return &pb.OKResp{}, nil
} }

View File

@ -3,8 +3,11 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
pb "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -24,8 +27,39 @@ func NewUpdateUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Up
} }
// UpdateUserInfo 更新 User Info // UpdateUserInfo 更新 User Info
func (l *UpdateUserInfoLogic) UpdateUserInfo(in *member.UpdateUserInfoReq) (*member.OKResp, error) { func (l *UpdateUserInfoLogic) UpdateUserInfo(in *pb.UpdateUserInfoReq) (*pb.OKResp, error) {
// todo: add your logic here and delete this line q := usecase.UpdateUserInfoRequest{
UID: in.GetUid(),
AvatarURL: in.Avatar,
FullName: in.FullName,
Nickname: in.NickName,
Birthdate: in.Birthdate,
Address: in.Address,
PreferredLanguage: in.Language,
Currency: in.Currency,
}
if in.Gender != nil {
c := *in.Gender
code, err := safeInt64ToInt8(c)
if err == nil {
q.GenderCode = &code
}
}
return &member.OKResp{}, nil if in.AlarmType != nil {
a := member.AlarmType(in.GetAlarmType().Number())
q.AlarmCategory = &a
}
if in.Status != nil {
s := member.Status(in.GetStatus().Number())
q.UserStatus = &s
}
err := l.svcCtx.AccountUseCase.UpdateUserInfo(l.ctx, &q)
if err != nil {
return nil, err
}
return &pb.OKResp{}, nil
} }

View File

@ -3,8 +3,10 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"app-cloudep-member-server/internal/svc"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -25,7 +27,15 @@ func NewUpdateUserTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *U
// UpdateUserToken 更新密碼 // UpdateUserToken 更新密碼
func (l *UpdateUserTokenLogic) UpdateUserToken(in *member.UpdateTokenReq) (*member.OKResp, error) { func (l *UpdateUserTokenLogic) UpdateUserToken(in *member.UpdateTokenReq) (*member.OKResp, error) {
// todo: add your logic here and delete this line // 更新密碼
err := l.svcCtx.AccountUseCase.UpdateUserToken(l.ctx, usecase.UpdateTokenRequest{
Account: in.GetAccount(),
Token: in.GetToken(),
Platform: in.GetPlatform(),
})
if err != nil {
return nil, err
}
return &member.OKResp{}, nil return &member.OKResp{}, nil
} }

View File

@ -3,8 +3,10 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"app-cloudep-member-server/internal/svc"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -24,8 +26,26 @@ func NewVerifyGoogleAuthResultLogic(ctx context.Context, svcCtx *svc.ServiceCont
} }
// VerifyGoogleAuthResult 驗證 google 登入是否有效 // VerifyGoogleAuthResult 驗證 google 登入是否有效
func (l *VerifyGoogleAuthResultLogic) VerifyGoogleAuthResult(in *member.VerifyAuthResultReq) (*member.VerifyAuthResultResp, error) { func (l *VerifyGoogleAuthResultLogic) VerifyGoogleAuthResult(in *member.VerifyAuthResultReq) (*member.VerifyGoogleAuthResultResp, error) {
// todo: add your logic here and delete this line result, err := l.svcCtx.AccountUseCase.VerifyGoogleAuthResult(l.ctx, usecase.VerifyAuthResultRequest{
Account: in.GetAccount(),
Token: in.GetToken(),
})
if err != nil {
return &member.VerifyGoogleAuthResultResp{
Status: false,
}, err
}
return &member.VerifyAuthResultResp{}, nil return &member.VerifyGoogleAuthResultResp{
Status: true,
Iss: &result.Iss,
Aud: &result.Aud,
Exp: &result.Exp,
Iat: &result.Iat,
Email: &result.Email,
EmailVerified: &result.EmailVerified,
Name: &result.Name,
Picture: &result.Picture,
}, nil
} }

View File

@ -3,8 +3,10 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"app-cloudep-member-server/internal/svc"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -25,7 +27,15 @@ func NewVerifyPlatformAuthResultLogic(ctx context.Context, svcCtx *svc.ServiceCo
// VerifyPlatformAuthResult 驗證 google 登入是否有效 // VerifyPlatformAuthResult 驗證 google 登入是否有效
func (l *VerifyPlatformAuthResultLogic) VerifyPlatformAuthResult(in *member.VerifyAuthResultReq) (*member.VerifyAuthResultResp, error) { func (l *VerifyPlatformAuthResultLogic) VerifyPlatformAuthResult(in *member.VerifyAuthResultReq) (*member.VerifyAuthResultResp, error) {
// todo: add your logic here and delete this line result, err := l.svcCtx.AccountUseCase.VerifyPlatformAuthResult(l.ctx, usecase.VerifyAuthResultRequest{
Account: in.GetAccount(),
Token: in.GetToken(),
})
if err != nil {
return nil, err
}
return &member.VerifyAuthResultResp{}, nil return &member.VerifyAuthResultResp{
Status: result.Status,
}, nil
} }

View File

@ -3,8 +3,12 @@ package accountlogic
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" domain "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
@ -23,9 +27,30 @@ func NewVerifyRefreshCodeLogic(ctx context.Context, svcCtx *svc.ServiceContext)
} }
} }
type verifyRefreshCodeRequest struct {
LoginID string `validate:"required"`
VerifyCode string `validate:"required"`
CodeType int32 `validate:"required"`
}
// VerifyRefreshCode 驗證忘記密碼 token // VerifyRefreshCode 驗證忘記密碼 token
func (l *VerifyRefreshCodeLogic) VerifyRefreshCode(in *member.VerifyRefreshCodeReq) (*member.OKResp, error) { func (l *VerifyRefreshCodeLogic) VerifyRefreshCode(in *member.VerifyRefreshCodeReq) (*member.OKResp, error) {
// todo: add your logic here and delete this line if err := l.svcCtx.Validate.ValidateAll(&verifyRefreshCodeRequest{
LoginID: in.Account,
VerifyCode: in.VerifyCode,
CodeType: in.CodeType,
}); err != nil {
return nil, errs.InvalidFormat(err.Error())
}
err := l.svcCtx.AccountUseCase.VerifyRefreshCode(l.ctx, usecase.VerifyRefreshCodeRequest{
LoginID: in.Account,
VerifyCode: in.VerifyCode,
CodeType: domain.GenerateCodeType(in.GetCodeType()),
})
if err != nil {
return nil, err
}
return &member.OKResp{}, nil return &member.OKResp{}, nil
} }

View File

@ -7,9 +7,9 @@ package server
import ( import (
"context" "context"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
accountlogic "app-cloudep-member-server/internal/logic/account" accountlogic "code.30cm.net/digimon/app-cloudep-member-server/internal/logic/account"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
) )
type AccountServer struct { type AccountServer struct {
@ -114,7 +114,7 @@ func (s *AccountServer) CheckRefreshCode(ctx context.Context, in *member.VerifyR
} }
// VerifyGoogleAuthResult 驗證 google 登入是否有效 // VerifyGoogleAuthResult 驗證 google 登入是否有效
func (s *AccountServer) VerifyGoogleAuthResult(ctx context.Context, in *member.VerifyAuthResultReq) (*member.VerifyAuthResultResp, error) { func (s *AccountServer) VerifyGoogleAuthResult(ctx context.Context, in *member.VerifyAuthResultReq) (*member.VerifyGoogleAuthResultResp, error) {
l := accountlogic.NewVerifyGoogleAuthResultLogic(ctx, s.svcCtx) l := accountlogic.NewVerifyGoogleAuthResultLogic(ctx, s.svcCtx)
return l.VerifyGoogleAuthResult(in) return l.VerifyGoogleAuthResult(in)
} }
@ -126,13 +126,13 @@ func (s *AccountServer) VerifyPlatformAuthResult(ctx context.Context, in *member
} }
// LineCodeToAccessToken Line 驗證相關 // LineCodeToAccessToken Line 驗證相關
func (s *AccountServer) LineCodeToAccessToken(ctx context.Context, in *member.NoneReq) (*member.LineAccessTokenResp, error) { func (s *AccountServer) LineCodeToAccessToken(ctx context.Context, in *member.LineGetTokenReq) (*member.LineAccessTokenResp, error) {
l := accountlogic.NewLineCodeToAccessTokenLogic(ctx, s.svcCtx) l := accountlogic.NewLineCodeToAccessTokenLogic(ctx, s.svcCtx)
return l.LineCodeToAccessToken(in) return l.LineCodeToAccessToken(in)
} }
// LineGetProfileByAccessToken Line 驗證相關 // LineGetProfileByAccessToken Line 驗證相關
func (s *AccountServer) LineGetProfileByAccessToken(ctx context.Context, in *member.NoneReq) (*member.LineUserProfile, error) { func (s *AccountServer) LineGetProfileByAccessToken(ctx context.Context, in *member.LineGetUserInfoReq) (*member.LineUserProfile, error) {
l := accountlogic.NewLineGetProfileByAccessTokenLogic(ctx, s.svcCtx) l := accountlogic.NewLineGetProfileByAccessTokenLogic(ctx, s.svcCtx)
return l.LineGetProfileByAccessToken(in) return l.LineGetProfileByAccessToken(in)
} }

View File

@ -1,11 +1,13 @@
package svc package svc
import ( import (
"app-cloudep-member-server/internal/config" "context"
cfg "app-cloudep-member-server/pkg/domain/config"
"app-cloudep-member-server/pkg/domain/usecase" "code.30cm.net/digimon/app-cloudep-member-server/internal/config"
"app-cloudep-member-server/pkg/repository" cfg "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/config"
uc "app-cloudep-member-server/pkg/usecase" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/repository"
uc "code.30cm.net/digimon/app-cloudep-member-server/pkg/usecase"
"code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code" "code.30cm.net/digimon/library-go/errs/code"
mgo "code.30cm.net/digimon/library-go/mongo" mgo "code.30cm.net/digimon/library-go/mongo"
@ -46,6 +48,10 @@ func NewAccountUC(c *config.Config) usecase.AccountUseCase {
EnableStandardReadWriteSplitMode: c.Mongo.EnableStandardReadWriteSplitMode, EnableStandardReadWriteSplitMode: c.Mongo.EnableStandardReadWriteSplitMode,
ConnectTimeoutMs: c.Mongo.ConnectTimeoutMs, ConnectTimeoutMs: c.Mongo.ConnectTimeoutMs,
} }
if c.Mongo.User != "" {
conf.User = c.Mongo.User
conf.Password = c.Mongo.Password
}
// 快取選項 // 快取選項
cacheOpts := []cache.Option{ cacheOpts := []cache.Option{
@ -57,36 +63,47 @@ func NewAccountUC(c *config.Config) usecase.AccountUseCase {
mgo.InitMongoOptions(*conf), mgo.InitMongoOptions(*conf),
} }
newRedis, err := redis.NewRedis(c.RedisConf, redis.Cluster()) newRedis, err := redis.NewRedis(c.Redis.RedisConf)
if err != nil { if err != nil {
panic(err) panic(err)
} }
ac := repository.NewAccountRepository(repository.AccountRepositoryParam{
Conf: conf,
CacheConf: c.Cache,
CacheOpts: cacheOpts,
DBOpts: dbOpts,
})
u := repository.NewUserRepository(repository.UserRepositoryParam{
Conf: conf,
CacheConf: c.Cache,
CacheOpts: cacheOpts,
DBOpts: dbOpts,
})
guid := repository.NewAutoIDRepository(repository.AutoIDRepositoryParam{
Conf: conf,
DBOpts: dbOpts,
})
auid := repository.NewAccountUIDRepository(repository.AccountUIDRepositoryParam{
Conf: conf,
CacheConf: c.Cache,
CacheOpts: cacheOpts,
DBOpts: dbOpts,
})
_, _ = ac.Index20241226001UP(context.Background())
_, _ = u.Index20241226001UP(context.Background())
_, _ = guid.Index20241226001UP(context.Background())
_, _ = auid.Index20241226001UP(context.Background())
return uc.MustMemberUseCase(uc.MemberUseCaseParam{ return uc.MustMemberUseCase(uc.MemberUseCaseParam{
Account: repository.NewAccountRepository(repository.AccountRepositoryParam{ Account: ac,
Conf: conf, User: u,
CacheConf: c.Cache, AccountUID: auid,
CacheOpts: cacheOpts,
DbOpts: dbOpts,
}),
User: repository.NewUserRepository(repository.UserRepositoryParam{
Conf: conf,
CacheConf: c.Cache,
CacheOpts: cacheOpts,
DbOpts: dbOpts,
}),
AccountUID: repository.NewAccountUIDRepository(repository.AccountUIDRepositoryParam{
Conf: conf,
CacheConf: c.Cache,
CacheOpts: cacheOpts,
DbOpts: dbOpts,
}),
VerifyCodeModel: repository.NewVerifyCodeRepository(newRedis), VerifyCodeModel: repository.NewVerifyCodeRepository(newRedis),
GenerateUID: repository.NewAutoIDRepository(repository.AutoIDRepositoryParam{ GenerateUID: guid,
Conf: conf, Config: prepareCfg(c),
DbOpts: dbOpts,
}),
Config: prepareCfg(c),
}) })
} }

View File

@ -5,10 +5,10 @@ import (
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
"app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member"
"app-cloudep-member-server/internal/config" "code.30cm.net/digimon/app-cloudep-member-server/internal/config"
accountServer "app-cloudep-member-server/internal/server/account" accountServer "code.30cm.net/digimon/app-cloudep-member-server/internal/server/account"
"app-cloudep-member-server/internal/svc" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc"
"github.com/zeromicro/go-zero/core/conf" "github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/core/service" "github.com/zeromicro/go-zero/core/service"

View File

@ -1,7 +1,7 @@
package entity package entity
import ( import (
"app-cloudep-member-server/pkg/domain/member" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/bson/primitive"
) )

View File

@ -1,7 +1,7 @@
package entity package entity
import ( import (
"app-cloudep-member-server/pkg/domain/member" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/bson/primitive"
) )

View File

@ -1,7 +1,7 @@
package entity package entity
import ( import (
"app-cloudep-member-server/pkg/domain/member" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/bson/primitive"
) )

View File

@ -1,9 +1,12 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain/entity"
"context" "context"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo"
) )
@ -13,7 +16,7 @@ type AccountRepository interface {
Update(ctx context.Context, data *entity.Account) (*mongo.UpdateResult, error) Update(ctx context.Context, data *entity.Account) (*mongo.UpdateResult, error)
Delete(ctx context.Context, id string) (int64, error) Delete(ctx context.Context, id string) (int64, error)
FindOneByAccount(ctx context.Context, loginID string) (*entity.Account, error) FindOneByAccount(ctx context.Context, loginID string) (*entity.Account, error)
UpdateTokenByLoginID(ctx context.Context, account string, token string) error UpdateTokenByLoginID(ctx context.Context, account string, token string, platform member.Platform) error
AccountIndexUP AccountIndexUP
} }

View File

@ -1,9 +1,10 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain/entity"
"context" "context"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo"
) )

View File

@ -1,9 +1,10 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain/entity"
"context" "context"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo"
) )

View File

@ -1,10 +1,11 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/member"
"context" "context"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo"
) )

View File

@ -1,8 +1,9 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain/member"
"context" "context"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
) )
// AccountUseCase 定義了帳號服務的操作方法 // AccountUseCase 定義了帳號服務的操作方法

View File

@ -10,10 +10,11 @@
package mock package mock
import ( import (
entity "app-cloudep-member-server/pkg/domain/entity"
context "context" context "context"
reflect "reflect" reflect "reflect"
entity "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
member "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
mongo "go.mongodb.org/mongo-driver/mongo" mongo "go.mongodb.org/mongo-driver/mongo"
gomock "go.uber.org/mock/gomock" gomock "go.uber.org/mock/gomock"
) )
@ -132,17 +133,17 @@ func (mr *MockAccountRepositoryMockRecorder) Update(ctx, data any) *gomock.Call
} }
// UpdateTokenByLoginID mocks base method. // UpdateTokenByLoginID mocks base method.
func (m *MockAccountRepository) UpdateTokenByLoginID(ctx context.Context, account, token string) error { func (m *MockAccountRepository) UpdateTokenByLoginID(ctx context.Context, account, token string, platform member.Platform) error {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "UpdateTokenByLoginID", ctx, account, token) ret := m.ctrl.Call(m, "UpdateTokenByLoginID", ctx, account, token, platform)
ret0, _ := ret[0].(error) ret0, _ := ret[0].(error)
return ret0 return ret0
} }
// UpdateTokenByLoginID indicates an expected call of UpdateTokenByLoginID. // UpdateTokenByLoginID indicates an expected call of UpdateTokenByLoginID.
func (mr *MockAccountRepositoryMockRecorder) UpdateTokenByLoginID(ctx, account, token any) *gomock.Call { func (mr *MockAccountRepositoryMockRecorder) UpdateTokenByLoginID(ctx, account, token, platform any) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTokenByLoginID", reflect.TypeOf((*MockAccountRepository)(nil).UpdateTokenByLoginID), ctx, account, token) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTokenByLoginID", reflect.TypeOf((*MockAccountRepository)(nil).UpdateTokenByLoginID), ctx, account, token, platform)
} }
// MockAccountIndexUP is a mock of AccountIndexUP interface. // MockAccountIndexUP is a mock of AccountIndexUP interface.

View File

@ -10,10 +10,10 @@
package mock package mock
import ( import (
entity "app-cloudep-member-server/pkg/domain/entity"
context "context" context "context"
reflect "reflect" reflect "reflect"
entity "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
mongo "go.mongodb.org/mongo-driver/mongo" mongo "go.mongodb.org/mongo-driver/mongo"
gomock "go.uber.org/mock/gomock" gomock "go.uber.org/mock/gomock"
) )

View File

@ -10,10 +10,10 @@
package mock package mock
import ( import (
entity "app-cloudep-member-server/pkg/domain/entity"
context "context" context "context"
reflect "reflect" reflect "reflect"
entity "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
mongo "go.mongodb.org/mongo-driver/mongo" mongo "go.mongodb.org/mongo-driver/mongo"
gomock "go.uber.org/mock/gomock" gomock "go.uber.org/mock/gomock"
) )

View File

@ -10,11 +10,11 @@
package mock package mock
import ( import (
entity "app-cloudep-member-server/pkg/domain/entity"
repository "app-cloudep-member-server/pkg/domain/repository"
context "context" context "context"
reflect "reflect" reflect "reflect"
entity "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
repository "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
mongo "go.mongodb.org/mongo-driver/mongo" mongo "go.mongodb.org/mongo-driver/mongo"
gomock "go.uber.org/mock/gomock" gomock "go.uber.org/mock/gomock"
) )

View File

@ -1,13 +1,16 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/repository"
"context" "context"
"errors" "errors"
"time" "time"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
mgo "code.30cm.net/digimon/library-go/mongo" mgo "code.30cm.net/digimon/library-go/mongo"
"github.com/zeromicro/go-zero/core/stores/cache" "github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/core/stores/mon" "github.com/zeromicro/go-zero/core/stores/mon"
@ -19,7 +22,7 @@ import (
type AccountRepositoryParam struct { type AccountRepositoryParam struct {
Conf *mgo.Conf Conf *mgo.Conf
CacheConf cache.CacheConf CacheConf cache.CacheConf
DbOpts []mon.Option DBOpts []mon.Option
CacheOpts []cache.Option CacheOpts []cache.Option
} }
@ -33,7 +36,7 @@ func NewAccountRepository(param AccountRepositoryParam) repository.AccountReposi
param.Conf, param.Conf,
e.CollectionName(), e.CollectionName(),
param.CacheConf, param.CacheConf,
param.DbOpts, param.DBOpts,
param.CacheOpts, param.CacheOpts,
) )
if err != nil { if err != nil {
@ -112,9 +115,9 @@ func (repo *AccountRepository) FindOneByAccount(ctx context.Context, loginID str
} }
} }
func (repo *AccountRepository) UpdateTokenByLoginID(ctx context.Context, account string, token string) error { func (repo *AccountRepository) UpdateTokenByLoginID(ctx context.Context, account string, token string, platform member.Platform) error {
// todo: 之後需要同步快取 // todo: 之後需要同步快取
filter := bson.M{"login_id": account} filter := bson.M{"login_id": account, "platform": platform.ToInt64()}
update := bson.M{ update := bson.M{
"$set": bson.M{ "$set": bson.M{
"token": token, "token": token,

View File

@ -1,13 +1,16 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/pkg/domain/repository"
"context" "context"
"errors" "errors"
"fmt"
"testing" "testing"
"time" "time"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
mgo "code.30cm.net/digimon/library-go/mongo" mgo "code.30cm.net/digimon/library-go/mongo"
"github.com/alicebob/miniredis/v2" "github.com/alicebob/miniredis/v2"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -26,8 +29,7 @@ func SetupTestAccountRepository(db string) (repository.AccountRepository, func()
conf := &mgo.Conf{ conf := &mgo.Conf{
Schema: Schema, Schema: Schema,
Host: h, Host: fmt.Sprintf("%s:%s", h, p),
Port: p,
Database: db, Database: db,
MaxStaleness: 300, MaxStaleness: 300,
MaxPoolSize: 100, MaxPoolSize: 100,
@ -312,6 +314,7 @@ func TestAccountModel_UpdateTokenByLoginID(t *testing.T) {
name string name string
loginID string loginID string
newToken string newToken string
platform int64
expectedErr error expectedErr error
expectFound bool expectFound bool
}{ }{
@ -319,6 +322,7 @@ func TestAccountModel_UpdateTokenByLoginID(t *testing.T) {
name: "Valid Update Token", name: "Valid Update Token",
loginID: "testuser2", loginID: "testuser2",
newToken: "newtoken123", newToken: "newtoken123",
platform: 1,
expectedErr: nil, expectedErr: nil,
expectFound: true, expectFound: true,
}, },
@ -326,6 +330,7 @@ func TestAccountModel_UpdateTokenByLoginID(t *testing.T) {
name: "Account Not Found for Update", name: "Account Not Found for Update",
loginID: "nonexistentuser", loginID: "nonexistentuser",
newToken: "newtoken456", newToken: "newtoken456",
platform: 1,
expectedErr: ErrNotFound, expectedErr: ErrNotFound,
expectFound: false, expectFound: false,
}, },
@ -333,7 +338,7 @@ func TestAccountModel_UpdateTokenByLoginID(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
err := repo.UpdateTokenByLoginID(context.Background(), tt.loginID, tt.newToken) err := repo.UpdateTokenByLoginID(context.Background(), tt.loginID, tt.newToken, member.Platform(tt.platform))
if tt.expectFound { if tt.expectFound {
assert.NoError(t, err) assert.NoError(t, err)

View File

@ -1,13 +1,14 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/repository"
"context" "context"
"errors" "errors"
"time" "time"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
mgo "code.30cm.net/digimon/library-go/mongo" mgo "code.30cm.net/digimon/library-go/mongo"
"github.com/zeromicro/go-zero/core/stores/cache" "github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/core/stores/mon" "github.com/zeromicro/go-zero/core/stores/mon"
@ -19,7 +20,7 @@ import (
type AccountUIDRepositoryParam struct { type AccountUIDRepositoryParam struct {
Conf *mgo.Conf Conf *mgo.Conf
CacheConf cache.CacheConf CacheConf cache.CacheConf
DbOpts []mon.Option DBOpts []mon.Option
CacheOpts []cache.Option CacheOpts []cache.Option
} }
@ -33,7 +34,7 @@ func NewAccountUIDRepository(param AccountUIDRepositoryParam) repository.Account
param.Conf, param.Conf,
e.CollectionName(), e.CollectionName(),
param.CacheConf, param.CacheConf,
param.DbOpts, param.DBOpts,
param.CacheOpts, param.CacheOpts,
) )
if err != nil { if err != nil {

View File

@ -1,12 +1,14 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/repository"
"context" "context"
"fmt"
"testing" "testing"
"time" "time"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
mgo "code.30cm.net/digimon/library-go/mongo" mgo "code.30cm.net/digimon/library-go/mongo"
"github.com/alicebob/miniredis/v2" "github.com/alicebob/miniredis/v2"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -24,8 +26,7 @@ func SetupTestAccountUIDRepository(db string) (repository.AccountUIDRepository,
conf := &mgo.Conf{ conf := &mgo.Conf{
Schema: Schema, Schema: Schema,
Host: h, Host: fmt.Sprintf("%s:%s", h, p),
Port: p,
Database: db, Database: db,
MaxStaleness: 300, MaxStaleness: 300,
MaxPoolSize: 100, MaxPoolSize: 100,

View File

@ -1,12 +1,13 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/repository"
"context" "context"
"errors" "errors"
"time" "time"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
GIDLib "code.30cm.net/digimon/library-go/utils/invited_code" GIDLib "code.30cm.net/digimon/library-go/utils/invited_code"
mgo "code.30cm.net/digimon/library-go/mongo" mgo "code.30cm.net/digimon/library-go/mongo"
@ -19,7 +20,7 @@ import (
type AutoIDRepositoryParam struct { type AutoIDRepositoryParam struct {
Conf *mgo.Conf Conf *mgo.Conf
DbOpts []mon.Option DBOpts []mon.Option
} }
type AutoIDRepository struct { type AutoIDRepository struct {
@ -29,7 +30,7 @@ type AutoIDRepository struct {
func NewAutoIDRepository(param AutoIDRepositoryParam) repository.AutoIDRepository { func NewAutoIDRepository(param AutoIDRepositoryParam) repository.AutoIDRepository {
e := entity.AutoID{} e := entity.AutoID{}
documentDB, err := mgo.NewDocumentDB(param.Conf, e.CollectionName(), param.DbOpts...) documentDB, err := mgo.NewDocumentDB(param.Conf, e.CollectionName(), param.DBOpts...)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -1,12 +1,14 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/repository"
"context" "context"
"fmt"
"testing" "testing"
"time" "time"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
mgo "code.30cm.net/digimon/library-go/mongo" mgo "code.30cm.net/digimon/library-go/mongo"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -19,8 +21,7 @@ func SetupTestAutoIDRepository(db string) (repository.AutoIDRepository, func(),
conf := &mgo.Conf{ conf := &mgo.Conf{
Schema: Schema, Schema: Schema,
Host: h, Host: fmt.Sprintf("%s:%s", h, p),
Port: p,
Database: db, Database: db,
MaxStaleness: 300, MaxStaleness: 300,
MaxPoolSize: 100, MaxPoolSize: 100,

View File

@ -1,13 +1,14 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/repository"
"context" "context"
"errors" "errors"
"fmt" "fmt"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
mgo "code.30cm.net/digimon/library-go/mongo" mgo "code.30cm.net/digimon/library-go/mongo"
"time" "time"
@ -23,7 +24,7 @@ import (
type UserRepositoryParam struct { type UserRepositoryParam struct {
Conf *mgo.Conf Conf *mgo.Conf
CacheConf cache.CacheConf CacheConf cache.CacheConf
DbOpts []mon.Option DBOpts []mon.Option
CacheOpts []cache.Option CacheOpts []cache.Option
} }
@ -37,7 +38,7 @@ func NewUserRepository(param UserRepositoryParam) repository.UserRepository {
param.Conf, param.Conf,
e.CollectionName(), e.CollectionName(),
param.CacheConf, param.CacheConf,
param.DbOpts, param.DBOpts,
param.CacheOpts, param.CacheOpts,
) )
if err != nil { if err != nil {

View File

@ -1,14 +1,16 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/pkg/domain/repository"
"context" "context"
"errors" "errors"
"fmt"
"testing" "testing"
"time" "time"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
mgo "code.30cm.net/digimon/library-go/mongo" mgo "code.30cm.net/digimon/library-go/mongo"
"github.com/alicebob/miniredis/v2" "github.com/alicebob/miniredis/v2"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -27,8 +29,7 @@ func SetupTestUserRepository(db string) (repository.UserRepository, func(), erro
conf := &mgo.Conf{ conf := &mgo.Conf{
Schema: Schema, Schema: Schema,
Host: h, Host: fmt.Sprintf("%s:%s", h, p),
Port: p,
Database: db, Database: db,
MaxStaleness: 300, MaxStaleness: 300,
MaxPoolSize: 100, MaxPoolSize: 100,

View File

@ -1,10 +1,10 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/repository"
"context" "context"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
"github.com/zeromicro/go-zero/core/stores/redis" "github.com/zeromicro/go-zero/core/stores/redis"
) )

View File

@ -1,11 +1,12 @@
package repository package repository
import ( import (
"app-cloudep-member-server/pkg/domain"
"context" "context"
"fmt" "fmt"
"testing" "testing"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"github.com/alicebob/miniredis/v2" "github.com/alicebob/miniredis/v2"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/zeromicro/go-zero/core/stores/redis" "github.com/zeromicro/go-zero/core/stores/redis"

View File

@ -1,9 +1,9 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain/config" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/config"
"app-cloudep-member-server/pkg/domain/repository" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
"app-cloudep-member-server/pkg/domain/usecase" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
) )
type MemberUseCaseParam struct { type MemberUseCaseParam struct {

View File

@ -1,13 +1,14 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/usecase"
"context" "context"
"errors" "errors"
"fmt" "fmt"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code" "code.30cm.net/digimon/library-go/errs/code"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"

View File

@ -1,18 +1,19 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/pkg/domain/usecase"
"context" "context"
"errors" "errors"
"testing" "testing"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"go.uber.org/mock/gomock" "go.uber.org/mock/gomock"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
mockRepo "app-cloudep-member-server/pkg/mock/repository" mockRepo "code.30cm.net/digimon/app-cloudep-member-server/pkg/mock/repository"
) )
func TestMemberUseCase_BindUserInfo(t *testing.T) { func TestMemberUseCase_BindUserInfo(t *testing.T) {

View File

@ -1,11 +1,12 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/entity"
"context" "context"
"math" "math"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code" "code.30cm.net/digimon/library-go/errs/code"
GIDLib "code.30cm.net/digimon/library-go/utils/invited_code" GIDLib "code.30cm.net/digimon/library-go/utils/invited_code"

View File

@ -1,13 +1,14 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain/entity"
mockRepo "app-cloudep-member-server/pkg/mock/repository"
"context" "context"
"errors" "errors"
"math" "math"
"testing" "testing"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
mockRepo "code.30cm.net/digimon/app-cloudep-member-server/pkg/mock/repository"
GIDLib "code.30cm.net/digimon/library-go/utils/invited_code" GIDLib "code.30cm.net/digimon/library-go/utils/invited_code"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"go.uber.org/mock/gomock" "go.uber.org/mock/gomock"

View File

@ -1,14 +1,16 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/pkg/domain/repository"
"app-cloudep-member-server/pkg/domain/usecase"
"context" "context"
"errors" "errors"
"fmt" "fmt"
"math"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code" "code.30cm.net/digimon/library-go/errs/code"
@ -68,7 +70,7 @@ func (use *MemberUseCase) GetUIDByAccount(ctx context.Context, req usecase.GetUI
e = errs.ResourceNotFoundWithScope( e = errs.ResourceNotFoundWithScope(
code.CloudEPMember, code.CloudEPMember,
domain.FailedFindUIDByLoginIDErrorCode, domain.FailedFindUIDByLoginIDErrorCode,
fmt.Sprintf("failed to insert account: %s", req.Account), fmt.Sprintf("failed to find uid by account: %s", req.Account),
) )
default: default:
// 錯誤代碼 20-201-07 // 錯誤代碼 20-201-07
@ -81,7 +83,7 @@ func (use *MemberUseCase) GetUIDByAccount(ctx context.Context, req usecase.GetUI
{Key: "func", Value: "AccountUID.FindUIDByLoginID"}, {Key: "func", Value: "AccountUID.FindUIDByLoginID"},
{Key: "err", Value: err.Error()}, {Key: "err", Value: err.Error()},
}, },
"failed to find account").Wrap(err) "failed to find uid by account").Wrap(err)
} }
return usecase.GetUIDByAccountResponse{}, e return usecase.GetUIDByAccountResponse{}, e
@ -216,8 +218,11 @@ func (use *MemberUseCase) UpdateUserToken(ctx context.Context, req usecase.Updat
fmt.Sprintf("failed to encrypt err: %s", e.Error()), fmt.Sprintf("failed to encrypt err: %s", e.Error()),
) )
} }
toInt8, err := safeInt64ToInt8(req.Platform)
err := use.Account.UpdateTokenByLoginID(ctx, req.Account, token) if err != nil {
return err
}
err = use.Account.UpdateTokenByLoginID(ctx, req.Account, token, member.Platform(toInt8))
if err != nil { if err != nil {
var e *errs.LibError var e *errs.LibError
switch { switch {
@ -387,3 +392,11 @@ func GetOriginalInt64(value *int64) int64 {
return *value return *value
} }
func safeInt64ToInt8(n int64) (int8, error) {
if n < math.MinInt8 || n > math.MaxInt8 {
return 0, fmt.Errorf("int64 value %d out of int8 range", n)
}
return int8(n), nil
}

View File

@ -1,17 +1,18 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/config"
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/pkg/domain/usecase"
mockRepo "app-cloudep-member-server/pkg/mock/repository"
"app-cloudep-member-server/pkg/repository"
"context" "context"
"errors" "errors"
"testing" "testing"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/config"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
mockRepo "code.30cm.net/digimon/app-cloudep-member-server/pkg/mock/repository"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/repository"
"code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code" "code.30cm.net/digimon/library-go/errs/code"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -413,17 +414,17 @@ func TestUpdateUserToken(t *testing.T) {
}{ }{
{ {
name: "Successful token update", name: "Successful token update",
req: usecase.UpdateTokenRequest{Account: "testAccount", Token: "newPassword"}, req: usecase.UpdateTokenRequest{Account: "testAccount", Token: "newPassword", Platform: 1},
mockSetup: func() { mockSetup: func() {
mockAccountRepo.EXPECT(). mockAccountRepo.EXPECT().
UpdateTokenByLoginID(gomock.Any(), "testAccount", "encrypted-password"). UpdateTokenByLoginID(gomock.Any(), "testAccount", "encrypted-password", gomock.Any()).
Return(nil) Return(nil)
}, },
wantErr: false, wantErr: false,
}, },
{ {
name: "Password encryption failure", name: "Password encryption failure",
req: usecase.UpdateTokenRequest{Account: "testAccount", Token: "fail"}, req: usecase.UpdateTokenRequest{Account: "testAccount", Token: "fail", Platform: 1},
mockSetup: func() { mockSetup: func() {
// No repo call expected // No repo call expected
}, },
@ -431,20 +432,20 @@ func TestUpdateUserToken(t *testing.T) {
}, },
{ {
name: "Account not found", name: "Account not found",
req: usecase.UpdateTokenRequest{Account: "nonExistentAccount", Token: "newPassword"}, req: usecase.UpdateTokenRequest{Account: "nonExistentAccount", Token: "newPassword", Platform: 1},
mockSetup: func() { mockSetup: func() {
mockAccountRepo.EXPECT(). mockAccountRepo.EXPECT().
UpdateTokenByLoginID(gomock.Any(), "nonExistentAccount", "encrypted-password"). UpdateTokenByLoginID(gomock.Any(), "nonExistentAccount", "encrypted-password", gomock.Any()).
Return(mon.ErrNotFound) Return(mon.ErrNotFound)
}, },
wantErr: true, wantErr: true,
}, },
{ {
name: "Database error during token update", name: "Database error during token update",
req: usecase.UpdateTokenRequest{Account: "errorAccount", Token: "newPassword"}, req: usecase.UpdateTokenRequest{Account: "errorAccount", Token: "newPassword", Platform: 1},
mockSetup: func() { mockSetup: func() {
mockAccountRepo.EXPECT(). mockAccountRepo.EXPECT().
UpdateTokenByLoginID(gomock.Any(), "errorAccount", "encrypted-password"). UpdateTokenByLoginID(gomock.Any(), "errorAccount", "encrypted-password", gomock.Any()).
Return(errors.New("database error")) Return(errors.New("database error"))
}, },
wantErr: true, wantErr: true,

View File

@ -1,12 +1,13 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/pkg/domain/usecase"
"context" "context"
"fmt" "fmt"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code" "code.30cm.net/digimon/library-go/errs/code"
) )

View File

@ -1,8 +1,6 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/usecase"
"context" "context"
"encoding/json" "encoding/json"
"errors" "errors"
@ -12,6 +10,9 @@ import (
"strconv" "strconv"
"time" "time"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code" "code.30cm.net/digimon/library-go/errs/code"
) )

View File

@ -1,14 +1,16 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code"
"github.com/stretchr/testify/assert"
"strconv" "strconv"
"testing" "testing"
"time" "time"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code"
"github.com/stretchr/testify/assert"
) )
func TestValidateGoogleTokenInfo(t *testing.T) { func TestValidateGoogleTokenInfo(t *testing.T) {

View File

@ -1,8 +1,6 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain"
"app-cloudep-member-server/pkg/domain/usecase"
"bytes" "bytes"
"context" "context"
"encoding/json" "encoding/json"
@ -10,6 +8,9 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
"code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code" "code.30cm.net/digimon/library-go/errs/code"
) )

View File

@ -1,15 +1,16 @@
package usecase package usecase
import ( import (
"app-cloudep-member-server/pkg/domain/entity"
"app-cloudep-member-server/pkg/domain/member"
"app-cloudep-member-server/pkg/domain/usecase"
mockRepo "app-cloudep-member-server/pkg/mock/repository"
"context" "context"
"errors" "errors"
"fmt" "fmt"
"testing" "testing"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member"
"code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase"
mockRepo "code.30cm.net/digimon/app-cloudep-member-server/pkg/mock/repository"
"code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"go.uber.org/mock/gomock" "go.uber.org/mock/gomock"