diff --git a/schema/prisma/schema/appSettings.prisma b/schema/prisma/schema/appSettings.prisma index 56451a4..2085b5b 100644 --- a/schema/prisma/schema/appSettings.prisma +++ b/schema/prisma/schema/appSettings.prisma @@ -1,7 +1,6 @@ model AppSettings { id Int @id @default(autoincrement()) last_reset_quota_date DateTime? @db.Date - + @@map("app_settings") } - diff --git a/schema/prisma/schema/autocomplete.prisma b/schema/prisma/schema/autocomplete.prisma index 86faf61..2c9d35f 100644 --- a/schema/prisma/schema/autocomplete.prisma +++ b/schema/prisma/schema/autocomplete.prisma @@ -1,31 +1,31 @@ model City { id Int @id @default(autoincrement()) name String? - - @@map("city") + @@index([name], map: "ix_city_name") + @@map("city") } model IndustrySector { id Int @id @default(autoincrement()) name String? - - @@map("industry_sector") + @@index([name], map: "ix_industry_sector_name") + @@map("industry_sector") } model LegalForm { id Int @id @default(autoincrement()) name String? - - @@map("legal_form") + @@index([name], map: "ix_legal_form_name") + @@map("legal_form") } model Region { id Int @id @default(autoincrement()) name String? - - @@map("region") + @@index([name], map: "ix_region_name") + @@map("region") } diff --git a/schema/prisma/schema/company.prisma b/schema/prisma/schema/company.prisma index 31bbf6a..7790af3 100644 --- a/schema/prisma/schema/company.prisma +++ b/schema/prisma/schema/company.prisma @@ -1,108 +1,107 @@ model Company { - id Int @id @default(autoincrement()) - company_name String? - siren_number String? - nic_number String? - legal_form String? - ape_code String? - ape_label String? - address String? - postal_code String? - department_number String? - department String? - city String? - region String? - trade_name String? - registration_date DateTime? @db.Date - deregistration_date DateTime? @db.Date - + id Int @id @default(autoincrement()) + company_name String? + siren_number String? + nic_number String? + legal_form String? + ape_code String? + ape_label String? + address String? + postal_code String? + department_number String? + department String? + city String? + region String? + trade_name String? + registration_date DateTime? @db.Date + deregistration_date DateTime? @db.Date + // 2018 financial data - closing_date_2018_1 DateTime? @db.Date - revenue_2018_1 Float? - turnover_2018_1 Float? - closing_date_2018_2 DateTime? @db.Date - revenue_2018_2 Float? - turnover_2018_2 Float? - closing_date_2018_3 DateTime? @db.Date - revenue_2018_3 Float? - turnover_2018_3 Float? - + closing_date_2018_1 DateTime? @db.Date + revenue_2018_1 Float? + turnover_2018_1 Float? + closing_date_2018_2 DateTime? @db.Date + revenue_2018_2 Float? + turnover_2018_2 Float? + closing_date_2018_3 DateTime? @db.Date + revenue_2018_3 Float? + turnover_2018_3 Float? + // 2019 financial data - closing_date_2019_1 DateTime? @db.Date - revenue_2019_1 Float? - turnover_2019_1 Float? - closing_date_2019_2 DateTime? @db.Date - revenue_2019_2 Float? - turnover_2019_2 Float? - closing_date_2019_3 DateTime? @db.Date - revenue_2019_3 Float? - turnover_2019_3 Float? - + closing_date_2019_1 DateTime? @db.Date + revenue_2019_1 Float? + turnover_2019_1 Float? + closing_date_2019_2 DateTime? @db.Date + revenue_2019_2 Float? + turnover_2019_2 Float? + closing_date_2019_3 DateTime? @db.Date + revenue_2019_3 Float? + turnover_2019_3 Float? + // 2020 financial data - closing_date_2020_1 DateTime? @db.Date - revenue_2020_1 Float? - turnover_2020_1 Float? - closing_date_2020_2 DateTime? @db.Date - revenue_2020_2 Float? - turnover_2020_2 Float? - closing_date_2020_3 DateTime? @db.Date - revenue_2020_3 Float? - turnover_2020_3 Float? - + closing_date_2020_1 DateTime? @db.Date + revenue_2020_1 Float? + turnover_2020_1 Float? + closing_date_2020_2 DateTime? @db.Date + revenue_2020_2 Float? + turnover_2020_2 Float? + closing_date_2020_3 DateTime? @db.Date + revenue_2020_3 Float? + turnover_2020_3 Float? + // 2021 financial data - closing_date_2021_1 DateTime? @db.Date - revenue_2021_1 Float? - turnover_2021_1 Float? - closing_date_2021_2 DateTime? @db.Date - revenue_2021_2 Float? - turnover_2021_2 Float? - closing_date_2021_3 DateTime? @db.Date - revenue_2021_3 Float? - turnover_2021_3 Float? - + closing_date_2021_1 DateTime? @db.Date + revenue_2021_1 Float? + turnover_2021_1 Float? + closing_date_2021_2 DateTime? @db.Date + revenue_2021_2 Float? + turnover_2021_2 Float? + closing_date_2021_3 DateTime? @db.Date + revenue_2021_3 Float? + turnover_2021_3 Float? + // 2022 financial data - closing_date_2022_1 DateTime? @db.Date - revenue_2022_1 Float? - turnover_2022_1 Float? - closing_date_2022_2 DateTime? @db.Date - revenue_2022_2 Float? - turnover_2022_2 Float? - closing_date_2022_3 DateTime? @db.Date - revenue_2022_3 Float? - turnover_2022_3 Float? - + closing_date_2022_1 DateTime? @db.Date + revenue_2022_1 Float? + turnover_2022_1 Float? + closing_date_2022_2 DateTime? @db.Date + revenue_2022_2 Float? + turnover_2022_2 Float? + closing_date_2022_3 DateTime? @db.Date + revenue_2022_3 Float? + turnover_2022_3 Float? + // 2023 financial data - closing_date_2023_1 DateTime? @db.Date - revenue_2023_1 Float? - turnover_2023_1 Float? - closing_date_2023_2 DateTime? @db.Date - revenue_2023_2 Float? - turnover_2023_2 Float? - closing_date_2023_3 DateTime? @db.Date - revenue_2023_3 Float? - turnover_2023_3 Float? - - industry_sector String? - phone_number String? - website String? @db.VarChar(3000) - reviews Json? - schedule Json? - instagram String? @db.VarChar(10000) - facebook String? @db.VarChar(3000) - twitter String? @db.VarChar(3000) - linkedin String? @db.VarChar(3000) - youtube String? @db.VarChar(3000) - email String? @db.VarChar(3000) - scraping_date DateTime? @db.Date - date_creation DateTime? @db.Date - last_processing_date DateTime? @db.Date - number_of_employee Int? - company_category String? - + closing_date_2023_1 DateTime? @db.Date + revenue_2023_1 Float? + turnover_2023_1 Float? + closing_date_2023_2 DateTime? @db.Date + revenue_2023_2 Float? + turnover_2023_2 Float? + closing_date_2023_3 DateTime? @db.Date + revenue_2023_3 Float? + turnover_2023_3 Float? + + industry_sector String? + phone_number String? + website String? @db.VarChar(3000) + reviews Json? + schedule Json? + instagram String? @db.VarChar(10000) + facebook String? @db.VarChar(3000) + twitter String? @db.VarChar(3000) + linkedin String? @db.VarChar(3000) + youtube String? @db.VarChar(3000) + email String? @db.VarChar(3000) + scraping_date DateTime? @db.Date + date_creation DateTime? @db.Date + last_processing_date DateTime? @db.Date + number_of_employee Int? + company_category String? + // Relations - user_company_statuses UserCompanyStatus[] - - @@map("companies") + user_company_statuses UserCompanyStatus[] + @@index([siren_number], map: "ix_companies_siren_number") @@index([company_name], map: "ix_companies_company_name") @@index([legal_form], map: "ix_companies_legal_form") @@ -130,4 +129,5 @@ model Company { @@index([region, industry_sector, legal_form], map: "ix_companies_region_industry_sector_legal_form") @@index([industry_sector, legal_form], map: "ix_companies_industry_sector_legal_form") @@index([industry_sector, number_of_employee], map: "ix_companies_industry_sector_number_of_employee") -} \ No newline at end of file + @@map("companies") +} diff --git a/schema/prisma/schema/leader.prisma b/schema/prisma/schema/leader.prisma index 4fc4faa..8b8fc52 100644 --- a/schema/prisma/schema/leader.prisma +++ b/schema/prisma/schema/leader.prisma @@ -12,11 +12,11 @@ model Leader { company_name String? @db.VarChar(3000) legal_form String? id_data String? - - @@map("leaders") + @@index([siren], map: "idx_leader_siren") @@index([company_name], map: "idx_leader_company_name") @@index([first_name], map: "idx_leader_first_name") @@index([last_name], map: "idx_leader_last_name") @@index([role], map: "idx_leader_role") + @@map("leaders") } diff --git a/schema/prisma/schema/schema.prisma b/schema/prisma/schema/schema.prisma index f6f2b8d..a9ce5b2 100644 --- a/schema/prisma/schema/schema.prisma +++ b/schema/prisma/schema/schema.prisma @@ -1,21 +1,19 @@ -/** -TODO: add this -def ensure_pg_trgm(connection): - if connection.dialect.name == "postgresql": - connection.execute(text("CREATE EXTENSION IF NOT EXISTS pg_trgm")) - - -def create_trgm_index(connection): - if connection.dialect.name == "postgresql": - connection.execute( - text( - """ - CREATE INDEX IF NOT EXISTS idx_companies_company_name_trgm - ON companies USING gin (LOWER(company_name) gin_trgm_ops); - """ - ) - ) -**/ +/** + * TODO: add this + * def ensure_pg_trgm(connection): + * if connection.dialect.name == "postgresql": + * connection.execute(text("CREATE EXTENSION IF NOT EXISTS pg_trgm")) + * def create_trgm_index(connection): + * if connection.dialect.name == "postgresql": + * connection.execute( + * text( + * """ + * CREATE INDEX IF NOT EXISTS idx_companies_company_name_trgm + * ON companies USING gin (LOWER(company_name) gin_trgm_ops); + * """ + * ) + * ) + */ generator client { provider = "prisma-client-js" diff --git a/schema/prisma/schema/springAiChatMemory.prisma b/schema/prisma/schema/springAiChatMemory.prisma new file mode 100644 index 0000000..f29c054 --- /dev/null +++ b/schema/prisma/schema/springAiChatMemory.prisma @@ -0,0 +1,13 @@ +model SpringAiChatMemory { + id Int @id @default(autoincrement()) + conversation_id String @db.VarChar(36) + content String @db.Text + type String @db.VarChar(10) + timestamp DateTime @db.Timestamp + + // Relations + userConversation UserConversation? @relation("UserConversationToSpringAiChatMemory", fields: [conversation_id], references: [conversation_id]) + + @@index([conversation_id]) + @@map("spring_ai_chat_memory") +} diff --git a/schema/prisma/schema/user.prisma b/schema/prisma/schema/user.prisma index 9e02a3d..d1d9c90 100644 --- a/schema/prisma/schema/user.prisma +++ b/schema/prisma/schema/user.prisma @@ -5,27 +5,26 @@ enum Status { } model UserCompanyStatus { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) user_id String? status Status? company_id Int? - + // Relations - company Company? @relation(fields: [company_id], references: [id]) - - @@map("user_company_status") + company Company? @relation(fields: [company_id], references: [id]) + @@index([user_id], map: "ix_user_company_status_user_id") @@index([company_id], map: "ix_user_company_status_company_id") + @@map("user_company_status") } model UserQuota { - user_id String @id + user_id String @id quota_allocated Int? - quota_used Int? - - @@map("user_quota") + quota_used Int? + @@index([user_id], map: "ix_user_quota_user_id") @@index([quota_allocated], map: "ix_user_quota_quota_allocated") @@index([quota_used], map: "ix_user_quota_quota_used") + @@map("user_quota") } - diff --git a/schema/prisma/schema/userConversation.prisma b/schema/prisma/schema/userConversation.prisma new file mode 100644 index 0000000..0515bf0 --- /dev/null +++ b/schema/prisma/schema/userConversation.prisma @@ -0,0 +1,10 @@ +model UserConversation { + id Int @id @default(autoincrement()) + conversation_id String? @unique @db.VarChar(36) + user_id String? + + // Relations - one conversation has many messages + chatMessages SpringAiChatMemory[] @relation("UserConversationToSpringAiChatMemory") + + @@map("user_conversation") +} diff --git a/scripts/setup-db.sh b/scripts/setup-db.sh index ac7f422..40f2c7b 100755 --- a/scripts/setup-db.sh +++ b/scripts/setup-db.sh @@ -1,4 +1,15 @@ #!/bin/bash + +# What we do here is ugly. We start Postgres, run migrations and load CSV data. We "bake" an image +# with a full database, so that when we start Postgres for real, it's already populated. +# +# We should decouple this logic from the Postgres image. +# The data from the CSV is static, so we don't need to load it every time we start the DB. +# +# On way to do would be to do like in production: having two containers, one for Postgres +# with baked data in it, and one to run the migrations. + + set -e # Start Postgres in background @@ -6,7 +17,11 @@ docker-entrypoint.sh postgres & # Wait for Postgres to be ready echo "Waiting for Postgres..." -sleep 5 +until pg_isready -h localhost -p 5432 -U "$POSTGRES_USER"; do + echo "Waiting for Postgres..." + sleep 1 +done +echo "Postgres is ready!" export DATABASE_URL="postgresql://postgres:root@localhost:5432/postgres" @@ -15,7 +30,8 @@ psql -d postgres -c "SELECT 1;" # Run migrations cd /app/schema -pnpm exec prisma db push +pnpm exec prisma migrate deploy +pnpm exec prisma generate cd /app psql -v ON_ERROR_STOP=1 --username="$POSTGRES_USER" <