58 lines
3.5 KiB
TypeScript
58 lines
3.5 KiB
TypeScript
import { HttpClient } from '@angular/common/http';
|
|
import { Injectable } from '@angular/core';
|
|
import { Observable, lastValueFrom } from 'rxjs';
|
|
import { BusinessListing, CommercialPropertyListing } from '../../../../bizmatch-server/src/models/db.model';
|
|
import { ListingType, ResponseBusinessListingArray, ResponseCommercialPropertyListingArray } from '../../../../bizmatch-server/src/models/main.model';
|
|
import { environment } from '../../environments/environment';
|
|
import { getCriteriaByListingCategory, getSortByListingCategory } from '../utils/utils';
|
|
|
|
@Injectable({
|
|
providedIn: 'root',
|
|
})
|
|
export class ListingsService {
|
|
private apiBaseUrl = environment.apiBaseUrl;
|
|
constructor(private http: HttpClient) {}
|
|
|
|
async getListings(listingsCategory: 'business' | 'professionals_brokers' | 'commercialProperty'): Promise<ResponseBusinessListingArray | ResponseCommercialPropertyListingArray> {
|
|
const criteria = getCriteriaByListingCategory(listingsCategory);
|
|
const sortBy = getSortByListingCategory(listingsCategory);
|
|
const body = { ...criteria, sortBy }; // Merge sortBy in Body
|
|
const result = await lastValueFrom(this.http.post<ResponseBusinessListingArray | ResponseCommercialPropertyListingArray>(`${this.apiBaseUrl}/bizmatch/listings/${listingsCategory}/find`, body));
|
|
return result;
|
|
}
|
|
|
|
getNumberOfListings(listingsCategory: 'business' | 'commercialProperty', crit?: any): Observable<number> {
|
|
const criteria = crit ? crit : getCriteriaByListingCategory(listingsCategory);
|
|
const sortBy = getSortByListingCategory(listingsCategory);
|
|
const body = { ...criteria, sortBy }; // Merge, falls relevant (wenn Backend sortBy für Count braucht; sonst ignorieren)
|
|
return this.http.post<number>(`${this.apiBaseUrl}/bizmatch/listings/${listingsCategory}/findTotal`, body);
|
|
}
|
|
|
|
getListingById(id: string, listingsCategory?: 'business' | 'commercialProperty'): Observable<ListingType> {
|
|
const result = this.http.get<ListingType>(`${this.apiBaseUrl}/bizmatch/listings/${listingsCategory}/${id}`);
|
|
return result;
|
|
}
|
|
getListingsByEmail(email: string, listingsCategory: 'business' | 'commercialProperty'): Promise<ListingType[]> {
|
|
return lastValueFrom(this.http.get<BusinessListing[]>(`${this.apiBaseUrl}/bizmatch/listings/${listingsCategory}/user/${email}`));
|
|
}
|
|
getFavoriteListings(listingsCategory: 'business' | 'commercialProperty'): Promise<ListingType[]> {
|
|
return lastValueFrom(this.http.get<BusinessListing[] | CommercialPropertyListing[]>(`${this.apiBaseUrl}/bizmatch/listings/${listingsCategory}/favorites/all`));
|
|
}
|
|
async save(listing: any, listingsCategory: 'business' | 'professionals_brokers' | 'commercialProperty') {
|
|
if (listing.id) {
|
|
return await lastValueFrom(this.http.put<ListingType>(`${this.apiBaseUrl}/bizmatch/listings/${listingsCategory}`, listing));
|
|
} else {
|
|
return await lastValueFrom(this.http.post<ListingType>(`${this.apiBaseUrl}/bizmatch/listings/${listingsCategory}`, listing));
|
|
}
|
|
}
|
|
async deleteBusinessListing(id: string) {
|
|
await lastValueFrom(this.http.delete<ListingType>(`${this.apiBaseUrl}/bizmatch/listings/business/listing/${id}`));
|
|
}
|
|
async deleteCommercialPropertyListing(id: string, imagePath: string) {
|
|
await lastValueFrom(this.http.delete<ListingType>(`${this.apiBaseUrl}/bizmatch/listings/commercialProperty/listing/${id}/${imagePath}`));
|
|
}
|
|
async removeFavorite(id: string, listingsCategory?: 'business' | 'commercialProperty') {
|
|
await lastValueFrom(this.http.delete<ListingType>(`${this.apiBaseUrl}/bizmatch/listings/${listingsCategory}/favorite/${id}`));
|
|
}
|
|
}
|