From ce32879386d2019b32dc7ded56f25614e9b9f483 Mon Sep 17 00:00:00 2001 From: fantasticit Date: Wed, 29 Jun 2022 00:20:12 +0800 Subject: [PATCH] server: use shortId --- .../server/src/entities/document.entity.ts | 10 ++++- packages/server/src/entities/wiki.entity.ts | 10 ++++- .../server/src/helpers/shortid.herlper.ts | 43 +++++++++++++++++++ 3 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 packages/server/src/helpers/shortid.herlper.ts diff --git a/packages/server/src/entities/document.entity.ts b/packages/server/src/entities/document.entity.ts index 7783e3a3..b1ee38a4 100644 --- a/packages/server/src/entities/document.entity.ts +++ b/packages/server/src/entities/document.entity.ts @@ -1,10 +1,16 @@ +import { getShortId } from '@helpers/shortid.herlper'; import { DocumentStatus } from '@think/domains'; import { Exclude } from 'class-transformer'; -import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'; +import { BeforeInsert, Column, CreateDateColumn, Entity, PrimaryColumn, UpdateDateColumn } from 'typeorm'; @Entity('document') export class DocumentEntity { - @PrimaryGeneratedColumn('uuid') + @BeforeInsert() + getShortId() { + this.id = getShortId(); + } + + @PrimaryColumn() public id: string; @Column({ type: 'varchar', comment: '文档所属知识库 Id' }) diff --git a/packages/server/src/entities/wiki.entity.ts b/packages/server/src/entities/wiki.entity.ts index c3861cb6..988b1b38 100644 --- a/packages/server/src/entities/wiki.entity.ts +++ b/packages/server/src/entities/wiki.entity.ts @@ -1,10 +1,16 @@ +import { getShortId } from '@helpers/shortid.herlper'; import { DEFAULT_WIKI_AVATAR } from '@think/constants'; import { WikiStatus } from '@think/domains'; -import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'; +import { BeforeInsert, Column, CreateDateColumn, Entity, PrimaryColumn, UpdateDateColumn } from 'typeorm'; @Entity('wiki') export class WikiEntity { - @PrimaryGeneratedColumn('uuid') + @BeforeInsert() + getShortId() { + this.id = getShortId(); + } + + @PrimaryColumn() public id: string; @Column({ type: 'varchar', length: 200, comment: '知识库名称' }) diff --git a/packages/server/src/helpers/shortid.herlper.ts b/packages/server/src/helpers/shortid.herlper.ts new file mode 100644 index 00000000..043fc0e7 --- /dev/null +++ b/packages/server/src/helpers/shortid.herlper.ts @@ -0,0 +1,43 @@ +import { randomFillSync } from 'node:crypto'; + +const urlAlphabet = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'; + +// It is best to make fewer, larger requests to the crypto module to +// avoid system call overhead. So, random numbers are generated in a +// pool. The pool is a Buffer that is larger than the initial random +// request size by this multiplier. The pool is enlarged if subsequent +// requests exceed the maximum buffer size. +const POOL_SIZE_MULTIPLIER = 128; +let pool, poolOffset; + +const fillPool = (bytes) => { + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); + randomFillSync(pool); + poolOffset = 0; + } else if (poolOffset + bytes > pool.length) { + randomFillSync(pool); + poolOffset = 0; + } + poolOffset += bytes; +}; + +const nanoid = (size = 21) => { + // `-=` convert `size` to number to prevent `valueOf` abusing + fillPool((size -= 0)); + let id = ''; + // We are reading directly from the random pool to avoid creating new array + for (let i = poolOffset - size; i < poolOffset; i++) { + // It is incorrect to use bytes exceeding the alphabet size. + // The following mask reduces the random byte in the 0-255 value + // range to the 0-63 value range. Therefore, adding hacks, such + // as empty string fallback or magic numbers, is unneccessary because + // the bitmask trims bytes down to the alphabet size. + id += urlAlphabet[pool[i] & 63]; + } + return id; +}; + +export const getShortId = () => { + return nanoid(12); +};