1- import { ParkingZone , GeoPoint , PxPoint , ParkingLot , Id } from '@/types' ;
1+ import { ParkingZone , GeoPoint , PxPoint , Id } from '@/types' ;
22import { useRequestLog } from './requestLog' ;
33
44type Config = { baseUrl : string ; token ?: string } ;
@@ -34,29 +34,13 @@ async function request<T>(method: 'GET'|'POST'|'PUT'|'DELETE', path: string, bod
3434}
3535
3636// --- helpers & mappers ---
37- const gp = ( x :number , y :number , long :number | null = null , lat :number | null = null ) : GeoPoint => ( { x, y, long , lat } ) ;
37+ const gp = ( x :number , y :number , longitude :number | null = null , latitude :number | null = null ) : GeoPoint => ( { x, y, longitude , latitude } ) ;
3838const px = ( p : GeoPoint ) : PxPoint => ( { x : p . x , y : p . y } ) ;
3939
40- function mapLotFromAPI ( l : any ) : ParkingLot {
41- const pts = ( l . points || [ ] ) . map ( ( p : any ) => gp ( + p . x , + p . y , p . long ?? null , p . lat ?? null ) ) as GeoPoint [ ] ;
42- return {
43- lot_id : l . lot_id as Id ,
44- long : l . long ?? null ,
45- lat : l . lat ?? null ,
46- points : pts ,
47- image_polygon : pts . map ( px )
48- } ;
49- }
50-
5140function mapZoneFromAPI ( z : any ) : ParkingZone {
52- const pts = ( z . points || [ ] ) . map ( ( p : any ) => gp ( + p . x , + p . y , p . long ?? null , p . lat ?? null ) ) as GeoPoint [ ] ;
41+ const pts = ( z . points || [ ] ) . map ( ( p : any ) => gp ( + p . x , + p . y , p . longitude ?? null , p . latitude ?? null ) ) as GeoPoint [ ] ;
5342 const quad = pts . slice ( 0 , 4 ) . map ( px ) as [ PxPoint , PxPoint , PxPoint , PxPoint ] ;
5443
55- // если сервер вернёт lots внутри зоны — распарсим
56- const lotsArr : ParkingLot [ ] = Array . isArray ( z . lots )
57- ? z . lots . map ( mapLotFromAPI )
58- : [ ] ;
59-
6044 return {
6145 id : z . zone_id as Id ,
6246 camera_id : + z . camera_id ,
@@ -65,34 +49,20 @@ function mapZoneFromAPI(z: any): ParkingZone {
6549 pay : + z . pay ,
6650 image_quad : quad ,
6751 points : pts . slice ( 0 , 4 ) as any ,
68- lots : lotsArr ,
69- lots_count : z . lots_count ,
7052 created_at : z . created_at ,
7153 updated_at : z . updated_at
7254 } ;
7355}
7456
75- // ——— ТЕПЕРЬ ЗОНЫ ОТПРАВЛЯЕМ С L O T S В ТЕЛЕ ———
76- function buildLotsForBody ( lots : ParkingLot [ ] ) {
77- return lots . map ( l => ( {
78- lot_id : l . lot_id ,
79- long : l . long ?? null ,
80- lat : l . lat ?? null ,
81- // формируем points из image_polygon; geo пока null
82- points : ( l . image_polygon ?. length ? l . image_polygon : l . points ) ?. map ( p => ( {
83- x : p . x , y : p . y , long : null , lat : null
84- } ) )
85- } ) ) ;
86- }
87-
8857function buildCreateZoneBody ( z : ParkingZone ) {
8958 return {
9059 camera_id : z . camera_id ,
9160 zone_type : z . zone_type ,
9261 capacity : z . capacity ,
9362 pay : z . pay ,
94- points : z . points . map ( p => ( { x : p . x , y : p . y , long : p . long , lat : p . lat } ) ) ,
95- lots : buildLotsForBody ( z . lots || [ ] )
63+ points : z . points . map ( p => ( {
64+ x : p . x , y : p . y , longitude : p . longitude , latitude : p . latitude
65+ } ) )
9666 } ;
9767}
9868
@@ -101,23 +71,22 @@ function buildUpdateZoneBody(z: ParkingZone) {
10171 zone_type : z . zone_type ,
10272 capacity : z . capacity ,
10373 pay : z . pay ,
104- points : z . points . map ( p => ( { x : p . x , y : p . y , long : p . long , lat : p . lat } ) ) ,
105- lots : buildLotsForBody ( z . lots || [ ] )
74+ points : z . points . map ( p => ( {
75+ x : p . x , y : p . y , longitude : p . longitude , latitude : p . latitude
76+ } ) )
10677 } ;
10778}
10879
10980// --- public API ---
11081export const api = {
111- // ZONES
11282 async listZones ( cameraId ?: number ) {
11383 const q = cameraId ? `?camera_id=${ encodeURIComponent ( cameraId ) } ` : '' ;
11484 const arr = await request < any [ ] > ( 'GET' , `/zones${ q } ` ) ;
11585 return arr . map ( mapZoneFromAPI ) ;
11686 } ,
11787 async createZone ( z : ParkingZone ) {
118- // Сервер может вернуть { zone_id } или целую зону — поддержим оба
11988 const resp = await request < any > ( 'POST' , `/zones/new` , buildCreateZoneBody ( z ) ) ;
120- return resp ;
89+ return resp ; // { zone_id } или полная зона — поддерживаем оба
12190 } ,
12291 async updateZone ( zoneId : Id , z : ParkingZone ) {
12392 const updated = await request < any > ( 'PUT' , `/zones/${ encodeURIComponent ( String ( zoneId ) ) } ` , buildUpdateZoneBody ( z ) ) ;
@@ -127,14 +96,6 @@ export const api = {
12796 await request < void > ( 'DELETE' , `/zones/${ encodeURIComponent ( String ( zoneId ) ) } ` ) ;
12897 } ,
12998
130- // При чтении lots по активной зоне можно оставить вспомогательные маршруты,
131- // если на сервере они есть; фронт больше их НЕ вызывает при сохранении.
132- async getLots ( zoneId : Id ) {
133- const arr = await request < any [ ] > ( 'GET' , `/zones/${ encodeURIComponent ( String ( zoneId ) ) } /lots` ) ;
134- return arr . map ( mapLotFromAPI ) ;
135- } ,
136-
137- // Snapshot JSON
13899 async getSnapshot ( cameraId : number ) {
139100 return request < { image_url : string ; captured_at ?: string ; width ?: number ; height ?: number } > (
140101 'GET' ,
0 commit comments