app-cloudep-product-service/pkg/usecase/kyc.go

172 lines
5.0 KiB
Go
Raw Normal View History

2025-04-01 09:44:57 +00:00
package usecase
2025-04-04 06:39:01 +00:00
import (
2025-04-06 02:08:46 +00:00
"context"
"errors"
"fmt"
2025-04-04 06:39:01 +00:00
"code.30cm.net/digimon/app-cloudep-product-service/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-product-service/pkg/domain/kyc"
"code.30cm.net/digimon/app-cloudep-product-service/pkg/domain/repository"
"code.30cm.net/digimon/app-cloudep-product-service/pkg/domain/usecase"
repo "code.30cm.net/digimon/app-cloudep-product-service/pkg/repository"
"code.30cm.net/digimon/library-go/errs"
"github.com/zeromicro/go-zero/core/logx"
)
type KYCUseCaseParam struct {
KYCRepo repository.KYCRepository
}
type KYCUseCase struct {
KYCUseCaseParam
}
func MustKYCUseCase(param KYCUseCaseParam) usecase.KYCUseCase {
return &KYCUseCase{
param,
}
}
func (use *KYCUseCase) Create(ctx context.Context, data *entity.KYC) error {
latest, err := use.KYCRepo.FindLatestByUID(ctx, data.UID)
// 發生真正的錯誤(非找不到)
if err != nil && !errors.Is(err, repo.ErrNotFound) {
return errs.DBErrorL(logx.WithContext(ctx),
[]logx.LogField{
{Key: "param", Value: data},
{Key: "func", Value: "KYCRepo.FindLatestByUID"},
{Key: "err", Value: err.Error()},
}, "failed to get latest kyc")
}
// 若查到資料,且不是被駁回的,表示已存在審核中/已通過資料 → 禁止再次建立
if err == nil && latest.Status != kyc.StatusREJECTED {
return errs.ForbiddenL(logx.WithContext(ctx),
[]logx.LogField{
{Key: "param", Value: data},
{Key: "func", Value: "KYCRepo.FindLatestByUID"},
{Key: "reason", Value: "KYC already in progress or approved"},
2025-04-08 09:20:34 +00:00
}, "KYC already in progress or approved")
2025-04-04 06:39:01 +00:00
}
// ✅ 若查不到資料ErrNotFound或前一筆是 REJECTED允許建立
data.Status = kyc.StatusPending
err = use.KYCRepo.Create(ctx, data)
if err != nil {
return errs.DBErrorL(logx.WithContext(ctx),
[]logx.LogField{
{Key: "param", Value: data},
{Key: "func", Value: "KYCRepo.Create"},
{Key: "err", Value: err.Error()},
}, "failed to create kyc review")
}
return nil
}
func (use *KYCUseCase) FindLatestByUID(ctx context.Context, uid string) (*entity.KYC, error) {
latest, err := use.KYCRepo.FindLatestByUID(ctx, uid)
2025-04-08 09:20:34 +00:00
if errors.Is(err, repo.ErrNotFound) {
return nil, errs.ResourceNotFound("failed to find latest kyc")
}
2025-04-04 06:39:01 +00:00
if err != nil {
return nil, errs.DBErrorL(logx.WithContext(ctx),
[]logx.LogField{
{Key: "uid", Value: uid},
{Key: "func", Value: "KYCRepo.FindLatestByUID"},
{Key: "err", Value: err.Error()},
}, "failed to get latest kyc")
}
return latest, nil
}
func (use *KYCUseCase) FindByID(ctx context.Context, id string) (*entity.KYC, error) {
byID, err := use.KYCRepo.FindByID(ctx, id)
if err != nil {
return nil, errs.DBErrorL(logx.WithContext(ctx),
[]logx.LogField{
{Key: "id", Value: id},
{Key: "func", Value: "KYCRepo.FindByID"},
{Key: "err", Value: err.Error()},
}, "failed to get kyc")
}
return byID, nil
}
func (use *KYCUseCase) List(ctx context.Context, params usecase.KYCQueryParams) ([]*entity.KYC, int64, error) {
q := repository.KYCQueryParams{
PageIndex: params.PageIndex,
PageSize: params.PageSize,
SortByDate: true,
}
if params.UID != nil {
q.UID = params.UID
}
if params.Country != nil {
q.Country = params.Country
}
if params.Status != nil {
q.Status = params.Status
}
list, i, err := use.KYCRepo.List(ctx, q)
if err != nil {
return nil, 0, errs.DBErrorL(logx.WithContext(ctx),
[]logx.LogField{
{Key: "params", Value: params},
{Key: "func", Value: "KYCRepo.List"},
{Key: "err", Value: err.Error()},
}, "failed to list kyc")
}
return list, i, nil
}
func (use *KYCUseCase) UpdateStatus(ctx context.Context, id string, status string, reason string) error {
err := use.KYCRepo.UpdateStatus(ctx, id, status, reason)
if err != nil {
return errs.DBErrorL(logx.WithContext(ctx),
[]logx.LogField{
{Key: "params", Value: fmt.Sprintf("id:%s, status:%s, reason: %s", id, status, reason)},
{Key: "func", Value: "KYCRepo.UpdateStatus"},
{Key: "err", Value: err.Error()},
}, "failed to update kyc status")
}
return nil
}
func (use *KYCUseCase) UpdateKYCInfo(ctx context.Context, id string, update *usecase.KYCUpdateParams) error {
err := use.KYCRepo.UpdateKYCInfo(ctx, id, &repository.KYCUpdateParams{
Name: update.Name,
Identification: update.Identification,
IdentificationType: update.IdentificationType,
Address: update.Address,
PostalCode: update.PostalCode,
IDFrontImage: update.IDFrontImage,
IDBackImage: update.IDBackImage,
BankStatementImg: update.BankStatementImg,
BankCode: update.BankCode,
BankName: update.BankName,
BranchCode: update.BranchCode,
BranchName: update.BranchName,
BankAccount: update.BankAccount,
})
if err != nil {
return errs.DBErrorL(logx.WithContext(ctx),
[]logx.LogField{
{Key: "id", Value: id},
{Key: "params", Value: update},
{Key: "func", Value: "KYCRepo.UpdateKYCInfo"},
{Key: "err", Value: err.Error()},
}, "failed to update kyc")
}
return nil
}