Einbau klassische Filter als Overlay ...

This commit is contained in:
2024-07-16 17:09:59 +02:00
parent af982d19d8
commit bdafb03165
32 changed files with 1274 additions and 239 deletions

View File

@@ -3,7 +3,7 @@ import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
import { Logger } from 'winston';
import { businesses } from '../drizzle/schema.js';
import { OptionalJwtAuthGuard } from '../jwt-auth/optional-jwt-auth.guard.js';
import { JwtUser, ListingCriteria } from '../models/main.model.js';
import { BusinessListingCriteria, JwtUser } from '../models/main.model.js';
import { ListingsService } from './listings.service.js';
@Controller('listings/business')
@@ -27,13 +27,13 @@ export class BusinessListingsController {
@UseGuards(OptionalJwtAuthGuard)
@Post('find')
find(@Request() req, @Body() criteria: ListingCriteria): any {
find(@Request() req, @Body() criteria: BusinessListingCriteria): any {
return this.listingsService.findBusinessListings(criteria, req.user as JwtUser);
}
@UseGuards(OptionalJwtAuthGuard)
@Post('search')
search(@Request() req, @Body() criteria: ListingCriteria): any {
search(@Request() req, @Body() criteria: BusinessListingCriteria): any {
return this.listingsService.searchBusinessListings(criteria.prompt);
}

View File

@@ -5,7 +5,7 @@ import { commercials } from '../drizzle/schema.js';
import { FileService } from '../file/file.service.js';
import { OptionalJwtAuthGuard } from '../jwt-auth/optional-jwt-auth.guard.js';
import { CommercialPropertyListing } from '../models/db.model';
import { JwtUser, ListingCriteria } from '../models/main.model.js';
import { CommercialPropertyListingCriteria, JwtUser } from '../models/main.model.js';
import { ListingsService } from './listings.service.js';
@Controller('listings/commercialProperty')
@@ -29,7 +29,7 @@ export class CommercialPropertyListingsController {
}
@UseGuards(OptionalJwtAuthGuard)
@Post('find')
async find(@Request() req, @Body() criteria: ListingCriteria): Promise<any> {
async find(@Request() req, @Body() criteria: CommercialPropertyListingCriteria): Promise<any> {
return await this.listingsService.findCommercialPropertyListings(criteria, req.user as JwtUser);
}
@Get('states/all')

View File

@@ -1,14 +1,14 @@
import { Inject, Injectable } from '@nestjs/common';
import { and, eq, gte, ilike, lte, ne, or, sql } from 'drizzle-orm';
import { and, eq, gte, ilike, inArray, lte, ne, or, sql } from 'drizzle-orm';
import { NodePgDatabase } from 'drizzle-orm/node-postgres';
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
import OpenAI from 'openai';
import { Logger } from 'winston';
import * as schema from '../drizzle/schema.js';
import { PG_CONNECTION, businesses, commercials } from '../drizzle/schema.js';
import { businesses, commercials, PG_CONNECTION } from '../drizzle/schema.js';
import { FileService } from '../file/file.service.js';
import { BusinessListing, CommercialPropertyListing } from '../models/db.model';
import { JwtUser, ListingCriteria, emailToDirName } from '../models/main.model.js';
import { BusinessListingCriteria, CommercialPropertyListingCriteria, emailToDirName, JwtUser } from '../models/main.model.js';
@Injectable()
export class ListingsService {
@@ -22,10 +22,10 @@ export class ListingsService {
apiKey: process.env.OPENAI_API_KEY, // Stellen Sie sicher, dass Sie Ihren API-Key als Umgebungsvariable setzen
});
}
private getConditions(criteria: ListingCriteria, table: typeof businesses | typeof commercials, user: JwtUser): any[] {
private getConditions(criteria: BusinessListingCriteria | CommercialPropertyListingCriteria, table: typeof businesses | typeof commercials, user: JwtUser): any[] {
const conditions = [];
if (criteria.type) {
conditions.push(eq(table.type, criteria.type));
if (criteria.types?.length > 0) {
conditions.push(inArray(table.type, criteria.types));
}
if (criteria.state) {
conditions.push(eq(table.state, criteria.state));
@@ -36,9 +36,6 @@ export class ListingsService {
if (criteria.maxPrice) {
conditions.push(lte(table.price, criteria.maxPrice));
}
if (criteria.realEstateChecked) {
conditions.push(eq(businesses.realEstateIncluded, true));
}
if (criteria.title) {
conditions.push(ilike(table.title, `%${criteria.title}%`));
}
@@ -61,7 +58,7 @@ export class ListingsService {
return results as BusinessListing[];
}
// #### Find by criteria ########################################
async findCommercialPropertyListings(criteria: ListingCriteria, user: JwtUser): Promise<any> {
async findCommercialPropertyListings(criteria: CommercialPropertyListingCriteria, user: JwtUser): Promise<any> {
const start = criteria.start ? criteria.start : 0;
const length = criteria.length ? criteria.length : 12;
const conditions = this.getConditions(criteria, commercials, user);
@@ -83,7 +80,7 @@ export class ListingsService {
]);
return { total, data };
}
async findBusinessListings(criteria: ListingCriteria, user: JwtUser): Promise<any> {
async findBusinessListings(criteria: BusinessListingCriteria, user: JwtUser): Promise<any> {
const start = criteria.start ? criteria.start : 0;
const length = criteria.length ? criteria.length : 12;
const conditions = this.getConditions(criteria, businesses, user);