diff --git a/Dockerfile b/Dockerfile index 9be035c9..8f74ec17 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,7 +47,6 @@ ENV NEXT_PUBLIC_POSTHOG_PAPIK=BAKED_NEXT_PUBLIC_POSTHOG_PAPIK RUN yarn workspace @sourcebot/web build - # ------ Build Backend ------ FROM node-alpine AS backend-builder WORKDIR /app @@ -59,7 +58,8 @@ COPY --from=database-builder /app/node_modules ./node_modules COPY --from=database-builder /app/packages/db ./packages/db RUN yarn workspace @sourcebot/backend install --frozen-lockfile RUN yarn workspace @sourcebot/backend build - + + # ------ Runner ------ FROM node-alpine AS runner WORKDIR /app @@ -68,6 +68,8 @@ ENV NEXT_TELEMETRY_DISABLED=1 ENV DATA_DIR=/data ENV CONFIG_PATH=$DATA_DIR/config.json ENV DATA_CACHE_DIR=$DATA_DIR/.sourcebot +ENV DB_DATA_DIR=$DATA_CACHE_DIR/db +ENV DB_NAME=sourcebot ARG SOURCEBOT_VERSION=unknown ENV SOURCEBOT_VERSION=$SOURCEBOT_VERSION @@ -94,23 +96,23 @@ ENV POSTHOG_PAPIK=$POSTHOG_PAPIK # ENV SOURCEBOT_TELEMETRY_DISABLED=1 # Configure dependencies -RUN apk add --no-cache git ca-certificates bind-tools tini jansson wget supervisor uuidgen curl perl jq redis +RUN apk add --no-cache git ca-certificates bind-tools tini jansson wget supervisor uuidgen curl perl jq redis postgresql postgresql-contrib # Configure zoekt COPY vendor/zoekt/install-ctags-alpine.sh . RUN ./install-ctags-alpine.sh && rm install-ctags-alpine.sh RUN mkdir -p ${DATA_CACHE_DIR} COPY --from=zoekt-builder \ - /cmd/zoekt-git-index \ - /cmd/zoekt-indexserver \ - /cmd/zoekt-mirror-github \ - /cmd/zoekt-mirror-gitiles \ - /cmd/zoekt-mirror-bitbucket-server \ - /cmd/zoekt-mirror-gitlab \ - /cmd/zoekt-mirror-gerrit \ - /cmd/zoekt-webserver \ - /cmd/zoekt-index \ - /usr/local/bin/ +/cmd/zoekt-git-index \ +/cmd/zoekt-indexserver \ +/cmd/zoekt-mirror-github \ +/cmd/zoekt-mirror-gitiles \ +/cmd/zoekt-mirror-bitbucket-server \ +/cmd/zoekt-mirror-gitlab \ +/cmd/zoekt-mirror-gerrit \ +/cmd/zoekt-webserver \ +/cmd/zoekt-index \ +/usr/local/bin/ # Configure the webapp COPY --from=web-builder /app/packages/web/public ./packages/web/public @@ -122,6 +124,9 @@ COPY --from=backend-builder /app/node_modules ./node_modules COPY --from=backend-builder /app/packages/backend ./packages/backend # Configure the database +RUN mkdir -p /run/postgresql && \ + chown -R postgres:postgres /run/postgresql && \ + chmod 775 /run/postgresql COPY --from=database-builder /app/node_modules ./node_modules COPY --from=database-builder /app/packages/db ./packages/db diff --git a/entrypoint.sh b/entrypoint.sh index ddbf6f09..7d497055 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -19,10 +19,12 @@ if [ ! -d "$DATA_CACHE_DIR" ]; then mkdir -p "$DATA_CACHE_DIR" fi -# Run a Database migration -echo -e "\e[34m[Info] Running database migration...\e[0m" -export DATABASE_URL="file:$DATA_CACHE_DIR/db.sqlite" -yarn workspace @sourcebot/db prisma:migrate:prod +# Check if DB_DATA_DIR exists, if not initialize it +if [ ! -d "$DB_DATA_DIR" ]; then + echo -e "\e[34m[Info] Initializing database at $DB_DATA_DIR...\e[0m" + mkdir -p $DB_DATA_DIR && chown -R postgres:postgres "$DB_DATA_DIR" + su postgres -c "initdb -D $DB_DATA_DIR" +fi # In order to detect if this is the first run, we create a `.installed` file in # the cache directory. @@ -162,5 +164,27 @@ fi # } +# Start the database and wait for it to be ready before starting any other service +su postgres -c "postgres -D $DB_DATA_DIR" & +until pg_isready -h localhost -p 5432 -U postgres; do + echo -e "\e[34m[Info] Waiting for the database to be ready...\e[0m" + sleep 1 +done + +# Check if the database already exists, and create it if it dne +EXISTING_DB=$(psql -U postgres -tAc "SELECT 1 FROM pg_database WHERE datname = '$DB_NAME'") + +if [ "$EXISTING_DB" = "1" ]; then + echo "Database '$DB_NAME' already exists; skipping creation." +else + echo "Creating database '$DB_NAME'..." + psql -U postgres -c "CREATE DATABASE \"$DB_NAME\"" +fi + +# Run a Database migration +export DATABASE_URL="postgresql://postgres@localhost:5432/$DB_NAME" +echo -e "\e[34m[Info] Running database migration...\e[0m" +yarn workspace @sourcebot/db prisma:migrate:prod + # Run supervisord exec supervisord -c /etc/supervisor/conf.d/supervisord.conf \ No newline at end of file diff --git a/package.json b/package.json index cf4e8ed5..cb2f60c1 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,19 @@ "scripts": { "build": "yarn workspaces run build", "test": "yarn workspaces run test", - "dev": "yarn workspace @sourcebot/db prisma:migrate:dev && cross-env SOURCEBOT_TENANT_MODE=single npm-run-all --print-label --parallel dev:zoekt dev:backend dev:web dev:redis", - "dev:mt": "yarn workspace @sourcebot/db prisma:migrate:dev && cross-env SOURCEBOT_TENANT_MODE=multi npm-run-all --print-label --parallel dev:zoekt:mt dev:backend dev:web dev:redis", + "dev": "cross-env SOURCEBOT_TENANT_MODE=single npm-run-all --print-label dev:deps:start dev:deps:wait dev:start", + "dev:mt": "cross-env SOURCEBOT_TENANT_MODE=multi npm-run-all --print-label dev:deps:start dev:deps:wait dev:start", + "dev:start": "yarn workspace @sourcebot/db prisma:migrate:dev && cross-env npm-run-all --print-label --parallel dev:zoekt dev:backend dev:web dev:redis", "dev:zoekt": "export PATH=\"$PWD/bin:$PATH\" && export SRC_TENANT_ENFORCEMENT_MODE=none && zoekt-webserver -index .sourcebot/index -rpc", - "dev:zoekt:mt": "export PATH=\"$PWD/bin:$PATH\" && export SRC_TENANT_ENFORCEMENT_MODE=strict && zoekt-webserver -index .sourcebot/index -rpc", "dev:backend": "yarn workspace @sourcebot/backend dev:watch", "dev:web": "yarn workspace @sourcebot/web dev", - "dev:redis": "docker ps --filter \"name=redis\" --format \"{{.Names}}\" | grep -q \"^redis$\" && docker rm -f redis; docker run -d --name redis -p 6379:6379 redis" + "dev:deps:start": "npm-run-all --print-label --parallel dev:postgres dev:redis", + "dev:deps:wait": "npm-run-all --print-label --parallel dev:postgres:wait dev:redis:wait", + "dev:deps:stop": "docker stop redis postgres", + "dev:redis": "docker ps --filter 'name=redis' --filter 'status=running' --quiet | grep -q . || docker run -d --rm --name redis -p 6379:6379 redis:7.4.2", + "dev:redis:wait": "sh -c 'while ! nc -z localhost 6379; do echo \"Waiting for Redis...\"; sleep 1; done'", + "dev:postgres": "docker ps --filter 'name=postgres' --filter 'status=running' --quiet | grep -q . || docker run -d --rm --name postgres -p 5432:5432 -v $(pwd)/.sourcebot/db:/var/lib/postgresql/data -e POSTGRES_USER=postgres -e POSTGRES_HOST_AUTH_METHOD=trust -e POSTGRES_DB=sourcebot postgres:17.2", + "dev:postgres:wait": "sh -c 'while ! nc -z localhost 5432; do echo \"Waiting for PostgreSQL...\"; sleep 1; done'" }, "devDependencies": { "cross-env": "^7.0.3", diff --git a/packages/backend/src/main.ts b/packages/backend/src/main.ts index 0c66ba46..c77ab0d1 100644 --- a/packages/backend/src/main.ts +++ b/packages/backend/src/main.ts @@ -223,6 +223,7 @@ export const main = async (db: PrismaClient, context: AppContext) => { }, data: { syncStatus: ConfigSyncStatus.SYNCED, + syncedAt: new Date() } }) }); diff --git a/packages/db/.env b/packages/db/.env index eda137b8..0dd95851 100644 --- a/packages/db/.env +++ b/packages/db/.env @@ -1 +1 @@ -DATABASE_URL=file:../../../.sourcebot/db.sqlite \ No newline at end of file +DATABASE_URL=postgresql://postgres@localhost:5432/sourcebot \ No newline at end of file diff --git a/packages/db/prisma/migrations/20250114182749_repo_init/migration.sql b/packages/db/prisma/migrations/20250114182749_repo_init/migration.sql deleted file mode 100644 index eba36b5d..00000000 --- a/packages/db/prisma/migrations/20250114182749_repo_init/migration.sql +++ /dev/null @@ -1,18 +0,0 @@ --- CreateTable -CREATE TABLE "Repo" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "name" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "indexedAt" DATETIME, - "isFork" BOOLEAN NOT NULL, - "isArchived" BOOLEAN NOT NULL, - "metadata" JSONB NOT NULL, - "cloneUrl" TEXT NOT NULL, - "external_id" TEXT NOT NULL, - "external_codeHostType" TEXT NOT NULL, - "external_codeHostUrl" TEXT NOT NULL -); - --- CreateIndex -CREATE UNIQUE INDEX "Repo_external_id_external_codeHostUrl_key" ON "Repo"("external_id", "external_codeHostUrl"); diff --git a/packages/db/prisma/migrations/20250114222109_add_tenant_id_to_repo/migration.sql b/packages/db/prisma/migrations/20250114222109_add_tenant_id_to_repo/migration.sql deleted file mode 100644 index d8008511..00000000 --- a/packages/db/prisma/migrations/20250114222109_add_tenant_id_to_repo/migration.sql +++ /dev/null @@ -1,30 +0,0 @@ -/* - Warnings: - - - Added the required column `tenantId` to the `Repo` table without a default value. This is not possible if the table is not empty. - -*/ --- RedefineTables -PRAGMA defer_foreign_keys=ON; -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Repo" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "name" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "indexedAt" DATETIME, - "isFork" BOOLEAN NOT NULL, - "isArchived" BOOLEAN NOT NULL, - "metadata" JSONB NOT NULL, - "cloneUrl" TEXT NOT NULL, - "tenantId" INTEGER NOT NULL, - "external_id" TEXT NOT NULL, - "external_codeHostType" TEXT NOT NULL, - "external_codeHostUrl" TEXT NOT NULL -); -INSERT INTO "new_Repo" ("cloneUrl", "createdAt", "external_codeHostType", "external_codeHostUrl", "external_id", "id", "indexedAt", "isArchived", "isFork", "metadata", "name", "updatedAt") SELECT "cloneUrl", "createdAt", "external_codeHostType", "external_codeHostUrl", "external_id", "id", "indexedAt", "isArchived", "isFork", "metadata", "name", "updatedAt" FROM "Repo"; -DROP TABLE "Repo"; -ALTER TABLE "new_Repo" RENAME TO "Repo"; -CREATE UNIQUE INDEX "Repo_external_id_external_codeHostUrl_key" ON "Repo"("external_id", "external_codeHostUrl"); -PRAGMA foreign_keys=ON; -PRAGMA defer_foreign_keys=OFF; diff --git a/packages/db/prisma/migrations/20250115193735_auth_js_models/migration.sql b/packages/db/prisma/migrations/20250115193735_auth_js_models/migration.sql deleted file mode 100644 index a476629a..00000000 --- a/packages/db/prisma/migrations/20250115193735_auth_js_models/migration.sql +++ /dev/null @@ -1,45 +0,0 @@ --- CreateTable -CREATE TABLE "User" ( - "id" TEXT NOT NULL PRIMARY KEY, - "name" TEXT, - "email" TEXT, - "emailVerified" DATETIME, - "image" TEXT, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL -); - --- CreateTable -CREATE TABLE "Account" ( - "id" TEXT NOT NULL PRIMARY KEY, - "userId" TEXT NOT NULL, - "type" TEXT NOT NULL, - "provider" TEXT NOT NULL, - "providerAccountId" TEXT NOT NULL, - "refresh_token" TEXT, - "access_token" TEXT, - "expires_at" INTEGER, - "token_type" TEXT, - "scope" TEXT, - "id_token" TEXT, - "session_state" TEXT, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "VerificationToken" ( - "identifier" TEXT NOT NULL, - "token" TEXT NOT NULL, - "expires" DATETIME NOT NULL -); - --- CreateIndex -CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); - --- CreateIndex -CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account"("provider", "providerAccountId"); - --- CreateIndex -CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token"); diff --git a/packages/db/prisma/migrations/20250115221611_add_indexing_status_to_repo/migration.sql b/packages/db/prisma/migrations/20250115221611_add_indexing_status_to_repo/migration.sql deleted file mode 100644 index 1531290d..00000000 --- a/packages/db/prisma/migrations/20250115221611_add_indexing_status_to_repo/migration.sql +++ /dev/null @@ -1,25 +0,0 @@ --- RedefineTables -PRAGMA defer_foreign_keys=ON; -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Repo" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "name" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "indexedAt" DATETIME, - "isFork" BOOLEAN NOT NULL, - "isArchived" BOOLEAN NOT NULL, - "metadata" JSONB NOT NULL, - "cloneUrl" TEXT NOT NULL, - "tenantId" INTEGER NOT NULL, - "repoIndexingStatus" TEXT NOT NULL DEFAULT 'NEW', - "external_id" TEXT NOT NULL, - "external_codeHostType" TEXT NOT NULL, - "external_codeHostUrl" TEXT NOT NULL -); -INSERT INTO "new_Repo" ("cloneUrl", "createdAt", "external_codeHostType", "external_codeHostUrl", "external_id", "id", "indexedAt", "isArchived", "isFork", "metadata", "name", "tenantId", "updatedAt") SELECT "cloneUrl", "createdAt", "external_codeHostType", "external_codeHostUrl", "external_id", "id", "indexedAt", "isArchived", "isFork", "metadata", "name", "tenantId", "updatedAt" FROM "Repo"; -DROP TABLE "Repo"; -ALTER TABLE "new_Repo" RENAME TO "Repo"; -CREATE UNIQUE INDEX "Repo_external_id_external_codeHostUrl_key" ON "Repo"("external_id", "external_codeHostUrl"); -PRAGMA foreign_keys=ON; -PRAGMA defer_foreign_keys=OFF; diff --git a/packages/db/prisma/migrations/20250116233531_add_orgs_table/migration.sql b/packages/db/prisma/migrations/20250116233531_add_orgs_table/migration.sql deleted file mode 100644 index 871c0bfd..00000000 --- a/packages/db/prisma/migrations/20250116233531_add_orgs_table/migration.sql +++ /dev/null @@ -1,18 +0,0 @@ --- CreateTable -CREATE TABLE "Org" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "name" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL -); - --- CreateTable -CREATE TABLE "UserToOrg" ( - "joinedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "orgId" INTEGER NOT NULL, - "userId" TEXT NOT NULL, - - PRIMARY KEY ("orgId", "userId"), - CONSTRAINT "UserToOrg_orgId_fkey" FOREIGN KEY ("orgId") REFERENCES "Org" ("id") ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT "UserToOrg_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); diff --git a/packages/db/prisma/migrations/20250117183646_add_config_table/migration.sql b/packages/db/prisma/migrations/20250117183646_add_config_table/migration.sql deleted file mode 100644 index e6fc16ae..00000000 --- a/packages/db/prisma/migrations/20250117183646_add_config_table/migration.sql +++ /dev/null @@ -1,11 +0,0 @@ --- CreateTable -CREATE TABLE "Config" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "data" JSONB NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "syncedAt" DATETIME, - "syncStatus" TEXT NOT NULL DEFAULT 'SYNC_NEEDED', - "orgId" INTEGER NOT NULL, - CONSTRAINT "Config_orgId_fkey" FOREIGN KEY ("orgId") REFERENCES "Org" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); diff --git a/packages/db/prisma/migrations/20250120201905_add_role/migration.sql b/packages/db/prisma/migrations/20250120201905_add_role/migration.sql deleted file mode 100644 index 7636d14c..00000000 --- a/packages/db/prisma/migrations/20250120201905_add_role/migration.sql +++ /dev/null @@ -1,18 +0,0 @@ --- RedefineTables -PRAGMA defer_foreign_keys=ON; -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_UserToOrg" ( - "joinedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "orgId" INTEGER NOT NULL, - "userId" TEXT NOT NULL, - "role" TEXT NOT NULL DEFAULT 'MEMBER', - - PRIMARY KEY ("orgId", "userId"), - CONSTRAINT "UserToOrg_orgId_fkey" FOREIGN KEY ("orgId") REFERENCES "Org" ("id") ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT "UserToOrg_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); -INSERT INTO "new_UserToOrg" ("joinedAt", "orgId", "userId") SELECT "joinedAt", "orgId", "userId" FROM "UserToOrg"; -DROP TABLE "UserToOrg"; -ALTER TABLE "new_UserToOrg" RENAME TO "UserToOrg"; -PRAGMA foreign_keys=ON; -PRAGMA defer_foreign_keys=OFF; diff --git a/packages/db/prisma/migrations/20250120222015_add_active_org_id/migration.sql b/packages/db/prisma/migrations/20250120222015_add_active_org_id/migration.sql deleted file mode 100644 index 2113e34a..00000000 --- a/packages/db/prisma/migrations/20250120222015_add_active_org_id/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "User" ADD COLUMN "activeOrgId" INTEGER; diff --git a/packages/db/prisma/migrations/20250120230752_relate_repo_to_org/migration.sql b/packages/db/prisma/migrations/20250120230752_relate_repo_to_org/migration.sql deleted file mode 100644 index 7ef2794f..00000000 --- a/packages/db/prisma/migrations/20250120230752_relate_repo_to_org/migration.sql +++ /dev/null @@ -1,27 +0,0 @@ --- RedefineTables -PRAGMA defer_foreign_keys=ON; -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Repo" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "name" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "indexedAt" DATETIME, - "isFork" BOOLEAN NOT NULL, - "isArchived" BOOLEAN NOT NULL, - "metadata" JSONB NOT NULL, - "cloneUrl" TEXT NOT NULL, - "tenantId" INTEGER NOT NULL, - "repoIndexingStatus" TEXT NOT NULL DEFAULT 'NEW', - "external_id" TEXT NOT NULL, - "external_codeHostType" TEXT NOT NULL, - "external_codeHostUrl" TEXT NOT NULL, - "orgId" INTEGER, - CONSTRAINT "Repo_orgId_fkey" FOREIGN KEY ("orgId") REFERENCES "Org" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); -INSERT INTO "new_Repo" ("cloneUrl", "createdAt", "external_codeHostType", "external_codeHostUrl", "external_id", "id", "indexedAt", "isArchived", "isFork", "metadata", "name", "repoIndexingStatus", "tenantId", "updatedAt") SELECT "cloneUrl", "createdAt", "external_codeHostType", "external_codeHostUrl", "external_id", "id", "indexedAt", "isArchived", "isFork", "metadata", "name", "repoIndexingStatus", "tenantId", "updatedAt" FROM "Repo"; -DROP TABLE "Repo"; -ALTER TABLE "new_Repo" RENAME TO "Repo"; -CREATE UNIQUE INDEX "Repo_external_id_external_codeHostUrl_key" ON "Repo"("external_id", "external_codeHostUrl"); -PRAGMA foreign_keys=ON; -PRAGMA defer_foreign_keys=OFF; diff --git a/packages/db/prisma/migrations/20250122225856_postgres_init/migration.sql b/packages/db/prisma/migrations/20250122225856_postgres_init/migration.sql new file mode 100644 index 00000000..4593d20e --- /dev/null +++ b/packages/db/prisma/migrations/20250122225856_postgres_init/migration.sql @@ -0,0 +1,130 @@ +-- CreateEnum +CREATE TYPE "RepoIndexingStatus" AS ENUM ('NEW', 'IN_INDEX_QUEUE', 'INDEXING', 'INDEXED', 'FAILED'); + +-- CreateEnum +CREATE TYPE "ConfigSyncStatus" AS ENUM ('SYNC_NEEDED', 'IN_SYNC_QUEUE', 'SYNCING', 'SYNCED', 'FAILED'); + +-- CreateEnum +CREATE TYPE "OrgRole" AS ENUM ('OWNER', 'MEMBER'); + +-- CreateTable +CREATE TABLE "Repo" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "indexedAt" TIMESTAMP(3), + "isFork" BOOLEAN NOT NULL, + "isArchived" BOOLEAN NOT NULL, + "metadata" JSONB NOT NULL, + "cloneUrl" TEXT NOT NULL, + "tenantId" INTEGER NOT NULL, + "repoIndexingStatus" "RepoIndexingStatus" NOT NULL DEFAULT 'NEW', + "external_id" TEXT NOT NULL, + "external_codeHostType" TEXT NOT NULL, + "external_codeHostUrl" TEXT NOT NULL, + "orgId" INTEGER, + + CONSTRAINT "Repo_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Config" ( + "id" SERIAL NOT NULL, + "data" JSONB NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "syncedAt" TIMESTAMP(3), + "syncStatus" "ConfigSyncStatus" NOT NULL DEFAULT 'SYNC_NEEDED', + "orgId" INTEGER NOT NULL, + + CONSTRAINT "Config_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Org" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Org_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UserToOrg" ( + "joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "orgId" INTEGER NOT NULL, + "userId" TEXT NOT NULL, + "role" "OrgRole" NOT NULL DEFAULT 'MEMBER', + + CONSTRAINT "UserToOrg_pkey" PRIMARY KEY ("orgId","userId") +); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "name" TEXT, + "email" TEXT, + "emailVerified" TIMESTAMP(3), + "image" TEXT, + "activeOrgId" INTEGER, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Account" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "type" TEXT NOT NULL, + "provider" TEXT NOT NULL, + "providerAccountId" TEXT NOT NULL, + "refresh_token" TEXT, + "access_token" TEXT, + "expires_at" INTEGER, + "token_type" TEXT, + "scope" TEXT, + "id_token" TEXT, + "session_state" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Account_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "VerificationToken" ( + "identifier" TEXT NOT NULL, + "token" TEXT NOT NULL, + "expires" TIMESTAMP(3) NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "Repo_external_id_external_codeHostUrl_key" ON "Repo"("external_id", "external_codeHostUrl"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account"("provider", "providerAccountId"); + +-- CreateIndex +CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token"); + +-- AddForeignKey +ALTER TABLE "Repo" ADD CONSTRAINT "Repo_orgId_fkey" FOREIGN KEY ("orgId") REFERENCES "Org"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Config" ADD CONSTRAINT "Config_orgId_fkey" FOREIGN KEY ("orgId") REFERENCES "Org"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UserToOrg" ADD CONSTRAINT "UserToOrg_orgId_fkey" FOREIGN KEY ("orgId") REFERENCES "Org"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UserToOrg" ADD CONSTRAINT "UserToOrg_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Account" ADD CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/db/prisma/migrations/migration_lock.toml b/packages/db/prisma/migrations/migration_lock.toml index e1640d1f..648c57fd 100644 --- a/packages/db/prisma/migrations/migration_lock.toml +++ b/packages/db/prisma/migrations/migration_lock.toml @@ -1,3 +1,3 @@ # Please do not edit this file manually # It should be added in your version-control system (e.g., Git) -provider = "sqlite" \ No newline at end of file +provider = "postgresql" \ No newline at end of file diff --git a/packages/db/prisma/schema.prisma b/packages/db/prisma/schema.prisma index 92661bcb..7490155d 100644 --- a/packages/db/prisma/schema.prisma +++ b/packages/db/prisma/schema.prisma @@ -6,7 +6,7 @@ generator client { } datasource db { - provider = "sqlite" + provider = "postgresql" url = env("DATABASE_URL") }