3.2 KiB
3.2 KiB
Context & Architecture Understanding
Key Findings
Gateway Client Already Initialized
- ✅
internal/gateway/client.go- Complete Gateway client implementation - ✅
internal/bootstrap/dependencies.go- GatewayClient is a field in Dependencies struct - ✅
internal/gateway/flow_card.go- 6+ card-related Gateway methods - ✅
internal/gateway/device.go- 7+ device-related Gateway methods
Current Handler Structure
internal/handler/admin/iot_card.go- Has 4 existing methods (ListStandalone, GetByICCID, AllocateCards, RecallCards)internal/handler/admin/device.go- Has 5 existing methods (List, GetByID, GetByIMEI, Delete, ListCards)- Both handlers receive only service, not Gateway client yet
Service Layer Already Uses Gateway
internal/service/iot_card/service.go- Already has gateway.Client dependencyinternal/service/device/service.go- Needs to be checked if it has gateway.Client
Handler Constructor Pattern
// Current pattern
func NewIotCardHandler(service *iotCardService.Service) *IotCardHandler
func NewDeviceHandler(service *deviceService.Service) *DeviceHandler
// New pattern (needed)
func NewIotCardHandler(service *iotCardService.Service, gatewayClient *gateway.Client) *IotCardHandler
func NewDeviceHandler(service *deviceService.Service, gatewayClient *gateway.Client) *DeviceHandler
Bootstrap Injection Pattern
// In initHandlers() function at internal/bootstrap/handlers.go
IotCard: admin.NewIotCardHandler(svc.IotCard),
Device: admin.NewDeviceHandler(svc.Device),
// Needs to be changed to:
IotCard: admin.NewIotCardHandler(svc.IotCard, deps.GatewayClient),
Device: admin.NewDeviceHandler(svc.Device, deps.GatewayClient),
Route Registration Pattern
// From internal/routes/iot_card.go
Register(iotCards, doc, groupPath, "GET", "/standalone", handler.ListStandalone, RouteSpec{
Summary: "单卡列表(未绑定设备)",
Tags: []string{"IoT卡管理"},
Input: new(dto.ListStandaloneIotCardRequest),
Output: new(dto.ListStandaloneIotCardResponse),
Auth: true,
})
Gateway Method Mappings
Card Methods (flow_card.go)
- QueryCardStatus(ctx, req) → CardStatusResp
- QueryFlow(ctx, req) → FlowUsageResp
- QueryRealnameStatus(ctx, req) → RealnameStatusResp
- GetRealnameLink(ctx, req) → string (link)
- StopCard(ctx, req) → error
- StartCard(ctx, req) → error
Device Methods (device.go)
- GetDeviceInfo(ctx, req) → DeviceInfoResp
- GetSlotInfo(ctx, req) → SlotInfoResp
- SetSpeedLimit(ctx, req) → error
- SetWiFi(ctx, req) → error
- SwitchCard(ctx, req) → error
- RebootDevice(ctx, req) → error
- ResetDevice(ctx, req) → error
Store Methods for Permission Validation
IotCardStore.GetByICCID(ctx, iccid)- Validate card ownershipDeviceStore.GetByDeviceNo(ctx, imei)- Validate device ownership
Important Conventions
- Permission errors return:
errors.New(errors.CodeNotFound, "卡不存在或无权限访问") - All card params: ICCID from path param, CardNo = ICCID
- All device params: IMEI from path param, DeviceID = IMEI
- Handler methods follow: Get params → Validate permissions → Call Gateway → Format response