🎯 MapView v2.0 - Global Deployment Ready

 MAJOR FEATURES:
• Auto-zoom intelligence với smart bounds fitting
• Enhanced 3D GPS markers với pulsing effects
• Professional route display với 6-layer rendering
• Status-based parking icons với availability indicators
• Production-ready build optimizations

🗺️ AUTO-ZOOM FEATURES:
• Smart bounds fitting cho GPS + selected parking
• Adaptive padding (50px) cho visual balance
• Max zoom control (level 16) để tránh quá gần
• Dynamic centering khi không có selection

🎨 ENHANCED VISUALS:
• 3D GPS marker với multi-layer pulse effects
• Advanced parking icons với status colors
• Selection highlighting với animation
• Dimming system cho non-selected items

🛣️ ROUTE SYSTEM:
• OpenRouteService API integration
• Multi-layer route rendering (glow, shadow, main, animated)
• Real-time distance & duration calculation
• Visual route info trong popup

📱 PRODUCTION READY:
• SSR safe với dynamic imports
• Build errors resolved
• Global deployment via Vercel
• Optimized performance

🌍 DEPLOYMENT:
• Vercel: https://whatever-ctk2auuxr-phong12hexdockworks-projects.vercel.app
• Bundle size: 22.8 kB optimized
• Global CDN distribution
• HTTPS enabled

💾 VERSION CONTROL:
• MapView-v2.0.tsx backup created
• MAPVIEW_VERSIONS.md documentation
• Full version history tracking
This commit is contained in:
2025-07-20 19:52:16 +07:00
parent 3203463a6a
commit c65cc97a33
64624 changed files with 7199453 additions and 6462 deletions

2
backend/dist/app.module.d.ts vendored Normal file
View File

@@ -0,0 +1,2 @@
export declare class AppModule {
}

47
backend/dist/app.module.js vendored Normal file
View File

@@ -0,0 +1,47 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AppModule = void 0;
const common_1 = require("@nestjs/common");
const config_1 = require("@nestjs/config");
const typeorm_1 = require("@nestjs/typeorm");
const throttler_1 = require("@nestjs/throttler");
const database_config_1 = require("./config/database.config");
const parking_module_1 = require("./modules/parking/parking.module");
const routing_module_1 = require("./modules/routing/routing.module");
const users_module_1 = require("./modules/users/users.module");
const auth_module_1 = require("./modules/auth/auth.module");
const health_module_1 = require("./modules/health/health.module");
let AppModule = class AppModule {
};
exports.AppModule = AppModule;
exports.AppModule = AppModule = __decorate([
(0, common_1.Module)({
imports: [
config_1.ConfigModule.forRoot({
isGlobal: true,
envFilePath: '.env',
}),
typeorm_1.TypeOrmModule.forRootAsync({
imports: [config_1.ConfigModule],
useClass: database_config_1.DatabaseConfig,
inject: [config_1.ConfigService],
}),
throttler_1.ThrottlerModule.forRoot({
ttl: 60000,
limit: 100,
}),
parking_module_1.ParkingModule,
routing_module_1.RoutingModule,
users_module_1.UsersModule,
auth_module_1.AuthModule,
health_module_1.HealthModule,
],
})
], AppModule);
//# sourceMappingURL=app.module.js.map

1
backend/dist/app.module.js.map vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,2CAA6D;AAC7D,6CAAgD;AAChD,iDAAoD;AACpD,8DAA0D;AAC1D,qEAAiE;AACjE,qEAAiE;AACjE,+DAA2D;AAC3D,4DAAwD;AACxD,kEAA8D;AAwBvD,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAtBrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,qBAAY,CAAC,OAAO,CAAC;gBACnB,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,MAAM;aACpB,CAAC;YACF,uBAAa,CAAC,YAAY,CAAC;gBACzB,OAAO,EAAE,CAAC,qBAAY,CAAC;gBACvB,QAAQ,EAAE,gCAAc;gBACxB,MAAM,EAAE,CAAC,sBAAa,CAAC;aACxB,CAAC;YACF,2BAAe,CAAC,OAAO,CAAC;gBACtB,GAAG,EAAE,KAAK;gBACV,KAAK,EAAE,GAAG;aACX,CAAC;YACF,8BAAa;YACb,8BAAa;YACb,0BAAW;YACX,wBAAU;YACV,4BAAY;SACb;KACF,CAAC;GACW,SAAS,CAAG"}

View File

@@ -0,0 +1,7 @@
import { ConfigService } from '@nestjs/config';
import { TypeOrmModuleOptions, TypeOrmOptionsFactory } from '@nestjs/typeorm';
export declare class DatabaseConfig implements TypeOrmOptionsFactory {
private configService;
constructor(configService: ConfigService);
createTypeOrmOptions(): TypeOrmModuleOptions;
}

48
backend/dist/config/database.config.js vendored Normal file
View File

@@ -0,0 +1,48 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DatabaseConfig = void 0;
const common_1 = require("@nestjs/common");
const config_1 = require("@nestjs/config");
const parking_lot_entity_1 = require("../modules/parking/entities/parking-lot.entity");
const user_entity_1 = require("../modules/users/entities/user.entity");
const parking_history_entity_1 = require("../modules/parking/entities/parking-history.entity");
const parking_update_entity_1 = require("../modules/parking/entities/parking-update.entity");
let DatabaseConfig = class DatabaseConfig {
constructor(configService) {
this.configService = configService;
}
createTypeOrmOptions() {
return {
type: 'postgres',
url: this.configService.get('DATABASE_URL') ||
'postgresql://parking_user:parking_pass@localhost:5432/parking_db',
entities: [parking_lot_entity_1.ParkingLot, user_entity_1.User, parking_history_entity_1.ParkingHistory, parking_update_entity_1.ParkingUpdate],
migrations: ['dist/database/migrations/*.js'],
synchronize: this.configService.get('NODE_ENV') === 'development',
logging: this.configService.get('NODE_ENV') === 'development',
ssl: this.configService.get('NODE_ENV') === 'production' ? {
rejectUnauthorized: false,
} : false,
extra: {
max: 20,
connectionTimeoutMillis: 2000,
idleTimeoutMillis: 30000,
},
};
}
};
exports.DatabaseConfig = DatabaseConfig;
exports.DatabaseConfig = DatabaseConfig = __decorate([
(0, common_1.Injectable)(),
__metadata("design:paramtypes", [config_1.ConfigService])
], DatabaseConfig);
//# sourceMappingURL=database.config.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"database.config.js","sourceRoot":"","sources":["../../src/config/database.config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,2CAA+C;AAE/C,uFAA4E;AAC5E,uEAA6D;AAC7D,+FAAoF;AACpF,6FAAkF;AAG3E,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAEpD,oBAAoB;QAClB,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,cAAc,CAAC;gBAC9C,kEAAkE;YACvE,QAAQ,EAAE,CAAC,+BAAU,EAAE,kBAAI,EAAE,uCAAc,EAAE,qCAAa,CAAC;YAC3D,UAAU,EAAE,CAAC,+BAA+B,CAAC;YAC7C,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,UAAU,CAAC,KAAK,aAAa;YACzE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,UAAU,CAAC,KAAK,aAAa;YACrE,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,UAAU,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC;gBACjE,kBAAkB,EAAE,KAAK;aAC1B,CAAC,CAAC,CAAC,KAAK;YACT,KAAK,EAAE;gBACL,GAAG,EAAE,EAAE;gBACP,uBAAuB,EAAE,IAAI;gBAC7B,iBAAiB,EAAE,KAAK;aACzB;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAtBY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;qCAEwB,sBAAa;GADrC,cAAc,CAsB1B"}

View File

@@ -0,0 +1,2 @@
import { DataSource } from 'typeorm';
export declare function seedParkingLots(dataSource: DataSource): Promise<void>;

View File

