This commit is contained in:
2024-09-10 21:30:03 +02:00
parent 17213ba4b0
commit 83307684ee
25 changed files with 799 additions and 477 deletions

View File

@@ -10,7 +10,7 @@ import { FileService } from '../file/file.service';
import { GeoService } from '../geo/geo.service';
import { CommercialPropertyListing, CommercialPropertyListingSchema } from '../models/db.model';
import { CommercialPropertyListingCriteria, JwtUser } from '../models/main.model';
import { convertCommercialToDrizzleCommercial, convertDrizzleBusinessToBusiness, convertDrizzleCommercialToCommercial, getDistanceQuery } from '../utils';
import { getDistanceQuery } from '../utils';
@Injectable()
export class CommercialPropertyService {
@@ -24,7 +24,7 @@ export class CommercialPropertyService {
const whereConditions: SQL[] = [];
if (criteria.city && criteria.searchType === 'exact') {
whereConditions.push(ilike(schema.commercials.city, `%${criteria.city.name}%`));
whereConditions.push(sql`${commercials.location}->>'name' ilike ${criteria.city.name}`);
}
if (criteria.city && criteria.radius && criteria.searchType === 'radius' && criteria.radius) {
const cityGeo = this.geoService.getCityWithCoords(criteria.state, criteria.city.name);
@@ -35,7 +35,7 @@ export class CommercialPropertyService {
}
if (criteria.state) {
whereConditions.push(eq(schema.commercials.state, criteria.state));
whereConditions.push(sql`${schema.commercials.location}->>'state' = ${criteria.city.state}`);
}
if (criteria.minPrice) {
@@ -89,7 +89,7 @@ export class CommercialPropertyService {
query.limit(length).offset(start);
const data = await query;
const results = data.map(r => r.commercial).map(r => convertDrizzleCommercialToCommercial(r));
const results = data.map(r => r.commercial);
const totalCount = await this.getCommercialPropertiesCount(criteria, user);
return {
@@ -122,7 +122,7 @@ export class CommercialPropertyService {
.from(commercials)
.where(and(...conditions));
if (result.length > 0) {
return convertDrizzleCommercialToCommercial(result[0]) as CommercialPropertyListing;
return result[0] as CommercialPropertyListing;
} else {
throw new BadRequestException(`No entry available for ${id}`);
}
@@ -139,7 +139,7 @@ export class CommercialPropertyService {
.select()
.from(commercials)
.where(and(...conditions))) as CommercialPropertyListing[];
return listings.map(l => convertDrizzleCommercialToCommercial(l)) as CommercialPropertyListing[];
return listings as CommercialPropertyListing[];
}
// #### Find Favorites ########################################
async findFavoriteListings(user: JwtUser): Promise<CommercialPropertyListing[]> {
@@ -147,7 +147,7 @@ export class CommercialPropertyService {
.select()
.from(commercials)
.where(arrayContains(commercials.favoritesForUser, [user.username]));
return userFavorites.map(l => convertDrizzleBusinessToBusiness(l));
return userFavorites;
}
// #### Find by imagePath ########################################
async findByImagePath(imagePath: string, serial: string): Promise<CommercialPropertyListing> {
@@ -155,7 +155,7 @@ export class CommercialPropertyService {
.select()
.from(commercials)
.where(and(sql`${commercials.imagePath} = ${imagePath}`, sql`${commercials.serialId} = ${serial}`));
return convertDrizzleCommercialToCommercial(result[0]) as CommercialPropertyListing;
return result[0] as CommercialPropertyListing;
}
// #### CREATE ########################################
async createListing(data: CommercialPropertyListing): Promise<CommercialPropertyListing> {
@@ -163,10 +163,10 @@ export class CommercialPropertyService {
data.created = data.created ? (typeof data.created === 'string' ? new Date(data.created) : data.created) : new Date();
data.updated = new Date();
CommercialPropertyListingSchema.parse(data);
const convertedCommercialPropertyListing = convertCommercialToDrizzleCommercial(data);
const convertedCommercialPropertyListing = data;
delete convertedCommercialPropertyListing.id;
const [createdListing] = await this.conn.insert(commercials).values(convertedCommercialPropertyListing).returning();
return convertDrizzleCommercialToCommercial(createdListing);
return createdListing;
} catch (error) {
if (error instanceof ZodError) {
const filteredErrors = error.errors
@@ -192,9 +192,9 @@ export class CommercialPropertyService {
this.logger.warn(`changes between image directory and imageOrder in listing ${data.serialId}: ${difference.join(',')}`);
data.imageOrder = imageOrder;
}
const convertedCommercialPropertyListing = convertCommercialToDrizzleCommercial(data);
const convertedCommercialPropertyListing = data;
const [updateListing] = await this.conn.update(commercials).set(convertedCommercialPropertyListing).where(eq(commercials.id, id)).returning();
return convertDrizzleCommercialToCommercial(updateListing);
return updateListing;
} catch (error) {
if (error instanceof ZodError) {
const filteredErrors = error.errors
@@ -240,11 +240,11 @@ export class CommercialPropertyService {
// ##############################################################
// States
// ##############################################################
async getStates(): Promise<any[]> {
return await this.conn
.select({ state: commercials.state, count: sql<number>`count(${commercials.id})`.mapWith(Number) })
.from(commercials)
.groupBy(sql`${commercials.state}`)
.orderBy(sql`count desc`);
}
// async getStates(): Promise<any[]> {
// return await this.conn
// .select({ state: commercials.state, count: sql<number>`count(${commercials.id})`.mapWith(Number) })
// .from(commercials)
// .groupBy(sql`${commercials.state}`)
// .orderBy(sql`count desc`);
// }
}