server: use shortId

This commit is contained in:
fantasticit 2022-06-29 00:20:12 +08:00
parent fb6fdfffb5
commit ce32879386
3 changed files with 59 additions and 4 deletions

View File

@ -1,10 +1,16 @@
import { getShortId } from '@helpers/shortid.herlper';
import { DocumentStatus } from '@think/domains'; import { DocumentStatus } from '@think/domains';
import { Exclude } from 'class-transformer'; import { Exclude } from 'class-transformer';
import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'; import { BeforeInsert, Column, CreateDateColumn, Entity, PrimaryColumn, UpdateDateColumn } from 'typeorm';
@Entity('document') @Entity('document')
export class DocumentEntity { export class DocumentEntity {
@PrimaryGeneratedColumn('uuid') @BeforeInsert()
getShortId() {
this.id = getShortId();
}
@PrimaryColumn()
public id: string; public id: string;
@Column({ type: 'varchar', comment: '文档所属知识库 Id' }) @Column({ type: 'varchar', comment: '文档所属知识库 Id' })

View File

@ -1,10 +1,16 @@
import { getShortId } from '@helpers/shortid.herlper';
import { DEFAULT_WIKI_AVATAR } from '@think/constants'; import { DEFAULT_WIKI_AVATAR } from '@think/constants';
import { WikiStatus } from '@think/domains'; import { WikiStatus } from '@think/domains';
import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'; import { BeforeInsert, Column, CreateDateColumn, Entity, PrimaryColumn, UpdateDateColumn } from 'typeorm';
@Entity('wiki') @Entity('wiki')
export class WikiEntity { export class WikiEntity {
@PrimaryGeneratedColumn('uuid') @BeforeInsert()
getShortId() {
this.id = getShortId();
}
@PrimaryColumn()
public id: string; public id: string;
@Column({ type: 'varchar', length: 200, comment: '知识库名称' }) @Column({ type: 'varchar', length: 200, comment: '知识库名称' })

View File

@ -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);
};