feat: Initialize BizMatch application with core UI components, routing, listing pages, backend services, migration scripts, and vulnerability management.

This commit is contained in:
Timo
2026-01-03 23:05:38 +01:00
parent e32e43d17f
commit e3e726d8ca
42 changed files with 1478 additions and 1579 deletions

View File

@@ -133,9 +133,18 @@ export class SeoService {
'description': listing.description,
'image': listing.images || [],
'url': `${this.baseUrl}/business/${urlSlug}`,
'offers': {
'brand': {
'@type': 'Brand',
'name': listing.businessName
},
'category': listing.category || 'Business'
};
// Only include offers if askingPrice is available
if (listing.askingPrice && listing.askingPrice > 0) {
schema['offers'] = {
'@type': 'Offer',
'price': listing.askingPrice,
'price': listing.askingPrice.toString(),
'priceCurrency': 'USD',
'availability': 'https://schema.org/InStock',
'url': `${this.baseUrl}/business/${urlSlug}`,
@@ -145,13 +154,25 @@ export class SeoService {
'name': this.siteName,
'url': this.baseUrl
}
},
'brand': {
'@type': 'Brand',
'name': listing.businessName
},
'category': listing.category || 'Business'
};
};
} else {
// For listings without a price, use PriceSpecification with "Contact for price"
schema['offers'] = {
'@type': 'Offer',
'priceCurrency': 'USD',
'availability': 'https://schema.org/InStock',
'url': `${this.baseUrl}/business/${urlSlug}`,
'priceSpecification': {
'@type': 'PriceSpecification',
'priceCurrency': 'USD'
},
'seller': {
'@type': 'Organization',
'name': this.siteName,
'url': this.baseUrl
}
};
}
// Add aggregateRating with placeholder data
schema['aggregateRating'] = {
@@ -271,7 +292,7 @@ export class SeoService {
* Generate RealEstateListing schema for commercial property
*/
generateRealEstateListingSchema(property: any): object {
const schema = {
const schema: any = {
'@context': 'https://schema.org',
'@type': 'RealEstateListing',
'name': property.propertyName || `${property.propertyType} in ${property.city}`,
@@ -290,19 +311,36 @@ export class SeoService {
'@type': 'GeoCoordinates',
'latitude': property.latitude,
'longitude': property.longitude
} : undefined,
'offers': {
} : undefined
};
// Only include offers with price if askingPrice is available
if (property.askingPrice && property.askingPrice > 0) {
schema['offers'] = {
'@type': 'Offer',
'price': property.askingPrice,
'price': property.askingPrice.toString(),
'priceCurrency': 'USD',
'availability': 'https://schema.org/InStock',
'url': `${this.baseUrl}/details-commercial-property/${property.id}`,
'priceSpecification': {
'@type': 'PriceSpecification',
'price': property.askingPrice,
'price': property.askingPrice.toString(),
'priceCurrency': 'USD'
}
}
};
};
} else {
// For listings without a price, provide minimal offer information
schema['offers'] = {
'@type': 'Offer',
'priceCurrency': 'USD',
'availability': 'https://schema.org/InStock',
'url': `${this.baseUrl}/details-commercial-property/${property.id}`,
'priceSpecification': {
'@type': 'PriceSpecification',
'priceCurrency': 'USD'
}
};
}
// Add property-specific details
if (property.squareFootage) {