@@ -0,0 +1,254 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.seedParkingLots = seedParkingLots;
const parking_lot_entity_1 = require("../../modules/parking/entities/parking-lot.entity");
async function seedParkingLots(dataSource) {
const parkingRepository = dataSource.getRepository(parking_lot_entity_1.ParkingLot);
const parkingLots = [
{
name: 'Central Mall Parking',
address: '123 Orchard Road, Singapore 238872',
lat: 1.3048,
lng: 103.8318,
location: `POINT(103.8318 1.3048)`,
hourlyRate: 5.00,
openTime: '06:00',
closeTime: '24:00',
availableSlots: 45,
totalSlots: 200,
amenities: {
covered: true,
security: true,
ev_charging: true,
wheelchair_accessible: true,
valet_service: false,
},
contactInfo: {
phone: '+65 6123 4567',
email: 'parking@centralmall.sg',
website: 'https://centralmall.sg/parking',
},
},
{
name: 'Marina Bay Business District Parking',
address: '8 Marina Boulevard, Singapore 018981',
lat: 1.2802,
lng: 103.8537,
location: `POINT(103.8537 1.2802)`,
hourlyRate: 8.50,
openTime: '00:00',
closeTime: '23:59',
availableSlots: 12,
totalSlots: 150,
amenities: {
covered: true,
security: true,
ev_charging: true,
wheelchair_accessible: true,
valet_service: true,
},
contactInfo: {
phone: '+65 6234 5678',
email: 'parking@marinabay.sg',
},
},
{
name: 'Chinatown Heritage Parking',
address: '48 Pagoda Street, Singapore 059207',
lat: 1.2838,
lng: 103.8444,
location: `POINT(103.8444 1.2838)`,
hourlyRate: 3.50,
openTime: '07:00',
closeTime: '22:00',
availableSlots: 8,
totalSlots: 80,
amenities: {
covered: false,
security: true,
ev_charging: false,
wheelchair_accessible: true,
valet_service: false,
},
contactInfo: {
phone: '+65 6345 6789',
},
},
{
name: 'Sentosa Island Resort Parking',
address: '39 Artillery Avenue, Singapore 099958',
lat: 1.2494,
lng: 103.8303,
location: `POINT(103.8303 1.2494)`,
hourlyRate: 6.00,
openTime: '06:00',
closeTime: '02:00',
availableSlots: 78,
totalSlots: 300,
amenities: {
covered: true,
security: true,
ev_charging: true,
wheelchair_accessible: true,
valet_service: true,
},
contactInfo: {
phone: '+65 6456 7890',
email: 'parking@sentosa.sg',
website: 'https://sentosa.sg/parking',
},
},
{
name: 'Clarke Quay Entertainment Parking',
address: '3E River Valley Road, Singapore 179024',
lat: 1.2897,
lng: 103.8467,
location: `POINT(103.8467 1.2897)`,
hourlyRate: 7.00,
openTime: '10:00',
closeTime: '04:00',
availableSlots: 23,
totalSlots: 120,
amenities: {
covered: true,
security: true,
ev_charging: false,
wheelchair_accessible: true,
valet_service: false,
},
contactInfo: {
phone: '+65 6567 8901',
email: 'parking@clarkequay.sg',
},
},
{
name: 'Little India Cultural Parking',
address: '48 Serangoon Road, Singapore 217959',
lat: 1.3093,
lng: 103.8522,
location: `POINT(103.8522 1.3093)`,
hourlyRate: 4.00,
openTime: '05:00',
closeTime: '23:00',
availableSlots: 34,
totalSlots: 100,
amenities: {
covered: false,
security: true,
ev_charging: false,
wheelchair_accessible: false,
valet_service: false,
},
contactInfo: {
phone: '+65 6678 9012',
},
},
{
name: 'Changi Airport Terminal Parking',
address: 'Airport Boulevard, Singapore 819663',
lat: 1.3644,
lng: 103.9915,
location: `POINT(103.9915 1.3644)`,
hourlyRate: 4.50,
openTime: '00:00',
closeTime: '23:59',
availableSlots: 156,
totalSlots: 800,
amenities: {
covered: true,
security: true,
ev_charging: true,
wheelchair_accessible: true,
valet_service: true,
},
contactInfo: {
phone: '+65 6789 0123',
email: 'parking@changiairport.sg',
website: 'https://changiairport.com/parking',
},
},
{
name: 'Bugis Street Shopping Parking',
address: '3 New Bugis Street, Singapore 188867',
lat: 1.3006,
lng: 103.8558,
location: `POINT(103.8558 1.3006)`,
hourlyRate: 5.50,
openTime: '08:00',
closeTime: '23:00',
availableSlots: 67,
totalSlots: 180,
amenities: {
covered: true,
security: true,
ev_charging: false,
wheelchair_accessible: true,
valet_service: false,
},
contactInfo: {
phone: '+65 6890 1234',
email: 'parking@bugisstreet.sg',
},
},
{
name: 'Jurong East Hub Parking',
address: '1 Jurong West Central 2, Singapore 648886',
lat: 1.3329,
lng: 103.7436,
location: `POINT(103.7436 1.3329)`,
hourlyRate: 3.00,
openTime: '06:00',
closeTime: '24:00',
availableSlots: 89,
totalSlots: 250,
amenities: {
covered: true,
security: true,
ev_charging: true,
wheelchair_accessible: true,
valet_service: false,
},
contactInfo: {
phone: '+65 6901 2345',
email: 'parking@jurongeast.sg',
},
},
{
name: 'East Coast Park Recreation Parking',
address: 'East Coast Park Service Road, Singapore 449876',
lat: 1.3018,
lng: 103.9057,
location: `POINT(103.9057 1.3018)`,
hourlyRate: 2.50,
openTime: '05:00',
closeTime: '02:00',
availableSlots: 145,
totalSlots: 400,
amenities: {
covered: false,
security: false,
ev_charging: false,
wheelchair_accessible: true,
valet_service: false,
},
contactInfo: {
phone: '+65 6012 3456',
},
},
];
for (const lotData of parkingLots) {
const existingLot = await parkingRepository.findOne({
where: { name: lotData.name },
});
if (!existingLot) {
const lot = parkingRepository.create(lotData);
await parkingRepository.save(lot);
console.log(`Created parking lot: ${lotData.name}`);
}
else {
console.log(`Parking lot already exists: ${lotData.name}`);
}
}
console.log('Parking lots seeding completed');
}
//# sourceMappingURL=parking-lots.seed.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"parking-lots.seed.js","sourceRoot":"","sources":["../../../src/database/seeds/parking-lots.seed.ts"],"names":[],"mappings":"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"}

1
backend/dist/main.d.ts vendored Normal file
View File

@@ -0,0 +1 @@
export {};

37
backend/dist/main.js vendored Normal file
View File

@@ -0,0 +1,37 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@nestjs/core");
const common_1 = require("@nestjs/common");
const swagger_1 = require("@nestjs/swagger");
const app_module_1 = require("./app.module");
const compression = require("compression");
const helmet = require("helmet");
async function bootstrap() {
const app = await core_1.NestFactory.create(app_module_1.AppModule);
app.use(helmet.default());
app.use(compression());
app.enableCors({
origin: process.env.CORS_ORIGIN || 'http://localhost:3000',
credentials: true,
});
app.useGlobalPipes(new common_1.ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true,
transform: true,
}));
app.setGlobalPrefix('api');
const config = new swagger_1.DocumentBuilder()
.setTitle('Smart Parking Finder API')
.setDescription('API for finding and navigating to parking lots')
.setVersion('1.0')
.addBearerAuth()
.build();
const document = swagger_1.SwaggerModule.createDocument(app, config);
swagger_1.SwaggerModule.setup('api/docs', app, document);
const port = process.env.PORT || 3001;
await app.listen(port);
console.log(`🚀 Application is running on: http://localhost:${port}`);
console.log(`📚 API Documentation: http://localhost:${port}/api/docs`);
}
bootstrap();
//# sourceMappingURL=main.js.map

1
backend/dist/main.js.map vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,2CAAgD;AAChD,6CAAiE;AACjE,6CAAyC;AACzC,2CAA2C;AAC3C,iCAAiC;AAEjC,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,CAAC;IAGhD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1B,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAGvB,GAAG,CAAC,UAAU,CAAC;QACb,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,uBAAuB;QAC1D,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IAGH,GAAG,CAAC,cAAc,CAChB,IAAI,uBAAc,CAAC;QACjB,SAAS,EAAE,IAAI;QACf,oBAAoB,EAAE,IAAI;QAC1B,SAAS,EAAE,IAAI;KAChB,CAAC,CACH,CAAC;IAGF,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAG3B,MAAM,MAAM,GAAG,IAAI,yBAAe,EAAE;SACjC,QAAQ,CAAC,0BAA0B,CAAC;SACpC,cAAc,CAAC,gDAAgD,CAAC;SAChE,UAAU,CAAC,KAAK,CAAC;SACjB,aAAa,EAAE;SACf,KAAK,EAAE,CAAC;IAEX,MAAM,QAAQ,GAAG,uBAAa,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3D,uBAAa,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE/C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;IACtC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEvB,OAAO,CAAC,GAAG,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,0CAA0C,IAAI,WAAW,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,EAAE,CAAC"}

View File

@@ -0,0 +1,12 @@
import { AuthService } from './auth.service';
export declare class AuthController {
private authService;
constructor(authService: AuthService);
login(loginDto: {
email: string;
password: string;
}): Promise<{
access_token: string;
user: any;
}>;
}

View File

