2024-08-13 12:20:24 +02:00
parent ec0576e7b8
commit 1f8febc479
10 changed files with 105 additions and 60 deletions

View File

@@ -21,7 +21,7 @@ export class BusinessListingService {
private geoService?: GeoService,
) {}
private getWhereConditions(criteria: BusinessListingCriteria): SQL[] {
private getWhereConditions(criteria: BusinessListingCriteria, user: JwtUser): SQL[] {
const whereConditions: SQL[] = [];
if (criteria.city && criteria.searchType === 'exact') {
@@ -98,6 +98,9 @@ export class BusinessListingService {
if (criteria.brokerName) {
whereConditions.push(or(ilike(schema.users.firstname, `%${criteria.brokerName}%`), ilike(schema.users.lastname, `%${criteria.brokerName}%`)));
}
if (!user?.roles?.includes('ADMIN') ?? false) {
whereConditions.push(or(eq(businesses.email, user?.username), ne(businesses.draft, true)));
}
whereConditions.push(and(eq(schema.users.customerType, 'professional'), eq(schema.users.customerSubType, 'broker')));
return whereConditions;
}
@@ -113,7 +116,7 @@ export class BusinessListingService {
.from(businesses)
.leftJoin(schema.users, eq(businesses.email, schema.users.email));
const whereConditions = this.getWhereConditions(criteria);
const whereConditions = this.getWhereConditions(criteria, user);
if (whereConditions.length > 0) {
const whereClause = and(...whereConditions);
@@ -124,7 +127,7 @@ export class BusinessListingService {
query.limit(length).offset(start);
const data = await query;
const totalCount = await this.getBusinessListingsCount(criteria);
const totalCount = await this.getBusinessListingsCount(criteria, user);
const results = data.map(r => r.business).map(r => convertDrizzleBusinessToBusiness(r));
return {
results,
@@ -132,10 +135,10 @@ export class BusinessListingService {
};
}
async getBusinessListingsCount(criteria: BusinessListingCriteria): Promise<number> {
async getBusinessListingsCount(criteria: BusinessListingCriteria, user: JwtUser): Promise<number> {
const countQuery = this.conn.select({ value: count() }).from(businesses).leftJoin(schema.users, eq(businesses.email, schema.users.email));
const whereConditions = this.getWhereConditions(criteria);
const whereConditions = this.getWhereConditions(criteria, user);
if (whereConditions.length > 0) {
const whereClause = and(...whereConditions);
@@ -147,12 +150,20 @@ export class BusinessListingService {
}
async findBusinessesById(id: string, user: JwtUser): Promise<BusinessListing> {
const conditions = [];
if (!user?.roles?.includes('ADMIN') ?? false) {
conditions.push(or(eq(businesses.email, user?.username), ne(businesses.draft, true)));
}
conditions.push(sql`${businesses.id} = ${id}`);
let result = await this.conn
.select()
.from(businesses)
.where(and(sql`${businesses.id} = ${id}`));
result = result.filter(r => !r.draft || r.imageName === emailToDirName(user?.username) || user?.roles.includes('ADMIN'));
return convertDrizzleBusinessToBusiness(result[0]) as BusinessListing;
.where(and(...conditions));
if (result.length > 0) {
return convertDrizzleBusinessToBusiness(result[0]) as BusinessListing;
} else {
throw new BadRequestException(`No entry available for ${id}`);
}
}
async findBusinessesByEmail(email: string, user: JwtUser): Promise<BusinessListing[]> {

View File

@@ -30,15 +30,11 @@ export class BusinessListingsController {
find(@Request() req, @Body() criteria: BusinessListingCriteria): any {
return this.listingsService.searchBusinessListings(criteria, req.user as JwtUser);
}
@UseGuards(OptionalJwtAuthGuard)
@Post('findTotal')
findTotal(@Body() criteria: BusinessListingCriteria): Promise<number> {
return this.listingsService.getBusinessListingsCount(criteria);
findTotal(@Request() req, @Body() criteria: BusinessListingCriteria): Promise<number> {
return this.listingsService.getBusinessListingsCount(criteria, req.user as JwtUser);
}
// @UseGuards(OptionalJwtAuthGuard)
// @Post('search')
// search(@Request() req, @Body() criteria: BusinessListingCriteria): any {
// return this.listingsService.searchBusinessListings(criteria.prompt);
// }
@Post()
create(@Body() listing: any) {

View File

@@ -31,9 +31,10 @@ export class CommercialPropertyListingsController {
async find(@Request() req, @Body() criteria: CommercialPropertyListingCriteria): Promise<any> {
return await this.listingsService.searchCommercialProperties(criteria, req.user as JwtUser);
}
@UseGuards(OptionalJwtAuthGuard)
@Post('findTotal')
findTotal(@Body() criteria: CommercialPropertyListingCriteria): Promise<number> {
return this.listingsService.getCommercialPropertiesCount(criteria);
findTotal(@Request() req, @Body() criteria: CommercialPropertyListingCriteria): Promise<number> {
return this.listingsService.getCommercialPropertiesCount(criteria, req.user as JwtUser);
}
@Get('states/all')
getStates(): any {

View File

@@ -20,7 +20,7 @@ export class CommercialPropertyService {
private fileService?: FileService,
private geoService?: GeoService,
) {}
private getWhereConditions(criteria: CommercialPropertyListingCriteria): SQL[] {
private getWhereConditions(criteria: CommercialPropertyListingCriteria, user: JwtUser): SQL[] {
const whereConditions: SQL[] = [];
if (criteria.city && criteria.searchType === 'exact') {
@@ -49,6 +49,9 @@ export class CommercialPropertyService {
if (criteria.title) {
whereConditions.push(or(ilike(schema.commercials.title, `%${criteria.title}%`), ilike(schema.commercials.description, `%${criteria.title}%`)));
}
if (!user?.roles?.includes('ADMIN') ?? false) {
whereConditions.push(or(eq(commercials.email, user?.username), ne(commercials.draft, true)));
}
whereConditions.push(and(eq(schema.users.customerType, 'professional')));
return whereConditions;
}
@@ -57,7 +60,7 @@ export class CommercialPropertyService {
const start = criteria.start ? criteria.start : 0;
const length = criteria.length ? criteria.length : 12;
const query = this.conn.select({ commercial: commercials }).from(commercials).leftJoin(schema.users, eq(commercials.email, schema.users.email));
const whereConditions = this.getWhereConditions(criteria);
const whereConditions = this.getWhereConditions(criteria, user);
if (whereConditions.length > 0) {
const whereClause = and(...whereConditions);
@@ -69,16 +72,16 @@ export class CommercialPropertyService {
const data = await query;
const results = data.map(r => r.commercial).map(r => convertDrizzleCommercialToCommercial(r));
const totalCount = await this.getCommercialPropertiesCount(criteria);
const totalCount = await this.getCommercialPropertiesCount(criteria, user);
return {
results,
totalCount,
};
}
async getCommercialPropertiesCount(criteria: CommercialPropertyListingCriteria): Promise<number> {
async getCommercialPropertiesCount(criteria: CommercialPropertyListingCriteria, user: JwtUser): Promise<number> {
const countQuery = this.conn.select({ value: count() }).from(schema.commercials).leftJoin(schema.users, eq(commercials.email, schema.users.email));
const whereConditions = this.getWhereConditions(criteria);
const whereConditions = this.getWhereConditions(criteria, user);
if (whereConditions.length > 0) {
const whereClause = and(...whereConditions);
@@ -91,12 +94,20 @@ export class CommercialPropertyService {
// #### Find by ID ########################################
async findCommercialPropertiesById(id: string, user: JwtUser): Promise<CommercialPropertyListing> {
const conditions = [];
if (!user?.roles?.includes('ADMIN') ?? false) {
conditions.push(or(eq(commercials.email, user?.username), ne(commercials.draft, true)));
}
conditions.push(sql`${commercials.id} = ${id}`);
let result = await this.conn
.select()
.from(commercials)
.where(and(sql`${commercials.id} = ${id}`));
result = result.filter(r => !r.draft || r.imagePath === emailToDirName(user?.username) || user?.roles.includes('ADMIN'));
return convertDrizzleCommercialToCommercial(result[0]) as CommercialPropertyListing;
.where(and(...conditions));
if (result.length > 0) {
return convertDrizzleCommercialToCommercial(result[0]) as CommercialPropertyListing;
} else {
throw new BadRequestException(`No entry available for ${id}`);
}
}
// #### Find by User EMail ########################################