Add proper ORM and postgres support (#3978)
* Add postgresql support * Fixes * Fix perfs
This commit is contained in:
70
packages/twenty-website/src/database/database.ts
Normal file
70
packages/twenty-website/src/database/database.ts
Normal file
@ -0,0 +1,70 @@
|
||||
import { createClient } from '@libsql/client';
|
||||
import { drizzle as sqliteDrizzle } from 'drizzle-orm/libsql';
|
||||
import { migrate as sqliteMigrate } from 'drizzle-orm/libsql/migrator';
|
||||
import { drizzle as pgDrizzle } from 'drizzle-orm/postgres-js';
|
||||
import { migrate as postgresMigrate } from 'drizzle-orm/postgres-js/migrator';
|
||||
import { SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core';
|
||||
import postgres from 'postgres';
|
||||
|
||||
import 'dotenv/config';
|
||||
|
||||
// Todo: Deprecate SQLite once prototyping is complete, this is making things impossible to type properly
|
||||
const databaseDriver = process.env.DATABASE_DRIVER;
|
||||
|
||||
const sqliteClient = createClient({
|
||||
url: 'file:twenty-website.sqlite',
|
||||
});
|
||||
const pgClient = postgres(`${process.env.DATABASE_PG_URL}`);
|
||||
const sqliteDb = sqliteDrizzle(sqliteClient, { logger: true });
|
||||
const pgDb = pgDrizzle(pgClient, { logger: true });
|
||||
|
||||
const isSqliteDriver = databaseDriver === 'sqlite';
|
||||
|
||||
const migrate = async () => {
|
||||
if (isSqliteDriver) {
|
||||
await sqliteMigrate(sqliteDb, {
|
||||
migrationsFolder: './src/database/sqlite/migrations',
|
||||
});
|
||||
} else {
|
||||
await postgresMigrate(pgDb, {
|
||||
migrationsFolder: './src/database/postgres/migrations',
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const findAll = (model: SQLiteTableWithColumns<any>) => {
|
||||
return isSqliteDriver
|
||||
? sqliteDb.select().from(model).all()
|
||||
: pgDb.select().from(model).execute();
|
||||
};
|
||||
|
||||
// Todo: rework typing
|
||||
const insertMany = async (
|
||||
model: SQLiteTableWithColumns<any>,
|
||||
data: any,
|
||||
options?: { onConflictKey?: string },
|
||||
) => {
|
||||
if (isSqliteDriver) {
|
||||
const query = sqliteDb.insert(model).values(data);
|
||||
if (options?.onConflictKey) {
|
||||
return query
|
||||
.onConflictDoNothing({
|
||||
target: [model[options.onConflictKey]],
|
||||
})
|
||||
.execute();
|
||||
}
|
||||
return query.execute();
|
||||
}
|
||||
const query = pgDb.insert(model).values(data);
|
||||
if (options?.onConflictKey) {
|
||||
return query
|
||||
.onConflictDoNothing({
|
||||
target: [model[options.onConflictKey]],
|
||||
})
|
||||
.execute();
|
||||
}
|
||||
|
||||
return query.execute();
|
||||
};
|
||||
|
||||
export { findAll, insertMany, migrate };
|
||||
47
packages/twenty-website/src/database/model.ts
Normal file
47
packages/twenty-website/src/database/model.ts
Normal file
@ -0,0 +1,47 @@
|
||||
import {
|
||||
pgIssueLabels,
|
||||
pgIssues,
|
||||
pgLabels,
|
||||
pgPullRequestLabels,
|
||||
pgPullRequests,
|
||||
pgUsers,
|
||||
} from '@/database/postgres/schema-postgres';
|
||||
import {
|
||||
sqlLiteIssueLabels,
|
||||
sqlLiteIssues,
|
||||
sqlLiteLabels,
|
||||
sqlLitePullRequestLabels,
|
||||
sqlLitePullRequests,
|
||||
sqlLiteUsers,
|
||||
} from '@/database/sqlite/schema-sqlite';
|
||||
|
||||
const databaseDriver = process.env.DATABASE_DRIVER;
|
||||
const isSqliteDriver = databaseDriver === 'sqlite';
|
||||
|
||||
export const userModel = isSqliteDriver ? sqlLiteUsers : pgUsers;
|
||||
export const pullRequestModel = isSqliteDriver
|
||||
? sqlLitePullRequests
|
||||
: pgPullRequests;
|
||||
export const issueModel = isSqliteDriver ? sqlLiteIssues : pgIssues;
|
||||
export const labelModel = isSqliteDriver ? sqlLiteLabels : pgLabels;
|
||||
export const pullRequestLabelModel = isSqliteDriver
|
||||
? sqlLitePullRequestLabels
|
||||
: pgPullRequestLabels;
|
||||
export const issueLabelModel = isSqliteDriver
|
||||
? sqlLiteIssueLabels
|
||||
: pgIssueLabels;
|
||||
|
||||
export type User = typeof sqlLiteUsers.$inferSelect;
|
||||
export type PullRequest = typeof sqlLitePullRequests.$inferSelect;
|
||||
export type Issue = typeof sqlLiteIssues.$inferSelect;
|
||||
export type Label = typeof sqlLiteLabels.$inferSelect;
|
||||
export type PullRequestLabel = typeof sqlLitePullRequestLabels.$inferSelect;
|
||||
export type IssueLabel = typeof sqlLiteIssueLabels.$inferSelect;
|
||||
|
||||
export type UserInsert = typeof sqlLiteUsers.$inferInsert;
|
||||
export type PullRequestInsert = typeof sqlLitePullRequests.$inferInsert;
|
||||
export type IssueInsert = typeof sqlLiteIssues.$inferInsert;
|
||||
export type LabelInsert = typeof sqlLiteLabels.$inferInsert;
|
||||
export type PullRequestLabelInsert =
|
||||
typeof sqlLitePullRequestLabels.$inferInsert;
|
||||
export type IssueLabelInsert = typeof sqlLiteIssueLabels.$inferInsert;
|
||||
@ -0,0 +1,14 @@
|
||||
import { Config } from 'drizzle-kit';
|
||||
|
||||
import 'dotenv/config';
|
||||
|
||||
const pgConfig = {
|
||||
schema: './src/database/postgres/schema-postgres.ts',
|
||||
out: './src/database/postgres/migrations',
|
||||
driver: 'pg',
|
||||
dbCredentials: {
|
||||
connectionString: process.env.DATABASE_PG_URL ?? '',
|
||||
},
|
||||
} satisfies Config;
|
||||
|
||||
export default pgConfig;
|
||||
@ -0,0 +1,84 @@
|
||||
CREATE TABLE IF NOT EXISTS "issueLabels" (
|
||||
"issueId" text,
|
||||
"labelId" text
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE IF NOT EXISTS "issues" (
|
||||
"id" text PRIMARY KEY NOT NULL,
|
||||
"externalId" text,
|
||||
"title" text,
|
||||
"body" text,
|
||||
"url" text,
|
||||
"createdAt" text,
|
||||
"updatedAt" text,
|
||||
"closedAt" text,
|
||||
"authorId" text
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE IF NOT EXISTS "labels" (
|
||||
"id" text PRIMARY KEY NOT NULL,
|
||||
"externalId" text,
|
||||
"name" text,
|
||||
"color" text,
|
||||
"description" text
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE IF NOT EXISTS "pullRequestLabels" (
|
||||
"pullRequestExternalId" text,
|
||||
"labelId" text
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE IF NOT EXISTS "pullRequests" (
|
||||
"id" text PRIMARY KEY NOT NULL,
|
||||
"title" text,
|
||||
"body" text,
|
||||
"url" text,
|
||||
"createdAt" text,
|
||||
"updatedAt" text,
|
||||
"closedAt" text,
|
||||
"mergedAt" text,
|
||||
"authorId" text
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE IF NOT EXISTS "users" (
|
||||
"id" text PRIMARY KEY NOT NULL,
|
||||
"avatarUrl" text,
|
||||
"url" text,
|
||||
"isEmployee" text
|
||||
);
|
||||
--> statement-breakpoint
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "issueLabels" ADD CONSTRAINT "issueLabels_issueId_issues_id_fk" FOREIGN KEY ("issueId") REFERENCES "issues"("id") ON DELETE no action ON UPDATE no action;
|
||||
EXCEPTION
|
||||
WHEN duplicate_object THEN null;
|
||||
END $$;
|
||||
--> statement-breakpoint
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "issueLabels" ADD CONSTRAINT "issueLabels_labelId_labels_id_fk" FOREIGN KEY ("labelId") REFERENCES "labels"("id") ON DELETE no action ON UPDATE no action;
|
||||
EXCEPTION
|
||||
WHEN duplicate_object THEN null;
|
||||
END $$;
|
||||
--> statement-breakpoint
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "issues" ADD CONSTRAINT "issues_authorId_users_id_fk" FOREIGN KEY ("authorId") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action;
|
||||
EXCEPTION
|
||||
WHEN duplicate_object THEN null;
|
||||
END $$;
|
||||
--> statement-breakpoint
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "pullRequestLabels" ADD CONSTRAINT "pullRequestLabels_pullRequestExternalId_pullRequests_id_fk" FOREIGN KEY ("pullRequestExternalId") REFERENCES "pullRequests"("id") ON DELETE no action ON UPDATE no action;
|
||||
EXCEPTION
|
||||
WHEN duplicate_object THEN null;
|
||||
END $$;
|
||||
--> statement-breakpoint
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "pullRequestLabels" ADD CONSTRAINT "pullRequestLabels_labelId_labels_id_fk" FOREIGN KEY ("labelId") REFERENCES "labels"("id") ON DELETE no action ON UPDATE no action;
|
||||
EXCEPTION
|
||||
WHEN duplicate_object THEN null;
|
||||
END $$;
|
||||
--> statement-breakpoint
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "pullRequests" ADD CONSTRAINT "pullRequests_authorId_users_id_fk" FOREIGN KEY ("authorId") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action;
|
||||
EXCEPTION
|
||||
WHEN duplicate_object THEN null;
|
||||
END $$;
|
||||
@ -0,0 +1,343 @@
|
||||
{
|
||||
"id": "a7895a79-44a3-4fad-b750-f89d8c04d85c",
|
||||
"prevId": "00000000-0000-0000-0000-000000000000",
|
||||
"version": "5",
|
||||
"dialect": "pg",
|
||||
"tables": {
|
||||
"issueLabels": {
|
||||
"name": "issueLabels",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"issueId": {
|
||||
"name": "issueId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"labelId": {
|
||||
"name": "labelId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"issueLabels_issueId_issues_id_fk": {
|
||||
"name": "issueLabels_issueId_issues_id_fk",
|
||||
"tableFrom": "issueLabels",
|
||||
"tableTo": "issues",
|
||||
"columnsFrom": [
|
||||
"issueId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
},
|
||||
"issueLabels_labelId_labels_id_fk": {
|
||||
"name": "issueLabels_labelId_labels_id_fk",
|
||||
"tableFrom": "issueLabels",
|
||||
"tableTo": "labels",
|
||||
"columnsFrom": [
|
||||
"labelId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"issues": {
|
||||
"name": "issues",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"externalId": {
|
||||
"name": "externalId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"title": {
|
||||
"name": "title",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"body": {
|
||||
"name": "body",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"url": {
|
||||
"name": "url",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"createdAt": {
|
||||
"name": "createdAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"updatedAt": {
|
||||
"name": "updatedAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"closedAt": {
|
||||
"name": "closedAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"authorId": {
|
||||
"name": "authorId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"issues_authorId_users_id_fk": {
|
||||
"name": "issues_authorId_users_id_fk",
|
||||
"tableFrom": "issues",
|
||||
"tableTo": "users",
|
||||
"columnsFrom": [
|
||||
"authorId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"labels": {
|
||||
"name": "labels",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"externalId": {
|
||||
"name": "externalId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"color": {
|
||||
"name": "color",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"description": {
|
||||
"name": "description",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"pullRequestLabels": {
|
||||
"name": "pullRequestLabels",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"pullRequestExternalId": {
|
||||
"name": "pullRequestExternalId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"labelId": {
|
||||
"name": "labelId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"pullRequestLabels_pullRequestExternalId_pullRequests_id_fk": {
|
||||
"name": "pullRequestLabels_pullRequestExternalId_pullRequests_id_fk",
|
||||
"tableFrom": "pullRequestLabels",
|
||||
"tableTo": "pullRequests",
|
||||
"columnsFrom": [
|
||||
"pullRequestExternalId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
},
|
||||
"pullRequestLabels_labelId_labels_id_fk": {
|
||||
"name": "pullRequestLabels_labelId_labels_id_fk",
|
||||
"tableFrom": "pullRequestLabels",
|
||||
"tableTo": "labels",
|
||||
"columnsFrom": [
|
||||
"labelId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"pullRequests": {
|
||||
"name": "pullRequests",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"title": {
|
||||
"name": "title",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"body": {
|
||||
"name": "body",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"url": {
|
||||
"name": "url",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"createdAt": {
|
||||
"name": "createdAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"updatedAt": {
|
||||
"name": "updatedAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"closedAt": {
|
||||
"name": "closedAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"mergedAt": {
|
||||
"name": "mergedAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"authorId": {
|
||||
"name": "authorId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"pullRequests_authorId_users_id_fk": {
|
||||
"name": "pullRequests_authorId_users_id_fk",
|
||||
"tableFrom": "pullRequests",
|
||||
"tableTo": "users",
|
||||
"columnsFrom": [
|
||||
"authorId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"users": {
|
||||
"name": "users",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"avatarUrl": {
|
||||
"name": "avatarUrl",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"url": {
|
||||
"name": "url",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"isEmployee": {
|
||||
"name": "isEmployee",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
}
|
||||
},
|
||||
"enums": {},
|
||||
"schemas": {},
|
||||
"_meta": {
|
||||
"columns": {},
|
||||
"schemas": {},
|
||||
"tables": {}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
{
|
||||
"version": "5",
|
||||
"dialect": "pg",
|
||||
"entries": [
|
||||
{
|
||||
"idx": 0,
|
||||
"version": "5",
|
||||
"when": 1707921820164,
|
||||
"tag": "0000_absent_giant_man",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
import { pgTable, text } from 'drizzle-orm/pg-core';
|
||||
|
||||
export const pgUsers = pgTable('users', {
|
||||
id: text('id').primaryKey(),
|
||||
avatarUrl: text('avatarUrl'),
|
||||
url: text('url'),
|
||||
isEmployee: text('isEmployee'),
|
||||
});
|
||||
|
||||
export const pgPullRequests = pgTable('pullRequests', {
|
||||
id: text('id').primaryKey(),
|
||||
name: text('title'),
|
||||
body: text('body'),
|
||||
url: text('url'),
|
||||
createdAt: text('createdAt'),
|
||||
updatedAt: text('updatedAt'),
|
||||
closedAt: text('closedAt'),
|
||||
mergedAt: text('mergedAt'),
|
||||
authorId: text('authorId').references(() => pgUsers.id),
|
||||
});
|
||||
|
||||
export const pgIssues = pgTable('issues', {
|
||||
id: text('id').primaryKey(),
|
||||
externalId: text('externalId'),
|
||||
title: text('title'),
|
||||
body: text('body'),
|
||||
url: text('url'),
|
||||
createdAt: text('createdAt'),
|
||||
updatedAt: text('updatedAt'),
|
||||
closedAt: text('closedAt'),
|
||||
authorId: text('authorId').references(() => pgUsers.id),
|
||||
});
|
||||
|
||||
export const pgLabels = pgTable('labels', {
|
||||
id: text('id').primaryKey(),
|
||||
externalId: text('externalId'),
|
||||
name: text('name'),
|
||||
color: text('color'),
|
||||
description: text('description'),
|
||||
});
|
||||
|
||||
export const pgPullRequestLabels = pgTable('pullRequestLabels', {
|
||||
pullRequestId: text('pullRequestExternalId').references(
|
||||
() => pgPullRequests.id,
|
||||
),
|
||||
labelId: text('labelId').references(() => pgLabels.id),
|
||||
});
|
||||
|
||||
export const pgIssueLabels = pgTable('issueLabels', {
|
||||
issueId: text('issueId').references(() => pgIssues.id),
|
||||
labelId: text('labelId').references(() => pgLabels.id),
|
||||
});
|
||||
@ -0,0 +1,14 @@
|
||||
import { Config } from 'drizzle-kit';
|
||||
|
||||
import 'dotenv/config';
|
||||
|
||||
const sqliteConfig = {
|
||||
schema: './src/database/sqlite/schema-sqlite.ts',
|
||||
out: './src/database/sqlite/migrations',
|
||||
driver: 'libsql',
|
||||
dbCredentials: {
|
||||
url: 'twenty-website.sqlite',
|
||||
},
|
||||
} satisfies Config;
|
||||
|
||||
export default sqliteConfig;
|
||||
@ -0,0 +1,54 @@
|
||||
CREATE TABLE `issueLabels` (
|
||||
`issueId` text,
|
||||
`labelId` text,
|
||||
FOREIGN KEY (`issueId`) REFERENCES `issues`(`id`) ON UPDATE no action ON DELETE no action,
|
||||
FOREIGN KEY (`labelId`) REFERENCES `labels`(`id`) ON UPDATE no action ON DELETE no action
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `issues` (
|
||||
`id` text PRIMARY KEY NOT NULL,
|
||||
`externalId` text,
|
||||
`title` text,
|
||||
`body` text,
|
||||
`url` text,
|
||||
`createdAt` text,
|
||||
`updatedAt` text,
|
||||
`closedAt` text,
|
||||
`authorId` text,
|
||||
FOREIGN KEY (`authorId`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `labels` (
|
||||
`id` text PRIMARY KEY NOT NULL,
|
||||
`externalId` text,
|
||||
`name` text,
|
||||
`color` text,
|
||||
`description` text
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `pullRequestLabels` (
|
||||
`pullRequestExternalId` text,
|
||||
`labelId` text,
|
||||
FOREIGN KEY (`pullRequestExternalId`) REFERENCES `pullRequests`(`id`) ON UPDATE no action ON DELETE no action,
|
||||
FOREIGN KEY (`labelId`) REFERENCES `labels`(`id`) ON UPDATE no action ON DELETE no action
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `pullRequests` (
|
||||
`id` text PRIMARY KEY NOT NULL,
|
||||
`title` text,
|
||||
`body` text,
|
||||
`url` text,
|
||||
`createdAt` text,
|
||||
`updatedAt` text,
|
||||
`closedAt` text,
|
||||
`mergedAt` text,
|
||||
`authorId` text,
|
||||
FOREIGN KEY (`authorId`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `users` (
|
||||
`id` text PRIMARY KEY NOT NULL,
|
||||
`avatarUrl` text,
|
||||
`url` text,
|
||||
`isEmployee` text
|
||||
);
|
||||
@ -0,0 +1,367 @@
|
||||
{
|
||||
"version": "5",
|
||||
"dialect": "sqlite",
|
||||
"id": "033cd768-53b9-4c60-99ee-be070ea7abd6",
|
||||
"prevId": "00000000-0000-0000-0000-000000000000",
|
||||
"tables": {
|
||||
"issueLabels": {
|
||||
"name": "issueLabels",
|
||||
"columns": {
|
||||
"issueId": {
|
||||
"name": "issueId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"labelId": {
|
||||
"name": "labelId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"issueLabels_issueId_issues_id_fk": {
|
||||
"name": "issueLabels_issueId_issues_id_fk",
|
||||
"tableFrom": "issueLabels",
|
||||
"tableTo": "issues",
|
||||
"columnsFrom": [
|
||||
"issueId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
},
|
||||
"issueLabels_labelId_labels_id_fk": {
|
||||
"name": "issueLabels_labelId_labels_id_fk",
|
||||
"tableFrom": "issueLabels",
|
||||
"tableTo": "labels",
|
||||
"columnsFrom": [
|
||||
"labelId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"issues": {
|
||||
"name": "issues",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"externalId": {
|
||||
"name": "externalId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"title": {
|
||||
"name": "title",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"body": {
|
||||
"name": "body",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"url": {
|
||||
"name": "url",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"createdAt": {
|
||||
"name": "createdAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"updatedAt": {
|
||||
"name": "updatedAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"closedAt": {
|
||||
"name": "closedAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"authorId": {
|
||||
"name": "authorId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"issues_authorId_users_id_fk": {
|
||||
"name": "issues_authorId_users_id_fk",
|
||||
"tableFrom": "issues",
|
||||
"tableTo": "users",
|
||||
"columnsFrom": [
|
||||
"authorId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"labels": {
|
||||
"name": "labels",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"externalId": {
|
||||
"name": "externalId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"color": {
|
||||
"name": "color",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"description": {
|
||||
"name": "description",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"pullRequestLabels": {
|
||||
"name": "pullRequestLabels",
|
||||
"columns": {
|
||||
"pullRequestExternalId": {
|
||||
"name": "pullRequestExternalId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"labelId": {
|
||||
"name": "labelId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"pullRequestLabels_pullRequestExternalId_pullRequests_id_fk": {
|
||||
"name": "pullRequestLabels_pullRequestExternalId_pullRequests_id_fk",
|
||||
"tableFrom": "pullRequestLabels",
|
||||
"tableTo": "pullRequests",
|
||||
"columnsFrom": [
|
||||
"pullRequestExternalId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
},
|
||||
"pullRequestLabels_labelId_labels_id_fk": {
|
||||
"name": "pullRequestLabels_labelId_labels_id_fk",
|
||||
"tableFrom": "pullRequestLabels",
|
||||
"tableTo": "labels",
|
||||
"columnsFrom": [
|
||||
"labelId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"pullRequests": {
|
||||
"name": "pullRequests",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"title": {
|
||||
"name": "title",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"body": {
|
||||
"name": "body",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"url": {
|
||||
"name": "url",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"createdAt": {
|
||||
"name": "createdAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"updatedAt": {
|
||||
"name": "updatedAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"closedAt": {
|
||||
"name": "closedAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"mergedAt": {
|
||||
"name": "mergedAt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"authorId": {
|
||||
"name": "authorId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"pullRequests_authorId_users_id_fk": {
|
||||
"name": "pullRequests_authorId_users_id_fk",
|
||||
"tableFrom": "pullRequests",
|
||||
"tableTo": "users",
|
||||
"columnsFrom": [
|
||||
"authorId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "no action",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"users": {
|
||||
"name": "users",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"avatarUrl": {
|
||||
"name": "avatarUrl",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"url": {
|
||||
"name": "url",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"isEmployee": {
|
||||
"name": "isEmployee",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
}
|
||||
},
|
||||
"enums": {},
|
||||
"_meta": {
|
||||
"schemas": {},
|
||||
"tables": {},
|
||||
"columns": {}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
{
|
||||
"version": "5",
|
||||
"dialect": "sqlite",
|
||||
"entries": [
|
||||
{
|
||||
"idx": 0,
|
||||
"version": "5",
|
||||
"when": 1707920913359,
|
||||
"tag": "0000_small_karma",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
52
packages/twenty-website/src/database/sqlite/schema-sqlite.ts
Normal file
52
packages/twenty-website/src/database/sqlite/schema-sqlite.ts
Normal file
@ -0,0 +1,52 @@
|
||||
import { sqliteTable, text } from 'drizzle-orm/sqlite-core';
|
||||
|
||||
export const sqlLiteUsers = sqliteTable('users', {
|
||||
id: text('id').primaryKey(),
|
||||
avatarUrl: text('avatarUrl'),
|
||||
url: text('url'),
|
||||
isEmployee: text('isEmployee'),
|
||||
});
|
||||
|
||||
export const sqlLitePullRequests = sqliteTable('pullRequests', {
|
||||
id: text('id').primaryKey(),
|
||||
name: text('title'),
|
||||
body: text('body'),
|
||||
url: text('url'),
|
||||
createdAt: text('createdAt'),
|
||||
updatedAt: text('updatedAt'),
|
||||
closedAt: text('closedAt'),
|
||||
mergedAt: text('mergedAt'),
|
||||
authorId: text('authorId').references(() => sqlLiteUsers.id),
|
||||
});
|
||||
|
||||
export const sqlLiteIssues = sqliteTable('issues', {
|
||||
id: text('id').primaryKey(),
|
||||
externalId: text('externalId'),
|
||||
title: text('title'),
|
||||
body: text('body'),
|
||||
url: text('url'),
|
||||
createdAt: text('createdAt'),
|
||||
updatedAt: text('updatedAt'),
|
||||
closedAt: text('closedAt'),
|
||||
authorId: text('authorId').references(() => sqlLiteUsers.id),
|
||||
});
|
||||
|
||||
export const sqlLiteLabels = sqliteTable('labels', {
|
||||
id: text('id').primaryKey(),
|
||||
externalId: text('externalId'),
|
||||
name: text('name'),
|
||||
color: text('color'),
|
||||
description: text('description'),
|
||||
});
|
||||
|
||||
export const sqlLitePullRequestLabels = sqliteTable('pullRequestLabels', {
|
||||
pullRequestId: text('pullRequestExternalId').references(
|
||||
() => sqlLitePullRequests.id,
|
||||
),
|
||||
labelId: text('labelId').references(() => sqlLiteLabels.id),
|
||||
});
|
||||
|
||||
export const sqlLiteIssueLabels = sqliteTable('issueLabels', {
|
||||
issueId: text('issueId').references(() => sqlLiteIssues.id),
|
||||
labelId: text('labelId').references(() => sqlLiteLabels.id),
|
||||
});
|
||||
Reference in New Issue
Block a user