@@ -0,0 +1,41 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AuthController = void 0;
const common_1 = require("@nestjs/common");
const swagger_1 = require("@nestjs/swagger");
const auth_service_1 = require("./auth.service");
let AuthController = class AuthController {
constructor(authService) {
this.authService = authService;
}
async login(loginDto) {
return this.authService.login(loginDto);
}
};
exports.AuthController = AuthController;
__decorate([
(0, common_1.Post)('login'),
(0, swagger_1.ApiOperation)({ summary: 'User login' }),
__param(0, (0, common_1.Body)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], AuthController.prototype, "login", null);
exports.AuthController = AuthController = __decorate([
(0, swagger_1.ApiTags)('Authentication'),
(0, common_1.Controller)('auth'),
__metadata("design:paramtypes", [auth_service_1.AuthService])
], AuthController);
//# sourceMappingURL=auth.controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../../src/modules/auth/auth.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAwD;AACxD,6CAAwD;AACxD,iDAA6C;AAItC,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAAoB,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAAG,CAAC;IAI1C,AAAN,KAAK,CAAC,KAAK,CAAS,QAA6C;QAC/D,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;CACF,CAAA;AARY,wCAAc;AAKnB;IAFL,IAAA,aAAI,EAAC,OAAO,CAAC;IACb,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAC3B,WAAA,IAAA,aAAI,GAAE,CAAA;;;;2CAElB;yBAPU,cAAc;IAF1B,IAAA,iBAAO,EAAC,gBAAgB,CAAC;IACzB,IAAA,mBAAU,EAAC,MAAM,CAAC;qCAEgB,0BAAW;GADjC,cAAc,CAQ1B"}

View File

@@ -0,0 +1,2 @@
export declare class AuthModule {
}

View File

@@ -0,0 +1,23 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AuthModule = void 0;
const common_1 = require("@nestjs/common");
const auth_controller_1 = require("./auth.controller");
const auth_service_1 = require("./auth.service");
let AuthModule = class AuthModule {
};
exports.AuthModule = AuthModule;
exports.AuthModule = AuthModule = __decorate([
(0, common_1.Module)({
controllers: [auth_controller_1.AuthController],
providers: [auth_service_1.AuthService],
exports: [auth_service_1.AuthService],
})
], AuthModule);
//# sourceMappingURL=auth.module.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../../../src/modules/auth/auth.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,uDAAmD;AACnD,iDAA6C;AAOtC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,gCAAU;qBAAV,UAAU;IALtB,IAAA,eAAM,EAAC;QACN,WAAW,EAAE,CAAC,gCAAc,CAAC;QAC7B,SAAS,EAAE,CAAC,0BAAW,CAAC;QACxB,OAAO,EAAE,CAAC,0BAAW,CAAC;KACvB,CAAC;GACW,UAAU,CAAG"}

View File

@@ -0,0 +1,7 @@
export declare class AuthService {
validateUser(email: string, password: string): Promise<any>;
login(user: any): Promise<{
access_token: string;
user: any;
}>;
}

View File

@@ -0,0 +1,26 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AuthService = void 0;
const common_1 = require("@nestjs/common");
let AuthService = class AuthService {
async validateUser(email, password) {
return null;
}
async login(user) {
return {
access_token: 'placeholder_token',
user,
};
}
};
exports.AuthService = AuthService;
exports.AuthService = AuthService = __decorate([
(0, common_1.Injectable)()
], AuthService);
//# sourceMappingURL=auth.service.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../src/modules/auth/auth.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAGrC,IAAM,WAAW,GAAjB,MAAM,WAAW;IACtB,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,QAAgB;QAEhD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAS;QAEnB,OAAO;YACL,YAAY,EAAE,mBAAmB;YACjC,IAAI;SACL,CAAC;IACJ,CAAC;CACF,CAAA;AAbY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;GACA,WAAW,CAavB"}

View File

@@ -0,0 +1,11 @@
import { HealthService } from './health.service';
export declare class HealthController {
private readonly healthService;
constructor(healthService: HealthService);
getHealth(): {
status: string;
timestamp: string;
uptime: number;
environment: string;
};
}

View File

@@ -0,0 +1,37 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.HealthController = void 0;
const common_1 = require("@nestjs/common");
const swagger_1 = require("@nestjs/swagger");
const health_service_1 = require("./health.service");
let HealthController = class HealthController {
constructor(healthService) {
this.healthService = healthService;
}
getHealth() {
return this.healthService.getHealth();
}
};
exports.HealthController = HealthController;
__decorate([
(0, common_1.Get)(),
(0, swagger_1.ApiOperation)({ summary: 'Health check endpoint' }),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], HealthController.prototype, "getHealth", null);
exports.HealthController = HealthController = __decorate([
(0, swagger_1.ApiTags)('Health'),
(0, common_1.Controller)('health'),
__metadata("design:paramtypes", [health_service_1.HealthService])
], HealthController);
//# sourceMappingURL=health.controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"health.controller.js","sourceRoot":"","sources":["../../../src/modules/health/health.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAiD;AACjD,6CAAwD;AACxD,qDAAiD;AAI1C,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAI7D,SAAS;QACP,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;IACxC,CAAC;CACF,CAAA;AARY,4CAAgB;AAK3B;IAFC,IAAA,YAAG,GAAE;IACL,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;;;;iDAGlD;2BAPU,gBAAgB;IAF5B,IAAA,iBAAO,EAAC,QAAQ,CAAC;IACjB,IAAA,mBAAU,EAAC,QAAQ,CAAC;qCAEyB,8BAAa;GAD9C,gBAAgB,CAQ5B"}

View File

@@ -0,0 +1,2 @@
export declare class HealthModule {
}

View File

@@ -0,0 +1,22 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.HealthModule = void 0;
const common_1 = require("@nestjs/common");
const health_controller_1 = require("./health.controller");
const health_service_1 = require("./health.service");
let HealthModule = class HealthModule {
};
exports.HealthModule = HealthModule;
exports.HealthModule = HealthModule = __decorate([
(0, common_1.Module)({
controllers: [health_controller_1.HealthController],
providers: [health_service_1.HealthService],
})
], HealthModule);
//# sourceMappingURL=health.module.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"health.module.js","sourceRoot":"","sources":["../../../src/modules/health/health.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,2DAAuD;AACvD,qDAAiD;AAM1C,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAJxB,IAAA,eAAM,EAAC;QACN,WAAW,EAAE,CAAC,oCAAgB,CAAC;QAC/B,SAAS,EAAE,CAAC,8BAAa,CAAC;KAC3B,CAAC;GACW,YAAY,CAAG"}

View File

@@ -0,0 +1,8 @@
export declare class HealthService {
getHealth(): {
status: string;
timestamp: string;
uptime: number;
environment: string;
};
}

View File

@@ -0,0 +1,25 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.HealthService = void 0;
const common_1 = require("@nestjs/common");
let HealthService = class HealthService {
getHealth() {
return {
status: 'ok',
timestamp: new Date().toISOString(),
uptime: process.uptime(),
environment: process.env.NODE_ENV || 'development',
};
}
};
exports.HealthService = HealthService;
exports.HealthService = HealthService = __decorate([
(0, common_1.Injectable)()
], HealthService);
//# sourceMappingURL=health.service.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"health.service.js","sourceRoot":"","sources":["../../../src/modules/health/health.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAGrC,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,SAAS;QACP,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;YACxB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;SACnD,CAAC;IACJ,CAAC;CACF,CAAA;AATY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CASzB"}

View File

@@ -0,0 +1,9 @@
export declare class FindNearbyParkingDto {
lat: number;
lng: number;
radius?: number;
maxResults?: number;
priceRange?: [number, number];
amenities?: string[];
availabilityFilter?: 'available' | 'limited' | 'full';
}

View File

@@ -0,0 +1,112 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FindNearbyParkingDto = void 0;
const swagger_1 = require("@nestjs/swagger");
const class_validator_1 = require("class-validator");
const class_transformer_1 = require("class-transformer");
class FindNearbyParkingDto {
constructor() {
this.radius = 4000;
this.maxResults = 20;
}
}
exports.FindNearbyParkingDto = FindNearbyParkingDto;
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Latitude coordinate',
example: 1.3521,
minimum: -90,
maximum: 90
}),
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(-90),
(0, class_validator_1.Max)(90),
(0, class_transformer_1.Transform)(({ value }) => parseFloat(value)),
__metadata("design:type", Number)
], FindNearbyParkingDto.prototype, "lat", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Longitude coordinate',
example: 103.8198,
minimum: -180,
maximum: 180
}),
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(-180),
(0, class_validator_1.Max)(180),
(0, class_transformer_1.Transform)(({ value }) => parseFloat(value)),
__metadata("design:type", Number)
], FindNearbyParkingDto.prototype, "lng", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Search radius in meters',
example: 4000,
minimum: 100,
maximum: 10000,
required: false
}),
(0, class_validator_1.IsOptional)(),
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(100),
(0, class_validator_1.Max)(10000),
(0, class_transformer_1.Transform)(({ value }) => parseFloat(value)),
__metadata("design:type", Number)
], FindNearbyParkingDto.prototype, "radius", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Maximum number of results to return',
example: 20,
minimum: 1,
maximum: 100,
required: false
}),
(0, class_validator_1.IsOptional)(),
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(1),
(0, class_validator_1.Max)(100),
(0, class_transformer_1.Transform)(({ value }) => parseInt(value)),
__metadata("design:type", Number)
], FindNearbyParkingDto.prototype, "maxResults", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Price range filter [min, max] per hour',
example: [0, 10],
required: false,
type: [Number]
}),
(0, class_validator_1.IsOptional)(),
(0, class_validator_1.IsArray)(),
(0, class_validator_1.IsNumber)({}, { each: true }),
__metadata("design:type", Array)
], FindNearbyParkingDto.prototype, "priceRange", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Required amenities',
example: ['covered', 'security', 'ev_charging'],
required: false,
type: [String]
}),
(0, class_validator_1.IsOptional)(),
(0, class_validator_1.IsArray)(),
__metadata("design:type", Array)
], FindNearbyParkingDto.prototype, "amenities", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Filter by availability status',
example: 'available',
enum: ['available', 'limited', 'full'],
required: false
}),
(0, class_validator_1.IsOptional)(),
__metadata("design:type", String)
], FindNearbyParkingDto.prototype, "availabilityFilter", void 0);
//# sourceMappingURL=find-nearby-parking.dto.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"find-nearby-parking.dto.js","sourceRoot":"","sources":["../../../../src/modules/parking/dto/find-nearby-parking.dto.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,6 @@
export declare class UpdateParkingAvailabilityDto {
availableSlots: number;
source?: string;
confidence?: number;
metadata?: Record<string, any>;
}

View File

@@ -0,0 +1,65 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UpdateParkingAvailabilityDto = void 0;
const swagger_1 = require("@nestjs/swagger");
const class_validator_1 = require("class-validator");
class UpdateParkingAvailabilityDto {
constructor() {
this.source = 'manual';
this.confidence = 1.0;
}
}
exports.UpdateParkingAvailabilityDto = UpdateParkingAvailabilityDto;
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Number of available parking slots',
example: 15,
minimum: 0
}),
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(0),
__metadata("design:type", Number)
], UpdateParkingAvailabilityDto.prototype, "availableSlots", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Source of the update',
example: 'sensor',
required: false
}),
(0, class_validator_1.IsOptional)(),
(0, class_validator_1.IsString)(),
__metadata("design:type", String)
], UpdateParkingAvailabilityDto.prototype, "source", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Confidence level of the update (0-1)',
example: 0.95,
minimum: 0,
maximum: 1,
required: false
}),
(0, class_validator_1.IsOptional)(),
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(0),
(0, class_validator_1.Max)(1),
__metadata("design:type", Number)
], UpdateParkingAvailabilityDto.prototype, "confidence", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Additional metadata',
example: { sensor_id: 'PARK_001', battery_level: 85 },
required: false
}),
(0, class_validator_1.IsOptional)(),
__metadata("design:type", Object)
], UpdateParkingAvailabilityDto.prototype, "metadata", void 0);
//# sourceMappingURL=update-availability.dto.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"update-availability.dto.js","sourceRoot":"","sources":["../../../../src/modules/parking/dto/update-availability.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAC9C,qDAA2E;AAE3E,MAAa,4BAA4B;IAAzC;QAiBE,WAAM,GAAY,QAAQ,CAAC;QAa3B,eAAU,GAAY,GAAG,CAAC;IAS5B,CAAC;CAAA;AAvCD,oEAuCC;AA/BC;IAPC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAG,EAAC,CAAC,CAAC;;oEACgB;AASvB;IAPC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,sBAAsB;QACnC,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,KAAK;KAChB,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;4DACgB;AAa3B;IAXC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,sCAAsC;QACnD,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,KAAK;KAChB,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAG,EAAC,CAAC,CAAC;IACN,IAAA,qBAAG,EAAC,CAAC,CAAC;;gEACmB;AAQ1B;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,qBAAqB;QAClC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE;QACrD,QAAQ,EAAE,KAAK;KAChB,CAAC;IACD,IAAA,4BAAU,GAAE;;8DACkB"}

View File

@@ -0,0 +1,13 @@
import { User } from '../../users/entities/user.entity';
import { ParkingLot } from './parking-lot.entity';
export declare class ParkingHistory {
id: number;
userId: string;
parkingLotId: number;
visitDate: Date;
durationMinutes: number;
rating: number;
review: string;
user: User;
parkingLot: ParkingLot;
}

View File

