# Tasks: refactor-data-permission-filter

## 1. 基础设施 - 数据结构和 Helper 函数

- [x] 1.1 扩展 `UserContextInfo` 结构体，添加 `SubordinateShopIDs []uint` 字段（`pkg/middleware/auth.go`）
- [x] 1.2 新增 Context key 常量 `ContextKeySubordinateShopIDs`（`pkg/constants/constants.go`）
- [x] 1.3 新增 `SetUserContext` 和 `SetUserToFiberContext` 对 `SubordinateShopIDs` 的处理
- [x] 1.4 新增 `pkg/middleware/data_scope.go` 文件，实现 `GetSubordinateShopIDs` 函数
- [x] 1.5 实现 `ApplyShopFilter` Helper 函数
- [x] 1.6 实现 `ApplyEnterpriseFilter` Helper 函数
- [x] 1.7 实现 `ApplyOwnerShopFilter` Helper 函数
- [x] 1.8 验证：编译通过，`go build ./...`

## 2. Auth 中间件改造

- [x] 2.1 扩展 `AuthConfig` 结构体，添加 `ShopStore ShopStoreInterface` 字段
- [x] 2.2 定义 `AuthShopStoreInterface` 接口（包含 `GetSubordinateShopIDs` 方法）
- [x] 2.3 修改 `Auth` 中间件，在 token 验证成功后预计算 `SubordinateShopIDs`
- [x] 2.4 实现降级逻辑：获取下级店铺失败时降级为只包含自己的店铺 ID
- [x] 2.5 更新 Admin API 和 H5 API 的 Auth 中间件配置，传入 ShopStore
- [x] 2.6 验证：编译通过（运行时验证将在最终验证阶段进行）

## 3. 权限检查函数改造

- [x] 3.1 修改 `CanManageShop` 函数签名，移除 `shopStore` 参数，改为从 Context 获取数据
- [x] 3.2 修改 `CanManageEnterprise` 函数签名，移除 `shopStore` 参数（保留 enterpriseStore）
- [x] 3.3 更新所有 `CanManageShop` 调用点（Service 层）
- [x] 3.4 更新所有 `CanManageEnterprise` 调用点（Service 层）
- [x] 3.5 验证：编译通过

## 4. Store 层改造 - 低复杂度（9 个）

- [x] 4.1 改造 `agent_wallet_store.go`：List、GetByShopID 等方法添加 `ApplyShopFilter`
- [x] 4.2 改造 `agent_wallet_transaction_store.go`：List 等方法添加 `ApplyShopFilter`
- [x] 4.3 改造 `commission_record_store.go`：List 等方法添加 `ApplyShopFilter`
- [x] 4.4 改造 `enterprise_device_authorization_store.go`：List 等方法添加 `ApplyEnterpriseFilter`
- [x] 4.5 改造 `enterprise_store.go`：List 等方法添加 `ApplyOwnerShopFilter`
- [x] 4.6 改造 `shop_role_store.go`：List 等方法添加 `ApplyShopFilter`
- [x] 4.7 改造 `iot_card_import_task_store.go`：List 等方法添加 `ApplyShopFilter`
- [x] 4.8 改造 `commission_withdrawal_request_store.go`：List 等方法添加 `ApplyShopFilter`
- [x] 4.9 改造 `card_wallet_store.go` 和 `card_wallet_transaction_store.go`
- [x] 4.10 验证：编译通过，低复杂度 Store 的列表接口数据过滤正常

## 5. Store 层改造 - 中复杂度（4 个）

- [x] 5.1 改造 `device_store.go`：List、Count 等方法添加 `ApplyShopFilter`，注意 NULL shop_id 处理
- [x] 5.2 改造 `order_store.go`：List 等方法添加店铺过滤（使用 seller_shop_id 字段）
- [x] 5.3 改造 `shop_package_allocation_store.go`：List 等方法添加 `ApplyShopFilter`
- [x] 5.4 改造 `shop_series_allocation_store.go`：List 等方法添加 `ApplyShopFilter`
- [x] 5.5 验证：编译通过，中复杂度 Store 的列表接口数据过滤正常

## 6. Store 层改造 - 高复杂度（3 个）

- [x] 6.1 改造 `account_store.go`：List、GetByID 等方法，根据用户类型选择 `ApplyShopFilter` 或 `ApplyEnterpriseFilter`
- [x] 6.2 改造 `iot_card_store.go`：List、ListStandalone 等方法添加 `ApplyShopFilter`，移除已有的手动过滤逻辑
- [x] 6.3 改造 `enterprise_card_authorization_store.go`：List、ListWithJoin 等方法，整合现有的手动权限过滤
- [x] 6.4 验证：编译通过，高复杂度 Store 的列表接口数据过滤正常

## 7. 清理 - 移除 GORM Callback

- [x] 7.1 移除 `pkg/gorm/callback.go` 中的 `RegisterDataPermissionCallback` 函数
- [x] 7.2 移除 `SkipDataPermission` 函数和 `SkipDataPermissionKey` 常量
- [x] 7.3 移除应用启动时的 `RegisterDataPermissionCallback` 调用
- [x] 7.4 验证：编译通过

## 8. 清理 - 移除 SkipDataPermission 调用

- [x] 8.1 移除 `internal/task/*.go` 中的 `SkipDataPermission` 调用（6 处）
- [x] 8.2 移除 `internal/service/auth/service.go` 中的 `SkipDataPermission` 调用
- [x] 8.3 移除 `internal/service/shop_series_allocation/service.go` 中的 `SkipDataPermission` 调用
- [x] 8.4 移除 `internal/service/enterprise_device/service.go` 中的 `SkipDataPermission` 调用（5 处）
- [x] 8.5 移除 `internal/store/postgres/iot_card_store.go` 中的 `SkipDataPermission` 调用（5 处）
- [x] 8.6 移除 `internal/store/postgres/enterprise_card_authorization_store.go` 中的 `SkipDataPermission` 调用
- [x] 8.7 移除 `internal/bootstrap/admin.go` 中的 `SkipDataPermission` 调用
- [x] 8.8 验证：编译通过，全局搜索 `SkipDataPermission` 无结果

## 9. 最终验证

- [ ] 9.1 启动服务，验证平台管理员可以查看所有数据
- [ ] 9.2 验证代理用户只能看到自己店铺及下级店铺的数据
- [ ] 9.3 验证企业用户只能看到自己企业的数据
- [ ] 9.4 验证 NULL shop_id 的记录对代理用户不可见
- [x] 9.5 运行 `go build ./...` 和 `go vet ./...` 确认无编译警告
