diff --git a/generate/protobuf/member.proto b/generate/protobuf/member.proto index 9d39c8a..884a47c 100644 --- a/generate/protobuf/member.proto +++ b/generate/protobuf/member.proto @@ -9,12 +9,6 @@ message OKResp {} message NoneReq {} // ================ enum ================ -enum VerifyType { - VERIFY_NONE = 0; // 初始(異常) - VERIFY_OK = 1; - VERIFY_NOT = 2; // 尚未 -} - enum AlarmType { ALARM_NONE = 0; // 初始(異常) ALARM_NOT = 1; // 未告警 @@ -61,19 +55,18 @@ message BindingUserResp { message CreateUserInfoReq { string uid = 1; - VerifyType verify_type = 2; - AlarmType alarm_type = 3; - MemberStatus status = 4; - string language = 5; - string currency = 6; - optional string avatar= 7; - optional string nick_name = 8; - optional string full_name = 9; - optional int64 gender = 10; - optional int64 birthdate = 11; - optional string phone_number = 12; - optional string email = 13; - optional string address = 14; + AlarmType alarm_type = 2; + MemberStatus status = 3; + string language = 4; + string currency = 5; + optional string avatar= 6; + optional string nick_name = 7; + optional string full_name = 8; + optional int64 gender = 9; + optional int64 birthdate = 10; + optional string phone_number = 11; + optional string email = 12; + optional string address = 13; } message GetAccountInfoResp { @@ -87,15 +80,12 @@ message UpdateUserInfoReq { optional string currency = 3; optional string nick_name = 4; optional string avatar = 5; - optional VerifyType verify_type = 6; - optional AlarmType alarm_type = 7; - optional MemberStatus status = 8; - optional string full_name = 9; - optional int64 gender = 10; - optional int64 birthdate = 11; - optional string phone_number = 12; - optional string email = 13; - optional string address = 14; + optional AlarmType alarm_type = 6; + optional MemberStatus status = 7; + optional string full_name = 8; + optional int64 gender = 9; + optional int64 birthdate = 10; + optional string address = 11; } message GetUIDByAccountReq { @@ -144,15 +134,20 @@ message GetUserInfoReq { message UserInfo { string uid = 1; - VerifyType verify_type = 2; - AlarmType alarm_type = 3; - MemberStatus status = 4; - string language = 5; - string currency = 6; - string avatar = 7; - int64 create_time=8; - int64 update_time=9; - optional string nick_name = 10; + optional string avatar_url = 2; + optional string full_name = 3; + optional string nick_name = 4; + optional int64 gender_code = 5; + optional int64 birthday = 6; + optional string phone =7; + optional string email=8; + optional string address=9; + AlarmType alarm_type = 10; + MemberStatus status = 11; + string language = 12; + string currency = 13; + int64 create_time=14; + int64 update_time=15; } message GetUserInfoResp { @@ -160,13 +155,12 @@ message GetUserInfoResp { } message ListUserInfoReq { - optional VerifyType verify_type = 1; - optional AlarmType alarm_type = 2; - optional MemberStatus status = 3; - optional int64 create_start_time = 4; - optional int64 create_end_time = 5; - int64 page_size =6; - int64 page_index=7; + optional AlarmType alarm_type = 1; + optional MemberStatus status = 2; + optional int64 create_start_time = 3; + optional int64 create_end_time = 4; + int64 page_size =5; + int64 page_index=6; } message ListUserInfoResp { @@ -183,6 +177,19 @@ message VerifyAuthResultResp { 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 { string token = 1; } @@ -201,8 +208,18 @@ message LineAccessTokenResp { } message LineUserProfile { - string name = 1; - string email = 2; + string display_name = 1; + string user_id = 2; + string picture_url = 3; + string status_message = 4; +} + +message LineGetTokenReq { + string code = 1; +} + +message LineGetUserInfoReq { + string token = 1; } service Account { @@ -237,12 +254,12 @@ service Account { // CheckRefreshCode 驗證忘記密碼 token 不刪除,只確認) rpc CheckRefreshCode(VerifyRefreshCodeReq) returns(OKResp); // VerifyGoogleAuthResult 驗證 google 登入是否有效 - rpc VerifyGoogleAuthResult(VerifyAuthResultReq)returns(VerifyAuthResultResp); + rpc VerifyGoogleAuthResult(VerifyAuthResultReq)returns(VerifyGoogleAuthResultResp); // VerifyPlatformAuthResult 驗證 google 登入是否有效 rpc VerifyPlatformAuthResult(VerifyAuthResultReq)returns(VerifyAuthResultResp); // LineCodeToAccessToken Line 驗證相關 - rpc LineCodeToAccessToken(NoneReq) returns (LineAccessTokenResp); + rpc LineCodeToAccessToken(LineGetTokenReq) returns (LineAccessTokenResp); // LineGetProfileByAccessToken Line 驗證相關 - rpc LineGetProfileByAccessToken(NoneReq) returns (LineUserProfile); + rpc LineGetProfileByAccessToken(LineGetUserInfoReq) returns (LineUserProfile); } // ================ account ================ \ No newline at end of file diff --git a/internal/config/config.go b/internal/config/config.go index 5085566..c05eb6b 100755 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -4,13 +4,11 @@ import ( "time" "github.com/zeromicro/go-zero/core/stores/cache" - "github.com/zeromicro/go-zero/core/stores/redis" "github.com/zeromicro/go-zero/zrpc" ) type Config struct { zrpc.RpcServerConf - redis.RedisConf // Redis Cluster Cache cache.CacheConf CacheExpireTime time.Duration diff --git a/internal/logic/account/bind_account_logic.go b/internal/logic/account/bind_account_logic.go index 86460ed..850e89f 100644 --- a/internal/logic/account/bind_account_logic.go +++ b/internal/logic/account/bind_account_logic.go @@ -44,43 +44,30 @@ func (l *BindAccountLogic) BindAccount(in *member.BindingUserReq) (*member.Bindi }); err != nil { return nil, errs.InvalidFormat(err.Error()) } - - // 先確定有這個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()) + s, err := safeInt64ToInt32(in.GetType()) if err != nil { return nil, err } - if _, err := l.svcCtx.AccountUseCase.BindAccount(l.ctx, usecase.BindingUser{ - LoginID: in.LoginId, - UID: uid, - Type: domain.AccountType(t), - }); err != nil { + account, err := l.svcCtx.AccountUseCase.BindAccount(l.ctx, usecase.BindingUser{ + UID: in.GetUid(), + LoginID: in.GetLoginId(), + Type: domain.AccountType(s), + }) + if err != nil { return nil, err } return &member.BindingUserResp{ - LoginId: in.LoginId, - Uid: uid, + LoginId: account.LoginID, + Uid: account.UID, Type: in.GetType(), }, nil } -func int64ToInt32Safe(value int64) (int32, error) { - if value > math.MaxInt32 || value < math.MinInt32 { - return 0, fmt.Errorf("value %d is out of int32 range", value) +func safeInt64ToInt32(n int64) (int32, error) { + if n < math.MinInt32 || n > math.MaxInt32 { + return 0, fmt.Errorf("int64 value %d out of int8 range", n) } - return int32(value), nil + + return int32(n), nil } diff --git a/internal/logic/account/bind_user_info_logic.go b/internal/logic/account/bind_user_info_logic.go index a5ddf02..ad4aceb 100644 --- a/internal/logic/account/bind_user_info_logic.go +++ b/internal/logic/account/bind_user_info_logic.go @@ -5,8 +5,11 @@ import ( "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" + "google.golang.org/protobuf/proto" ) type BindUserInfoLogic struct { @@ -23,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 { - Uid string `validate:"required"` // 唯一辨識碼 + UID string `validate:"required"` // 唯一辨識碼 Language string `validate:"required"` Currency string `validate:"required"` } // BindUserInfo 初次,綁定 User Info 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 } diff --git a/internal/logic/account/bind_verify_email_logic.go b/internal/logic/account/bind_verify_email_logic.go index ec0d721..06b12ad 100644 --- a/internal/logic/account/bind_verify_email_logic.go +++ b/internal/logic/account/bind_verify_email_logic.go @@ -3,6 +3,8 @@ package accountlogic import ( "context" + "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" @@ -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 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 } diff --git a/internal/logic/account/bind_verify_phone_logic.go b/internal/logic/account/bind_verify_phone_logic.go index 458999b..fabb432 100644 --- a/internal/logic/account/bind_verify_phone_logic.go +++ b/internal/logic/account/bind_verify_phone_logic.go @@ -3,6 +3,8 @@ package accountlogic import ( "context" + "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" @@ -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 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 } diff --git a/internal/logic/account/check_refresh_code_logic.go b/internal/logic/account/check_refresh_code_logic.go index 90ea60c..6d74bc8 100644 --- a/internal/logic/account/check_refresh_code_logic.go +++ b/internal/logic/account/check_refresh_code_logic.go @@ -3,6 +3,10 @@ package accountlogic import ( "context" + 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/app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc" @@ -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 不刪除,只確認) 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 } diff --git a/internal/logic/account/create_user_account_logic.go b/internal/logic/account/create_user_account_logic.go index 1361751..6e6a694 100644 --- a/internal/logic/account/create_user_account_logic.go +++ b/internal/logic/account/create_user_account_logic.go @@ -2,6 +2,12 @@ package accountlogic import ( "context" + "fmt" + "math" + + 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/app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc" @@ -23,9 +29,47 @@ func NewCreateUserAccountLogic(ctx context.Context, svcCtx *svc.ServiceContext) } } +type createUserAccountReq struct { + LoginID string `validate:"required"` + Token string `validate:"required"` +} + // CreateUserAccount 建立帳號與密碼 -> 可登入,但可不可以做其他事情看業務流程,也可以只註冊就好 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 } + +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 +} diff --git a/internal/logic/account/generate_refresh_code_logic.go b/internal/logic/account/generate_refresh_code_logic.go index 79fd31c..f388b02 100644 --- a/internal/logic/account/generate_refresh_code_logic.go +++ b/internal/logic/account/generate_refresh_code_logic.go @@ -5,6 +5,9 @@ import ( "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" ) @@ -23,9 +26,34 @@ func NewGenerateRefreshCodeLogic(ctx context.Context, svcCtx *svc.ServiceContext } } +type generateRefreshCodeReq struct { + LoginID string `validate:"required"` +} + // GenerateRefreshCode 這個帳號驗證碼(十分鐘),通用的 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 } diff --git a/internal/logic/account/get_u_i_d_by_account_logic.go b/internal/logic/account/get_u_i_d_by_account_logic.go index c7a671f..a26b6d3 100644 --- a/internal/logic/account/get_u_i_d_by_account_logic.go +++ b/internal/logic/account/get_u_i_d_by_account_logic.go @@ -3,6 +3,9 @@ package accountlogic import ( "context" + "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" @@ -23,9 +26,27 @@ func NewGetUIDByAccountLogic(ctx context.Context, svcCtx *svc.ServiceContext) *G } } +type getUIDByAccountReq struct { + Account string `validate:"required"` +} + // GetUIDByAccount 用帳號換取 UID 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 } diff --git a/internal/logic/account/get_user_account_info_logic.go b/internal/logic/account/get_user_account_info_logic.go index 65f8d8c..62bcb67 100644 --- a/internal/logic/account/get_user_account_info_logic.go +++ b/internal/logic/account/get_user_account_info_logic.go @@ -3,6 +3,9 @@ package accountlogic import ( "context" + "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" @@ -23,9 +26,30 @@ func NewGetUserAccountInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) } } +type getUserAccountInfoReq struct { + Account string `validate:"required"` +} + // GetUserAccountInfo 取得帳號密碼資料 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 } diff --git a/internal/logic/account/get_user_info_logic.go b/internal/logic/account/get_user_info_logic.go index 4a873cb..74f48f2 100644 --- a/internal/logic/account/get_user_info_logic.go +++ b/internal/logic/account/get_user_info_logic.go @@ -5,6 +5,7 @@ import ( "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member" "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" ) @@ -25,7 +26,31 @@ func NewGetUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUs // GetUserInfo 取得會員資訊 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 } diff --git a/internal/logic/account/line_code_to_access_token_logic.go b/internal/logic/account/line_code_to_access_token_logic.go index 4d7f5d5..069461a 100644 --- a/internal/logic/account/line_code_to_access_token_logic.go +++ b/internal/logic/account/line_code_to_access_token_logic.go @@ -24,8 +24,13 @@ func NewLineCodeToAccessTokenLogic(ctx context.Context, svcCtx *svc.ServiceConte } // LineCodeToAccessToken Line 驗證相關 -func (l *LineCodeToAccessTokenLogic) LineCodeToAccessToken(in *member.NoneReq) (*member.LineAccessTokenResp, error) { - // todo: add your logic here and delete this line +func (l *LineCodeToAccessTokenLogic) LineCodeToAccessToken(in *member.LineGetTokenReq) (*member.LineAccessTokenResp, error) { + 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 } diff --git a/internal/logic/account/line_get_profile_by_access_token_logic.go b/internal/logic/account/line_get_profile_by_access_token_logic.go index 608ef48..d1b6221 100644 --- a/internal/logic/account/line_get_profile_by_access_token_logic.go +++ b/internal/logic/account/line_get_profile_by_access_token_logic.go @@ -24,8 +24,16 @@ func NewLineGetProfileByAccessTokenLogic(ctx context.Context, svcCtx *svc.Servic } // LineGetProfileByAccessToken Line 驗證相關 -func (l *LineGetProfileByAccessTokenLogic) LineGetProfileByAccessToken(in *member.NoneReq) (*member.LineUserProfile, error) { - // todo: add your logic here and delete this line +func (l *LineGetProfileByAccessTokenLogic) LineGetProfileByAccessToken(in *member.LineGetUserInfoReq) (*member.LineUserProfile, error) { + 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 } diff --git a/internal/logic/account/list_member_logic.go b/internal/logic/account/list_member_logic.go index 2d8a3b7..d6f0840 100644 --- a/internal/logic/account/list_member_logic.go +++ b/internal/logic/account/list_member_logic.go @@ -3,8 +3,11 @@ package accountlogic import ( "context" - "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member" + pb "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member" "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" ) @@ -24,8 +27,72 @@ func NewListMemberLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ListMe } // ListMember 取得會員列表 -func (l *ListMemberLogic) ListMember(in *member.ListUserInfoReq) (*member.ListUserInfoResp, error) { - // todo: add your logic here and delete this line +func (l *ListMemberLogic) ListMember(in *pb.ListUserInfoReq) (*pb.ListUserInfoResp, error) { + 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 } diff --git a/internal/logic/account/update_status_logic.go b/internal/logic/account/update_status_logic.go index fee370f..4712c93 100644 --- a/internal/logic/account/update_status_logic.go +++ b/internal/logic/account/update_status_logic.go @@ -3,7 +3,11 @@ package accountlogic import ( "context" - "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member" + "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" + + 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" @@ -24,8 +28,16 @@ func NewUpdateStatusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Upda } // UpdateStatus 修改狀態 -func (l *UpdateStatusLogic) UpdateStatus(in *member.UpdateStatusReq) (*member.OKResp, error) { - // todo: add your logic here and delete this line +func (l *UpdateStatusLogic) UpdateStatus(in *pb.UpdateStatusReq) (*pb.OKResp, error) { + 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 } diff --git a/internal/logic/account/update_user_info_logic.go b/internal/logic/account/update_user_info_logic.go index 5a8f08d..b2a36b4 100644 --- a/internal/logic/account/update_user_info_logic.go +++ b/internal/logic/account/update_user_info_logic.go @@ -3,7 +3,10 @@ package accountlogic import ( "context" - "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member" + "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member" + "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" @@ -24,8 +27,39 @@ func NewUpdateUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Up } // UpdateUserInfo 更新 User Info -func (l *UpdateUserInfoLogic) UpdateUserInfo(in *member.UpdateUserInfoReq) (*member.OKResp, error) { - // todo: add your logic here and delete this line +func (l *UpdateUserInfoLogic) UpdateUserInfo(in *pb.UpdateUserInfoReq) (*pb.OKResp, error) { + 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 } diff --git a/internal/logic/account/update_user_token_logic.go b/internal/logic/account/update_user_token_logic.go index 1a30e75..d2df588 100644 --- a/internal/logic/account/update_user_token_logic.go +++ b/internal/logic/account/update_user_token_logic.go @@ -3,6 +3,8 @@ package accountlogic import ( "context" + "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase" + "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc" @@ -25,7 +27,15 @@ func NewUpdateUserTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *U // UpdateUserToken 更新密碼 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 } diff --git a/internal/logic/account/verify_google_auth_result_logic.go b/internal/logic/account/verify_google_auth_result_logic.go index 78dc5f4..5dffff0 100644 --- a/internal/logic/account/verify_google_auth_result_logic.go +++ b/internal/logic/account/verify_google_auth_result_logic.go @@ -3,6 +3,8 @@ package accountlogic import ( "context" + "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase" + "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc" @@ -24,8 +26,26 @@ func NewVerifyGoogleAuthResultLogic(ctx context.Context, svcCtx *svc.ServiceCont } // VerifyGoogleAuthResult 驗證 google 登入是否有效 -func (l *VerifyGoogleAuthResultLogic) VerifyGoogleAuthResult(in *member.VerifyAuthResultReq) (*member.VerifyAuthResultResp, error) { - // todo: add your logic here and delete this line +func (l *VerifyGoogleAuthResultLogic) VerifyGoogleAuthResult(in *member.VerifyAuthResultReq) (*member.VerifyGoogleAuthResultResp, error) { + 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 } diff --git a/internal/logic/account/verify_platform_auth_result_logic.go b/internal/logic/account/verify_platform_auth_result_logic.go index 9224ac6..6931b0e 100644 --- a/internal/logic/account/verify_platform_auth_result_logic.go +++ b/internal/logic/account/verify_platform_auth_result_logic.go @@ -3,6 +3,8 @@ package accountlogic import ( "context" + "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase" + "code.30cm.net/digimon/app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc" @@ -25,7 +27,15 @@ func NewVerifyPlatformAuthResultLogic(ctx context.Context, svcCtx *svc.ServiceCo // VerifyPlatformAuthResult 驗證 google 登入是否有效 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 } diff --git a/internal/logic/account/verify_refresh_code_logic.go b/internal/logic/account/verify_refresh_code_logic.go index 7490ce6..40481a8 100644 --- a/internal/logic/account/verify_refresh_code_logic.go +++ b/internal/logic/account/verify_refresh_code_logic.go @@ -3,6 +3,10 @@ package accountlogic import ( "context" + 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/app-cloudep-member-server/gen_result/pb/member" "code.30cm.net/digimon/app-cloudep-member-server/internal/svc" @@ -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 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 } diff --git a/internal/server/account/account_server.go b/internal/server/account/account_server.go index 377cd82..8dbeff7 100644 --- a/internal/server/account/account_server.go +++ b/internal/server/account/account_server.go @@ -114,7 +114,7 @@ func (s *AccountServer) CheckRefreshCode(ctx context.Context, in *member.VerifyR } // 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) return l.VerifyGoogleAuthResult(in) } @@ -126,13 +126,13 @@ func (s *AccountServer) VerifyPlatformAuthResult(ctx context.Context, in *member } // 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) return l.LineCodeToAccessToken(in) } // 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) return l.LineGetProfileByAccessToken(in) } diff --git a/internal/svc/service_context.go b/internal/svc/service_context.go index 4f7c47b..647e133 100644 --- a/internal/svc/service_context.go +++ b/internal/svc/service_context.go @@ -1,6 +1,8 @@ package svc import ( + "context" + "code.30cm.net/digimon/app-cloudep-member-server/internal/config" cfg "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/config" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase" @@ -46,6 +48,10 @@ func NewAccountUC(c *config.Config) usecase.AccountUseCase { EnableStandardReadWriteSplitMode: c.Mongo.EnableStandardReadWriteSplitMode, ConnectTimeoutMs: c.Mongo.ConnectTimeoutMs, } + if c.Mongo.User != "" { + conf.User = c.Mongo.User + conf.Password = c.Mongo.Password + } // 快取選項 cacheOpts := []cache.Option{ @@ -57,36 +63,47 @@ func NewAccountUC(c *config.Config) usecase.AccountUseCase { mgo.InitMongoOptions(*conf), } - newRedis, err := redis.NewRedis(c.RedisConf, redis.Cluster()) + newRedis, err := redis.NewRedis(c.Redis.RedisConf) if err != nil { 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{ - Account: repository.NewAccountRepository(repository.AccountRepositoryParam{ - Conf: conf, - CacheConf: c.Cache, - 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, - }), + Account: ac, + User: u, + AccountUID: auid, VerifyCodeModel: repository.NewVerifyCodeRepository(newRedis), - GenerateUID: repository.NewAutoIDRepository(repository.AutoIDRepositoryParam{ - Conf: conf, - DBOpts: dbOpts, - }), - Config: prepareCfg(c), + GenerateUID: guid, + Config: prepareCfg(c), }) } diff --git a/pkg/domain/repository/account.go b/pkg/domain/repository/account.go index 5cce164..e13203f 100644 --- a/pkg/domain/repository/account.go +++ b/pkg/domain/repository/account.go @@ -3,6 +3,8 @@ package repository import ( "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" @@ -14,7 +16,7 @@ type AccountRepository interface { Update(ctx context.Context, data *entity.Account) (*mongo.UpdateResult, error) Delete(ctx context.Context, id string) (int64, 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 } diff --git a/pkg/repository/account.go b/pkg/repository/account.go index 75bec4d..c3ddc5f 100644 --- a/pkg/repository/account.go +++ b/pkg/repository/account.go @@ -5,6 +5,8 @@ import ( "errors" "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" @@ -113,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: 之後需要同步快取 - filter := bson.M{"login_id": account} + filter := bson.M{"login_id": account, "platform": platform.ToInt64()} update := bson.M{ "$set": bson.M{ "token": token, diff --git a/pkg/repository/account_test.go b/pkg/repository/account_test.go index 4930555..71e6de0 100644 --- a/pkg/repository/account_test.go +++ b/pkg/repository/account_test.go @@ -1,14 +1,15 @@ package repository import ( - "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity" - "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository" "context" "errors" "fmt" "testing" "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" "github.com/alicebob/miniredis/v2" "github.com/stretchr/testify/assert" diff --git a/pkg/repository/account_uid_test.go b/pkg/repository/account_uid_test.go index 7640107..b9f168c 100644 --- a/pkg/repository/account_uid_test.go +++ b/pkg/repository/account_uid_test.go @@ -1,13 +1,14 @@ package repository import ( - "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity" - "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository" "context" "fmt" "testing" "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" "github.com/alicebob/miniredis/v2" "github.com/stretchr/testify/assert" diff --git a/pkg/repository/auto_id_test.go b/pkg/repository/auto_id_test.go index 7056a46..0aea917 100644 --- a/pkg/repository/auto_id_test.go +++ b/pkg/repository/auto_id_test.go @@ -1,13 +1,14 @@ package repository import ( - "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity" - "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/repository" "context" "fmt" "testing" "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" "github.com/stretchr/testify/assert" ) diff --git a/pkg/repository/user_test.go b/pkg/repository/user_test.go index 6352b11..03a4745 100644 --- a/pkg/repository/user_test.go +++ b/pkg/repository/user_test.go @@ -1,15 +1,16 @@ package repository import ( - "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" "context" "errors" "fmt" "testing" "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" "github.com/alicebob/miniredis/v2" "github.com/stretchr/testify/assert" diff --git a/pkg/repository/verify_code.go b/pkg/repository/verify_code.go index 7ca996d..4a3dd8e 100644 --- a/pkg/repository/verify_code.go +++ b/pkg/repository/verify_code.go @@ -5,7 +5,6 @@ import ( "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" ) diff --git a/pkg/repository/verify_code_test.go b/pkg/repository/verify_code_test.go index df0e946..ddb8092 100644 --- a/pkg/repository/verify_code_test.go +++ b/pkg/repository/verify_code_test.go @@ -1,11 +1,12 @@ package repository import ( - "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain" "context" "fmt" "testing" + "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain" + "github.com/alicebob/miniredis/v2" "github.com/stretchr/testify/assert" "github.com/zeromicro/go-zero/core/stores/redis" diff --git a/pkg/usecase/binding_test.go b/pkg/usecase/binding_test.go index b127d49..df71cef 100644 --- a/pkg/usecase/binding_test.go +++ b/pkg/usecase/binding_test.go @@ -1,13 +1,14 @@ package usecase import ( - "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" "context" "errors" "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" "go.uber.org/mock/gomock" "google.golang.org/protobuf/proto" diff --git a/pkg/usecase/generate_test.go b/pkg/usecase/generate_test.go index 3ff02bc..b68fc04 100644 --- a/pkg/usecase/generate_test.go +++ b/pkg/usecase/generate_test.go @@ -1,13 +1,14 @@ package usecase import ( - "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity" - mockRepo "code.30cm.net/digimon/app-cloudep-member-server/pkg/mock/repository" "context" "errors" "math" "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" "github.com/stretchr/testify/assert" "go.uber.org/mock/gomock" diff --git a/pkg/usecase/member.go b/pkg/usecase/member.go index 8b71588..00c3de8 100644 --- a/pkg/usecase/member.go +++ b/pkg/usecase/member.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "math" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/entity" @@ -69,7 +70,7 @@ func (use *MemberUseCase) GetUIDByAccount(ctx context.Context, req usecase.GetUI e = errs.ResourceNotFoundWithScope( code.CloudEPMember, domain.FailedFindUIDByLoginIDErrorCode, - fmt.Sprintf("failed to insert account: %s", req.Account), + fmt.Sprintf("failed to find uid by account: %s", req.Account), ) default: // 錯誤代碼 20-201-07 @@ -82,7 +83,7 @@ func (use *MemberUseCase) GetUIDByAccount(ctx context.Context, req usecase.GetUI {Key: "func", Value: "AccountUID.FindUIDByLoginID"}, {Key: "err", Value: err.Error()}, }, - "failed to find account").Wrap(err) + "failed to find uid by account").Wrap(err) } return usecase.GetUIDByAccountResponse{}, e @@ -217,8 +218,11 @@ func (use *MemberUseCase) UpdateUserToken(ctx context.Context, req usecase.Updat fmt.Sprintf("failed to encrypt err: %s", e.Error()), ) } - - err := use.Account.UpdateTokenByLoginID(ctx, req.Account, token) + toInt8, err := safeInt64ToInt8(req.Platform) + if err != nil { + return err + } + err = use.Account.UpdateTokenByLoginID(ctx, req.Account, token, member.Platform(toInt8)) if err != nil { var e *errs.LibError switch { @@ -388,3 +392,11 @@ func GetOriginalInt64(value *int64) int64 { 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 +} diff --git a/pkg/usecase/member_test.go b/pkg/usecase/member_test.go index 770e749..d177d8a 100644 --- a/pkg/usecase/member_test.go +++ b/pkg/usecase/member_test.go @@ -1,6 +1,10 @@ package usecase import ( + "context" + "errors" + "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" @@ -8,9 +12,6 @@ import ( "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" - "context" - "errors" - "testing" "code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs/code" diff --git a/pkg/usecase/verify_google_test.go b/pkg/usecase/verify_google_test.go index 61950e6..de76fcf 100644 --- a/pkg/usecase/verify_google_test.go +++ b/pkg/usecase/verify_google_test.go @@ -1,12 +1,13 @@ package usecase import ( - "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain" - "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/usecase" "strconv" "testing" "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" diff --git a/pkg/usecase/verify_test.go b/pkg/usecase/verify_test.go index 479ee8b..7fdca13 100644 --- a/pkg/usecase/verify_test.go +++ b/pkg/usecase/verify_test.go @@ -1,15 +1,16 @@ package usecase import ( - "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" "context" "errors" "fmt" "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" "github.com/stretchr/testify/assert" "go.uber.org/mock/gomock"