@@ -0,0 +1,68 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ParkingHistory = void 0;
const typeorm_1 = require("typeorm");
const swagger_1 = require("@nestjs/swagger");
const user_entity_1 = require("../../users/entities/user.entity");
const parking_lot_entity_1 = require("./parking-lot.entity");
let ParkingHistory = class ParkingHistory {
};
exports.ParkingHistory = ParkingHistory;
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Unique identifier for the parking history entry' }),
(0, typeorm_1.PrimaryGeneratedColumn)(),
__metadata("design:type", Number)
], ParkingHistory.prototype, "id", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'User who visited the parking lot' }),
(0, typeorm_1.Column)({ type: 'uuid', nullable: true }),
__metadata("design:type", String)
], ParkingHistory.prototype, "userId", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Parking lot that was visited' }),
(0, typeorm_1.Column)({ type: 'int' }),
__metadata("design:type", Number)
], ParkingHistory.prototype, "parkingLotId", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Date and time of the visit' }),
(0, typeorm_1.CreateDateColumn)(),
__metadata("design:type", Date)
], ParkingHistory.prototype, "visitDate", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Duration of parking in minutes' }),
(0, typeorm_1.Column)({ type: 'int', nullable: true }),
__metadata("design:type", Number)
], ParkingHistory.prototype, "durationMinutes", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'User rating for the parking experience' }),
(0, typeorm_1.Column)({ type: 'int', nullable: true }),
__metadata("design:type", Number)
], ParkingHistory.prototype, "rating", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'User review comments' }),
(0, typeorm_1.Column)({ type: 'text', nullable: true }),
__metadata("design:type", String)
], ParkingHistory.prototype, "review", void 0);
__decorate([
(0, typeorm_1.ManyToOne)(() => user_entity_1.User, (user) => user.parkingHistory, { nullable: true }),
(0, typeorm_1.JoinColumn)({ name: 'userId' }),
__metadata("design:type", user_entity_1.User)
], ParkingHistory.prototype, "user", void 0);
__decorate([
(0, typeorm_1.ManyToOne)(() => parking_lot_entity_1.ParkingLot, (parkingLot) => parkingLot.history),
(0, typeorm_1.JoinColumn)({ name: 'parkingLotId' }),
__metadata("design:type", parking_lot_entity_1.ParkingLot)
], ParkingHistory.prototype, "parkingLot", void 0);
exports.ParkingHistory = ParkingHistory = __decorate([
(0, typeorm_1.Entity)('parking_history')
], ParkingHistory);
//# sourceMappingURL=parking-history.entity.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"parking-history.entity.js","sourceRoot":"","sources":["../../../../src/modules/parking/entities/parking-history.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAOiB;AACjB,6CAA8C;AAC9C,kEAAwD;AACxD,6DAAkD;AAG3C,IAAM,cAAc,GAApB,MAAM,cAAc;CAqC1B,CAAA;AArCY,wCAAc;AAGzB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;IAC/E,IAAA,gCAAsB,GAAE;;0CACd;AAIX;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC;IAChE,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC1B;AAIf;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;IAC5D,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;oDACH;AAIrB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;IAC1D,IAAA,0BAAgB,GAAE;8BACR,IAAI;iDAAC;AAIhB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;IAC9D,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDAChB;AAIxB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC;IACtE,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CACzB;AAIf;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACpD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC1B;AAKf;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACxE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;8BACzB,kBAAI;4CAAC;AAIX;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,+BAAU,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;IAC/D,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;8BACzB,+BAAU;kDAAC;yBApCZ,cAAc;IAD1B,IAAA,gBAAM,EAAC,iBAAiB,CAAC;GACb,cAAc,CAqC1B"}

View File

@@ -0,0 +1,25 @@
import { ParkingHistory } from './parking-history.entity';
import { ParkingUpdate } from './parking-update.entity';
export declare class ParkingLot {
id: number;
name: string;
address: string;
lat: number;
lng: number;
location: string;
hourlyRate: number;
openTime: string;
closeTime: string;
availableSlots: number;
totalSlots: number;
amenities: Record<string, any>;
contactInfo: Record<string, any>;
isActive: boolean;
createdAt: Date;
updatedAt: Date;
history: ParkingHistory[];
updates: ParkingUpdate[];
get occupancyRate(): number;
get availabilityStatus(): 'available' | 'limited' | 'full';
get isOpen(): boolean;
}

View File

@@ -0,0 +1,155 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ParkingLot = void 0;
const typeorm_1 = require("typeorm");
const swagger_1 = require("@nestjs/swagger");
const parking_history_entity_1 = require("./parking-history.entity");
const parking_update_entity_1 = require("./parking-update.entity");
let ParkingLot = class ParkingLot {
get occupancyRate() {
if (this.totalSlots === 0)
return 0;
return ((this.totalSlots - this.availableSlots) / this.totalSlots) * 100;
}
get availabilityStatus() {
const rate = this.occupancyRate;
if (rate >= 95)
return 'full';
if (rate >= 80)
return 'limited';
return 'available';
}
get isOpen() {
if (!this.openTime || !this.closeTime)
return true;
const now = new Date();
const currentTime = now.getHours() * 60 + now.getMinutes();
const [openHour, openMin] = this.openTime.split(':').map(Number);
const [closeHour, closeMin] = this.closeTime.split(':').map(Number);
const openMinutes = openHour * 60 + openMin;
const closeMinutes = closeHour * 60 + closeMin;
return currentTime >= openMinutes && currentTime <= closeMinutes;
}
};
exports.ParkingLot = ParkingLot;
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Unique identifier for the parking lot' }),
(0, typeorm_1.PrimaryGeneratedColumn)(),
__metadata("design:type", Number)
], ParkingLot.prototype, "id", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Name of the parking lot' }),
(0, typeorm_1.Column)({ type: 'varchar', length: 255 }),
__metadata("design:type", String)
], ParkingLot.prototype, "name", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Address of the parking lot' }),
(0, typeorm_1.Column)({ type: 'text' }),
__metadata("design:type", String)
], ParkingLot.prototype, "address", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Latitude coordinate' }),
(0, typeorm_1.Column)({ type: 'double precision' }),
__metadata("design:type", Number)
], ParkingLot.prototype, "lat", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Longitude coordinate' }),
(0, typeorm_1.Column)({ type: 'double precision' }),
__metadata("design:type", Number)
], ParkingLot.prototype, "lng", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'PostGIS geography point' }),
(0, typeorm_1.Column)({
type: 'geography',
spatialFeatureType: 'Point',
srid: 4326,
nullable: true,
}),
__metadata("design:type", String)
], ParkingLot.prototype, "location", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Hourly parking rate' }),
(0, typeorm_1.Column)({ type: 'decimal', precision: 10, scale: 2, nullable: true }),
__metadata("design:type", Number)
], ParkingLot.prototype, "hourlyRate", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Opening time' }),
(0, typeorm_1.Column)({ type: 'time', nullable: true }),
__metadata("design:type", String)
], ParkingLot.prototype, "openTime", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Closing time' }),
(0, typeorm_1.Column)({ type: 'time', nullable: true }),
__metadata("design:type", String)
], ParkingLot.prototype, "closeTime", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Number of available parking spaces' }),
(0, typeorm_1.Column)({ type: 'int', default: 0 }),
__metadata("design:type", Number)
], ParkingLot.prototype, "availableSlots", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Total number of parking spaces' }),
(0, typeorm_1.Column)({ type: 'int' }),
__metadata("design:type", Number)
], ParkingLot.prototype, "totalSlots", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Parking lot amenities' }),
(0, typeorm_1.Column)({ type: 'jsonb', default: '{}' }),
__metadata("design:type", Object)
], ParkingLot.prototype, "amenities", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Contact information' }),
(0, typeorm_1.Column)({ type: 'jsonb', default: '{}' }),
__metadata("design:type", Object)
], ParkingLot.prototype, "contactInfo", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Whether the parking lot is active' }),
(0, typeorm_1.Column)({ type: 'boolean', default: true }),
__metadata("design:type", Boolean)
], ParkingLot.prototype, "isActive", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Creation timestamp' }),
(0, typeorm_1.CreateDateColumn)(),
__metadata("design:type", Date)
], ParkingLot.prototype, "createdAt", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Last update timestamp' }),
(0, typeorm_1.UpdateDateColumn)(),
__metadata("design:type", Date)
], ParkingLot.prototype, "updatedAt", void 0);
__decorate([
(0, typeorm_1.OneToMany)(() => parking_history_entity_1.ParkingHistory, (history) => history.parkingLot),
__metadata("design:type", Array)
], ParkingLot.prototype, "history", void 0);
__decorate([
(0, typeorm_1.OneToMany)(() => parking_update_entity_1.ParkingUpdate, (update) => update.parkingLot),
__metadata("design:type", Array)
], ParkingLot.prototype, "updates", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Occupancy rate as percentage' }),
__metadata("design:type", Number),
__metadata("design:paramtypes", [])
], ParkingLot.prototype, "occupancyRate", null);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Availability status' }),
__metadata("design:type", String),
__metadata("design:paramtypes", [])
], ParkingLot.prototype, "availabilityStatus", null);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Whether the parking lot is currently open' }),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], ParkingLot.prototype, "isOpen", null);
exports.ParkingLot = ParkingLot = __decorate([
(0, typeorm_1.Entity)('parking_lots')
], ParkingLot);
//# sourceMappingURL=parking-lot.entity.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"parking-lot.entity.js","sourceRoot":"","sources":["../../../../src/modules/parking/entities/parking-lot.entity.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,11 @@
import { ParkingLot } from './parking-lot.entity';
export declare class ParkingUpdate {
id: number;
parkingLotId: number;
availableSlots: number;
source: string;
confidence: number;
metadata: Record<string, any>;
timestamp: Date;
parkingLot: ParkingLot;
}

View File

@@ -0,0 +1,62 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ParkingUpdate = void 0;
const typeorm_1 = require("typeorm");
const swagger_1 = require("@nestjs/swagger");
const parking_lot_entity_1 = require("./parking-lot.entity");
let ParkingUpdate = class ParkingUpdate {
};
exports.ParkingUpdate = ParkingUpdate;
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Unique identifier for the parking update' }),
(0, typeorm_1.PrimaryGeneratedColumn)(),
__metadata("design:type", Number)
], ParkingUpdate.prototype, "id", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Parking lot being updated' }),
(0, typeorm_1.Column)({ type: 'int' }),
__metadata("design:type", Number)
], ParkingUpdate.prototype, "parkingLotId", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Number of available slots at time of update' }),
(0, typeorm_1.Column)({ type: 'int' }),
__metadata("design:type", Number)
], ParkingUpdate.prototype, "availableSlots", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Source of the update' }),
(0, typeorm_1.Column)({ type: 'varchar', length: 50, default: 'sensor' }),
__metadata("design:type", String)
], ParkingUpdate.prototype, "source", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Confidence level of the update (0-1)' }),
(0, typeorm_1.Column)({ type: 'decimal', precision: 3, scale: 2, default: 1.0 }),
__metadata("design:type", Number)
], ParkingUpdate.prototype, "confidence", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Additional metadata for the update' }),
(0, typeorm_1.Column)({ type: 'jsonb', default: '{}' }),
__metadata("design:type", Object)
], ParkingUpdate.prototype, "metadata", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Timestamp of the update' }),
(0, typeorm_1.CreateDateColumn)(),
__metadata("design:type", Date)
], ParkingUpdate.prototype, "timestamp", void 0);
__decorate([
(0, typeorm_1.ManyToOne)(() => parking_lot_entity_1.ParkingLot, (parkingLot) => parkingLot.updates),
(0, typeorm_1.JoinColumn)({ name: 'parkingLotId' }),
__metadata("design:type", parking_lot_entity_1.ParkingLot)
], ParkingUpdate.prototype, "parkingLot", void 0);
exports.ParkingUpdate = ParkingUpdate = __decorate([
(0, typeorm_1.Entity)('parking_updates')
], ParkingUpdate);
//# sourceMappingURL=parking-update.entity.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"parking-update.entity.js","sourceRoot":"","sources":["../../../../src/modules/parking/entities/parking-update.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAOiB;AACjB,6CAA8C;AAC9C,6DAAkD;AAG3C,IAAM,aAAa,GAAnB,MAAM,aAAa;CAiCzB,CAAA;AAjCY,sCAAa;AAGxB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC;IACxE,IAAA,gCAAsB,GAAE;;yCACd;AAIX;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;IACzD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;mDACH;AAIrB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAAC;IAC3E,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;qDACD;AAIvB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACpD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;;6CAC5C;AAIf;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;IACpE,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;;iDAC/C;AAInB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC;IAClE,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;+CACX;AAI9B;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;IACvD,IAAA,0BAAgB,GAAE;8BACR,IAAI;gDAAC;AAKhB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,+BAAU,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;IAC/D,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;8BACzB,+BAAU;iDAAC;wBAhCZ,aAAa;IADzB,IAAA,gBAAM,EAAC,iBAAiB,CAAC;GACb,aAAa,CAiCzB"}

