Compare commits
2 Commits
8e1293f4b7
...
84e608f4bb
Author | SHA1 | Date |
---|---|---|
|
84e608f4bb | |
|
fa9b188811 |
|
@ -48,8 +48,8 @@ type TagModifyParams struct {
|
||||||
|
|
||||||
// TagBindingRepo 定義與 tag binding (TagsBindingTable) 資料表相關的操作
|
// TagBindingRepo 定義與 tag binding (TagsBindingTable) 資料表相關的操作
|
||||||
type TagBindingRepo interface {
|
type TagBindingRepo interface {
|
||||||
// BindTag 建立一筆 tag 與其他資料(例如專案)的綁定關係
|
// BindTags 建立一筆 tag 與其他資料(例如專案)的綁定關係
|
||||||
BindTag(ctx context.Context, binding *entity.TagsBindingTable) error
|
BindTags(ctx context.Context, binding []*entity.TagsBindingTable) error
|
||||||
// UnbindTag 刪除一筆綁定資料
|
// UnbindTag 刪除一筆綁定資料
|
||||||
UnbindTag(ctx context.Context, tagID, referenceID string) error
|
UnbindTag(ctx context.Context, tagID, referenceID string) error
|
||||||
// GetBindingsByReference 根據參照 ID 取得所有綁定資料
|
// GetBindingsByReference 根據參照 ID 取得所有綁定資料
|
||||||
|
|
|
@ -12,15 +12,22 @@ import (
|
||||||
"go.mongodb.org/mongo-driver/mongo/options"
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (repo *TagsRepository) BindTag(ctx context.Context, data *entity.TagsBindingTable) error {
|
func (repo *TagsRepository) BindTags(ctx context.Context, data []*entity.TagsBindingTable) error {
|
||||||
if data.ID.IsZero() {
|
|
||||||
now := time.Now().UTC().UnixNano()
|
now := time.Now().UTC().UnixNano()
|
||||||
data.ID = primitive.NewObjectID()
|
docs := make([]any, 0, len(data))
|
||||||
data.CreatedAt = now
|
|
||||||
data.UpdatedAt = now
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := repo.TageBinding.GetClient().InsertOne(ctx, data)
|
for i := range data {
|
||||||
|
if data[i].ID.IsZero() {
|
||||||
|
data[i].ID = primitive.NewObjectID()
|
||||||
|
data[i].CreatedAt = now
|
||||||
|
data[i].UpdatedAt = now
|
||||||
|
}
|
||||||
|
docs = append(docs, data[i])
|
||||||
|
}
|
||||||
|
if len(docs) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
_, err := repo.TageBinding.GetClient().InsertMany(ctx, docs)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -545,7 +545,7 @@ func TestBindTag(t *testing.T) {
|
||||||
for _, tc := range tests {
|
for _, tc := range tests {
|
||||||
tc := tc // capture range variable
|
tc := tc // capture range variable
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
err := repo.BindTag(ctx, tc.inputBinding)
|
err := repo.BindTags(ctx, []*entity.TagsBindingTable{tc.inputBinding})
|
||||||
if tc.expectError {
|
if tc.expectError {
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
} else {
|
} else {
|
||||||
|
@ -581,11 +581,7 @@ func TestGetBindingsByReference(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 插入資料
|
// 插入資料
|
||||||
err = repo.BindTag(ctx, binding1)
|
err = repo.BindTags(ctx, []*entity.TagsBindingTable{binding1, binding2, binding3})
|
||||||
require.NoError(t, err)
|
|
||||||
err = repo.BindTag(ctx, binding2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
err = repo.BindTag(ctx, binding3)
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
|
@ -665,14 +661,8 @@ func TestListTagBinding(t *testing.T) {
|
||||||
UpdatedAt: 2500,
|
UpdatedAt: 2500,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 插入綁定資料
|
// 插入資料
|
||||||
err = repo.BindTag(ctx, binding1)
|
err = repo.BindTags(ctx, []*entity.TagsBindingTable{binding1, binding2, binding3, binding4})
|
||||||
require.NoError(t, err)
|
|
||||||
err = repo.BindTag(ctx, binding2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
err = repo.BindTag(ctx, binding3)
|
|
||||||
require.NoError(t, err)
|
|
||||||
err = repo.BindTag(ctx, binding4)
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// 測試案例
|
// 測試案例
|
||||||
|
@ -767,7 +757,7 @@ func TestUnbindTag(t *testing.T) {
|
||||||
ReferenceID: "ref-001",
|
ReferenceID: "ref-001",
|
||||||
TagID: "tag-001",
|
TagID: "tag-001",
|
||||||
}
|
}
|
||||||
err = repo.BindTag(ctx, binding)
|
err = repo.BindTags(ctx, []*entity.TagsBindingTable{binding})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
|
|
|
@ -68,6 +68,7 @@ func SetupTestProductRepository(db string) (repository.ProductRepository, func()
|
||||||
func TestListProduct(t *testing.T) {
|
func TestListProduct(t *testing.T) {
|
||||||
model, tearDown, err := SetupTestProductRepository("testDB")
|
model, tearDown, err := SetupTestProductRepository("testDB")
|
||||||
defer tearDown()
|
defer tearDown()
|
||||||
|
fmt.Println("ddddddddddddddddddddd", err.Error())
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
|
|
|
@ -5,14 +5,12 @@ import (
|
||||||
"code.30cm.net/digimon/app-cloudep-product-service/pkg/domain/repository"
|
"code.30cm.net/digimon/app-cloudep-product-service/pkg/domain/repository"
|
||||||
"code.30cm.net/digimon/app-cloudep-product-service/pkg/domain/usecase"
|
"code.30cm.net/digimon/app-cloudep-product-service/pkg/domain/usecase"
|
||||||
"code.30cm.net/digimon/app-cloudep-product-service/pkg/utils"
|
"code.30cm.net/digimon/app-cloudep-product-service/pkg/utils"
|
||||||
|
"code.30cm.net/digimon/library-go/errs"
|
||||||
"context"
|
"context"
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
"go.mongodb.org/mongo-driver/mongo/options"
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
"go.mongodb.org/mongo-driver/mongo/readconcern"
|
"go.mongodb.org/mongo-driver/mongo/readconcern"
|
||||||
|
|
||||||
"code.30cm.net/digimon/library-go/errs"
|
|
||||||
"code.30cm.net/digimon/library-go/errs/code"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ProductUseCaseParam struct {
|
type ProductUseCaseParam struct {
|
||||||
|
@ -98,8 +96,15 @@ func (use *ProductUseCase) Create(ctx context.Context, product *usecase.Product)
|
||||||
err := use.ProductRepo.Transaction(ctx, func(sessCtx mongo.SessionContext) (any, error) {
|
err := use.ProductRepo.Transaction(ctx, func(sessCtx mongo.SessionContext) (any, error) {
|
||||||
// 插入 Product
|
// 插入 Product
|
||||||
if err := use.ProductRepo.Insert(sessCtx, insert); err != nil {
|
if err := use.ProductRepo.Insert(sessCtx, insert); err != nil {
|
||||||
e := errs.DBError(code.CloudEPProduct, 0)
|
e := errs.DBErrorL(logx.WithContext(ctx),
|
||||||
return nil, err
|
[]logx.LogField{
|
||||||
|
{Key: "req", Value: product},
|
||||||
|
{Key: "func", Value: "ProductRepo.Insert"},
|
||||||
|
{Key: "err", Value: err.Error()},
|
||||||
|
},
|
||||||
|
"failed to create product")
|
||||||
|
|
||||||
|
return nil, e
|
||||||
}
|
}
|
||||||
|
|
||||||
// 插入 Product 統計資料
|
// 插入 Product 統計資料
|
||||||
|
@ -112,20 +117,35 @@ func (use *ProductUseCase) Create(ctx context.Context, product *usecase.Product)
|
||||||
FansCount: 0,
|
FansCount: 0,
|
||||||
FansCountUpdateTime: 0,
|
FansCountUpdateTime: 0,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return nil, err
|
e := errs.DBErrorL(logx.WithContext(ctx),
|
||||||
|
[]logx.LogField{
|
||||||
|
{Key: "ProductID", Value: insert.ID.Hex()},
|
||||||
|
{Key: "func", Value: "ProductStatisticsRepo.Create"},
|
||||||
|
{Key: "err", Value: err.Error()},
|
||||||
|
},
|
||||||
|
"failed to create product statistics")
|
||||||
|
|
||||||
|
return nil, e
|
||||||
}
|
}
|
||||||
|
|
||||||
// 過濾 Tag
|
// 過濾 Tag
|
||||||
// 綁定 Tags
|
// 綁定 Tags
|
||||||
for _, tag := range product.Tags {
|
//for _, tag := range product.Tags {
|
||||||
if err := use.TagBinding.BindTag(sessCtx, &entity.TagsBindingTable{
|
// if err := use.TagBinding.BindTag(sessCtx, &entity.TagsBindingTable{
|
||||||
ReferenceID: insert.ID.Hex(),
|
// ReferenceID: insert.ID.Hex(),
|
||||||
TagID: tag,
|
// TagID: tag,
|
||||||
}); err != nil {
|
// }); err != nil {
|
||||||
logx.Errorf("failed to bind tag %s to product %s: %v", tag, insert.ID.Hex(), err)
|
// _ = errs.DBErrorL(logx.WithContext(ctx),
|
||||||
return nil, err
|
// []logx.LogField{
|
||||||
}
|
// {Key: "ReferenceID", Value: insert.ID.Hex()},
|
||||||
}
|
// {Key: "TagID", Value: tag},
|
||||||
|
// {Key: "func", Value: "TagBinding.BindTag"},
|
||||||
|
// {Key: "err", Value: err.Error()},
|
||||||
|
// }, "")
|
||||||
|
//
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}, opts)
|
}, opts)
|
||||||
|
|
Loading…
Reference in New Issue