修复库房地址受控展示
为平台库房管理列表和详情增加专用响应处理,在保留全局敏感字段保护的前提下恢复库房自身地址。未填写地址时显示‘未填写’,创建和编辑继续复用原有白名单写入逻辑,不修改数据库及历史数据。补充回归测试、操作日志和项目文档。
This commit is contained in:
71
backend/api/internal/logic/platform/product/warehouse.go
Normal file
71
backend/api/internal/logic/platform/product/warehouse.go
Normal file
@@ -0,0 +1,71 @@
|
||||
// 功能描述:提供平台总后台库房列表与详情,并受控恢复库房自身地址。
|
||||
// 版本:v1.0
|
||||
package product
|
||||
|
||||
import (
|
||||
"git.apinb.com/bsm-sdk/core/infra"
|
||||
"git.apinb.com/heqiapp/platforms/backend/api/internal/impl"
|
||||
"git.apinb.com/heqiapp/platforms/backend/api/internal/logic/common"
|
||||
"git.apinb.com/heqiapp/platforms/backend/api/internal/models"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// ListProductWarehouse 查询库房分页列表,并向已鉴权的平台管理端恢复库房地址。
|
||||
func ListProductWarehouse(ctx *gin.Context) {
|
||||
page, size := common.PageSize(ctx)
|
||||
var list []models.ProductWarehouse
|
||||
var total int64
|
||||
query := common.ApplyKeywordFilter(ctx, common.ActiveRecords(impl.DBService.Model(&models.ProductWarehouse{})), &models.ProductWarehouse{})
|
||||
if err := query.Count(&total).Error; err != nil {
|
||||
infra.Response.Error(ctx, err)
|
||||
return
|
||||
}
|
||||
if err := query.Order("created_at desc").Offset((page - 1) * size).Limit(size).Find(&list).Error; err != nil {
|
||||
infra.Response.Error(ctx, err)
|
||||
return
|
||||
}
|
||||
response, err := common.PublicResourceResponse(list)
|
||||
if err != nil {
|
||||
infra.Response.Error(ctx, err)
|
||||
return
|
||||
}
|
||||
// 先执行全局敏感字段保护,再仅为库房管理资源恢复库房自身地址。
|
||||
protected := common.ProtectPreciseLocation(ctx, &models.ProductWarehouse{}, response)
|
||||
infra.Response.Success(ctx, gin.H{"total": total, "list": restoreProductWarehouseAddresses(protected, list)})
|
||||
}
|
||||
|
||||
// GetProductWarehouse 查询单个库房,并返回详情与编辑表单所需的库房地址。
|
||||
func GetProductWarehouse(ctx *gin.Context) {
|
||||
var warehouse models.ProductWarehouse
|
||||
if err := common.ActiveRecords(impl.DBService).Where("identity = ?", ctx.Param("identity")).First(&warehouse).Error; err != nil {
|
||||
common.RespondRecordError(ctx, err)
|
||||
return
|
||||
}
|
||||
response, err := common.PublicResourceResponse(warehouse)
|
||||
if err != nil {
|
||||
infra.Response.Error(ctx, err)
|
||||
return
|
||||
}
|
||||
protected := common.ProtectPreciseLocation(ctx, &models.ProductWarehouse{}, response)
|
||||
infra.Response.Success(ctx, restoreProductWarehouseAddresses(protected, []models.ProductWarehouse{warehouse}))
|
||||
}
|
||||
|
||||
// restoreProductWarehouseAddresses 将已鉴权库房记录的地址恢复到安全响应中。
|
||||
func restoreProductWarehouseAddresses(response any, warehouses []models.ProductWarehouse) any {
|
||||
switch data := response.(type) {
|
||||
case []any:
|
||||
for index, item := range data {
|
||||
if index >= len(warehouses) {
|
||||
break
|
||||
}
|
||||
if record, ok := item.(map[string]any); ok {
|
||||
record["address"] = warehouses[index].Address
|
||||
}
|
||||
}
|
||||
case map[string]any:
|
||||
if len(warehouses) > 0 {
|
||||
data["address"] = warehouses[0].Address
|
||||
}
|
||||
}
|
||||
return response
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
// 功能描述:验证库房管理响应仅恢复库房自身地址。
|
||||
// 版本:v1.0
|
||||
package product
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.apinb.com/heqiapp/platforms/backend/api/internal/models"
|
||||
)
|
||||
|
||||
// TestRestoreProductWarehouseAddresses 验证库房列表按原顺序恢复地址。
|
||||
func TestRestoreProductWarehouseAddresses(t *testing.T) {
|
||||
response := []any{
|
||||
map[string]any{"identity": "warehouse-1"},
|
||||
map[string]any{"identity": "warehouse-2"},
|
||||
}
|
||||
warehouses := []models.ProductWarehouse{
|
||||
{Address: "海口市龙华区库房路 1 号"},
|
||||
{Address: "三亚市吉阳区库房路 2 号"},
|
||||
}
|
||||
|
||||
restored := restoreProductWarehouseAddresses(response, warehouses).([]any)
|
||||
for index, warehouse := range warehouses {
|
||||
if restored[index].(map[string]any)["address"] != warehouse.Address {
|
||||
t.Fatalf("第 %d 条库房地址未正确恢复:%#v", index+1, restored[index])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestRestoreProductWarehouseAddress 验证库房详情恢复编辑所需地址。
|
||||
func TestRestoreProductWarehouseAddress(t *testing.T) {
|
||||
response := map[string]any{"identity": "warehouse-1"}
|
||||
warehouse := models.ProductWarehouse{Address: "海口市秀英区库房路 18 号"}
|
||||
|
||||
restored := restoreProductWarehouseAddresses(response, []models.ProductWarehouse{warehouse}).(map[string]any)
|
||||
if restored["address"] != warehouse.Address {
|
||||
t.Fatalf("库房详情地址未正确恢复:%#v", restored)
|
||||
}
|
||||
}
|
||||
|
||||
// TestRestoreProductWarehouseEmptyAddress 验证未填写地址时保留空值。
|
||||
func TestRestoreProductWarehouseEmptyAddress(t *testing.T) {
|
||||
response := map[string]any{"identity": "warehouse-1"}
|
||||
|
||||
restored := restoreProductWarehouseAddresses(response, []models.ProductWarehouse{{}}).(map[string]any)
|
||||
if restored["address"] != "" {
|
||||
t.Fatalf("未填写库房地址应保留空值:%#v", restored)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user