feat: Initialize BizMatch application with core UI components, routing, listing pages, backend services, migration scripts, and vulnerability management.
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user