View File

@@ -0,0 +1,22 @@
import { ParkingService } from './parking.service';
import { FindNearbyParkingDto } from './dto/find-nearby-parking.dto';
import { UpdateParkingAvailabilityDto } from './dto/update-availability.dto';
import { ParkingLot } from './entities/parking-lot.entity';
import { ParkingUpdate } from './entities/parking-update.entity';
export declare class ParkingController {
private readonly parkingService;
constructor(parkingService: ParkingService);
findNearbyParking(dto: FindNearbyParkingDto): Promise<{
parkingLots: ParkingLot[];
userLocation: {
lat: number;
lng: number;
};
searchRadius: number;
}>;
getAllParkingLots(): Promise<ParkingLot[]>;
getPopularParkingLots(limit?: number): Promise<ParkingLot[]>;
getParkingLotById(id: number): Promise<ParkingLot>;
updateAvailability(id: number, dto: UpdateParkingAvailabilityDto): Promise<ParkingLot>;
getParkingLotHistory(id: number, limit?: number): Promise<ParkingUpdate[]>;
}

View File

@@ -0,0 +1,207 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ParkingController = void 0;
const common_1 = require("@nestjs/common");
const swagger_1 = require("@nestjs/swagger");
const throttler_1 = require("@nestjs/throttler");
const parking_service_1 = require("./parking.service");
const find_nearby_parking_dto_1 = require("./dto/find-nearby-parking.dto");
const update_availability_dto_1 = require("./dto/update-availability.dto");
const parking_lot_entity_1 = require("./entities/parking-lot.entity");
const parking_update_entity_1 = require("./entities/parking-update.entity");
let ParkingController = class ParkingController {
constructor(parkingService) {
this.parkingService = parkingService;
}
async findNearbyParking(dto) {
return this.parkingService.findNearbyParking(dto);
}
async getAllParkingLots() {
return this.parkingService.getAllParkingLots();
}
async getPopularParkingLots(limit) {
return this.parkingService.getPopularParkingLots(limit);
}
async getParkingLotById(id) {
return this.parkingService.findById(id);
}
async updateAvailability(id, dto) {
return this.parkingService.updateAvailability(id, dto);
}
async getParkingLotHistory(id, limit) {
return this.parkingService.getParkingLotHistory(id, limit);
}
};
exports.ParkingController = ParkingController;
__decorate([
(0, common_1.Post)('nearby'),
(0, swagger_1.ApiOperation)({
summary: 'Find nearby parking lots',
description: 'Search for parking lots within a specified radius of the given coordinates'
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.OK,
description: 'Successfully found nearby parking lots',
type: parking_lot_entity_1.ParkingLot,
isArray: true,
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.BAD_REQUEST,
description: 'Invalid coordinates or parameters',
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.INTERNAL_SERVER_ERROR,
description: 'Failed to search for parking lots',
}),
__param(0, (0, common_1.Body)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [find_nearby_parking_dto_1.FindNearbyParkingDto]),
__metadata("design:returntype", Promise)
], ParkingController.prototype, "findNearbyParking", null);
__decorate([
(0, common_1.Get)(),
(0, swagger_1.ApiOperation)({
summary: 'Get all parking lots',
description: 'Retrieve all active parking lots in the system'
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.OK,
description: 'Successfully retrieved parking lots',
type: parking_lot_entity_1.ParkingLot,
isArray: true,
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], ParkingController.prototype, "getAllParkingLots", null);
__decorate([
(0, common_1.Get)('popular'),
(0, swagger_1.ApiOperation)({
summary: 'Get popular parking lots',
description: 'Retrieve the most frequently visited parking lots'
}),
(0, swagger_1.ApiQuery)({
name: 'limit',
required: false,
description: 'Maximum number of results',
example: 10
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.OK,
description: 'Successfully retrieved popular parking lots',
type: parking_lot_entity_1.ParkingLot,
isArray: true,
}),
__param(0, (0, common_1.Query)('limit')),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Number]),
__metadata("design:returntype", Promise)
], ParkingController.prototype, "getPopularParkingLots", null);
__decorate([
(0, common_1.Get)(':id'),
(0, swagger_1.ApiOperation)({
summary: 'Get parking lot details',
description: 'Retrieve detailed information about a specific parking lot'
}),
(0, swagger_1.ApiParam)({
name: 'id',
description: 'Parking lot ID',
example: 1
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.OK,
description: 'Successfully retrieved parking lot details',
type: parking_lot_entity_1.ParkingLot,
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.NOT_FOUND,
description: 'Parking lot not found',
}),
__param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Number]),
__metadata("design:returntype", Promise)
], ParkingController.prototype, "getParkingLotById", null);
__decorate([
(0, common_1.Put)(':id/availability'),
(0, swagger_1.ApiBearerAuth)(),
(0, swagger_1.ApiOperation)({
summary: 'Update parking availability',
description: 'Update the number of available slots for a parking lot'
}),
(0, swagger_1.ApiParam)({
name: 'id',
description: 'Parking lot ID',
example: 1
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.OK,
description: 'Successfully updated parking availability',
type: parking_lot_entity_1.ParkingLot,
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.NOT_FOUND,
description: 'Parking lot not found',
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.BAD_REQUEST,
description: 'Invalid availability data',
}),
__param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
__param(1, (0, common_1.Body)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Number, update_availability_dto_1.UpdateParkingAvailabilityDto]),
__metadata("design:returntype", Promise)
], ParkingController.prototype, "updateAvailability", null);
__decorate([
(0, common_1.Get)(':id/history'),
(0, swagger_1.ApiOperation)({
summary: 'Get parking lot update history',
description: 'Retrieve the update history for a specific parking lot'
}),
(0, swagger_1.ApiParam)({
name: 'id',
description: 'Parking lot ID',
example: 1
}),
(0, swagger_1.ApiQuery)({
name: 'limit',
required: false,
description: 'Maximum number of history records',
example: 100
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.OK,
description: 'Successfully retrieved parking lot history',
type: parking_update_entity_1.ParkingUpdate,
isArray: true,
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.NOT_FOUND,
description: 'Parking lot not found',
}),
__param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
__param(1, (0, common_1.Query)('limit')),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Number, Number]),
__metadata("design:returntype", Promise)
], ParkingController.prototype, "getParkingLotHistory", null);
exports.ParkingController = ParkingController = __decorate([
(0, swagger_1.ApiTags)('Parking'),
(0, common_1.Controller)('parking'),
(0, common_1.UseGuards)(throttler_1.ThrottlerGuard),
__metadata("design:paramtypes", [parking_service_1.ParkingService])
], ParkingController);
//# sourceMappingURL=parking.controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"parking.controller.js","sourceRoot":"","sources":["../../../src/modules/parking/parking.controller.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,2 @@
export declare class ParkingModule {
}

View File

@@ -0,0 +1,34 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ParkingModule = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const parking_controller_1 = require("./parking.controller");
const parking_service_1 = require("./parking.service");
const parking_lot_entity_1 = require("./entities/parking-lot.entity");
const parking_history_entity_1 = require("./entities/parking-history.entity");
const parking_update_entity_1 = require("./entities/parking-update.entity");
let ParkingModule = class ParkingModule {
};
exports.ParkingModule = ParkingModule;
exports.ParkingModule = ParkingModule = __decorate([
(0, common_1.Module)({
imports: [
typeorm_1.TypeOrmModule.forFeature([
parking_lot_entity_1.ParkingLot,
parking_history_entity_1.ParkingHistory,
parking_update_entity_1.ParkingUpdate,
]),
],
controllers: [parking_controller_1.ParkingController],
providers: [parking_service_1.ParkingService],
exports: [parking_service_1.ParkingService],
})
], ParkingModule);
//# sourceMappingURL=parking.module.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"parking.module.js","sourceRoot":"","sources":["../../../src/modules/parking/parking.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6CAAgD;AAChD,6DAAyD;AACzD,uDAAmD;AACnD,sEAA2D;AAC3D,8EAAmE;AACnE,4EAAiE;AAc1D,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IAZzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,uBAAa,CAAC,UAAU,CAAC;gBACvB,+BAAU;gBACV,uCAAc;gBACd,qCAAa;aACd,CAAC;SACH;QACD,WAAW,EAAE,CAAC,sCAAiB,CAAC;QAChC,SAAS,EAAE,CAAC,gCAAc,CAAC;QAC3B,OAAO,EAAE,CAAC,gCAAc,CAAC;KAC1B,CAAC;GACW,aAAa,CAAG"}

View File

@@ -0,0 +1,24 @@
import { Repository } from 'typeorm';
import { ParkingLot } from './entities/parking-lot.entity';
import { ParkingUpdate } from './entities/parking-update.entity';
import { FindNearbyParkingDto } from './dto/find-nearby-parking.dto';
import { UpdateParkingAvailabilityDto } from './dto/update-availability.dto';
export declare class ParkingService {
private readonly parkingRepository;
private readonly updateRepository;
private readonly logger;
constructor(parkingRepository: Repository<ParkingLot>, updateRepository: Repository<ParkingUpdate>);
findNearbyParking(dto: FindNearbyParkingDto): Promise<{
parkingLots: ParkingLot[];
userLocation: {
lat: number;
lng: number;
};
searchRadius: number;
}>;
findById(id: number): Promise<ParkingLot>;
updateAvailability(id: number, dto: UpdateParkingAvailabilityDto): Promise<ParkingLot>;
getAllParkingLots(): Promise<ParkingLot[]>;
getParkingLotHistory(id: number, limit?: number): Promise<ParkingUpdate[]>;
getPopularParkingLots(limit?: number): Promise<ParkingLot[]>;
}

