diff --git a/bizmatch-server/data/broker.json b/bizmatch-server/data/broker.json index ec3cace..86238c3 100644 --- a/bizmatch-server/data/broker.json +++ b/bizmatch-server/data/broker.json @@ -6,7 +6,7 @@ "email": "robert.jackson@texasbizbrokers.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "654321" } ], @@ -37,7 +37,7 @@ "email": "amanda.taylor@lonestarbizbrokers.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "987654" } ], @@ -57,7 +57,7 @@ "Caldwell County, TX" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "7i8j9k0l-1m2n-3o4p-5q6r-7s8t9u0v1w2x", @@ -66,7 +66,7 @@ "email": "william@biztexas.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "210987" } ], @@ -86,7 +86,7 @@ "Medina County, TX" ], "offeredServices": "

Services Offered

", - "gender":"male" + "gender": "male" }, { "id": "3y4z5a6b-7c8d-9e0f-1g2h-3i4j5k6l7m8n", @@ -95,7 +95,7 @@ "email": "elizabeth.martinez@texasbusinesssales.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "543210" } ], @@ -115,7 +115,7 @@ "Galveston County, TX" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "9o0p1q2r-3s4t-5u6v-7w8x-9y0z1a2b3c4d", @@ -124,7 +124,7 @@ "email": "daniel@bizbrokersdfw.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "876543" } ], @@ -144,7 +144,7 @@ "Johnson County, TX" ], "offeredServices": "

Services Offered

", - "gender":"male" + "gender": "male" }, { "id": "5e6f7g8h-9i0j-1k2l-3m4n-5o6p7q8r9s0t", @@ -153,7 +153,7 @@ "email": "olivia@businessbrokerstx.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "109876" } ], @@ -173,7 +173,7 @@ "Rusk County, TX" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "1u2v3w4x-5y6z-7a8b-9c0d-1e2f3g4h5i6j", @@ -182,7 +182,7 @@ "email": "matthew.lee@texasbizadvisors.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "432109" } ], @@ -202,7 +202,7 @@ "Lynn County, TX" ], "offeredServices": "

Services Offered

", - "gender":"male" + "gender": "male" }, { "id": "7k8l9m0n-1o2p-3q4r-5s6t-7u8v9w0x1y2z", @@ -211,7 +211,7 @@ "email": "sophia.wright@texasbizconnection.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "765432" } ], @@ -231,7 +231,7 @@ "Zapata County, TX" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "3a4b5c6d-7e8f-9g0h-1i2j-3k4l5m6n7o8p", @@ -240,7 +240,7 @@ "email": "ethan@elpasobizbrokers.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "098765" } ], @@ -260,7 +260,7 @@ "Presidio County, TX" ], "offeredServices": "

Services Offered

", - "gender":"male" + "gender": "male" }, { "id": "9q0r1s2t-3u4v-5w6x-7y8z-9a0b1c2d3e4f", @@ -269,7 +269,7 @@ "email": "ava@texomabizsales.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "432109" } ], @@ -289,7 +289,7 @@ "Marshall County, OK" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "8a2b1c5d-7e6f-4g3h-9i1j-2k3l4m5n6o7p", @@ -298,11 +298,11 @@ "email": "sarah.thompson@businessbrokers.com", "licensedIn": [ { - "name": "California", + "name": "CA", "value": "123456" }, { - "name": "Nevada", + "name": "NV", "value": "789012" } ], @@ -322,7 +322,7 @@ "Washoe County, NV" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "4q5r6s7t-8u9v-0w1x-2y3z-4a5b6c7d8e9f", @@ -331,7 +331,7 @@ "email": "michael@bizbrokers.net", "licensedIn": [ { - "name": "Florida", + "name": "FL", "value": "654321" } ], @@ -351,7 +351,7 @@ "Volusia County, FL" ], "offeredServices": "

Services Offered

", - "gender":"male" + "gender": "male" }, { "id": "1g2h3i4j-5k6l-7m8n-9o0p-1q2r3s4t5u6v", @@ -360,11 +360,11 @@ "email": "emily.davis@bizsaleexperts.com", "licensedIn": [ { - "name": "New York", + "name": "NY", "value": "987654" }, { - "name": "New Jersey", + "name": "NJ", "value": "210987" } ], @@ -386,7 +386,7 @@ "Essex County, NJ" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "7w8x9y0z-1a2b-3c4d-5e6f-7g8h9i0j1k2l", @@ -395,7 +395,7 @@ "email": "david.wilson@bizacquisitions.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "543210" } ], @@ -415,7 +415,7 @@ "Travis County, TX" ], "offeredServices": "

Services Offered

", - "gender":"male" + "gender": "male" }, { "id": "3m4n5o6p-7q8r-9s0t-1u2v-3w4x5y6z7a8b", @@ -424,11 +424,11 @@ "email": "jessica@bizbrokerexperts.com", "licensedIn": [ { - "name": "Illinois", + "name": "IL", "value": "876543" }, { - "name": "Wisconsin", + "name": "WI", "value": "109876" } ], @@ -448,7 +448,7 @@ "Dane County, WI" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "5g6h7i8j-9k0l-1m2n-3o4p-5q6r7s8t9u0v", @@ -457,11 +457,11 @@ "email": "liam.patel@sunbeltbizbrokers.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "765432" }, { - "name": "Louisiana", + "name": "LA", "value": "987654" } ], @@ -481,7 +481,7 @@ "Dallas County, TX" ], "offeredServices": "

Services Offered

", - "gender":"male" + "gender": "male" }, { "id": "1w2x3y4z-5a6b-7c8d-9e0f-1g2h3i4j5k6l", @@ -490,7 +490,7 @@ "email": "emma@newmexicobusinessbrokers.com", "licensedIn": [ { - "name": "New Mexico", + "name": "NM", "value": "543210" } ], @@ -510,7 +510,7 @@ "San Juan County, NM" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "7m8n9o0p-1q2r-3s4t-5u6v-7w8x9y0z1a2b", @@ -519,7 +519,7 @@ "email": "noah@oklahomabizsales.com", "licensedIn": [ { - "name": "Oklahoma", + "name": "OK", "value": "876543" } ], @@ -539,7 +539,7 @@ "Pottawatomie County, OK" ], "offeredServices": "

Services Offered

", - "gender":"male" + "gender": "male" }, { "id": "3c4d5e6f-7g8h-9i0j-1k2l-3m4n5o6p7q8r", @@ -548,7 +548,7 @@ "email": "isabella.garcia@arkansasbizconnect.com", "licensedIn": [ { - "name": "Arkansas", + "name": "AR", "value": "210987" } ], @@ -568,7 +568,7 @@ "Washington County, AR" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "9s0t1u2v-3w4x-5y6z-7a8b-9c0d1e2f3g4h", @@ -577,7 +577,7 @@ "email": "mason@msbizbrokers.com", "licensedIn": [ { - "name": "Mississippi", + "name": "MS", "value": "543210" } ], @@ -597,7 +597,7 @@ "Harrison County, MS" ], "offeredServices": "

Services Offered

", - "gender":"male" + "gender": "male" }, { "id": "5i6j7k8l-9m0n-1o2p-3q4r-5s6t7u8v9w0x", @@ -606,7 +606,7 @@ "email": "evelyn.davis@azbizsales.com", "licensedIn": [ { - "name": "Arizona", + "name": "AZ", "value": "876543" } ], @@ -626,7 +626,7 @@ "Mohave County, AZ" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "1y2z3a4b-5c6d-7e8f-9g0h-1i2j3k4l5m6n", @@ -635,7 +635,7 @@ "email": "harper@bamabizsales.com", "licensedIn": [ { - "name": "Alabama", + "name": "AL", "value": "210987" } ], @@ -655,7 +655,7 @@ "Mobile County, AL" ], "offeredServices": "

