mirror of
https://github.com/sourcebot-dev/sourcebot.git
synced 2025-12-13 12:55:19 +00:00
Migrate to postgres (#174)
* spin up postgres in docker container * get initial pol of postgres db working in docker image * spin up postgres server in dev case * updated syncedAt date after config sync: * remove unnecessary port expose in docker file
This commit is contained in:
parent
8a3521b080
commit
a5006c52fe
16 changed files with 189 additions and 218 deletions
29
Dockerfile
29
Dockerfile
|
|
@ -47,7 +47,6 @@ ENV NEXT_PUBLIC_POSTHOG_PAPIK=BAKED_NEXT_PUBLIC_POSTHOG_PAPIK
|
||||||
|
|
||||||
RUN yarn workspace @sourcebot/web build
|
RUN yarn workspace @sourcebot/web build
|
||||||
|
|
||||||
|
|
||||||
# ------ Build Backend ------
|
# ------ Build Backend ------
|
||||||
FROM node-alpine AS backend-builder
|
FROM node-alpine AS backend-builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
@ -60,6 +59,7 @@ COPY --from=database-builder /app/packages/db ./packages/db
|
||||||
RUN yarn workspace @sourcebot/backend install --frozen-lockfile
|
RUN yarn workspace @sourcebot/backend install --frozen-lockfile
|
||||||
RUN yarn workspace @sourcebot/backend build
|
RUN yarn workspace @sourcebot/backend build
|
||||||
|
|
||||||
|
|
||||||
# ------ Runner ------
|
# ------ Runner ------
|
||||||
FROM node-alpine AS runner
|
FROM node-alpine AS runner
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
@ -68,6 +68,8 @@ ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
ENV DATA_DIR=/data
|
ENV DATA_DIR=/data
|
||||||
ENV CONFIG_PATH=$DATA_DIR/config.json
|
ENV CONFIG_PATH=$DATA_DIR/config.json
|
||||||
ENV DATA_CACHE_DIR=$DATA_DIR/.sourcebot
|
ENV DATA_CACHE_DIR=$DATA_DIR/.sourcebot
|
||||||
|
ENV DB_DATA_DIR=$DATA_CACHE_DIR/db
|
||||||
|
ENV DB_NAME=sourcebot
|
||||||
|
|
||||||
ARG SOURCEBOT_VERSION=unknown
|
ARG SOURCEBOT_VERSION=unknown
|
||||||
ENV SOURCEBOT_VERSION=$SOURCEBOT_VERSION
|
ENV SOURCEBOT_VERSION=$SOURCEBOT_VERSION
|
||||||
|
|
@ -94,23 +96,23 @@ ENV POSTHOG_PAPIK=$POSTHOG_PAPIK
|
||||||
# ENV SOURCEBOT_TELEMETRY_DISABLED=1
|
# ENV SOURCEBOT_TELEMETRY_DISABLED=1
|
||||||
|
|
||||||
# Configure dependencies
|
# 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
|
# Configure zoekt
|
||||||
COPY vendor/zoekt/install-ctags-alpine.sh .
|
COPY vendor/zoekt/install-ctags-alpine.sh .
|
||||||
RUN ./install-ctags-alpine.sh && rm install-ctags-alpine.sh
|
RUN ./install-ctags-alpine.sh && rm install-ctags-alpine.sh
|
||||||
RUN mkdir -p ${DATA_CACHE_DIR}
|
RUN mkdir -p ${DATA_CACHE_DIR}
|
||||||
COPY --from=zoekt-builder \
|
COPY --from=zoekt-builder \
|
||||||
/cmd/zoekt-git-index \
|
/cmd/zoekt-git-index \
|
||||||
/cmd/zoekt-indexserver \
|
/cmd/zoekt-indexserver \
|
||||||
/cmd/zoekt-mirror-github \
|
/cmd/zoekt-mirror-github \
|
||||||
/cmd/zoekt-mirror-gitiles \
|
/cmd/zoekt-mirror-gitiles \
|
||||||
/cmd/zoekt-mirror-bitbucket-server \
|
/cmd/zoekt-mirror-bitbucket-server \
|
||||||
/cmd/zoekt-mirror-gitlab \
|
/cmd/zoekt-mirror-gitlab \
|
||||||
/cmd/zoekt-mirror-gerrit \
|
/cmd/zoekt-mirror-gerrit \
|
||||||
/cmd/zoekt-webserver \
|
/cmd/zoekt-webserver \
|
||||||
/cmd/zoekt-index \
|
/cmd/zoekt-index \
|
||||||
/usr/local/bin/
|
/usr/local/bin/
|
||||||
|
|
||||||
# Configure the webapp
|
# Configure the webapp
|
||||||
COPY --from=web-builder /app/packages/web/public ./packages/web/public
|
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
|
COPY --from=backend-builder /app/packages/backend ./packages/backend
|
||||||
|
|
||||||
# Configure the database
|
# 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/node_modules ./node_modules
|
||||||
COPY --from=database-builder /app/packages/db ./packages/db
|
COPY --from=database-builder /app/packages/db ./packages/db
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,12 @@ if [ ! -d "$DATA_CACHE_DIR" ]; then
|
||||||
mkdir -p "$DATA_CACHE_DIR"
|
mkdir -p "$DATA_CACHE_DIR"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Run a Database migration
|
# Check if DB_DATA_DIR exists, if not initialize it
|
||||||
echo -e "\e[34m[Info] Running database migration...\e[0m"
|
if [ ! -d "$DB_DATA_DIR" ]; then
|
||||||
export DATABASE_URL="file:$DATA_CACHE_DIR/db.sqlite"
|
echo -e "\e[34m[Info] Initializing database at $DB_DATA_DIR...\e[0m"
|
||||||
yarn workspace @sourcebot/db prisma:migrate:prod
|
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
|
# In order to detect if this is the first run, we create a `.installed` file in
|
||||||
# the cache directory.
|
# 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
|
# Run supervisord
|
||||||
exec supervisord -c /etc/supervisor/conf.d/supervisord.conf
|
exec supervisord -c /etc/supervisor/conf.d/supervisord.conf
|
||||||
14
package.json
14
package.json
|
|
@ -6,13 +6,19 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "yarn workspaces run build",
|
"build": "yarn workspaces run build",
|
||||||
"test": "yarn workspaces run test",
|
"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": "cross-env SOURCEBOT_TENANT_MODE=single npm-run-all --print-label dev:deps:start dev:deps:wait dev:start",
|
||||||
"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: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": "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:backend": "yarn workspace @sourcebot/backend dev:watch",
|
||||||
"dev:web": "yarn workspace @sourcebot/web dev",
|
"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": {
|
"devDependencies": {
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
DATABASE_URL=file:../../../.sourcebot/db.sqlite
|
DATABASE_URL=postgresql://postgres@localhost:5432/sourcebot
|
||||||
|
|
@ -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");
|
|
||||||
|
|
@ -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;
|
|
||||||
|
|
@ -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");
|
|
||||||
|
|
@ -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;
|
|
||||||
|
|
@ -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
|
|
||||||
);
|
|
||||||
|
|
@ -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
|
|
||||||
);
|
|
||||||
|
|
@ -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;
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
-- AlterTable
|
|
||||||
ALTER TABLE "User" ADD COLUMN "activeOrgId" INTEGER;
|
|
||||||
|
|
@ -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;
|
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
# Please do not edit this file manually
|
# Please do not edit this file manually
|
||||||
# It should be added in your version-control system (e.g., Git)
|
# It should be added in your version-control system (e.g., Git)
|
||||||
provider = "sqlite"
|
provider = "postgresql"
|
||||||
|
|
@ -6,7 +6,7 @@ generator client {
|
||||||
}
|
}
|
||||||
|
|
||||||
datasource db {
|
datasource db {
|
||||||
provider = "sqlite"
|
provider = "postgresql"
|
||||||
url = env("DATABASE_URL")
|
url = env("DATABASE_URL")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue