From b7b34dacab701627ef3c5ed845dacb7397f13b06 Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Sat, 13 Jul 2024 19:44:07 +0200 Subject: [PATCH] add embeddings, remove userId from business & commercialProperty replaced by email --- bizmatch-server/src/drizzle/import.js | 34 -- bizmatch-server/src/drizzle/import.ts | 36 +- ...000_known_havok.sql => 0000_slim_nova.sql} | 27 +- .../drizzle/migrations/0001_eager_sandman.sql | 1 - .../migrations/meta/0000_snapshot.json | 108 ++-- .../migrations/meta/0001_snapshot.json | 547 ------------------ .../src/drizzle/migrations/meta/_journal.json | 15 +- bizmatch-server/src/drizzle/schema.js | 75 --- bizmatch-server/src/drizzle/schema.ts | 12 +- bizmatch-server/src/models/db.model.ts | 7 +- bizmatch-server/src/models/main.model.ts | 1 - .../details-business-listing.component.ts | 5 +- ...s-commercial-property-listing.component.ts | 5 +- .../edit-business-listing.component.ts | 2 +- ...t-commercial-property-listing.component.ts | 3 +- .../email-us/email-us.component.ts | 2 +- bizmatch/src/app/utils/utils.ts | 6 +- 17 files changed, 123 insertions(+), 763 deletions(-) delete mode 100644 bizmatch-server/src/drizzle/import.js rename bizmatch-server/src/drizzle/migrations/{0000_known_havok.sql => 0000_slim_nova.sql} (74%) delete mode 100644 bizmatch-server/src/drizzle/migrations/0001_eager_sandman.sql delete mode 100644 bizmatch-server/src/drizzle/migrations/meta/0001_snapshot.json delete mode 100644 bizmatch-server/src/drizzle/schema.js diff --git a/bizmatch-server/src/drizzle/import.js b/bizmatch-server/src/drizzle/import.js deleted file mode 100644 index 07fd414..0000000 --- a/bizmatch-server/src/drizzle/import.js +++ /dev/null @@ -1,34 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -require("dotenv/config"); -var node_postgres_1 = require("drizzle-orm/node-postgres"); -var pg_1 = require("pg"); -var Client = pg_1.default.Client; -var schema = require("./schema.js"); -var fs_1 = require("fs"); -var connectionString = process.env.DATABASE_URL; -// const pool = new Pool({connectionString}) -var client = new Client({ connectionString: connectionString }); -var db = (0, node_postgres_1.drizzle)(client, { schema: schema, logger: true }); -//Broker -var filePath = "./data/broker.json"; -var data = (0, fs_1.readFileSync)(filePath, 'utf8'); -var jsonData = JSON.parse(data); // Erwartet ein Array von Objekten -await db.delete(schema.users); -console.log(jsonData.length); -for (var _i = 0, jsonData_1 = jsonData; _i < jsonData_1.length; _i++) { - var user = jsonData_1[_i]; - delete user.id; - await db.insert(schema.users).values(user); -} -//Business Listings -// filePath = `./data/businesses.json` -// data = readFileSync(filePath, 'utf8'); -// jsonData = JSON.parse(data); // Erwartet ein Array von Objekten -// db.delete(schema.businesses); -// for (const business of jsonData) { -// delete business.id -// await db.insert(schema.businesses).values(business); -// } -//End -//await client.end() diff --git a/bizmatch-server/src/drizzle/import.ts b/bizmatch-server/src/drizzle/import.ts index ae259a8..312710e 100644 --- a/bizmatch-server/src/drizzle/import.ts +++ b/bizmatch-server/src/drizzle/import.ts @@ -7,6 +7,7 @@ import { join } from 'path'; import pkg from 'pg'; import { rimraf } from 'rimraf'; import sharp from 'sharp'; +import winston from 'winston'; import { BusinessListing, CommercialPropertyListing, User, UserData } from '../models/db.model.js'; import { emailToDirName, KeyValueStyle } from '../models/main.model.js'; import * as schema from './schema.js'; @@ -35,7 +36,9 @@ const connectionString = process.env.DATABASE_URL; // const pool = new Pool({connectionString}) const client = new Pool({ connectionString }); const db = drizzle(client, { schema, logger: true }); - +const logger = winston.createLogger({ + transports: [new winston.transports.Console()], +}); //Delete Content await db.delete(schema.commercials); await db.delete(schema.businesses); @@ -59,7 +62,10 @@ deleteFilesOfDir(targetPathProperty); fs.ensureDirSync(`./pictures/logo`); fs.ensureDirSync(`./pictures/profile`); fs.ensureDirSync(`./pictures/property`); -for (const userData of usersData) { +type UserProfile = Omit; +//for (const userData of usersData) { +for (let index = 0; index < usersData.length; index++) { + const userData = usersData[index]; const user: User = { firstname: '', lastname: '', email: '' }; user.licensedIn = []; userData.licensedIn.forEach(l => { @@ -87,7 +93,22 @@ for (const userData of usersData) { user.customerSubType = 'broker'; user.created = new Date(); user.updated = new Date(); - const u = await db.insert(schema.users).values(user).returning({ insertedId: schema.users.id, gender: schema.users.gender, email: schema.users.email }); + const createUserProfile = (user: User): UserProfile => { + const { id, created, updated, hasCompanyLogo, hasProfile, ...userProfile } = user; + return userProfile; + }; + const userProfile = createUserProfile(user); + logger.info(`${index} - ${JSON.stringify(userProfile)}`); + const embedding = await createEmbedding(JSON.stringify(userProfile)); + sleep(500); + const u = await db + .insert(schema.users) + .values({ + ...user, + embedding: embedding, + }) + .returning({ insertedId: schema.users.id, gender: schema.users.gender, email: schema.users.email }); + // const u = await db.insert(schema.users).values(user).returning({ insertedId: schema.users.id, gender: schema.users.gender, email: schema.users.email }); generatedUserData.push(u[0]); i++; @@ -113,7 +134,7 @@ for (const business of businessJsonData) { business.created = new Date(business.created); business.updated = new Date(business.created); const user = getRandomItem(generatedUserData); - business.userId = user.insertedId; + business.email = user.email; business.imageName = emailToDirName(user.email); const embeddingText = JSON.stringify({ type: typesOfBusiness.find(b => b.value === String(business.type))?.name, @@ -133,6 +154,7 @@ for (const business of businessJsonData) { reasonForSale: business.reasonForSale, }); const embedding = await createEmbedding(embeddingText); + sleep(300); await db.insert(schema.businesses).values({ ...business, embedding: embedding, @@ -151,10 +173,9 @@ for (const commercial of commercialJsonData) { const insertionDate = getRandomDateWithinLastYear(); commercial.created = insertionDate; commercial.updated = insertionDate; - commercial.userId = user.insertedId; + commercial.email = user.email; commercial.draft = false; const result = await db.insert(schema.commercials).values(commercial).returning(); - //fs.ensureDirSync(`./pictures/property/${result[0].imagePath}/${result[0].serialId}`); try { fs.copySync(`./pictures_base/property/${id}`, `./pictures/property/${result[0].imagePath}/${result[0].serialId}`); } catch (err) { @@ -165,6 +186,9 @@ for (const commercial of commercialJsonData) { //End await client.end(); +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} async function createEmbedding(text: string): Promise { const response = await openai.embeddings.create({ model: 'text-embedding-3-small', diff --git a/bizmatch-server/src/drizzle/migrations/0000_known_havok.sql b/bizmatch-server/src/drizzle/migrations/0000_slim_nova.sql similarity index 74% rename from bizmatch-server/src/drizzle/migrations/0000_known_havok.sql rename to bizmatch-server/src/drizzle/migrations/0000_slim_nova.sql index ef82364..220656d 100644 --- a/bizmatch-server/src/drizzle/migrations/0000_known_havok.sql +++ b/bizmatch-server/src/drizzle/migrations/0000_slim_nova.sql @@ -1,24 +1,24 @@ DO $$ BEGIN - CREATE TYPE "customerSubType" AS ENUM('broker', 'cpa', 'attorney', 'titleCompany', 'surveyor', 'appraiser'); + CREATE TYPE "public"."customerSubType" AS ENUM('broker', 'cpa', 'attorney', 'titleCompany', 'surveyor', 'appraiser'); EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN - CREATE TYPE "customerType" AS ENUM('buyer', 'professional'); + CREATE TYPE "public"."customerType" AS ENUM('buyer', 'professional'); EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN - CREATE TYPE "gender" AS ENUM('male', 'female'); + CREATE TYPE "public"."gender" AS ENUM('male', 'female'); EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint CREATE TABLE IF NOT EXISTS "businesses" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, - "userId" uuid, + "email" varchar(255), "type" integer, "title" varchar(255), "description" text, @@ -44,13 +44,14 @@ CREATE TABLE IF NOT EXISTS "businesses" ( "created" timestamp, "updated" timestamp, "visits" integer, - "lastVisit" timestamp + "lastVisit" timestamp, + "embedding" vector(1536) ); --> statement-breakpoint CREATE TABLE IF NOT EXISTS "commercials" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "serial_id" serial NOT NULL, - "userId" uuid, + "email" varchar(255), "type" integer, "title" varchar(255), "description" text, @@ -63,15 +64,13 @@ CREATE TABLE IF NOT EXISTS "commercials" ( "draft" boolean, "zipCode" integer, "county" varchar(255), - "email" varchar(255), - "website" varchar(255), - "phoneNumber" varchar(255), "imageOrder" varchar(200)[], "imagePath" varchar(200), "created" timestamp, "updated" timestamp, "visits" integer, - "lastVisit" timestamp + "lastVisit" timestamp, + "embedding" vector(1536) ); --> statement-breakpoint CREATE TABLE IF NOT EXISTS "users" ( @@ -94,17 +93,19 @@ CREATE TABLE IF NOT EXISTS "users" ( "customerType" "customerType", "customerSubType" "customerSubType", "created" timestamp, - "updated" timestamp + "updated" timestamp, + "embedding" vector(1536), + CONSTRAINT "users_email_unique" UNIQUE("email") ); --> statement-breakpoint DO $$ BEGIN - ALTER TABLE "businesses" ADD CONSTRAINT "businesses_userId_users_id_fk" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action; + ALTER TABLE "businesses" ADD CONSTRAINT "businesses_email_users_email_fk" FOREIGN KEY ("email") REFERENCES "public"."users"("email") ON DELETE no action ON UPDATE no action; EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN - ALTER TABLE "commercials" ADD CONSTRAINT "commercials_userId_users_id_fk" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action; + ALTER TABLE "commercials" ADD CONSTRAINT "commercials_email_users_email_fk" FOREIGN KEY ("email") REFERENCES "public"."users"("email") ON DELETE no action ON UPDATE no action; EXCEPTION WHEN duplicate_object THEN null; END $$; diff --git a/bizmatch-server/src/drizzle/migrations/0001_eager_sandman.sql b/bizmatch-server/src/drizzle/migrations/0001_eager_sandman.sql deleted file mode 100644 index ebab33a..0000000 --- a/bizmatch-server/src/drizzle/migrations/0001_eager_sandman.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE "businesses" ADD COLUMN "embedding" vector(1536); \ No newline at end of file diff --git a/bizmatch-server/src/drizzle/migrations/meta/0000_snapshot.json b/bizmatch-server/src/drizzle/migrations/meta/0000_snapshot.json index c7c464b..a3e762a 100644 --- a/bizmatch-server/src/drizzle/migrations/meta/0000_snapshot.json +++ b/bizmatch-server/src/drizzle/migrations/meta/0000_snapshot.json @@ -1,4 +1,6 @@ { + "id": "2d8edad3-5544-4cb1-a543-84c07737ea9f", + "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", "tables": { @@ -13,9 +15,9 @@ "notNull": true, "default": "gen_random_uuid()" }, - "userId": { - "name": "userId", - "type": "uuid", + "email": { + "name": "email", + "type": "varchar(255)", "primaryKey": false, "notNull": false }, @@ -174,22 +176,28 @@ "type": "timestamp", "primaryKey": false, "notNull": false + }, + "embedding": { + "name": "embedding", + "type": "vector(1536)", + "primaryKey": false, + "notNull": false } }, "indexes": {}, "foreignKeys": { - "businesses_userId_users_id_fk": { - "name": "businesses_userId_users_id_fk", + "businesses_email_users_email_fk": { + "name": "businesses_email_users_email_fk", "tableFrom": "businesses", - "columnsFrom": [ - "userId" - ], "tableTo": "users", - "columnsTo": [ - "id" + "columnsFrom": [ + "email" ], - "onUpdate": "no action", - "onDelete": "no action" + "columnsTo": [ + "email" + ], + "onDelete": "no action", + "onUpdate": "no action" } }, "compositePrimaryKeys": {}, @@ -212,9 +220,9 @@ "primaryKey": false, "notNull": true }, - "userId": { - "name": "userId", - "type": "uuid", + "email": { + "name": "email", + "type": "varchar(255)", "primaryKey": false, "notNull": false }, @@ -290,24 +298,6 @@ "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)[]", @@ -343,22 +333,28 @@ "type": "timestamp", "primaryKey": false, "notNull": false + }, + "embedding": { + "name": "embedding", + "type": "vector(1536)", + "primaryKey": false, + "notNull": false } }, "indexes": {}, "foreignKeys": { - "commercials_userId_users_id_fk": { - "name": "commercials_userId_users_id_fk", + "commercials_email_users_email_fk": { + "name": "commercials_email_users_email_fk", "tableFrom": "commercials", - "columnsFrom": [ - "userId" - ], "tableTo": "users", - "columnsTo": [ - "id" + "columnsFrom": [ + "email" ], - "onUpdate": "no action", - "onDelete": "no action" + "columnsTo": [ + "email" + ], + "onDelete": "no action", + "onUpdate": "no action" } }, "compositePrimaryKeys": {}, @@ -462,18 +458,21 @@ "gender": { "name": "gender", "type": "gender", + "typeSchema": "public", "primaryKey": false, "notNull": false }, "customerType": { "name": "customerType", "type": "customerType", + "typeSchema": "public", "primaryKey": false, "notNull": false }, "customerSubType": { "name": "customerSubType", "type": "customerSubType", + "typeSchema": "public", "primaryKey": false, "notNull": false }, @@ -488,12 +487,26 @@ "type": "timestamp", "primaryKey": false, "notNull": false + }, + "embedding": { + "name": "embedding", + "type": "vector(1536)", + "primaryKey": false, + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": { + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } } }, "enums": { @@ -527,11 +540,10 @@ } }, "schemas": {}, + "sequences": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} - }, - "id": "f8241dfe-8f15-4656-aeb5-c9ef0ad65f28", - "prevId": "00000000-0000-0000-0000-000000000000" + "tables": {} + } } \ No newline at end of file diff --git a/bizmatch-server/src/drizzle/migrations/meta/0001_snapshot.json b/bizmatch-server/src/drizzle/migrations/meta/0001_snapshot.json deleted file mode 100644 index d7d5f1f..0000000 --- a/bizmatch-server/src/drizzle/migrations/meta/0001_snapshot.json +++ /dev/null @@ -1,547 +0,0 @@ -{ - "id": "aac13d99-fd8d-44f9-bfb0-f00cef85809d", - "prevId": "f8241dfe-8f15-4656-aeb5-c9ef0ad65f28", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.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 - }, - "imagePath": { - "name": "imagePath", - "type": "varchar(200)", - "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 - }, - "embedding": { - "name": "embedding", - "type": "vector(1536)", - "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": {} - }, - "public.commercials": { - "name": "commercials", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "serial_id": { - "name": "serial_id", - "type": "serial", - "primaryKey": false, - "notNull": true - }, - "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(200)", - "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": {} - }, - "public.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": "jsonb", - "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": "jsonb", - "primaryKey": false, - "notNull": false - }, - "gender": { - "name": "gender", - "type": "gender", - "typeSchema": "public", - "primaryKey": false, - "notNull": false - }, - "customerType": { - "name": "customerType", - "type": "customerType", - "typeSchema": "public", - "primaryKey": false, - "notNull": false - }, - "customerSubType": { - "name": "customerSubType", - "type": "customerSubType", - "typeSchema": "public", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "updated": { - "name": "updated", - "type": "timestamp", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": { - "public.customerSubType": { - "name": "customerSubType", - "schema": "public", - "values": [ - "broker", - "cpa", - "attorney", - "titleCompany", - "surveyor", - "appraiser" - ] - }, - "public.customerType": { - "name": "customerType", - "schema": "public", - "values": [ - "buyer", - "professional" - ] - }, - "public.gender": { - "name": "gender", - "schema": "public", - "values": [ - "male", - "female" - ] - } - }, - "schemas": {}, - "sequences": {}, - "_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 f591828..94b280d 100644 --- a/bizmatch-server/src/drizzle/migrations/meta/_journal.json +++ b/bizmatch-server/src/drizzle/migrations/meta/_journal.json @@ -1,19 +1,12 @@ { - "version": "5", - "dialect": "pg", + "version": "7", + "dialect": "postgresql", "entries": [ { "idx": 0, - "version": "5", - "when": 1717933164279, - "tag": "0000_known_havok", - "breakpoints": true - }, - { - "idx": 1, "version": "7", - "when": 1720777203223, - "tag": "0001_eager_sandman", + "when": 1720872296432, + "tag": "0000_slim_nova", "breakpoints": true } ] diff --git a/bizmatch-server/src/drizzle/schema.js b/bizmatch-server/src/drizzle/schema.js deleted file mode 100644 index f62e82e..0000000 --- a/bizmatch-server/src/drizzle/schema.js +++ /dev/null @@ -1,75 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.commercials = exports.businesses = exports.users = exports.PG_CONNECTION = void 0; -var pg_core_1 = require("drizzle-orm/pg-core"); -exports.PG_CONNECTION = 'PG_CONNECTION'; -exports.users = (0, pg_core_1.pgTable)('users', { - id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(), - firstname: (0, pg_core_1.varchar)('firstname', { length: 255 }).notNull(), - lastname: (0, pg_core_1.varchar)('lastname', { length: 255 }).notNull(), - email: (0, pg_core_1.varchar)('email', { length: 255 }).notNull(), - phoneNumber: (0, pg_core_1.varchar)('phoneNumber', { length: 255 }), - description: (0, pg_core_1.text)('description'), - companyName: (0, pg_core_1.varchar)('companyName', { length: 255 }), - companyOverview: (0, pg_core_1.text)('companyOverview'), - companyWebsite: (0, pg_core_1.varchar)('companyWebsite', { length: 255 }), - companyLocation: (0, pg_core_1.varchar)('companyLocation', { length: 255 }), - offeredServices: (0, pg_core_1.text)('offeredServices'), - areasServed: (0, pg_core_1.varchar)('areasServed', { length: 100 }).array(), - hasProfile: (0, pg_core_1.boolean)('hasProfile'), - hasCompanyLogo: (0, pg_core_1.boolean)('hasCompanyLogo'), - licensedIn: (0, pg_core_1.varchar)('licensedIn', { length: 50 }).array(), -}); -exports.businesses = (0, pg_core_1.pgTable)('businesses', { - id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(), - userId: (0, pg_core_1.uuid)('userId').references(function () { return exports.users.id; }), - type: (0, pg_core_1.varchar)('type', { length: 255 }), - title: (0, pg_core_1.varchar)('title', { length: 255 }), - description: (0, pg_core_1.text)('description'), - city: (0, pg_core_1.varchar)('city', { length: 255 }), - state: (0, pg_core_1.char)('state', { length: 2 }), - price: (0, pg_core_1.numeric)('price', { precision: 10, scale: 2 }), - favoritesForUser: (0, pg_core_1.varchar)('favoritesForUser', { length: 30 }).array(), - draft: (0, pg_core_1.boolean)('draft'), - listingsCategory: (0, pg_core_1.varchar)('listingsCategory', { length: 255 }), - realEstateIncluded: (0, pg_core_1.boolean)('realEstateIncluded'), - leasedLocation: (0, pg_core_1.boolean)('leasedLocation'), - franchiseResale: (0, pg_core_1.boolean)('franchiseResale'), - salesRevenue: (0, pg_core_1.numeric)('salesRevenue', { precision: 10, scale: 2 }), - cashFlow: (0, pg_core_1.numeric)('cashFlow', { precision: 10, scale: 2 }), - supportAndTraining: (0, pg_core_1.text)('supportAndTraining'), - employees: (0, pg_core_1.integer)('employees'), - established: (0, pg_core_1.integer)('established'), - internalListingNumber: (0, pg_core_1.integer)('internalListingNumber'), - reasonForSale: (0, pg_core_1.varchar)('reasonForSale', { length: 255 }), - brokerLicencing: (0, pg_core_1.varchar)('brokerLicencing', { length: 255 }), - internals: (0, pg_core_1.text)('internals'), - created: (0, pg_core_1.timestamp)('created'), - updated: (0, pg_core_1.timestamp)('updated'), - visits: (0, pg_core_1.integer)('visits'), - lastVisit: (0, pg_core_1.timestamp)('lastVisit'), -}); -exports.commercials = (0, pg_core_1.pgTable)('commercials', { - id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(), - userId: (0, pg_core_1.uuid)('userId').references(function () { return exports.users.id; }), - type: (0, pg_core_1.varchar)('type', { length: 255 }), - title: (0, pg_core_1.varchar)('title', { length: 255 }), - description: (0, pg_core_1.text)('description'), - city: (0, pg_core_1.varchar)('city', { length: 255 }), - state: (0, pg_core_1.char)('state', { length: 2 }), - price: (0, pg_core_1.numeric)('price', { precision: 10, scale: 2 }), - favoritesForUser: (0, pg_core_1.varchar)('favoritesForUser', { length: 30 }).array(), - hideImage: (0, pg_core_1.boolean)('hideImage'), - draft: (0, pg_core_1.boolean)('draft'), - zipCode: (0, pg_core_1.integer)('zipCode'), - county: (0, pg_core_1.varchar)('county', { length: 255 }), - email: (0, pg_core_1.varchar)('email', { length: 255 }), - website: (0, pg_core_1.varchar)('website', { length: 255 }), - phoneNumber: (0, pg_core_1.varchar)('phoneNumber', { length: 255 }), - imageOrder: (0, pg_core_1.varchar)('imageOrder', { length: 30 }).array(), - imagePath: (0, pg_core_1.varchar)('imagePath', { length: 30 }).array(), - created: (0, pg_core_1.timestamp)('created'), - updated: (0, pg_core_1.timestamp)('updated'), - visits: (0, pg_core_1.integer)('visits'), - lastVisit: (0, pg_core_1.timestamp)('lastVisit'), -}); diff --git a/bizmatch-server/src/drizzle/schema.ts b/bizmatch-server/src/drizzle/schema.ts index ec51884..b39663f 100644 --- a/bizmatch-server/src/drizzle/schema.ts +++ b/bizmatch-server/src/drizzle/schema.ts @@ -9,7 +9,7 @@ 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(), + email: varchar('email', { length: 255 }).notNull().unique(), phoneNumber: varchar('phoneNumber', { length: 255 }), description: text('description'), companyName: varchar('companyName', { length: 255 }), @@ -26,11 +26,12 @@ export const users = pgTable('users', { customerSubType: customerSubTypeEnum('customerSubType'), created: timestamp('created'), updated: timestamp('updated'), + embedding: vector('embedding', { dimensions: 1536 }), }); export const businesses = pgTable('businesses', { id: uuid('id').primaryKey().defaultRandom(), - userId: uuid('userId').references(() => users.id), + email: varchar('email', { length: 255 }).references(() => users.email), type: integer('type'), title: varchar('title', { length: 255 }), description: text('description'), @@ -59,13 +60,12 @@ export const businesses = pgTable('businesses', { lastVisit: timestamp('lastVisit'), // Neue Spalte für das OpenAI Embedding embedding: vector('embedding', { dimensions: 1536 }), - // embedding: sql`vector(1536)`, }); export const commercials = pgTable('commercials', { id: uuid('id').primaryKey().defaultRandom(), serialId: serial('serial_id'), - userId: uuid('userId').references(() => users.id), + email: varchar('email', { length: 255 }).references(() => users.email), type: integer('type'), title: varchar('title', { length: 255 }), description: text('description'), @@ -78,13 +78,11 @@ export const commercials = pgTable('commercials', { 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: 200 }), created: timestamp('created'), updated: timestamp('updated'), visits: integer('visits'), lastVisit: timestamp('lastVisit'), + embedding: vector('embedding', { dimensions: 1536 }), }); diff --git a/bizmatch-server/src/models/db.model.ts b/bizmatch-server/src/models/db.model.ts index 37afe5e..349541a 100644 --- a/bizmatch-server/src/models/db.model.ts +++ b/bizmatch-server/src/models/db.model.ts @@ -44,7 +44,7 @@ export interface UserData { } export interface BusinessListing { id: string; - userId?: string; + email?: string; type?: number; title?: string; description?: string; @@ -76,7 +76,7 @@ export interface BusinessListing { export interface CommercialPropertyListing { id: string; serialId?: number; - userId?: string; + email?: string; type?: number; title?: string; description?: string; @@ -88,9 +88,6 @@ export interface CommercialPropertyListing { draft?: boolean; zipCode?: number; county?: string; - email?: string; - website?: string; - phoneNumber?: string; imageOrder?: string[]; imagePath?: string; created?: Date; diff --git a/bizmatch-server/src/models/main.model.ts b/bizmatch-server/src/models/main.model.ts index 2eb5530..f108271 100644 --- a/bizmatch-server/src/models/main.model.ts +++ b/bizmatch-server/src/models/main.model.ts @@ -160,7 +160,6 @@ export interface AutoCompleteCompleteEvent { } export interface MailInfo { sender: Sender; - userId: string; email: string; url: string; listing?: BusinessListing; 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 dbd02fb..b01b81d 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 @@ -69,7 +69,7 @@ export class DetailsBusinessListingComponent { this.history.push(event.urlAfterRedirects); } }); - this.mailinfo = { sender: {}, userId: '', email: '', url: environment.mailinfoUrl }; + this.mailinfo = { sender: {}, email: '', url: environment.mailinfoUrl }; this.criteria = onChange(getCriteriaStateObject(), getSessionStorageHandler); } @@ -81,7 +81,7 @@ export class DetailsBusinessListingComponent { this.mailinfo.sender = { name: `${this.user.firstname} ${this.user.lastname}`, email: this.user.email, phoneNumber: this.user.phoneNumber, state: this.user.companyLocation }; } this.listing = await lastValueFrom(this.listingsService.getListingById(this.id, 'business')); - this.listingUser = await this.userService.getById(this.listing.userId); + this.listingUser = await this.userService.getByMail(this.listing.email); this.description = this.sanitizer.bypassSecurityTrustHtml(this.listing.description); } @@ -90,7 +90,6 @@ export class DetailsBusinessListingComponent { } async mail() { this.mailinfo.email = this.listingUser.email; - this.mailinfo.userId = this.listing.userId; this.mailinfo.listing = this.listing; await this.mailService.mail(this.mailinfo); // this.messageService.add({ severity: 'info', summary: 'Confirmed', detail: 'Your message has been sent to the creator of the listing', life: 3000 }); 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 b332ccd..91e39fb 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 @@ -71,7 +71,7 @@ export class DetailsCommercialPropertyListingComponent { private imageService: ImageService, private ngZone: NgZone, ) { - this.mailinfo = { sender: {}, userId: '', email: '', url: environment.mailinfoUrl }; + this.mailinfo = { sender: {}, email: '', url: environment.mailinfoUrl }; this.criteria = onChange(getCriteriaStateObject(), getSessionStorageHandler); } @@ -84,7 +84,7 @@ export class DetailsCommercialPropertyListingComponent { this.mailinfo.sender = { name: `${this.user.firstname} ${this.user.lastname}`, email: this.user.email, phoneNumber: this.user.phoneNumber, state: this.user.companyLocation }; } this.listing = await lastValueFrom(this.listingsService.getListingById(this.id, 'commercialProperty')); - this.listingUser = await this.userService.getById(this.listing.userId); + this.listingUser = await this.userService.getByMail(this.listing.email); this.description = this.sanitizer.bypassSecurityTrustHtml(this.listing.description); import('flowbite').then(flowbite => { flowbite.initCarousels(); @@ -113,7 +113,6 @@ export class DetailsCommercialPropertyListingComponent { } async mail() { this.mailinfo.email = this.listingUser.email; - this.mailinfo.userId = this.listing.userId; this.mailinfo.listing = this.listing; const result = await this.mailService.mail(this.mailinfo); if (result) { diff --git a/bizmatch/src/app/pages/subscription/edit-business-listing/edit-business-listing.component.ts b/bizmatch/src/app/pages/subscription/edit-business-listing/edit-business-listing.component.ts index fde31f7..e90e868 100644 --- a/bizmatch/src/app/pages/subscription/edit-business-listing/edit-business-listing.component.ts +++ b/bizmatch/src/app/pages/subscription/edit-business-listing/edit-business-listing.component.ts @@ -85,7 +85,7 @@ export class EditBusinessListingComponent { } else { this.listing = createDefaultBusinessListing(); const listingUser = await this.userService.getByMail(keycloakUser.email); - this.listing.userId = listingUser.id; + this.listing.email = listingUser.email; this.listing.imageName = emailToDirName(keycloakUser.email); if (this.data) { this.listing.title = this.data?.title; diff --git a/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.ts b/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.ts index 0fb1a0e..fb699c5 100644 --- a/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.ts +++ b/bizmatch/src/app/pages/subscription/edit-commercial-property-listing/edit-commercial-property-listing.component.ts @@ -36,7 +36,6 @@ import { TOOLBAR_OPTIONS } from '../../utils/defaults'; styleUrl: './edit-commercial-property-listing.component.scss', }) export class EditCommercialPropertyListingComponent { - // @ViewChild(FileUpload) public fileUpload: FileUpload; @ViewChild('fileInput') fileInput!: ElementRef; listingsCategory = 'commercialProperty'; @@ -125,7 +124,7 @@ export class EditCommercialPropertyListingComponent { } else { this.listing = createDefaultCommercialPropertyListing(); const listingUser = await this.userService.getByMail(keycloakUser.email); - this.listing.userId = listingUser.id; + this.listing.email = listingUser.email; this.listing.imagePath = `${emailToDirName(keycloakUser.email)}`; if (this.data) { this.listing.title = this.data?.title; diff --git a/bizmatch/src/app/pages/subscription/email-us/email-us.component.ts b/bizmatch/src/app/pages/subscription/email-us/email-us.component.ts index c80c44d..4f56a52 100644 --- a/bizmatch/src/app/pages/subscription/email-us/email-us.component.ts +++ b/bizmatch/src/app/pages/subscription/email-us/email-us.component.ts @@ -22,7 +22,7 @@ export class EmailUsComponent { user: User; errorResponse: ErrorResponse; constructor(private mailService: MailService, private userService: UserService, public keycloakService: KeycloakService) { - this.mailinfo = { sender: {}, userId: '', email: '', url: environment.mailinfoUrl }; + this.mailinfo = { sender: {}, email: '', url: environment.mailinfoUrl }; } async ngOnInit() { const token = await this.keycloakService.getToken(); diff --git a/bizmatch/src/app/utils/utils.ts b/bizmatch/src/app/utils/utils.ts index 05b7c5a..9196b93 100644 --- a/bizmatch/src/app/utils/utils.ts +++ b/bizmatch/src/app/utils/utils.ts @@ -31,7 +31,7 @@ export function createDefaultUser(email: string, firstname: string, lastname: st export function createDefaultCommercialPropertyListing(): CommercialPropertyListing { return { id: undefined, - userId: '', + email: '', type: null, title: '', description: '', @@ -43,9 +43,6 @@ export function createDefaultCommercialPropertyListing(): CommercialPropertyList draft: false, zipCode: null, county: '', - email: '', - website: '', - phoneNumber: '', imageOrder: [], imagePath: '', created: null, @@ -58,7 +55,6 @@ export function createDefaultCommercialPropertyListing(): CommercialPropertyList export function createDefaultBusinessListing(): BusinessListing { return { id: undefined, - userId: '', type: null, title: '', description: '',