mirror of
https://github.com/docmost/docmost.git
synced 2025-11-14 19:01:09 +10:00
use uuid7
This commit is contained in:
@ -0,0 +1,53 @@
|
||||
import { Kysely, sql } from 'kysely';
|
||||
|
||||
export async function up(db: Kysely<any>): Promise<void> {
|
||||
await sql`
|
||||
/*
|
||||
* MIT License - Copyright (c) 2023-2024 Fabio Lima
|
||||
* Source: https://gist.githubusercontent.com/fabiolimace/515a0440e3e40efeb234e12644a6a346/
|
||||
*/
|
||||
CREATE OR REPLACE FUNCTION gen_uuid_v7() RETURNS uuid AS $$
|
||||
declare
|
||||
v_time numeric := null;
|
||||
|
||||
v_unix_t numeric := null;
|
||||
v_rand_a numeric := null;
|
||||
v_rand_b numeric := null;
|
||||
|
||||
v_unix_t_hex varchar := null;
|
||||
v_rand_a_hex varchar := null;
|
||||
v_rand_b_hex varchar := null;
|
||||
|
||||
v_output_bytes bytea := null;
|
||||
|
||||
c_milli_factor numeric := 10^3::numeric; -- 1000
|
||||
c_micro_factor numeric := 10^6::numeric; -- 1000000
|
||||
c_scale_factor numeric := 4.096::numeric; -- 4.0 * (1024 / 1000)
|
||||
|
||||
c_version bit(64) := x'0000000000007000'; -- RFC-4122 version: b'0111...'
|
||||
c_variant bit(64) := x'8000000000000000'; -- RFC-4122 variant: b'10xx...'
|
||||
|
||||
begin
|
||||
v_time := extract(epoch from clock_timestamp());
|
||||
|
||||
v_unix_t := trunc(v_time * c_milli_factor);
|
||||
v_rand_a := ((v_time * c_micro_factor) - (v_unix_t * c_milli_factor)) * c_scale_factor;
|
||||
v_rand_b := random()::numeric * 2^62::numeric;
|
||||
|
||||
v_unix_t_hex := lpad(to_hex(v_unix_t::bigint), 12, '0');
|
||||
v_rand_a_hex := lpad(to_hex((v_rand_a::bigint::bit(64) | c_version)::bigint), 4, '0');
|
||||
v_rand_b_hex := lpad(to_hex((v_rand_b::bigint::bit(64) | c_variant)::bigint), 16, '0');
|
||||
|
||||
v_output_bytes := decode(v_unix_t_hex || v_rand_a_hex || v_rand_b_hex, 'hex');
|
||||
|
||||
return encode(v_output_bytes, 'hex')::uuid;
|
||||
|
||||
v_output_bytes := decode(v_unix_t_hex || v_rand_a_hex || v_rand_b_hex, 'hex');
|
||||
|
||||
return encode(v_output_bytes, 'hex')::uuid;
|
||||
end $$ LANGUAGE plpgsql;`.execute(db);
|
||||
}
|
||||
|
||||
export async function down(db: Kysely<any>): Promise<void> {
|
||||
await sql`DROP FUNCTION gen_uuid_v7`.execute(db);
|
||||
}
|
||||
@ -5,7 +5,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.createTable('workspaces')
|
||||
.addColumn('id', 'uuid', (col) =>
|
||||
col.primaryKey().defaultTo(sql`gen_random_uuid()`),
|
||||
col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
|
||||
)
|
||||
.addColumn('name', 'varchar', (col) => col)
|
||||
.addColumn('description', 'varchar', (col) => col)
|
||||
|
||||
@ -4,7 +4,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.createTable('users')
|
||||
.addColumn('id', 'uuid', (col) =>
|
||||
col.primaryKey().defaultTo(sql`gen_random_uuid()`),
|
||||
col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
|
||||
)
|
||||
.addColumn('name', 'varchar', (col) => col)
|
||||
.addColumn('email', 'varchar', (col) => col.notNull())
|
||||
|
||||
@ -4,7 +4,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.createTable('groups')
|
||||
.addColumn('id', 'uuid', (col) =>
|
||||
col.primaryKey().defaultTo(sql`gen_random_uuid()`),
|
||||
col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
|
||||
)
|
||||
.addColumn('name', 'varchar', (col) => col.notNull())
|
||||
.addColumn('description', 'text', (col) => col)
|
||||
@ -19,6 +19,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
.addColumn('updated_at', 'timestamptz', (col) =>
|
||||
col.notNull().defaultTo(sql`now()`),
|
||||
)
|
||||
.addColumn('deleted_at', 'timestamptz', (col) => col)
|
||||
.addUniqueConstraint('groups_name_workspace_id_unique', [
|
||||
'name',
|
||||
'workspace_id',
|
||||
@ -29,7 +30,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.createTable('group_users')
|
||||
.addColumn('id', 'uuid', (col) =>
|
||||
col.primaryKey().defaultTo(sql`gen_random_uuid()`),
|
||||
col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
|
||||
)
|
||||
.addColumn('user_id', 'uuid', (col) =>
|
||||
col.references('users.id').onDelete('cascade').notNull(),
|
||||
|
||||
@ -8,7 +8,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.createTable('spaces')
|
||||
.addColumn('id', 'uuid', (col) =>
|
||||
col.primaryKey().defaultTo(sql`gen_random_uuid()`),
|
||||
col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
|
||||
)
|
||||
.addColumn('name', 'varchar', (col) => col)
|
||||
.addColumn('description', 'text', (col) => col)
|
||||
@ -40,7 +40,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.createTable('space_members')
|
||||
.addColumn('id', 'uuid', (col) =>
|
||||
col.primaryKey().defaultTo(sql`gen_random_uuid()`),
|
||||
col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
|
||||
)
|
||||
.addColumn('user_id', 'uuid', (col) =>
|
||||
col.references('users.id').onDelete('cascade'),
|
||||
@ -59,6 +59,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
.addColumn('updated_at', 'timestamptz', (col) =>
|
||||
col.notNull().defaultTo(sql`now()`),
|
||||
)
|
||||
.addColumn('deleted_at', 'timestamptz', (col) => col)
|
||||
.addUniqueConstraint('space_members_space_id_user_id_unique', [
|
||||
'space_id',
|
||||
'user_id',
|
||||
|
||||
@ -4,7 +4,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.createTable('workspace_invitations')
|
||||
.addColumn('id', 'uuid', (col) =>
|
||||
col.primaryKey().defaultTo(sql`gen_random_uuid()`),
|
||||
col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
|
||||
)
|
||||
.addColumn('email', 'varchar', (col) => col)
|
||||
.addColumn('role', 'varchar', (col) => col.notNull())
|
||||
|
||||
@ -4,7 +4,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.createTable('pages')
|
||||
.addColumn('id', 'uuid', (col) =>
|
||||
col.primaryKey().defaultTo(sql`gen_random_uuid()`),
|
||||
col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
|
||||
)
|
||||
.addColumn('slug_id', 'varchar', (col) => col.notNull())
|
||||
.addColumn('title', 'varchar', (col) => col)
|
||||
|
||||
@ -4,7 +4,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.createTable('page_history')
|
||||
.addColumn('id', 'uuid', (col) =>
|
||||
col.primaryKey().defaultTo(sql`gen_random_uuid()`),
|
||||
col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
|
||||
)
|
||||
.addColumn('page_id', 'uuid', (col) =>
|
||||
col.references('pages.id').onDelete('cascade').notNull(),
|
||||
|
||||
@ -4,7 +4,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.createTable('comments')
|
||||
.addColumn('id', 'uuid', (col) =>
|
||||
col.primaryKey().defaultTo(sql`gen_random_uuid()`),
|
||||
col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
|
||||
)
|
||||
.addColumn('content', 'jsonb', (col) => col)
|
||||
.addColumn('selection', 'varchar', (col) => col)
|
||||
|
||||
@ -4,7 +4,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.createTable('attachments')
|
||||
.addColumn('id', 'uuid', (col) =>
|
||||
col.primaryKey().defaultTo(sql`gen_random_uuid()`),
|
||||
col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
|
||||
)
|
||||
.addColumn('file_name', 'varchar', (col) => col.notNull())
|
||||
.addColumn('file_path', 'varchar', (col) => col.notNull())
|
||||
|
||||
Reference in New Issue
Block a user