Services Offered

", - "gender":"male" + "gender": "male" }, { "id": "7o8p9q0r-1s2t-3u4v-5w6x-7y8z9a0b1c2d", @@ -664,7 +664,7 @@ "email": "abigail.martinez@georgiabizconnect.com", "licensedIn": [ { - "name": "Georgia", + "name": "GA", "value": "543210" } ], @@ -684,7 +684,7 @@ "Chatham County, GA" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "3e4f5g6h-7i8j-9k0l-1m2n-3o4p5q6r7s8t", @@ -693,7 +693,7 @@ "email": "benjamin.robinson@gulfcoastbizbrokers.com", "licensedIn": [ { - "name": "Louisiana", + "name": "LA", "value": "876543" }, { @@ -717,7 +717,7 @@ "Jefferson Parish, LA" ], "offeredServices": "

Services Offered

", - "gender":"male" + "gender": "male" }, { "id": "9u0v1w2x-3y4z-5a6b-7c8d-9e0f1g2h3i4j", @@ -726,7 +726,7 @@ "email": "charlotte@oklabizsales.com", "licensedIn": [ { - "name": "Oklahoma", + "name": "OK", "value": "543210" } ], @@ -746,7 +746,7 @@ "Osage County, OK" ], "offeredServices": "

Services Offered

", - "gender":"female" + "gender": "female" }, { "id": "5k6l7m8n-9o0p-1q2r-3s4t-5u6v7w8x9y0z", @@ -755,7 +755,7 @@ "email": "elijah.nguyen@lonestarbizsales.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "109876" } ], @@ -775,7 +775,7 @@ "Galveston County, TX" ], "offeredServices": "", - "gender":"male" + "gender": "male" }, { "id": "1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p", @@ -784,7 +784,7 @@ "email": "avery.brown@nmbizsales.com", "licensedIn": [ { - "name": "New Mexico", + "name": "NM", "value": "432109" } ], @@ -804,7 +804,7 @@ "Grant County, NM" ], "offeredServices": "

What We Offer

", - "gender":"female" + "gender": "female" }, { "id": "7q8r9s0t-1u2v-3w4x-5y6z-7a8b9c0d1e2f", @@ -813,7 +813,7 @@ "email": "scarlett@arkanbizsales.com", "licensedIn": [ { - "name": "Arkansas", + "name": "AR", "value": "765432" } ], @@ -833,7 +833,7 @@ "Boone County, AR" ], "offeredServices": "", - "gender":"female" + "gender": "female" }, { "id": "3g4h5i6j-7k8l-9m0n-1o2p-3q4r5s6t7u8v", @@ -842,7 +842,7 @@ "email": "levi.kim@magnoliabizconnect.com", "licensedIn": [ { - "name": "Mississippi", + "name": "MS", "value": "098765" } ], @@ -862,7 +862,7 @@ "Tate County, MS" ], "offeredServices": "

Our Services Include

", - "gender":"male" + "gender": "male" }, { "id": "9w0x1y2z-3a4b-5c6d-7e8f-9g0h1i2j3k4l", @@ -871,7 +871,7 @@ "email": "mila.singh@pelicanstatebiz.com", "licensedIn": [ { - "name": "Louisiana", + "name": "LA", "value": "432109" } ], @@ -891,7 +891,7 @@ "St. Landry Parish, LA" ], "offeredServices": "", - "gender":"female" + "gender": "female" }, { "id": "5m6n7o8p-9q0r-1s2t-3u4v-5w6x7y8z9a0b", @@ -900,7 +900,7 @@ "email": "ezra.garcia@grandcanyonbiz.com", "licensedIn": [ { - "name": "Arizona", + "name": "AZ", "value": "765432" } ], @@ -920,7 +920,7 @@ "Mohave County, AZ" ], "offeredServices": "

Services We Provide

", - "gender":"male" + "gender": "male" }, { "id": "1c2d3e4f-5g6h-7i8j-9k0l-1m2n3o4p5q6r", @@ -929,7 +929,7 @@ "email": "nora@alabamabizconnect.com", "licensedIn": [ { - "name": "Alabama", + "name": "AL", "value": "098765" } ], @@ -949,7 +949,7 @@ "Clarke County, AL" ], "offeredServices": "", - "gender":"female" + "gender": "female" }, { "id": "7s8t9u0v-1w2x-3y4z-5a6b-7c8d9e0f1g2h", @@ -958,7 +958,7 @@ "email": "lucas.patel@peachtreebiz.com", "licensedIn": [ { - "name": "Georgia", + "name": "GA", "value": "432109" } ], @@ -978,7 +978,7 @@ "Bryan County, GA" ], "offeredServices": "

What We Offer

", - "gender":"male" + "gender": "male" }, { "id": "3i4j5k6l-7m8n-9o0p-1q2r-3s4t5u6v7w8x", @@ -987,7 +987,7 @@ "email": "penelope@soonestatebiz.com", "licensedIn": [ { - "name": "Oklahoma", + "name": "OK", "value": "765432" } ], @@ -1007,7 +1007,7 @@ "Pottawatomie County, OK" ], "offeredServices": "", - "gender":"female" + "gender": "female" }, { "id": "9y0z1a2b-3c4d-5e6f-7g8h-9i0j1k2l3m4n", @@ -1016,7 +1016,7 @@ "email": "asher.chavez@desertbizgroup.com", "licensedIn": [ { - "name": "New Mexico", + "name": "NM", "value": "098765" } ], @@ -1036,7 +1036,7 @@ "Sandoval County, NM" ], "offeredServices": "

Services We Provide

", - "gender":"male" + "gender": "male" }, { "id": "5s6t7u8v-9w0x-1y2z-3a4b-5c6d7e8f9g0h", @@ -1045,11 +1045,11 @@ "email": "daniel.hernandez@nationalbizsolutions.com", "licensedIn": [ { - "name": "California", + "name": "CA", "value": "135790" }, { - "name": "Nevada", + "name": "NV", "value": "086429" } ], @@ -1069,7 +1069,7 @@ "Washoe County, NV" ], "offeredServices": "

Our Services

", - "gender":"male" + "gender": "male" }, { "id": "1i2j3k4l-5m6n-7o8p-9q0r-1s2t3u4v5w6x", @@ -1078,11 +1078,11 @@ "email": "olivia.patel@bizusasolutions.com", "licensedIn": [ { - "name": "Texas", + "name": "TX", "value": "753951" }, { - "name": "Louisiana", + "name": "LA", "value": "159753" } ], @@ -1102,7 +1102,7 @@ "Jefferson Parish, LA" ], "offeredServices": "", - "gender":"female" + "gender": "female" }, { "id": "7y8z9a0b-1c2d-3e4f-5g6h-7i8j9k0l1m2n", @@ -1111,11 +1111,11 @@ "email": "liam.garcia@usabizadvisors.com", "licensedIn": [ { - "name": "Florida", + "name": "FL", "value": "369147" }, { - "name": "Georgia", + "name": "GA", "value": "258147" } ], @@ -1135,7 +1135,7 @@ "Gwinnett County, GA" ], "offeredServices": "

What We Offer

", - "gender":"male" + "gender": "male" }, { "id": "3o4p5q6r-7s8t-9u0v-1w2x-3y4z5a6b7c8d", @@ -1144,11 +1144,11 @@ "email": "sophia.lee@americanbizsolutions.com", "licensedIn": [ { - "name": "New York", + "name": "NY", "value": "246810" }, { - "name": "New Jersey", + "name": "NJ", "value": "135790" } ], @@ -1168,7 +1168,7 @@ "Bergen County, NJ" ], "offeredServices": "", - "gender":"female" + "gender": "female" }, { "id": "9e0f1g2h-3i4j-5k6l-7m8n-9o0p1q2r3s4t", @@ -1177,7 +1177,7 @@ "email": "ava.kim@bizamericaadvisors.com", "licensedIn": [ { - "name": "Illinois", + "name": "IL", "value": "753951" }, { @@ -1201,7 +1201,7 @@ "Dane County, WI" ], "offeredServices": "