View File

@@ -0,0 +1,148 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var ParkingService_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ParkingService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const parking_lot_entity_1 = require("./entities/parking-lot.entity");
const parking_update_entity_1 = require("./entities/parking-update.entity");
let ParkingService = ParkingService_1 = class ParkingService {
constructor(parkingRepository, updateRepository) {
this.parkingRepository = parkingRepository;
this.updateRepository = updateRepository;
this.logger = new common_1.Logger(ParkingService_1.name);
}
async findNearbyParking(dto) {
try {
this.logger.debug(`Finding parking near ${dto.lat}, ${dto.lng} within ${dto.radius}m`);
let query = this.parkingRepository
.createQueryBuilder('lot')
.select([
'lot.*',
'ST_Distance(lot.location::geography, ST_Point(:lng, :lat)::geography) as distance'
])
.where('ST_DWithin(lot.location::geography, ST_Point(:lng, :lat)::geography, :radius)', {
lng: dto.lng,
lat: dto.lat,
radius: dto.radius,
})
.andWhere('lot.isActive = :isActive', { isActive: true });
if (dto.priceRange && dto.priceRange.length === 2) {
query = query.andWhere('lot.hourlyRate BETWEEN :minPrice AND :maxPrice', { minPrice: dto.priceRange[0], maxPrice: dto.priceRange[1] });
}
if (dto.amenities && dto.amenities.length > 0) {
dto.amenities.forEach((amenity, index) => {
query = query.andWhere(`lot.amenities ? :amenity${index}`, { [`amenity${index}`]: amenity });
});
}
if (dto.availabilityFilter) {
switch (dto.availabilityFilter) {
case 'available':
query = query.andWhere('(lot.availableSlots::float / lot.totalSlots::float) > 0.2');
break;
case 'limited':
query = query.andWhere('(lot.availableSlots::float / lot.totalSlots::float) BETWEEN 0.05 AND 0.2');
break;
case 'full':
query = query.andWhere('(lot.availableSlots::float / lot.totalSlots::float) < 0.05');
break;
}
}
const results = await query
.orderBy('distance', 'ASC')
.limit(dto.maxResults)
.getRawMany();
const parkingLots = results.map((result) => {
const { distance, ...lotData } = result;
const lot = this.parkingRepository.create(lotData);
lot.distance = parseFloat(distance);
return lot;
});
return {
parkingLots,
userLocation: { lat: dto.lat, lng: dto.lng },
searchRadius: dto.radius,
};
}
catch (error) {
this.logger.error('Failed to find nearby parking', error);
throw new common_1.InternalServerErrorException('Failed to find nearby parking');
}
}
async findById(id) {
const lot = await this.parkingRepository.findOne({
where: { id },
relations: ['updates'],
});
if (!lot) {
throw new common_1.NotFoundException(`Parking lot with ID ${id} not found`);
}
return lot;
}
async updateAvailability(id, dto) {
const lot = await this.findById(id);
const update = this.updateRepository.create({
parkingLotId: id,
availableSlots: dto.availableSlots,
source: dto.source,
confidence: dto.confidence,
metadata: dto.metadata,
});
await this.updateRepository.save(update);
lot.availableSlots = dto.availableSlots;
lot.updatedAt = new Date();
return this.parkingRepository.save(lot);
}
async getAllParkingLots() {
return this.parkingRepository.find({
where: { isActive: true },
order: { name: 'ASC' },
});
}
async getParkingLotHistory(id, limit = 100) {
return this.updateRepository.find({
where: { parkingLotId: id },
order: { timestamp: 'DESC' },
take: limit,
});
}
async getPopularParkingLots(limit = 10) {
const results = await this.parkingRepository
.createQueryBuilder('lot')
.leftJoin('lot.history', 'history')
.select(['lot.*', 'COUNT(history.id) as visit_count'])
.where('lot.isActive = :isActive', { isActive: true })
.groupBy('lot.id')
.orderBy('visit_count', 'DESC')
.limit(limit)
.getRawMany();
return results.map((result) => {
const { visit_count, ...lotData } = result;
const lot = this.parkingRepository.create(lotData);
lot.visitCount = parseInt(visit_count) || 0;
return lot;
});
}
};
exports.ParkingService = ParkingService;
exports.ParkingService = ParkingService = ParkingService_1 = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(parking_lot_entity_1.ParkingLot)),
__param(1, (0, typeorm_1.InjectRepository)(parking_update_entity_1.ParkingUpdate)),
__metadata("design:paramtypes", [typeorm_2.Repository,
typeorm_2.Repository])
], ParkingService);
//# sourceMappingURL=parking.service.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"parking.service.js","sourceRoot":"","sources":["../../../src/modules/parking/parking.service.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,37 @@
export declare class RouteRequestDto {
originLat: number;
originLng: number;
destinationLat: number;
destinationLng: number;
costing?: 'auto' | 'bicycle' | 'pedestrian';
alternatives?: number;
avoidHighways?: boolean;
avoidTolls?: boolean;
}
export interface RoutePoint {
lat: number;
lng: number;
}
export interface RouteStep {
instruction: string;
distance: number;
time: number;
type: string;
geometry: RoutePoint[];
}
export interface Route {
summary: {
distance: number;
time: number;
cost?: number;
};
geometry: RoutePoint[];
steps: RouteStep[];
confidence: number;
}
export interface RouteResponse {
routes: Route[];
origin: RoutePoint;
destination: RoutePoint;
requestId: string;
}

View File

@@ -0,0 +1,121 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RouteRequestDto = void 0;
const swagger_1 = require("@nestjs/swagger");
const class_validator_1 = require("class-validator");
const class_transformer_1 = require("class-transformer");
class RouteRequestDto {
constructor() {
this.costing = 'auto';
this.alternatives = 1;
this.avoidHighways = false;
this.avoidTolls = false;
}
}
exports.RouteRequestDto = RouteRequestDto;
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Origin latitude',
example: 1.3521,
minimum: -90,
maximum: 90
}),
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(-90),
(0, class_validator_1.Max)(90),
(0, class_transformer_1.Transform)(({ value }) => parseFloat(value)),
__metadata("design:type", Number)
], RouteRequestDto.prototype, "originLat", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Origin longitude',
example: 103.8198,
minimum: -180,
maximum: 180
}),
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(-180),
(0, class_validator_1.Max)(180),
(0, class_transformer_1.Transform)(({ value }) => parseFloat(value)),
__metadata("design:type", Number)
], RouteRequestDto.prototype, "originLng", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Destination latitude',
example: 1.3500,
minimum: -90,
maximum: 90
}),
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(-90),
(0, class_validator_1.Max)(90),
(0, class_transformer_1.Transform)(({ value }) => parseFloat(value)),
__metadata("design:type", Number)
], RouteRequestDto.prototype, "destinationLat", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Destination longitude',
example: 103.8150,
minimum: -180,
maximum: 180
}),
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(-180),
(0, class_validator_1.Max)(180),
(0, class_transformer_1.Transform)(({ value }) => parseFloat(value)),
__metadata("design:type", Number)
], RouteRequestDto.prototype, "destinationLng", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Transportation mode',
example: 'auto',
enum: ['auto', 'bicycle', 'pedestrian'],
required: false
}),
(0, class_validator_1.IsOptional)(),
(0, class_validator_1.IsEnum)(['auto', 'bicycle', 'pedestrian']),
__metadata("design:type", String)
], RouteRequestDto.prototype, "costing", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Number of alternative routes',
example: 2,
minimum: 0,
maximum: 3,
required: false
}),
(0, class_validator_1.IsOptional)(),
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(0),
(0, class_validator_1.Max)(3),
(0, class_transformer_1.Transform)(({ value }) => parseInt(value)),
__metadata("design:type", Number)
], RouteRequestDto.prototype, "alternatives", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Avoid highways',
example: false,
required: false
}),
(0, class_validator_1.IsOptional)(),
__metadata("design:type", Boolean)
], RouteRequestDto.prototype, "avoidHighways", void 0);
__decorate([
(0, swagger_1.ApiProperty)({
description: 'Avoid tolls',
example: false,
required: false
}),
(0, class_validator_1.IsOptional)(),
__metadata("design:type", Boolean)
], RouteRequestDto.prototype, "avoidTolls", void 0);
//# sourceMappingURL=route-request.dto.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"route-request.dto.js","sourceRoot":"","sources":["../../../../src/modules/routing/dto/route-request.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAC9C,qDAAyE;AACzE,yDAA8C;AAE9C,MAAa,eAAe;IAA5B;QAyDE,YAAO,GAAuC,MAAM,CAAC;QAcrD,iBAAY,GAAY,CAAC,CAAC;QAQ1B,kBAAa,GAAa,KAAK,CAAC;QAQhC,eAAU,GAAa,KAAK,CAAC;IAC/B,CAAC;CAAA;AAxFD,0CAwFC;AA7EC;IAVC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,CAAC,EAAE;QACZ,OAAO,EAAE,EAAE;KACZ,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAG,EAAC,CAAC,EAAE,CAAC;IACR,IAAA,qBAAG,EAAC,EAAE,CAAC;IACP,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;;kDAC1B;AAYlB;IAVC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,CAAC,GAAG;QACb,OAAO,EAAE,GAAG;KACb,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAG,EAAC,CAAC,GAAG,CAAC;IACT,IAAA,qBAAG,EAAC,GAAG,CAAC;IACR,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;;kDAC1B;AAYlB;IAVC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,sBAAsB;QACnC,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,CAAC,EAAE;QACZ,OAAO,EAAE,EAAE;KACZ,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAG,EAAC,CAAC,EAAE,CAAC;IACR,IAAA,qBAAG,EAAC,EAAE,CAAC;IACP,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;;uDACrB;AAYvB;IAVC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,uBAAuB;QACpC,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,CAAC,GAAG;QACb,OAAO,EAAE,GAAG;KACb,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAG,EAAC,CAAC,GAAG,CAAC;IACT,IAAA,qBAAG,EAAC,GAAG,CAAC;IACR,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;;uDACrB;AAUvB;IARC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,qBAAqB;QAClC,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC;QACvC,QAAQ,EAAE,KAAK;KAChB,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;;gDACW;AAcrD;IAZC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,8BAA8B;QAC3C,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,KAAK;KAChB,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAG,EAAC,CAAC,CAAC;IACN,IAAA,qBAAG,EAAC,CAAC,CAAC;IACN,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;;qDAChB;AAQ1B;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,gBAAgB;QAC7B,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;KAChB,CAAC;IACD,IAAA,4BAAU,GAAE;;sDACmB;AAQhC;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;KAChB,CAAC;IACD,IAAA,4BAAU,GAAE;;mDACgB"}

