fix(backend): JWT config mapstructure tag 修复 + 模型从 hotel 重构为 shop
- 修复 JWTConfig 缺少 mapstructure tag 导致 access_expire_min 解析为 0, token 签发即过期,所有 API 请求返回 401 - 全部 config struct 补齐 mapstructure tag(secret/dsn/hmac_secret 等) - 模型层从 hotel/HotelID 统一重命名为 shop/ShopID - 删除旧 migrations(001-004),新增 001_init 综合迁移文件 - 更新 schema.sql、testutil、handler/service/model 相关引用 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -15,16 +15,16 @@ import (
|
||||
|
||||
func TestInventoryHandler_List(t *testing.T) {
|
||||
db := testutil.SetupTestDB()
|
||||
hotel := testutil.CreateTestHotel(db, "INV001")
|
||||
user := testutil.CreateTestUser(db, hotel.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, hotel.ID, "Warehouse")
|
||||
product := testutil.CreateTestProduct(db, hotel.ID, "Beer")
|
||||
token := getAuthToken(user.ID, hotel.ID, "admin")
|
||||
shop := testutil.CreateTestShop(db, "INV001")
|
||||
user := testutil.CreateTestUser(db, shop.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, shop.ID, "Warehouse")
|
||||
product := testutil.CreateTestProduct(db, shop.ID, "Beer")
|
||||
token := getAuthToken(user.ID, shop.ID, "admin")
|
||||
r := setupProtectedRouter(db)
|
||||
|
||||
// 直接插入库存记录
|
||||
inv := model.Inventory{
|
||||
HotelID: hotel.ID,
|
||||
ShopID: shop.ID,
|
||||
WarehouseID: warehouse.ID,
|
||||
ProductID: product.ID,
|
||||
Quantity: 100,
|
||||
@@ -39,18 +39,18 @@ func TestInventoryHandler_List(t *testing.T) {
|
||||
|
||||
func TestInventoryHandler_List_FilterByWarehouse(t *testing.T) {
|
||||
db := testutil.SetupTestDB()
|
||||
hotel := testutil.CreateTestHotel(db, "INV002")
|
||||
user := testutil.CreateTestUser(db, hotel.ID, "admin", "pass", "admin")
|
||||
warehouse1 := testutil.CreateTestWarehouse(db, hotel.ID, "W1")
|
||||
warehouse2 := testutil.CreateTestWarehouse(db, hotel.ID, "W2")
|
||||
product1 := testutil.CreateTestProduct(db, hotel.ID, "Beer1")
|
||||
product2 := testutil.CreateTestProduct(db, hotel.ID, "Beer2")
|
||||
token := getAuthToken(user.ID, hotel.ID, "admin")
|
||||
shop := testutil.CreateTestShop(db, "INV002")
|
||||
user := testutil.CreateTestUser(db, shop.ID, "admin", "pass", "admin")
|
||||
warehouse1 := testutil.CreateTestWarehouse(db, shop.ID, "W1")
|
||||
warehouse2 := testutil.CreateTestWarehouse(db, shop.ID, "W2")
|
||||
product1 := testutil.CreateTestProduct(db, shop.ID, "Beer1")
|
||||
product2 := testutil.CreateTestProduct(db, shop.ID, "Beer2")
|
||||
token := getAuthToken(user.ID, shop.ID, "admin")
|
||||
r := setupProtectedRouter(db)
|
||||
|
||||
// 两个仓库各有一个库存
|
||||
db.Create(&model.Inventory{HotelID: hotel.ID, WarehouseID: warehouse1.ID, ProductID: product1.ID, Quantity: 10})
|
||||
db.Create(&model.Inventory{HotelID: hotel.ID, WarehouseID: warehouse2.ID, ProductID: product2.ID, Quantity: 20})
|
||||
db.Create(&model.Inventory{ShopID: shop.ID, WarehouseID: warehouse1.ID, ProductID: product1.ID, Quantity: 10})
|
||||
db.Create(&model.Inventory{ShopID: shop.ID, WarehouseID: warehouse2.ID, ProductID: product2.ID, Quantity: 20})
|
||||
|
||||
// 按仓库过滤
|
||||
w := makeRequest(r, "GET", fmt.Sprintf("/api/v1/inventory?warehouse_id=%d", warehouse1.ID), token, nil)
|
||||
@@ -61,16 +61,16 @@ func TestInventoryHandler_List_FilterByWarehouse(t *testing.T) {
|
||||
|
||||
func TestInventoryHandler_List_InStockOnly(t *testing.T) {
|
||||
db := testutil.SetupTestDB()
|
||||
hotel := testutil.CreateTestHotel(db, "INV003")
|
||||
user := testutil.CreateTestUser(db, hotel.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, hotel.ID, "Warehouse")
|
||||
product1 := testutil.CreateTestProduct(db, hotel.ID, "InStock")
|
||||
product2 := testutil.CreateTestProduct(db, hotel.ID, "OutOfStock")
|
||||
token := getAuthToken(user.ID, hotel.ID, "admin")
|
||||
shop := testutil.CreateTestShop(db, "INV003")
|
||||
user := testutil.CreateTestUser(db, shop.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, shop.ID, "Warehouse")
|
||||
product1 := testutil.CreateTestProduct(db, shop.ID, "InStock")
|
||||
product2 := testutil.CreateTestProduct(db, shop.ID, "OutOfStock")
|
||||
token := getAuthToken(user.ID, shop.ID, "admin")
|
||||
r := setupProtectedRouter(db)
|
||||
|
||||
db.Create(&model.Inventory{HotelID: hotel.ID, WarehouseID: warehouse.ID, ProductID: product1.ID, Quantity: 10})
|
||||
db.Create(&model.Inventory{HotelID: hotel.ID, WarehouseID: warehouse.ID, ProductID: product2.ID, Quantity: 0})
|
||||
db.Create(&model.Inventory{ShopID: shop.ID, WarehouseID: warehouse.ID, ProductID: product1.ID, Quantity: 10})
|
||||
db.Create(&model.Inventory{ShopID: shop.ID, WarehouseID: warehouse.ID, ProductID: product2.ID, Quantity: 0})
|
||||
|
||||
// 只显示有库存的
|
||||
w := makeRequest(r, "GET", "/api/v1/inventory?in_stock=1", token, nil)
|
||||
@@ -81,17 +81,17 @@ func TestInventoryHandler_List_InStockOnly(t *testing.T) {
|
||||
|
||||
func TestInventoryHandler_Logs(t *testing.T) {
|
||||
db := testutil.SetupTestDB()
|
||||
hotel := testutil.CreateTestHotel(db, "INV004")
|
||||
user := testutil.CreateTestUser(db, hotel.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, hotel.ID, "Warehouse")
|
||||
product := testutil.CreateTestProduct(db, hotel.ID, "Wine")
|
||||
token := getAuthToken(user.ID, hotel.ID, "admin")
|
||||
shop := testutil.CreateTestShop(db, "INV004")
|
||||
user := testutil.CreateTestUser(db, shop.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, shop.ID, "Warehouse")
|
||||
product := testutil.CreateTestProduct(db, shop.ID, "Wine")
|
||||
token := getAuthToken(user.ID, shop.ID, "admin")
|
||||
r := setupProtectedRouter(db)
|
||||
|
||||
// 创建库存流水
|
||||
opID := user.ID
|
||||
db.Create(&model.InventoryLog{
|
||||
HotelID: hotel.ID,
|
||||
ShopID: shop.ID,
|
||||
WarehouseID: warehouse.ID,
|
||||
ProductID: product.ID,
|
||||
Direction: "in",
|
||||
@@ -111,16 +111,16 @@ func TestInventoryHandler_Logs(t *testing.T) {
|
||||
|
||||
func TestInventoryHandler_CreateCheck(t *testing.T) {
|
||||
db := testutil.SetupTestDB()
|
||||
hotel := testutil.CreateTestHotel(db, "INV005")
|
||||
user := testutil.CreateTestUser(db, hotel.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, hotel.ID, "Warehouse")
|
||||
product := testutil.CreateTestProduct(db, hotel.ID, "Whiskey")
|
||||
token := getAuthToken(user.ID, hotel.ID, "admin")
|
||||
shop := testutil.CreateTestShop(db, "INV005")
|
||||
user := testutil.CreateTestUser(db, shop.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, shop.ID, "Warehouse")
|
||||
product := testutil.CreateTestProduct(db, shop.ID, "Whiskey")
|
||||
token := getAuthToken(user.ID, shop.ID, "admin")
|
||||
r := setupProtectedRouter(db)
|
||||
|
||||
// 先创建库存
|
||||
db.Create(&model.Inventory{
|
||||
HotelID: hotel.ID,
|
||||
ShopID: shop.ID,
|
||||
WarehouseID: warehouse.ID,
|
||||
ProductID: product.ID,
|
||||
Quantity: 50,
|
||||
@@ -154,11 +154,11 @@ func TestInventoryHandler_CreateCheck(t *testing.T) {
|
||||
|
||||
func TestInventoryHandler_GetCheck(t *testing.T) {
|
||||
db := testutil.SetupTestDB()
|
||||
hotel := testutil.CreateTestHotel(db, "INV006")
|
||||
user := testutil.CreateTestUser(db, hotel.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, hotel.ID, "Warehouse")
|
||||
product := testutil.CreateTestProduct(db, hotel.ID, "Vodka")
|
||||
token := getAuthToken(user.ID, hotel.ID, "admin")
|
||||
shop := testutil.CreateTestShop(db, "INV006")
|
||||
user := testutil.CreateTestUser(db, shop.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, shop.ID, "Warehouse")
|
||||
product := testutil.CreateTestProduct(db, shop.ID, "Vodka")
|
||||
token := getAuthToken(user.ID, shop.ID, "admin")
|
||||
r := setupProtectedRouter(db)
|
||||
|
||||
// 创建盘点单
|
||||
@@ -181,9 +181,9 @@ func TestInventoryHandler_GetCheck(t *testing.T) {
|
||||
|
||||
func TestInventoryHandler_GetCheck_NotFound(t *testing.T) {
|
||||
db := testutil.SetupTestDB()
|
||||
hotel := testutil.CreateTestHotel(db, "INV007")
|
||||
user := testutil.CreateTestUser(db, hotel.ID, "admin", "pass", "admin")
|
||||
token := getAuthToken(user.ID, hotel.ID, "admin")
|
||||
shop := testutil.CreateTestShop(db, "INV007")
|
||||
user := testutil.CreateTestUser(db, shop.ID, "admin", "pass", "admin")
|
||||
token := getAuthToken(user.ID, shop.ID, "admin")
|
||||
r := setupProtectedRouter(db)
|
||||
|
||||
w := makeRequest(r, "GET", "/api/v1/inventory/checks/99999", token, nil)
|
||||
@@ -193,20 +193,20 @@ func TestInventoryHandler_GetCheck_NotFound(t *testing.T) {
|
||||
func TestInventoryHandler_List_HotelIsolation(t *testing.T) {
|
||||
db := testutil.SetupTestDB()
|
||||
|
||||
hotelA := testutil.CreateTestHotel(db, "INV_A")
|
||||
userA := testutil.CreateTestUser(db, hotelA.ID, "adminA", "pass", "admin")
|
||||
warehouseA := testutil.CreateTestWarehouse(db, hotelA.ID, "WA")
|
||||
productA := testutil.CreateTestProduct(db, hotelA.ID, "ProductA")
|
||||
tokenA := getAuthToken(userA.ID, hotelA.ID, "admin")
|
||||
shopA := testutil.CreateTestShop(db, "INV_A")
|
||||
userA := testutil.CreateTestUser(db, shopA.ID, "adminA", "pass", "admin")
|
||||
warehouseA := testutil.CreateTestWarehouse(db, shopA.ID, "WA")
|
||||
productA := testutil.CreateTestProduct(db, shopA.ID, "ProductA")
|
||||
tokenA := getAuthToken(userA.ID, shopA.ID, "admin")
|
||||
|
||||
hotelB := testutil.CreateTestHotel(db, "INV_B")
|
||||
userB := testutil.CreateTestUser(db, hotelB.ID, "adminB", "pass", "admin")
|
||||
tokenB := getAuthToken(userB.ID, hotelB.ID, "admin")
|
||||
shopB := testutil.CreateTestShop(db, "INV_B")
|
||||
userB := testutil.CreateTestUser(db, shopB.ID, "adminB", "pass", "admin")
|
||||
tokenB := getAuthToken(userB.ID, shopB.ID, "admin")
|
||||
|
||||
r := setupProtectedRouter(db)
|
||||
|
||||
// 酒店 A 有库存
|
||||
db.Create(&model.Inventory{HotelID: hotelA.ID, WarehouseID: warehouseA.ID, ProductID: productA.ID, Quantity: 100})
|
||||
db.Create(&model.Inventory{ShopID: shopA.ID, WarehouseID: warehouseA.ID, ProductID: productA.ID, Quantity: 100})
|
||||
|
||||
// 酒店 A 能看到自己的库存
|
||||
w := makeRequest(r, "GET", "/api/v1/inventory", tokenA, nil)
|
||||
@@ -221,11 +221,11 @@ func TestInventoryHandler_List_HotelIsolation(t *testing.T) {
|
||||
|
||||
func TestInventoryHandler_AfterStockInApprove(t *testing.T) {
|
||||
db := testutil.SetupTestDB()
|
||||
hotel := testutil.CreateTestHotel(db, "INV008")
|
||||
user := testutil.CreateTestUser(db, hotel.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, hotel.ID, "Warehouse")
|
||||
product := testutil.CreateTestProduct(db, hotel.ID, "Champagne")
|
||||
token := getAuthToken(user.ID, hotel.ID, "admin")
|
||||
shop := testutil.CreateTestShop(db, "INV008")
|
||||
user := testutil.CreateTestUser(db, shop.ID, "admin", "pass", "admin")
|
||||
warehouse := testutil.CreateTestWarehouse(db, shop.ID, "Warehouse")
|
||||
product := testutil.CreateTestProduct(db, shop.ID, "Champagne")
|
||||
token := getAuthToken(user.ID, shop.ID, "admin")
|
||||
r := setupProtectedRouter(db)
|
||||
|
||||
// 初始库存为 0
|
||||
|
||||
Reference in New Issue
Block a user