Services We Provide

", - "gender":"female" + "gender": "female" }, { "id": "5u6v7w8x-9y0z-1a2b-3c4d-5e6f7g8h9i0j", @@ -1210,11 +1210,11 @@ "email": "noah.nguyen@nationwidebizadvisors.com", "licensedIn": [ { - "name": "Washington", + "name": "WA", "value": "357159" }, { - "name": "Oregon", + "name": "OR", "value": "086429" } ], @@ -1234,7 +1234,7 @@ "Washington County, OR" ], "offeredServices": "

Our Services

", - "gender":"male" + "gender": "male" }, { "id": "1k2l3m4n-5o6p-7q8r-9s0t-1u2v3w4x5y6z", @@ -1243,11 +1243,11 @@ "email": "emma.patel@americanbusinessadvisors.com", "licensedIn": [ { - "name": "Arizona", + "name": "AZ", "value": "246810" }, { - "name": "New Mexico", + "name": "NM", "value": "135790" } ], @@ -1267,7 +1267,7 @@ "Santa Fe County, NM" ], "offeredServices": "", - "gender":"female" + "gender": "female" }, { "id": "7a8b9c0d-1e2f-3g4h-5i6j-7k8l9m0n1o2p", @@ -1276,11 +1276,11 @@ "email": "william.johnson@bizusagroup.com", "licensedIn": [ { - "name": "Colorado", + "name": "CO", "value": "753951" }, { - "name": "Utah", + "name": "UT", "value": "159753" } ], @@ -1300,7 +1300,7 @@ "Utah County, UT" ], "offeredServices": "

What We Offer

", - "gender":"male" + "gender": "male" }, { "id": "3q4r5s6t-7u8v-9w0x-1y2z-3a4b5c6d7e8f", @@ -1309,11 +1309,11 @@ "email": "isabella.kim@nationalbusinesssolutions.com", "licensedIn": [ { - "name": "Michigan", + "name": "MI", "value": "369147" }, { - "name": "Ohio", + "name": "OH", "value": "258147" } ], @@ -1333,7 +1333,7 @@ "Franklin County, OH" ], "offeredServices": "", - "gender":"female" + "gender": "female" }, { "id": "9g0h1i2j-3k4l-5m6n-7o8p-9q0r1s2t3u4v", @@ -1342,11 +1342,11 @@ "email": "mia.hernandez@usabusinessgroup.com", "licensedIn": [ { - "name": "North Carolina", + "name": "NC", "value": "753951" }, { - "name": "South Carolina", + "name": "SC", "value": "159753" } ], @@ -1366,6 +1366,6 @@ "Charleston County, SC" ], "offeredServices": "

Services We Provide