View File

@@ -0,0 +1,11 @@
import { RoutingService } from './routing.service';
import { RouteRequestDto, RouteResponse } from './dto/route-request.dto';
export declare class RoutingController {
private readonly routingService;
constructor(routingService: RoutingService);
calculateRoute(dto: RouteRequestDto): Promise<RouteResponse>;
getServiceStatus(): Promise<{
status: string;
version?: string;
}>;
}

View File

@@ -0,0 +1,88 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RoutingController = void 0;
const common_1 = require("@nestjs/common");
const swagger_1 = require("@nestjs/swagger");
const throttler_1 = require("@nestjs/throttler");
const routing_service_1 = require("./routing.service");
const route_request_dto_1 = require("./dto/route-request.dto");
let RoutingController = class RoutingController {
constructor(routingService) {
this.routingService = routingService;
}
async calculateRoute(dto) {
return this.routingService.calculateRoute(dto);
}
async getServiceStatus() {
return this.routingService.getServiceStatus();
}
};
exports.RoutingController = RoutingController;
__decorate([
(0, common_1.Post)('calculate'),
(0, swagger_1.ApiOperation)({
summary: 'Calculate route between two points',
description: 'Generate turn-by-turn directions using Valhalla routing engine'
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.OK,
description: 'Successfully calculated route',
type: 'object',
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.BAD_REQUEST,
description: 'Invalid route parameters',
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.NOT_FOUND,
description: 'No route found between the specified locations',
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.SERVICE_UNAVAILABLE,
description: 'Routing service unavailable',
}),
__param(0, (0, common_1.Body)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [route_request_dto_1.RouteRequestDto]),
__metadata("design:returntype", Promise)
], RoutingController.prototype, "calculateRoute", null);
__decorate([
(0, common_1.Get)('status'),
(0, swagger_1.ApiOperation)({
summary: 'Check routing service status',
description: 'Check if the Valhalla routing service is healthy and responsive'
}),
(0, swagger_1.ApiResponse)({
status: common_1.HttpStatus.OK,
description: 'Service status information',
schema: {
type: 'object',
properties: {
status: { type: 'string', example: 'healthy' },
version: { type: 'string', example: '3.1.0' },
},
},
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], RoutingController.prototype, "getServiceStatus", null);
exports.RoutingController = RoutingController = __decorate([
(0, swagger_1.ApiTags)('Routing'),
(0, common_1.Controller)('routing'),
(0, common_1.UseGuards)(throttler_1.ThrottlerGuard),
__metadata("design:paramtypes", [routing_service_1.RoutingService])
], RoutingController);
//# sourceMappingURL=routing.controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"routing.controller.js","sourceRoot":"","sources":["../../../src/modules/routing/routing.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAOwB;AACxB,6CAIyB;AACzB,iDAAmD;AACnD,uDAAmD;AACnD,+DAAyE;AAKlE,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,YAA6B,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAwBzD,AAAN,KAAK,CAAC,cAAc,CAAS,GAAoB;QAC/C,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAkBK,AAAN,KAAK,CAAC,gBAAgB;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;IAChD,CAAC;CACF,CAAA;AAhDY,8CAAiB;AAyBtB;IAtBL,IAAA,aAAI,EAAC,WAAW,CAAC;IACjB,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,oCAAoC;QAC7C,WAAW,EAAE,gEAAgE;KAC9E,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,mBAAU,CAAC,EAAE;QACrB,WAAW,EAAE,+BAA+B;QAC5C,IAAI,EAAE,QAAQ;KACf,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,mBAAU,CAAC,WAAW;QAC9B,WAAW,EAAE,0BAA0B;KACxC,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,mBAAU,CAAC,SAAS;QAC5B,WAAW,EAAE,gDAAgD;KAC9D,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,mBAAU,CAAC,mBAAmB;QACtC,WAAW,EAAE,6BAA6B;KAC3C,CAAC;IACoB,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,mCAAe;;uDAEhD;AAkBK;IAhBL,IAAA,YAAG,EAAC,QAAQ,CAAC;IACb,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,8BAA8B;QACvC,WAAW,EAAE,iEAAiE;KAC/E,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,mBAAU,CAAC,EAAE;QACrB,WAAW,EAAE,4BAA4B;QACzC,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE;gBAC9C,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;aAC9C;SACF;KACF,CAAC;;;;yDAGD;4BA/CU,iBAAiB;IAH7B,IAAA,iBAAO,EAAC,SAAS,CAAC;IAClB,IAAA,mBAAU,EAAC,SAAS,CAAC;IACrB,IAAA,kBAAS,EAAC,0BAAc,CAAC;qCAEqB,gCAAc;GADhD,iBAAiB,CAgD7B"}

View File

@@ -0,0 +1,2 @@
export declare class RoutingModule {
}

View File

@@ -0,0 +1,23 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RoutingModule = void 0;
const common_1 = require("@nestjs/common");
const routing_controller_1 = require("./routing.controller");
const routing_service_1 = require("./routing.service");
let RoutingModule = class RoutingModule {
};
exports.RoutingModule = RoutingModule;
exports.RoutingModule = RoutingModule = __decorate([
(0, common_1.Module)({
controllers: [routing_controller_1.RoutingController],
providers: [routing_service_1.RoutingService],
exports: [routing_service_1.RoutingService],
})
], RoutingModule);
//# sourceMappingURL=routing.module.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"routing.module.js","sourceRoot":"","sources":["../../../src/modules/routing/routing.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6DAAyD;AACzD,uDAAmD;AAO5C,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IALzB,IAAA,eAAM,EAAC;QACN,WAAW,EAAE,CAAC,sCAAiB,CAAC;QAChC,SAAS,EAAE,CAAC,gCAAc,CAAC;QAC3B,OAAO,EAAE,CAAC,gCAAc,CAAC;KAC1B,CAAC;GACW,aAAa,CAAG"}

View File

@@ -0,0 +1,21 @@
import { ConfigService } from '@nestjs/config';
import { RouteRequestDto, RouteResponse } from './dto/route-request.dto';
export declare class RoutingService {
private configService;
private readonly logger;
private readonly valhallaClient;
private readonly valhallaUrl;
constructor(configService: ConfigService);
calculateRoute(dto: RouteRequestDto): Promise<RouteResponse>;
private buildValhallaRequest;
private getCostingOptions;
private parseValhallaResponse;
private parseManeuvers;
private decodePolyline;
private estimateFuelCost;
private generateRequestId;
getServiceStatus(): Promise<{
status: string;
version?: string;
}>;
}

View File

@@ -0,0 +1,206 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var RoutingService_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RoutingService = void 0;
const common_1 = require("@nestjs/common");
const config_1 = require("@nestjs/config");
const axios_1 = require("axios");
let RoutingService = RoutingService_1 = class RoutingService {
constructor(configService) {
this.configService = configService;
this.logger = new common_1.Logger(RoutingService_1.name);
this.valhallaUrl = this.configService.get('VALHALLA_URL') || 'http://valhalla:8002';
this.valhallaClient = axios_1.default.create({
baseURL: this.valhallaUrl,
timeout: 30000,
headers: {
'Content-Type': 'application/json',
},
});
}
async calculateRoute(dto) {
try {
this.logger.debug(`Calculating route from ${dto.originLat},${dto.originLng} to ${dto.destinationLat},${dto.destinationLng}`);
const requestId = this.generateRequestId();
const valhallaRequest = this.buildValhallaRequest(dto);
const response = await this.valhallaClient.post('/route', valhallaRequest);
if (!response.data || !response.data.trip) {
throw new Error('Invalid response from Valhalla routing engine');
}
const routes = this.parseValhallaResponse(response.data);
return {
routes,
origin: { lat: dto.originLat, lng: dto.originLng },
destination: { lat: dto.destinationLat, lng: dto.destinationLng },
requestId,
};
}
catch (error) {
this.logger.error('Failed to calculate route', error);
if (error.response?.status === 400) {
throw new common_1.HttpException('Invalid route request parameters', common_1.HttpStatus.BAD_REQUEST);
}
if (error.response?.status === 404) {
throw new common_1.HttpException('No route found between the specified locations', common_1.HttpStatus.NOT_FOUND);
}
throw new common_1.HttpException('Route calculation service unavailable', common_1.HttpStatus.SERVICE_UNAVAILABLE);
}
}
buildValhallaRequest(dto) {
const locations = [
{ lat: dto.originLat, lon: dto.originLng },
{ lat: dto.destinationLat, lon: dto.destinationLng },
];
const costingOptions = this.getCostingOptions(dto);
return {
locations,
costing: dto.costing,
costing_options: costingOptions,
directions_options: {
units: 'kilometers',
language: 'en-US',
narrative: true,
alternates: dto.alternatives || 1,
},
format: 'json',
shape_match: 'edge_walk',
encoded_polyline: true,
};
}
getCostingOptions(dto) {
const options = {};
if (dto.costing === 'auto') {
options.auto = {
maneuver_penalty: 5,
gate_cost: 30,
gate_penalty: 300,
private_access_penalty: 450,
toll_booth_cost: 15,
toll_booth_penalty: 0,
ferry_cost: 300,
use_ferry: dto.avoidTolls ? 0 : 1,
use_highways: dto.avoidHighways ? 0 : 1,
use_tolls: dto.avoidTolls ? 0 : 1,
};
}
else if (dto.costing === 'bicycle') {
options.bicycle = {
maneuver_penalty: 5,
gate_penalty: 300,
use_roads: 0.5,
use_hills: 0.5,
use_ferry: 1,
avoid_bad_surfaces: 0.25,
};
}
else if (dto.costing === 'pedestrian') {
options.pedestrian = {
walking_speed: 5.1,
walkway_factor: 1,
sidewalk_factor: 1,
alley_factor: 2,
driveway_factor: 5,
step_penalty: 0,
use_ferry: 1,
use_living_streets: 0.6,
};
}
return options;
}
parseValhallaResponse(data) {
const trip = data.trip;
if (!trip || !trip.legs || trip.legs.length === 0) {
return [];
}
const route = {
summary: {
distance: Math.round(trip.summary.length * 100) / 100,
time: Math.round(trip.summary.time / 60 * 100) / 100,
cost: this.estimateFuelCost(trip.summary.length, 'auto'),
},
geometry: this.decodePolyline(trip.shape),
steps: this.parseManeuvers(trip.legs[0].maneuvers),
confidence: 0.95,
};
return [route];
}
parseManeuvers(maneuvers) {
return maneuvers.map(maneuver => ({
instruction: maneuver.instruction,
distance: Math.round(maneuver.length * 1000),
time: maneuver.time,
type: maneuver.type?.toString() || 'unknown',
geometry: [],
}));
}
decodePolyline(encoded) {
const points = [];
let index = 0;
let lat = 0;
let lng = 0;
while (index < encoded.length) {
let result = 1;
let shift = 0;
let b;
do {
b = encoded.charCodeAt(index++) - 63 - 1;
result += b << shift;
shift += 5;
} while (b >= 0x1f);
lat += (result & 1) !== 0 ? ~(result >> 1) : (result >> 1);
result = 1;
shift = 0;
do {
b = encoded.charCodeAt(index++) - 63 - 1;
result += b << shift;
shift += 5;
} while (b >= 0x1f);
lng += (result & 1) !== 0 ? ~(result >> 1) : (result >> 1);
points.push({
lat: lat / 1e5,
lng: lng / 1e5,
});
}
return points;
}
estimateFuelCost(distanceKm, costing) {
if (costing !== 'auto')
return 0;
const fuelEfficiency = 10;
const fuelPricePerLiter = 1.5;
return Math.round((distanceKm / fuelEfficiency) * fuelPricePerLiter * 100) / 100;
}
generateRequestId() {
return `route_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
}
async getServiceStatus() {
try {
const response = await this.valhallaClient.get('/status');
return {
status: 'healthy',
version: response.data?.version,
};
}
catch (error) {
this.logger.error('Valhalla service health check failed', error);
return {
status: 'unhealthy',
};
}
}
};
exports.RoutingService = RoutingService;
exports.RoutingService = RoutingService = RoutingService_1 = __decorate([
(0, common_1.Injectable)(),
__metadata("design:paramtypes", [config_1.ConfigService])
], RoutingService);
//# sourceMappingURL=routing.service.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,12 @@
import { ParkingHistory } from '../../parking/entities/parking-history.entity';
export declare class User {
id: string;
email: string;
name: string;
password: string;
preferences: Record<string, any>;
isActive: boolean;
createdAt: Date;
parkingHistory: ParkingHistory[];
toJSON(): Omit<this, "password" | "toJSON">;
}

View File

@@ -0,0 +1,65 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.User = void 0;
const typeorm_1 = require("typeorm");
const swagger_1 = require("@nestjs/swagger");
const parking_history_entity_1 = require("../../parking/entities/parking-history.entity");
let User = class User {
toJSON() {
const { password, ...result } = this;
return result;
}
};
exports.User = User;
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Unique identifier for the user' }),
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
__metadata("design:type", String)
], User.prototype, "id", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'User email address' }),
(0, typeorm_1.Column)({ type: 'varchar', length: 255, unique: true, nullable: true }),
__metadata("design:type", String)
], User.prototype, "email", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'User full name' }),
(0, typeorm_1.Column)({ type: 'varchar', length: 255, nullable: true }),
__metadata("design:type", String)
], User.prototype, "name", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Hashed password' }),
(0, typeorm_1.Column)({ type: 'varchar', length: 255, nullable: true }),
__metadata("design:type", String)
], User.prototype, "password", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'User preferences and settings' }),
(0, typeorm_1.Column)({ type: 'jsonb', default: '{}' }),
__metadata("design:type", Object)
], User.prototype, "preferences", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'Whether the user account is active' }),
(0, typeorm_1.Column)({ type: 'boolean', default: true }),
__metadata("design:type", Boolean)
], User.prototype, "isActive", void 0);
__decorate([
(0, swagger_1.ApiProperty)({ description: 'User creation timestamp' }),
(0, typeorm_1.CreateDateColumn)(),
__metadata("design:type", Date)
], User.prototype, "createdAt", void 0);
__decorate([
(0, typeorm_1.OneToMany)(() => parking_history_entity_1.ParkingHistory, (history) => history.user),
__metadata("design:type", Array)
], User.prototype, "parkingHistory", void 0);
exports.User = User = __decorate([
(0, typeorm_1.Entity)('users')
], User);
//# sourceMappingURL=user.entity.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"user.entity.js","sourceRoot":"","sources":["../../../../src/modules/users/entities/user.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAMiB;AACjB,6CAA8C;AAC9C,0FAA+E;AAGxE,IAAM,IAAI,GAAV,MAAM,IAAI;IAkCf,MAAM;QACJ,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;QACrC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAA;AAtCY,oBAAI;AAGf;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;IAC9D,IAAA,gCAAsB,EAAC,MAAM,CAAC;;gCACpB;AAIX;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;IAClD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mCACzD;AAId;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAC9C,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kCAC5C;AAIb;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;IAC/C,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sCACxC;AAIjB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;IAC7D,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;yCACR;AAIjC;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC;IAClE,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;sCACzB;AAIlB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;IACvD,IAAA,0BAAgB,GAAE;8BACR,IAAI;uCAAC;AAIhB;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,uCAAc,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;;4CAC1B;eA/BtB,IAAI;IADhB,IAAA,gBAAM,EAAC,OAAO,CAAC;GACH,IAAI,CAsChB"}

View File

@@ -0,0 +1,7 @@
import { UsersService } from './users.service';
import { User } from './entities/user.entity';
export declare class UsersController {
private readonly usersService;
constructor(usersService: UsersService);
findAll(): Promise<User[]>;
}

View File

@@ -0,0 +1,39 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UsersController = void 0;
const common_1 = require("@nestjs/common");
const swagger_1 = require("@nestjs/swagger");
const users_service_1 = require("./users.service");
const user_entity_1 = require("./entities/user.entity");
let UsersController = class UsersController {
constructor(usersService) {
this.usersService = usersService;
}
async findAll() {
return this.usersService.findAll();
}
};
exports.UsersController = UsersController;
__decorate([
(0, common_1.Get)(),
(0, swagger_1.ApiOperation)({ summary: 'Get all users' }),
(0, swagger_1.ApiResponse)({ status: 200, description: 'Successfully retrieved users', type: user_entity_1.User, isArray: true }),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], UsersController.prototype, "findAll", null);
exports.UsersController = UsersController = __decorate([
(0, swagger_1.ApiTags)('Users'),
(0, common_1.Controller)('users'),
__metadata("design:paramtypes", [users_service_1.UsersService])
], UsersController);
//# sourceMappingURL=users.controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"users.controller.js","sourceRoot":"","sources":["../../../src/modules/users/users.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAiD;AACjD,6CAAqE;AACrE,mDAA+C;AAC/C,wDAA8C;AAIvC,IAAM,eAAe,GAArB,MAAM,eAAe;IAC1B,YAA6B,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAKrD,AAAN,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;CACF,CAAA;AATY,0CAAe;AAMpB;IAHL,IAAA,YAAG,GAAE;IACL,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAC1C,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,8BAA8B,EAAE,IAAI,EAAE,kBAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;;;8CAGpG;0BARU,eAAe;IAF3B,IAAA,iBAAO,EAAC,OAAO,CAAC;IAChB,IAAA,mBAAU,EAAC,OAAO,CAAC;qCAEyB,4BAAY;GAD5C,eAAe,CAS3B"}

View File

@@ -0,0 +1,2 @@
export declare class UsersModule {
}

View File

@@ -0,0 +1,26 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UsersModule = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const users_controller_1 = require("./users.controller");
const users_service_1 = require("./users.service");
const user_entity_1 = require("./entities/user.entity");
let UsersModule = class UsersModule {
};
exports.UsersModule = UsersModule;
exports.UsersModule = UsersModule = __decorate([
(0, common_1.Module)({
imports: [typeorm_1.TypeOrmModule.forFeature([user_entity_1.User])],
controllers: [users_controller_1.UsersController],
providers: [users_service_1.UsersService],
exports: [users_service_1.UsersService],
})
], UsersModule);
//# sourceMappingURL=users.module.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"users.module.js","sourceRoot":"","sources":["../../../src/modules/users/users.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6CAAgD;AAChD,yDAAqD;AACrD,mDAA+C;AAC/C,wDAA8C;AAQvC,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,kCAAW;sBAAX,WAAW;IANvB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,uBAAa,CAAC,UAAU,CAAC,CAAC,kBAAI,CAAC,CAAC,CAAC;QAC3C,WAAW,EAAE,CAAC,kCAAe,CAAC;QAC9B,SAAS,EAAE,CAAC,4BAAY,CAAC;QACzB,OAAO,EAAE,CAAC,4BAAY,CAAC;KACxB,CAAC;GACW,WAAW,CAAG"}

View File

@@ -0,0 +1,12 @@
import { Repository } from 'typeorm';
import { User } from './entities/user.entity';
export declare class UsersService {
private readonly userRepository;
constructor(userRepository: Repository<User>);
findAll(): Promise<User[]>;
findById(id: string): Promise<User | null>;
findByEmail(email: string): Promise<User | null>;
create(userData: Partial<User>): Promise<User>;
update(id: string, userData: Partial<User>): Promise<User>;
delete(id: string): Promise<void>;
}

View File

@@ -0,0 +1,51 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UsersService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const user_entity_1 = require("./entities/user.entity");
let UsersService = class UsersService {
constructor(userRepository) {
this.userRepository = userRepository;
}
async findAll() {
return this.userRepository.find();
}
async findById(id) {
return this.userRepository.findOne({ where: { id } });
}
async findByEmail(email) {
return this.userRepository.findOne({ where: { email } });
}
async create(userData) {
const user = this.userRepository.create(userData);
return this.userRepository.save(user);
}
async update(id, userData) {
await this.userRepository.update(id, userData);
return this.findById(id);
}
async delete(id) {
await this.userRepository.delete(id);
}
};
exports.UsersService = UsersService;
exports.UsersService = UsersService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(user_entity_1.User)),
__metadata("design:paramtypes", [typeorm_2.Repository])
], UsersService);
//# sourceMappingURL=users.service.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"users.service.js","sourceRoot":"","sources":["../../../src/modules/users/users.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAqC;AACrC,wDAA8C;AAGvC,IAAM,YAAY,GAAlB,MAAM,YAAY;IACvB,YAEmB,cAAgC;QAAhC,mBAAc,GAAd,cAAc,CAAkB;IAChD,CAAC;IAEJ,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAuB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,QAAuB;QAC9C,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;CACF,CAAA;AA/BY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,kBAAI,CAAC,CAAA;qCACU,oBAAU;GAHlC,YAAY,CA+BxB"}

1
backend/dist/tsconfig.tsbuildinfo vendored Normal file

File diff suppressed because one or more lines are too long