import { HTTPNoBody } from '@fastify-modular/route'; import { pito } from 'pito'; import { CardinalPoint, PriceType } from '../enums'; import { DatetimeMultiRangeDefine, IntMultiRangeDefine, LatLongDefine, NumMultiRangeDefine } from '../types'; // ========================================================================== export const ListMarkerByBoundOption = pito.Obj({ alat : pito.Num({ minimum: -90, maximum: 90 }), along : pito.Num({ minimum: -180, maximum: 180 }), blat : pito.Num({ minimum: -90, maximum: 90 }), blong : pito.Num({ minimum: -180, maximum: 180 }), // filterPriceSale: pito.Opt(pito.Uobj('mode') // ┬ 매매 .case('include', ({ // ├─┬ 해당 타입 포함 범위로 설정 price: pito.Opt(NumMultiRangeDefine), // │ └ 가격 범위를 지정 })) // │ .case('exclude', ({})) // └── 해당 타입 제외 범위로 설정 .end()), // filterPriceCharter: pito.Opt(pito.Uobj('mode') // ┬ 전세 .case('include', ({ // ├─┬ 해당 타입 포함 범위로 설정 price: pito.Opt(NumMultiRangeDefine), // │ └ 가격 범위를 지정 })) // │ .case('exclude', ({})) // └── 해당 타입 제외 범위로 설정 .end()), // filterPriceMonthly: (pito.Uobj('mode') // ┬ 월세 .case('include', ({ // ├─┬ 해당 타입 포함 범위로 설정 price : pito.Opt(NumMultiRangeDefine), // │ ├ 가격 범위를 지정 deposit: pito.Opt(NumMultiRangeDefine), // │ └ 보증금 범위를 지정 })) // │ .case('exclude', ({})) // └─ 해당 타입 제외 범위로 설정 .end()), // filterArea : pito.Opt(NumMultiRangeDefine), // | 면적 크기제한 filterApproval : pito.Opt(DatetimeMultiRangeDefine), // | 사용승인일 filterHhldCount : pito.Opt(IntMultiRangeDefine), // | 세대수 필터 filterFloor : pito.Opt(NumMultiRangeDefine), // | 층수 (%배열), // | 라벨 | 범위 표기 | 실제 데이터 // | - 1층 | [0 , 0 ] | { min:0 , max:0 , } // | - 저층 | (0 , 0.33] | { min:0 , max:0.33, exclusiveMin:true } // | - 중층 | (0.33, 0.66) | { min:0.33, max:0.66, exclusiveMin:true, exclusiveMax:true} // | - 고층 | [0.66, 1 ) | { min:0.66, max:1 , exclusiveMax:true } // | - 탑층 | [1 , 1 ] | { min:1 , max:1 , } // | 이런 식으로 보낼 것. filterRoomCnt : pito.Opt(IntMultiRangeDefine), // | 방 개수 filterBathroomCnt: pito.Opt(IntMultiRangeDefine), // | 화장실 개수 filterCardinal : pito.Opt(pito.Arr(pito.Enums(CardinalPoint))), // | 창문방향 filterMncst : pito.Opt(NumMultiRangeDefine), // | 관리비 범위 // withKapt : pito.Opt(pito.Bool()), withTitle : pito.Opt(pito.Bool()), pageSize: pito.Opt(pito.Int({ minimum: 0, maximum: 100 })), pageNo : pito.Opt(pito.Int({ minimum: 1 })), }); export type ListMarkerByBoundOption = pito.Type; // ========================================================================== export const ListMarkerByBoundOutput = pito.Obj({ found: pito.Arr(pito.Obj({ addressId: pito.UUID(), position : LatLongDefine, // kaptNm : pito.Str(), statistics: pito.Arr(pito.Obj({ type : pito.Enums(PriceType), count: pito.Int(), // reprArea : pito.Num(), // reprPrice: pito.Num(), minPrice : pito.Num(), maxPrice : pito.Num(), avgPrice : pito.Num(), minDeposit: pito.Num(), maxDeposit: pito.Num(), avgDeposit: pito.Num(), })), })), }); export type ListMarkerByBoundOutput = pito.Type; // ========================================================================== export const ListMarkerByBound = HTTPNoBody('GET', '/api/v1/search/list-marker-by-bound', 'search') .query(ListMarkerByBoundOption) .response(ListMarkerByBoundOutput) .build(); // ==========================================================================