", - "gender":"female" + "gender": "female" } ] \ No newline at end of file diff --git a/bizmatch-server/src/drizzle/migrations/0003_tough_hobgoblin.sql b/bizmatch-server/src/drizzle/migrations/0003_tough_hobgoblin.sql new file mode 100644 index 0000000..952bbdd --- /dev/null +++ b/bizmatch-server/src/drizzle/migrations/0003_tough_hobgoblin.sql @@ -0,0 +1 @@ +ALTER TABLE "commercials" ADD COLUMN "listingsCategory" varchar(255); \ No newline at end of file diff --git a/bizmatch-server/src/drizzle/migrations/meta/0003_snapshot.json b/bizmatch-server/src/drizzle/migrations/meta/0003_snapshot.json new file mode 100644 index 0000000..939c657 --- /dev/null +++ b/bizmatch-server/src/drizzle/migrations/meta/0003_snapshot.json @@ -0,0 +1,480 @@ +{ + "id": "da786c6a-fd5f-4629-bd5e-3ecd42ab1f2c", + "prevId": "ad48c6eb-2d04-442f-9242-b6765553c7c4", + "version": "5", + "dialect": "pg", + "tables": { + "businesses": { + "name": "businesses", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "userId": { + "name": "userId", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "city": { + "name": "city", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "state": { + "name": "state", + "type": "char(2)", + "primaryKey": false, + "notNull": false + }, + "price": { + "name": "price", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "favoritesForUser": { + "name": "favoritesForUser", + "type": "varchar(30)[]", + "primaryKey": false, + "notNull": false + }, + "draft": { + "name": "draft", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "listingsCategory": { + "name": "listingsCategory", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "realEstateIncluded": { + "name": "realEstateIncluded", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "leasedLocation": { + "name": "leasedLocation", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "franchiseResale": { + "name": "franchiseResale", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "salesRevenue": { + "name": "salesRevenue", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "cashFlow": { + "name": "cashFlow", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "supportAndTraining": { + "name": "supportAndTraining", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "employees": { + "name": "employees", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "established": { + "name": "established", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "internalListingNumber": { + "name": "internalListingNumber", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "reasonForSale": { + "name": "reasonForSale", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "brokerLicencing": { + "name": "brokerLicencing", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "internals": { + "name": "internals", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated": { + "name": "updated", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "visits": { + "name": "visits", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "lastVisit": { + "name": "lastVisit", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "businesses_userId_users_id_fk": { + "name": "businesses_userId_users_id_fk", + "tableFrom": "businesses", + "tableTo": "users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "commercials": { + "name": "commercials", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "userId": { + "name": "userId", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "city": { + "name": "city", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "state": { + "name": "state", + "type": "char(2)", + "primaryKey": false, + "notNull": false + }, + "price": { + "name": "price", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "favoritesForUser": { + "name": "favoritesForUser", + "type": "varchar(30)[]", + "primaryKey": false, + "notNull": false + }, + "listingsCategory": { + "name": "listingsCategory", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hideImage": { + "name": "hideImage", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "draft": { + "name": "draft", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "zipCode": { + "name": "zipCode", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "county": { + "name": "county", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "website": { + "name": "website", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "phoneNumber": { + "name": "phoneNumber", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "imageOrder": { + "name": "imageOrder", + "type": "varchar(200)[]", + "primaryKey": false, + "notNull": false + }, + "imagePath": { + "name": "imagePath", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated": { + "name": "updated", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "visits": { + "name": "visits", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "lastVisit": { + "name": "lastVisit", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "commercials_userId_users_id_fk": { + "name": "commercials_userId_users_id_fk", + "tableFrom": "commercials", + "tableTo": "users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "firstname": { + "name": "firstname", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "lastname": { + "name": "lastname", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "phoneNumber": { + "name": "phoneNumber", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "companyName": { + "name": "companyName", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "companyOverview": { + "name": "companyOverview", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "companyWebsite": { + "name": "companyWebsite", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "companyLocation": { + "name": "companyLocation", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "offeredServices": { + "name": "offeredServices", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "areasServed": { + "name": "areasServed", + "type": "varchar(100)[]", + "primaryKey": false, + "notNull": false + }, + "hasProfile": { + "name": "hasProfile", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "hasCompanyLogo": { + "name": "hasCompanyLogo", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "licensedIn": { + "name": "licensedIn", + "type": "varchar(50)[]", + "primaryKey": false, + "notNull": false + }, + "gender": { + "name": "gender", + "type": "gender", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "gender": { + "name": "gender", + "values": { + "male": "male", + "female": "female" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/bizmatch-server/src/drizzle/migrations/meta/_journal.json b/bizmatch-server/src/drizzle/migrations/meta/_journal.json index 633985c..9153cf7 100644 --- a/bizmatch-server/src/drizzle/migrations/meta/_journal.json +++ b/bizmatch-server/src/drizzle/migrations/meta/_journal.json @@ -22,6 +22,13 @@ "when": 1714982539265, "tag": "0002_black_zaladane", "breakpoints": true + }, + { + "idx": 3, + "version": "5", + "when": 1715254754561, + "tag": "0003_tough_hobgoblin", + "breakpoints": true } ] } \ No newline at end of file diff --git a/bizmatch-server/src/drizzle/schema.ts b/bizmatch-server/src/drizzle/schema.ts index 9397274..560453e 100644 --- a/bizmatch-server/src/drizzle/schema.ts +++ b/bizmatch-server/src/drizzle/schema.ts @@ -1,79 +1,78 @@ -import { integer, serial, text, pgTable, timestamp, jsonb, varchar, char, numeric, boolean, uuid, real, doublePrecision, pgEnum } from 'drizzle-orm/pg-core'; -import { InferInsertModel, InferModel, InferModelFromColumns, InferSelectModel, relations, sql } from 'drizzle-orm'; +import { boolean, char, doublePrecision, integer, pgEnum, pgTable, text, timestamp, uuid, varchar } from 'drizzle-orm/pg-core'; export const PG_CONNECTION = 'PG_CONNECTION'; -export const genderEnum = pgEnum('gender', ['male','female']); +export const genderEnum = pgEnum('gender', ['male', 'female']); export const users = pgTable('users', { - id: uuid('id').primaryKey().defaultRandom(), - firstname: varchar('firstname', { length: 255 }).notNull(), - lastname: varchar('lastname', { length: 255 }).notNull(), - email: varchar('email', { length: 255 }).notNull(), - phoneNumber: varchar('phoneNumber', { length: 255 }), - description: text('description'), - companyName: varchar('companyName', { length: 255 }), - companyOverview: text('companyOverview'), - companyWebsite: varchar('companyWebsite', { length: 255 }), - companyLocation: varchar('companyLocation', { length: 255 }), - offeredServices: text('offeredServices'), - areasServed: varchar('areasServed', { length: 100 }).array(), - hasProfile: boolean('hasProfile'), - hasCompanyLogo: boolean('hasCompanyLogo'), - licensedIn:varchar('licensedIn', { length: 50 }).array(), - gender: genderEnum('gender'), - }); - + id: uuid('id').primaryKey().defaultRandom(), + firstname: varchar('firstname', { length: 255 }).notNull(), + lastname: varchar('lastname', { length: 255 }).notNull(), + email: varchar('email', { length: 255 }).notNull(), + phoneNumber: varchar('phoneNumber', { length: 255 }), + description: text('description'), + companyName: varchar('companyName', { length: 255 }), + companyOverview: text('companyOverview'), + companyWebsite: varchar('companyWebsite', { length: 255 }), + companyLocation: varchar('companyLocation', { length: 255 }), + offeredServices: text('offeredServices'), + areasServed: varchar('areasServed', { length: 100 }).array(), + hasProfile: boolean('hasProfile'), + hasCompanyLogo: boolean('hasCompanyLogo'), + licensedIn: varchar('licensedIn', { length: 50 }).array(), + gender: genderEnum('gender'), +}); + export const businesses = pgTable('businesses', { - id: uuid('id').primaryKey().defaultRandom(), - userId: uuid('userId').references(()=>users.id), - type: integer('type'), - title: varchar('title', { length: 255 }), - description: text('description'), - city: varchar('city', { length: 255 }), - state: char('state', { length: 2 }), - price: doublePrecision('price'), - favoritesForUser: varchar('favoritesForUser',{length:30}).array(), - draft: boolean('draft'), - listingsCategory: varchar('listingsCategory', { length: 255 }), - realEstateIncluded: boolean('realEstateIncluded'), - leasedLocation: boolean('leasedLocation'), - franchiseResale: boolean('franchiseResale'), - salesRevenue: doublePrecision('salesRevenue'), - cashFlow: doublePrecision('cashFlow'), - supportAndTraining: text('supportAndTraining'), - employees: integer('employees'), - established: integer('established'), - internalListingNumber: integer('internalListingNumber'), - reasonForSale: varchar('reasonForSale', { length: 255 }), - brokerLicencing: varchar('brokerLicencing', { length: 255 }), - internals: text('internals'), - created: timestamp('created'), - updated: timestamp('updated'), - visits: integer('visits'), - lastVisit: timestamp('lastVisit'), + id: uuid('id').primaryKey().defaultRandom(), + userId: uuid('userId').references(() => users.id), + type: integer('type'), + title: varchar('title', { length: 255 }), + description: text('description'), + city: varchar('city', { length: 255 }), + state: char('state', { length: 2 }), + price: doublePrecision('price'), + favoritesForUser: varchar('favoritesForUser', { length: 30 }).array(), + draft: boolean('draft'), + listingsCategory: varchar('listingsCategory', { length: 255 }), + realEstateIncluded: boolean('realEstateIncluded'), + leasedLocation: boolean('leasedLocation'), + franchiseResale: boolean('franchiseResale'), + salesRevenue: doublePrecision('salesRevenue'), + cashFlow: doublePrecision('cashFlow'), + supportAndTraining: text('supportAndTraining'), + employees: integer('employees'), + established: integer('established'), + internalListingNumber: integer('internalListingNumber'), + reasonForSale: varchar('reasonForSale', { length: 255 }), + brokerLicencing: varchar('brokerLicencing', { length: 255 }), + internals: text('internals'), + created: timestamp('created'), + updated: timestamp('updated'), + visits: integer('visits'), + lastVisit: timestamp('lastVisit'), }); export const commercials = pgTable('commercials', { - id: uuid('id').primaryKey().defaultRandom(), - userId: uuid('userId').references(()=>users.id), - type: integer('type'), - title: varchar('title', { length: 255 }), - description: text('description'), - city: varchar('city', { length: 255 }), - state: char('state', { length: 2 }), - price: doublePrecision('price'), - favoritesForUser: varchar('favoritesForUser',{length:30}).array(), - hideImage: boolean('hideImage'), - draft: boolean('draft'), - zipCode:integer('zipCode'), - county:varchar('county', { length: 255 }), - email: varchar('email', { length: 255 }), - website: varchar('website', { length: 255 }), - phoneNumber: varchar('phoneNumber', { length: 255 }), - imageOrder:varchar('imageOrder',{length:200}).array(), - imagePath:varchar('imagePath',{length:50}), - created: timestamp('created'), - updated: timestamp('updated'), - visits: integer('visits'), - lastVisit: timestamp('lastVisit'), + id: uuid('id').primaryKey().defaultRandom(), + userId: uuid('userId').references(() => users.id), + type: integer('type'), + title: varchar('title', { length: 255 }), + description: text('description'), + city: varchar('city', { length: 255 }), + state: char('state', { length: 2 }), + price: doublePrecision('price'), + favoritesForUser: varchar('favoritesForUser', { length: 30 }).array(), + listingsCategory: varchar('listingsCategory', { length: 255 }), + hideImage: boolean('hideImage'), + draft: boolean('draft'), + zipCode: integer('zipCode'), + county: varchar('county', { length: 255 }), + email: varchar('email', { length: 255 }), + website: varchar('website', { length: 255 }), + phoneNumber: varchar('phoneNumber', { length: 255 }), + imageOrder: varchar('imageOrder', { length: 200 }).array(), + imagePath: varchar('imagePath', { length: 50 }), + created: timestamp('created'), + updated: timestamp('updated'), + visits: integer('visits'), + lastVisit: timestamp('lastVisit'), }); - diff --git a/bizmatch-server/src/listings/commercial-property-listings.controller.ts b/bizmatch-server/src/listings/commercial-property-listings.controller.ts index f170c1f..a1d4256 100644 --- a/bizmatch-server/src/listings/commercial-property-listings.controller.ts +++ b/bizmatch-server/src/listings/commercial-property-listings.controller.ts @@ -1,48 +1,52 @@ -import { Body, Controller, Delete, Get, Inject, Param, Post, Put, UploadedFile, UseInterceptors } from '@nestjs/common'; -import { ListingsService } from './listings.service.js'; +import { Body, Controller, Delete, Get, Inject, Param, Post, Put } from '@nestjs/common'; import { WINSTON_MODULE_PROVIDER } from 'nest-winston'; import { Logger } from 'winston'; -import { FileInterceptor } from '@nestjs/platform-express'; +import { commercials } from '../drizzle/schema.js'; import { FileService } from '../file/file.service.js'; -import { ImageProperty, ListingCriteria } from '../models/main.model.js'; -import { commercials} from '../drizzle/schema.js'; +import { ListingCriteria } from '../models/main.model.js'; +import { ListingsService } from './listings.service.js'; @Controller('listings/commercialProperty') export class CommercialPropertyListingsController { - - constructor(private readonly listingsService:ListingsService,private fileService:FileService,@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger) { - } - - @Get(':id') - findById(@Param('id') id:string): any { - return this.listingsService.findById(id,commercials); - } - // @Get('user/:userid') - // findByUserId(@Param('userid') userid:string): any { - // return this.listingsService.findByUserId(userid,commercials); - // } - @Post('search') - async find(@Body() criteria: ListingCriteria): Promise { - return await this.listingsService.findListingsByCriteria(criteria,commercials); - } - - @Post() - async create(@Body() listing: any){ - this.logger.info(`Save Listing`); - return await this.listingsService.createListing(listing,commercials) - } - @Put() - async update(@Body() listing: any){ - this.logger.info(`Save Listing`); - return await this.listingsService.updateListing(listing.id,listing,commercials) - } - @Delete(':id') - deleteById(@Param('id') id:string){ - this.listingsService.deleteListing(id,commercials) - } + constructor( + private readonly listingsService: ListingsService, + private fileService: FileService, + @Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger, + ) {} - @Put('imageOrder/:id') - async changeImageOrder(@Param('id') id:string,@Body() imageOrder: string[]) { - this.listingsService.updateImageOrder(id, imageOrder) - } + @Get(':id') + findById(@Param('id') id: string): any { + return this.listingsService.findById(id, commercials); + } + @Get('user/:userid') + findByUserId(@Param('userid') userid: string): any { + return this.listingsService.findByUserId(userid, commercials); + } + @Post('search') + async find(@Body() criteria: ListingCriteria): Promise { + return await this.listingsService.findListingsByCriteria(criteria, commercials); + } + @Get('states/all') + getStates(): any { + return this.listingsService.getStates(commercials); + } + @Post() + async create(@Body() listing: any) { + this.logger.info(`Save Listing`); + return await this.listingsService.createListing(listing, commercials); + } + @Put() + async update(@Body() listing: any) { + this.logger.info(`Save Listing`); + return await this.listingsService.updateListing(listing.id, listing, commercials); + } + @Delete(':id') + deleteById(@Param('id') id: string) { + this.listingsService.deleteListing(id, commercials); + } + + @Put('imageOrder/:id') + async changeImageOrder(@Param('id') id: string, @Body() imageOrder: string[]) { + this.listingsService.updateImageOrder(id, imageOrder); + } } diff --git a/bizmatch-server/src/models/db.model.ts b/bizmatch-server/src/models/db.model.ts index 13b94b9..84e1e37 100644 --- a/bizmatch-server/src/models/db.model.ts +++ b/bizmatch-server/src/models/db.model.ts @@ -27,7 +27,6 @@ export interface BusinessListing { price?: number; favoritesForUser?: string[]; draft?: boolean; - listingsCategory?: string; realEstateIncluded?: boolean; leasedLocation?: boolean; franchiseResale?: boolean; @@ -44,6 +43,7 @@ export interface BusinessListing { updated?: Date; visits?: number; lastVisit?: Date; + listingsCategory?: string; } export interface CommercialPropertyListing { @@ -69,4 +69,5 @@ export interface CommercialPropertyListing { updated?: Date; visits?: number; lastVisit?: Date; + listingsCategory?: string; } diff --git a/bizmatch/src/app/pages/details/details-business-listing/details-business-listing.component.html b/bizmatch/src/app/pages/details/details-business-listing/details-business-listing.component.html index 707ccaa..22a1ba7 100644 --- a/bizmatch/src/app/pages/details/details-business-listing/details-business-listing.component.html +++ b/bizmatch/src/app/pages/details/details-business-listing/details-business-listing.component.html @@ -51,7 +51,7 @@ @if(listing && user && (user.id===listing?.userId || isAdmin())){ - + }
diff --git a/bizmatch/src/app/pages/details/details-business-listing/details-business-listing.component.ts b/bizmatch/src/app/pages/details/details-business-listing/details-business-listing.component.ts index 9ee3b87..cf760dc 100644 --- a/bizmatch/src/app/pages/details/details-business-listing/details-business-listing.component.ts +++ b/bizmatch/src/app/pages/details/details-business-listing/details-business-listing.component.ts @@ -61,9 +61,9 @@ export class DetailsBusinessListingComponent { private sanitizer: DomSanitizer, private location: Location, ) { + this.mailinfo = { sender: {}, userId: '', email: '' }; this.userService.getUserObservable().subscribe(user => { this.user = user; - this.mailinfo = { sender: {}, userId: '', email: user.email }; }); this.criteria = onChange(getCriteriaStateObject(), getSessionStorageHandler); } @@ -79,6 +79,7 @@ export class DetailsBusinessListingComponent { return this.userService.hasAdminRole(); } async mail() { + this.mailinfo.email = this.user.email; this.mailinfo.userId = this.listing.userId; this.mailinfo.listing = this.listing; await this.mailService.mail(this.mailinfo); diff --git a/bizmatch/src/app/pages/details/details-commercial-property-listing/details-commercial-property-listing.component.html b/bizmatch/src/app/pages/details/details-commercial-property-listing/details-commercial-property-listing.component.html index 0265946..74c4574 100644 --- a/bizmatch/src/app/pages/details/details-commercial-property-listing/details-commercial-property-listing.component.html +++ b/bizmatch/src/app/pages/details/details-commercial-property-listing/details-commercial-property-listing.component.html @@ -51,9 +51,10 @@ --> @if(listing && user && (user.id===listing?.userId || isAdmin())){ - + }
+ @if (mailinfo){
Contact The Author of This Listing
@@ -85,6 +86,7 @@
+ } } diff --git a/bizmatch/src/app/pages/details/details-commercial-property-listing/details-commercial-property-listing.component.ts b/bizmatch/src/app/pages/details/details-commercial-property-listing/details-commercial-property-listing.component.ts index 6ecffdf..1c4efef 100644 --- a/bizmatch/src/app/pages/details/details-commercial-property-listing/details-commercial-property-listing.component.ts +++ b/bizmatch/src/app/pages/details/details-commercial-property-listing/details-commercial-property-listing.component.ts @@ -62,9 +62,9 @@ export class DetailsCommercialPropertyListingComponent { private sanitizer: DomSanitizer, private location: Location, ) { + this.mailinfo = { sender: {}, userId: '', email: '' }; this.userService.getUserObservable().subscribe(user => { this.user = user; - this.mailinfo = { sender: {}, userId: '', email: user.email }; }); this.criteria = onChange(getCriteriaStateObject(), getSessionStorageHandler); } @@ -81,6 +81,7 @@ export class DetailsCommercialPropertyListingComponent { return this.userService.hasAdminRole(); } async mail() { + this.mailinfo.email = this.user.email; this.mailinfo.userId = this.listing.userId; this.mailinfo.listing = this.listing; await this.mailService.mail(this.mailinfo); diff --git a/bizmatch/src/app/pages/details/details-user/details-user.component.html b/bizmatch/src/app/pages/details/details-user/details-user.component.html index 6c3164e..cb673e6 100644 --- a/bizmatch/src/app/pages/details/details-user/details-user.component.html +++ b/bizmatch/src/app/pages/details/details-user/details-user.component.html @@ -92,11 +92,12 @@ } + @if(businessListings?.length>0){
  • -
    My Listings For Sale
    +
    My Business Listings For Sale
    - @for (listing of userListings; track listing) { + @for (listing of businessListings; track listing) {
    @@ -112,6 +113,30 @@
  • + } @if(commercialPropListings?.length>0){ +
  • +
    My Commercial Property Listings For Sale
    +
    +
    + @for (listing of commercialPropListings; track listing) { +
    +
    +
    + @if (listing.imageOrder?.length>0){ + + } @else { + + } + {{ selectOptions.getCommercialProperty(listing.type) }} +
    +
    {{ listing.title }}
    +
    +
    + } +
    +
    +
  • + } diff --git a/bizmatch/src/app/pages/details/details-user/details-user.component.ts b/bizmatch/src/app/pages/details/details-user/details-user.component.ts index 150afd7..2c6d242 100644 --- a/bizmatch/src/app/pages/details/details-user/details-user.component.ts +++ b/bizmatch/src/app/pages/details/details-user/details-user.component.ts @@ -5,7 +5,7 @@ import { ActivatedRoute, Router } from '@angular/router'; import { MessageService } from 'primeng/api'; import { GalleriaModule } from 'primeng/galleria'; import { Observable } from 'rxjs'; -import { BusinessListing, User } from '../../../../../../bizmatch-server/src/models/db.model'; +import { BusinessListing, CommercialPropertyListing, User } from '../../../../../../bizmatch-server/src/models/db.model'; import { KeyValue, ListingCriteria } from '../../../../../../bizmatch-server/src/models/main.model'; import { environment } from '../../../../environments/environment'; import { ImageService } from '../../../services/image.service'; @@ -28,7 +28,8 @@ export class DetailsUserComponent { user$: Observable; environment = environment; criteria: ListingCriteria; - userListings: BusinessListing[]; + businessListings: BusinessListing[]; + commercialPropListings: CommercialPropertyListing[]; companyOverview: SafeHtml; offeredServices: SafeHtml; userLicensedIn: KeyValue[]; @@ -49,7 +50,10 @@ export class DetailsUserComponent { this.userLicensedIn = this.user.licensedIn.map(l => { return { name: l.split('|')[0], value: l.split('|')[1] }; }); - this.userListings = await this.listingsService.getListingByUserId(this.id); + const results = await Promise.all([await this.listingsService.getListingByUserId(this.id, 'business'), await this.listingsService.getListingByUserId(this.id, 'commercialProperty')]); + // Zuweisen der Ergebnisse zu den Member-Variablen der Klasse + this.businessListings = results[0]; + this.commercialPropListings = results[1]; this.user$ = this.userService.getUserObservable(); this.companyOverview = this.sanitizer.bypassSecurityTrustHtml(this.user.companyOverview); this.offeredServices = this.sanitizer.bypassSecurityTrustHtml(this.user.offeredServices); diff --git a/bizmatch/src/app/pages/home/home.component.html b/bizmatch/src/app/pages/home/home.component.html index 025a69f..3bbc14a 100644 --- a/bizmatch/src/app/pages/home/home.component.html +++ b/bizmatch/src/app/pages/home/home.component.html @@ -27,25 +27,25 @@
      -
    • +
    • - +
    -
    +
    - + @if(activeTabAction === 'business'){ } @if(activeTabAction === 'commercialProperty'){ @@ -61,10 +61,8 @@ } @if(activeTabAction === 'business' || activeTabAction === 'commercialProperty'){ - } @else { -
     
    } - +
    diff --git a/bizmatch/src/app/pages/home/home.component.scss b/bizmatch/src/app/pages/home/home.component.scss index 0951e29..b73e824 100644 --- a/bizmatch/src/app/pages/home/home.component.scss +++ b/bizmatch/src/app/pages/home/home.component.scss @@ -16,3 +16,9 @@ .p-button-white { color: aliceblue; } +.mt-11 { + margin-top: 5.9rem !important; +} +.mt-22 { + margin-top: 9.7rem !important; +} diff --git a/bizmatch/src/app/pages/home/home.component.ts b/bizmatch/src/app/pages/home/home.component.ts index 80604cd..6088b74 100644 --- a/bizmatch/src/app/pages/home/home.component.ts +++ b/bizmatch/src/app/pages/home/home.component.ts @@ -11,6 +11,7 @@ import { StyleClassModule } from 'primeng/styleclass'; import { Observable } from 'rxjs'; import { User } from '../../../../../bizmatch-server/src/models/db.model'; import { ListingCriteria } from '../../../../../bizmatch-server/src/models/main.model'; +import { ListingsService } from '../../services/listings.service'; import { SelectOptionsService } from '../../services/select-options.service'; import { UserService } from '../../services/user.service'; import { getCriteriaStateObject, getSessionStorageHandler, resetCriteria } from '../../utils/utils'; @@ -22,22 +23,38 @@ import { getCriteriaStateObject, getSessionStorageHandler, resetCriteria } from styleUrl: './home.component.scss', }) export class HomeComponent { - activeTabAction = 'business'; + activeTabAction: 'business' | 'commercialProperty' | 'broker' = 'business'; type: string; maxPrice: string; minPrice: string; criteria: ListingCriteria; user$: Observable; - public constructor(private router: Router, private activatedRoute: ActivatedRoute, public selectOptions: SelectOptionsService, public userService: UserService) { + states = []; + public constructor(private router: Router, private activatedRoute: ActivatedRoute, public selectOptions: SelectOptionsService, public userService: UserService, private listingsService: ListingsService) { this.criteria = onChange(getCriteriaStateObject(), getSessionStorageHandler); resetCriteria(this.criteria); } - ngOnInit() { + async ngOnInit() { this.user$ = this.userService.getUserObservable(); + if (this.activeTabAction === 'business' || this.activeTabAction === 'commercialProperty') { + const statesResult = await this.listingsService.getAllStates(this.activeTabAction); + this.states = statesResult.map(s => s.state).map(ls => ({ name: this.selectOptions.getState(ls as string), value: ls })); + } else { + this.states = []; + } + } + async changeTab(tabname: 'business' | 'commercialProperty' | 'broker') { + this.activeTabAction = tabname; + if (this.activeTabAction === 'business' || this.activeTabAction === 'commercialProperty') { + const statesResult = await this.listingsService.getAllStates(this.activeTabAction); + this.states = statesResult.map(s => s.state).map(ls => ({ name: this.selectOptions.getState(ls as string), value: ls })); + } else { + this.states = this.selectOptions.states; + } } - search() { - this.router.navigate([`${this.activeTabAction}Listings`]); + const data = { keep: true }; + this.router.navigate([`${this.activeTabAction}Listings`], { state: { data } }); } login() { diff --git a/bizmatch/src/app/pages/listings/broker-listings/broker-listings.component.html b/bizmatch/src/app/pages/listings/broker-listings/broker-listings.component.html index 134eb09..b221d8f 100644 --- a/bizmatch/src/app/pages/listings/broker-listings/broker-listings.component.html +++ b/bizmatch/src/app/pages/listings/broker-listings/broker-listings.component.html @@ -8,7 +8,7 @@
    - +
    diff --git a/bizmatch/src/app/pages/listings/broker-listings/broker-listings.component.ts b/bizmatch/src/app/pages/listings/broker-listings/broker-listings.component.ts index 3d5d5e5..a2e3392 100644 --- a/bizmatch/src/app/pages/listings/broker-listings/broker-listings.component.ts +++ b/bizmatch/src/app/pages/listings/broker-listings/broker-listings.component.ts @@ -18,7 +18,7 @@ import { ImageService } from '../../../services/image.service'; import { ListingsService } from '../../../services/listings.service'; import { SelectOptionsService } from '../../../services/select-options.service'; import { UserService } from '../../../services/user.service'; -import { createGenericObject, getCriteriaStateObject, getSessionStorageHandler } from '../../../utils/utils'; +import { getCriteriaStateObject, getSessionStorageHandler, resetCriteria } from '../../../utils/utils'; @Component({ selector: 'app-broker-listings', @@ -54,14 +54,13 @@ export class BrokerListingsComponent { private router: Router, private cdRef: ChangeDetectorRef, private imageService: ImageService, + private route: ActivatedRoute, ) { this.criteria = onChange(getCriteriaStateObject(), getSessionStorageHandler); this.criteria.type = undefined; - this.router.getCurrentNavigation(); - this.activatedRoute.snapshot; - this.activatedRoute.params.subscribe(params => { - if (this.activatedRoute.snapshot.fragment === '') { - this.criteria = onChange(createGenericObject(), getSessionStorageHandler); + this.route.data.subscribe(async () => { + if (!this.router.getCurrentNavigation().extras.state) { + resetCriteria(this.criteria); } this.init(); }); diff --git a/bizmatch/src/app/pages/listings/business-listings/business-listings.component.html b/bizmatch/src/app/pages/listings/business-listings/business-listings.component.html index 201b398..cb2478e 100644 --- a/bizmatch/src/app/pages/listings/business-listings/business-listings.component.html +++ b/bizmatch/src/app/pages/listings/business-listings/business-listings.component.html @@ -42,7 +42,7 @@
    @for (listing of listings; track listing.id) { -
    +
    diff --git a/bizmatch/src/app/pages/listings/business-listings/business-listings.component.ts b/bizmatch/src/app/pages/listings/business-listings/business-listings.component.ts index c5a003e..8f9e8bb 100644 --- a/bizmatch/src/app/pages/listings/business-listings/business-listings.component.ts +++ b/bizmatch/src/app/pages/listings/business-listings/business-listings.component.ts @@ -18,7 +18,7 @@ import { environment } from '../../../../environments/environment'; import { ImageService } from '../../../services/image.service'; import { ListingsService } from '../../../services/listings.service'; import { SelectOptionsService } from '../../../services/select-options.service'; -import { createGenericObject, getCriteriaStateObject, getSessionStorageHandler } from '../../../utils/utils'; +import { getCriteriaStateObject, getSessionStorageHandler, resetCriteria } from '../../../utils/utils'; @Component({ selector: 'app-business-listings', @@ -65,15 +65,14 @@ export class BusinessListingsComponent { private router: Router, private cdRef: ChangeDetectorRef, private imageService: ImageService, + private route: ActivatedRoute, ) { this.criteria = onChange(getCriteriaStateObject(), getSessionStorageHandler); - this.router.getCurrentNavigation(); - this.activatedRoute.snapshot; - this.activatedRoute.params.subscribe(params => { - if (this.activatedRoute.snapshot.fragment === '') { - this.criteria = onChange(createGenericObject(), getSessionStorageHandler); + this.criteria.type = undefined; + this.route.data.subscribe(async () => { + if (!this.router.getCurrentNavigation().extras.state) { + resetCriteria(this.criteria); } - this.category = (params).type; this.init(); }); } diff --git a/bizmatch/src/app/pages/listings/commercial-property-listings/commercial-property-listings.component.ts b/bizmatch/src/app/pages/listings/commercial-property-listings/commercial-property-listings.component.ts index d3dec2c..2cf7360 100644 --- a/bizmatch/src/app/pages/listings/commercial-property-listings/commercial-property-listings.component.ts +++ b/bizmatch/src/app/pages/listings/commercial-property-listings/commercial-property-listings.component.ts @@ -17,7 +17,7 @@ import { environment } from '../../../../environments/environment'; import { ImageService } from '../../../services/image.service'; import { ListingsService } from '../../../services/listings.service'; import { SelectOptionsService } from '../../../services/select-options.service'; -import { createGenericObject, getCriteriaStateObject, getSessionStorageHandler } from '../../../utils/utils'; +import { getCriteriaStateObject, getSessionStorageHandler, resetCriteria } from '../../../utils/utils'; @Component({ selector: 'app-commercial-property-listings', @@ -50,14 +50,13 @@ export class CommercialPropertyListingsComponent { private router: Router, private cdRef: ChangeDetectorRef, private imageService: ImageService, + private route: ActivatedRoute, ) { this.criteria = onChange(getCriteriaStateObject(), getSessionStorageHandler); this.criteria.type = undefined; - this.router.getCurrentNavigation(); - this.activatedRoute.snapshot; - this.activatedRoute.params.subscribe(params => { - if (this.activatedRoute.snapshot.fragment === '') { - this.criteria = onChange(createGenericObject(), getSessionStorageHandler); + this.route.data.subscribe(async () => { + if (!this.router.getCurrentNavigation().extras.state) { + resetCriteria(this.criteria); } this.init(); }); diff --git a/bizmatch/src/app/pages/listings/listings.component.html b/bizmatch/src/app/pages/listings/listings.component.html deleted file mode 100644 index e69de29..0000000 diff --git a/bizmatch/src/app/pages/listings/listings.component.scss b/bizmatch/src/app/pages/listings/listings.component.scss deleted file mode 100644 index af0a00b..0000000 --- a/bizmatch/src/app/pages/listings/listings.component.scss +++ /dev/null @@ -1,23 +0,0 @@ -#sky-line { - background-image: url(../../../assets/images/bw-sky.jpg); - height: 204px; - background-position: bottom; - background-size: cover; - margin-bottom: -1px; -} -.search{ - background-color: #343F69; -} -::ng-deep p-paginator div { - background-color: var(--surface-200) !important; - // background-color: var(--surface-400) !important; -} -.rounded-image { - border-radius: 6px; - // width: 100px; - max-width: 100px; - height: 45px; - border: 1px solid rgba(0,0,0,0.2); - padding: 1px 1px; - object-fit: contain; -} \ No newline at end of file diff --git a/bizmatch/src/app/pages/listings/listings.component.ts b/bizmatch/src/app/pages/listings/listings.component.ts deleted file mode 100644 index b393f67..0000000 --- a/bizmatch/src/app/pages/listings/listings.component.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { ChangeDetectorRef, Component } from '@angular/core'; -import { ButtonModule } from 'primeng/button'; -import { CheckboxModule } from 'primeng/checkbox'; -import { InputTextModule } from 'primeng/inputtext'; -import { StyleClassModule } from 'primeng/styleclass'; -import { SelectOptionsService } from '../../services/select-options.service'; -import { DropdownModule } from 'primeng/dropdown'; -import { FormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; -import { ToggleButtonModule } from 'primeng/togglebutton'; -import { ActivatedRoute, Router, RouterModule } from '@angular/router'; -import { ListingsService } from '../../services/listings.service'; -import { Observable, lastValueFrom } from 'rxjs'; -import { PaginatorModule } from 'primeng/paginator'; -import onChange from 'on-change'; -import { createGenericObject, getCriteriaStateObject, getSessionStorageHandler } from '../../utils/utils'; -import { InitEditableRow } from 'primeng/table'; -import { environment } from '../../../environments/environment'; - -import { UserService } from '../../services/user.service'; -import { ImageService } from '../../services/image.service'; -import { ListingCriteria, ListingType } from '../../../../../bizmatch-server/src/models/main.model'; -import { User } from '../../../../../bizmatch-server/src/models/db.model'; -@Component({ - selector: 'app-listings', - standalone: true, - imports: [CommonModule, StyleClassModule, ButtonModule, CheckboxModule, InputTextModule, DropdownModule, FormsModule, StyleClassModule, ToggleButtonModule, RouterModule, PaginatorModule], - templateUrl: './listings.component.html', - styleUrls: ['./listings.component.scss', '../pages.scss'] -}) -export class ListingsComponent { - // environment=environment; - // listings: Array; - // users: Array - // filteredListings: Array; - // criteria:ListingCriteria; - // realEstateChecked: boolean; - // maxPrice: string; - // minPrice: string; - // type:string; - // states = []; - // statesSet = new Set(); - // state:string; - // first: number = 0; - // rows: number = 12; - // totalRecords:number = 0; - // ts = new Date().getTime() - // public category: 'business' | 'commercialProperty' | 'professionals_brokers' | undefined; - - // constructor(public selectOptions: SelectOptionsService, - // private listingsService:ListingsService, - // private userService:UserService, - // private activatedRoute: ActivatedRoute, - // private router:Router, - // private cdRef:ChangeDetectorRef, - // private imageService:ImageService) { - // this.criteria = onChange(getCriteriaStateObject(),getSessionStorageHandler); - // this.router.getCurrentNavigation() - // this.activatedRoute.snapshot - // this.activatedRoute.params.subscribe(params => { - // if (this.activatedRoute.snapshot.fragment===''){ - // this.criteria = onChange(createGenericObject(),getSessionStorageHandler) - // this.first=0; - // } - // this.category = (params).type; - // this.criteria.listingsCategory=this.category; - // this.init() - // }) - - // } - // async ngOnInit(){ - // } - // async init(){ - // if (this.category==='business' || this.category==='commercialProperty'){ - // this.users=[] - // this.listings=await this.listingsService.getListings(this.criteria); - - // this.setStates(); - // this.totalRecords=this.listings.length - // this.cdRef.markForCheck(); - // this.cdRef.detectChanges(); - // } else { - // this.listings=[] - // this.filteredListings=[]; - // this.users=await this.userService.search(this.criteria); - // const profiles = await this.imageService.getProfileImagesForUsers(this.users.map(u=>u.id)); - // const logos = await this.imageService.getCompanyLogosForUsers(this.users.map(u=>u.id)); - // this.users.forEach(u=>{ - // u.hasProfile=profiles[u.id] - // u.hasCompanyLogo=logos[u.id] - // }) - // this.cdRef.markForCheck(); - // this.cdRef.detectChanges(); - // } - - // } - // setStates(){ - // this.statesSet=new Set(); - // this.listings.forEach(l=>{ - // if (l.state){ - // this.statesSet.add(l.state) - // } - // }) - // this.states = [...this.statesSet].map((ls) =>({name:this.selectOptions.getState(ls as string),value:ls})) - // } - // async search() { - // this.listings= await this.listingsService.getListings(this.criteria); - // this.setStates(); - // this.totalRecords=this.listings.length - // this.filteredListings =[...this.listings].splice(this.first,this.rows); - // this.cdRef.markForCheck(); - // this.cdRef.detectChanges(); - // } - // onPageChange(event: any) { - // this.criteria.start=event.first; - // this.criteria.length=event.rows; - // this.criteria.page=event.page; - // this.criteria.pageCount=event.pageCount; - // } - // imageErrorHandler(listing: ListingType) { - // listing.hideImage = true; // Bild ausblenden, wenn es nicht geladen werden kann - // } - -} diff --git a/bizmatch/src/app/pages/subscription/account/account.component.ts b/bizmatch/src/app/pages/subscription/account/account.component.ts index f74b8f7..8b88b7d 100644 --- a/bizmatch/src/app/pages/subscription/account/account.component.ts +++ b/bizmatch/src/app/pages/subscription/account/account.component.ts @@ -80,7 +80,9 @@ export class AccountComponent { printInvoice(invoice: Invoice) {} async updateProfile(user: User) { + this.user.licensedIn = this.userLicensedIn.map(l => `${l.name}|${l.value}`); await this.userService.save(this.user); + this.messageService.add({ severity: 'info', summary: 'Confirmed', detail: 'Acount changes have been persisted', life: 3000 }); } onUploadCompanyLogo(event: any) { diff --git a/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.html b/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.html index 73a28e1..8077d56 100644 --- a/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.html +++ b/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.html @@ -103,7 +103,7 @@ @for (image of propertyImages; track image) {
    - +
    diff --git a/bizmatch/src/app/pages/subscription/my-listing/my-listing.component.html b/bizmatch/src/app/pages/subscription/my-listing/my-listing.component.html index c5fc30c..d931fc5 100644 --- a/bizmatch/src/app/pages/subscription/my-listing/my-listing.component.html +++ b/bizmatch/src/app/pages/subscription/my-listing/my-listing.component.html @@ -28,7 +28,7 @@ {{ listing.title }} {{ selectOptions.getListingsCategory(listing.listingsCategory) }} - {{ selectOptions.getState(listing.city) }} + {{ selectOptions.getState(listing.state) }} @if(isBusinessListing(listing)){ diff --git a/bizmatch/src/app/pages/subscription/my-listing/my-listing.component.ts b/bizmatch/src/app/pages/subscription/my-listing/my-listing.component.ts index 2fa42d2..7896b4c 100644 --- a/bizmatch/src/app/pages/subscription/my-listing/my-listing.component.ts +++ b/bizmatch/src/app/pages/subscription/my-listing/my-listing.component.ts @@ -34,12 +34,14 @@ export class MyListingComponent { const keycloakUser = this.userService.getKeycloakUser(); const email = keycloakUser.email; this.user = await this.userService.getByMail(email); - this.myListings = await this.listingsService.getListingByUserId(this.user.id); + const result = await Promise.all([await this.listingsService.getListingByUserId(this.user.id, 'business'), await this.listingsService.getListingByUserId(this.user.id, 'commercialProperty')]); + this.myListings = [...result[0], ...result[1]]; } async deleteListing(listing: ListingType) { await this.listingsService.deleteListing(listing.id, getListingType(listing)); - this.myListings = await this.listingsService.getListingByUserId(this.user.id); + const result = await Promise.all([await this.listingsService.getListingByUserId(this.user.id, 'business'), await this.listingsService.getListingByUserId(this.user.id, 'commercialProperty')]); + this.myListings = [...result[0], ...result[1]]; } confirm(event: Event, listing: ListingType) { diff --git a/bizmatch/src/app/services/listings.service.ts b/bizmatch/src/app/services/listings.service.ts index 55d5a88..ed22c9c 100644 --- a/bizmatch/src/app/services/listings.service.ts +++ b/bizmatch/src/app/services/listings.service.ts @@ -23,8 +23,8 @@ export class ListingsService { const result = this.http.get(`${this.apiBaseUrl}/bizmatch/listings/${listingsCategory}/${id}`); return result; } - getListingByUserId(userid: string): Promise { - return lastValueFrom(this.http.get(`${this.apiBaseUrl}/bizmatch/listings/business/user/${userid}`)); + getListingByUserId(userid: string, listingsCategory: 'business' | 'commercialProperty'): Promise { + return lastValueFrom(this.http.get(`${this.apiBaseUrl}/bizmatch/listings/${listingsCategory}/user/${userid}`)); } async save(listing: any, listingsCategory: 'business' | 'professionals_brokers' | 'commercialProperty') { if (listing.id) {