# ✅ Zone (Banzone) API Migration - Complete ## Migration Banzone/Zone API vào SGW Module ### Files Created 1. **ZoneController.ts** - `src/services/slave/sgw/ZoneController.ts` ```typescript ✅ apiGetAllBanzones(body) - Get all banzones with pagination ✅ apiRemoveBanzone(id, groupID) - Remove a banzone ✅ apiGetZoneById(zoneId) - Get banzone by ID ✅ apiCreateBanzone(body) - Create new banzone ✅ apiUpdateBanzone(id, body) - Update banzone ``` 2. **Type Definitions** - Added to `src/services/slave/sgw/sgw.typing.d.ts` ```typescript ✅ Banzone ✅ Condition ✅ Geom ✅ ZoneResponse ✅ ZoneBodyRequest ``` 3. **Route Constants** - Added to `src/constants/slave/sgw/routes.ts` ```typescript ✅ SGW_ROUTE_BANZONES = '/api/sgw/banzones' ✅ SGW_ROUTE_BANZONES_LIST = '/api/sgw/banzones/list' ``` ### Files Updated - ✅ `src/pages/Slave/SGW/Map/components/ShipDetail.tsx` - Updated import: `@/services/controller/ZoneController` → `@/services/slave/sgw/ZoneController` - Updated types: `API.Thing` → `SgwModel.SgwThing` - Updated types: `API.UserResponse` → `MasterModel.UserResponse` - Updated types: `API.Geom` → `SgwModel.Geom` ### Migration Changes **Before:** ```typescript import { apiGetZoneById } from '@/services/controller/ZoneController'; thing: API.Thing const zone_geom: API.Geom = ... ``` **After:** ```typescript import { apiGetZoneById } from '@/services/slave/sgw/ZoneController'; thing: SgwModel.SgwThing const zone_geom: SgwModel.Geom = ... ``` ### Type Definitions ```typescript declare namespace SgwModel { interface Banzone { id?: string; name?: string; province_code?: string; type?: number; conditions?: Condition[]; description?: string; geometry?: string; enabled?: boolean; created_at?: Date; updated_at?: Date; } interface Condition { max?: number; min?: number; type?: 'length_limit' | 'month_range' | 'date_range'; to?: number; from?: number; } interface Geom { geom_type?: number; geom_poly?: string; geom_lines?: string; geom_point?: string; geom_radius?: number; } interface ZoneResponse { total?: number; offset?: number; limit?: number; banzones?: Banzone[]; } interface ZoneBodyRequest { name?: string; province_code?: string; type?: number; conditions?: Condition[]; description?: string; geometry?: string; enabled?: boolean; } } ``` ### API Usage Examples **Get Zone by ID:** ```typescript import { apiGetZoneById } from '@/services/slave/sgw/ZoneController'; const zone = await apiGetZoneById('zone-123'); const geometry: SgwModel.Geom = JSON.parse(zone.geometry || '{}'); ``` **Create Banzone:** ```typescript import { apiCreateBanzone } from '@/services/slave/sgw/ZoneController'; const zoneData: SgwModel.ZoneBodyRequest = { name: 'Vùng cấm mùa sinh sản', province_code: 'QN', type: 1, enabled: true, conditions: [ { type: 'month_range', from: 4, to: 8, }, ], geometry: JSON.stringify({ geom_type: 1, geom_poly: 'POLYGON(...)', }), }; await apiCreateBanzone(zoneData); ``` **Get All Banzones:** ```typescript import { apiGetAllBanzones } from '@/services/slave/sgw/ZoneController'; const response = await apiGetAllBanzones({ offset: 0, limit: 20, order: 'name', dir: 'asc', }); ``` ## Status: ✅ Complete - ✅ 5 API functions migrated - ✅ 5 type definitions added - ✅ 2 route constants added - ✅ 1 file updated (ShipDetail.tsx) - ✅ 0 compilation errors ## Total SGW Migration Progress | Module | APIs | Types | Status | | --------- | ------ | ------- | ------ | | Ship | 12 | 15+ | ✅ | | Trip | 17 | 21+ | ✅ | | Photo | 2 | 2 | ✅ | | Zone | 5 | 5 | ✅ | | **TOTAL** | **36** | **43+** | ✅ | --- **Migration Date:** January 23, 2026 **Status:** ✅ Complete **Ready for Testing:** YES