-
Notifications
You must be signed in to change notification settings - Fork 0
/
PgScriptRepository.ts
65 lines (50 loc) · 2.12 KB
/
PgScriptRepository.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import { TEntityFieldsNames } from './protocols/EntityFieldsName'
import { BaseEntity } from './BaseEntity'
import { TFindOptions } from '@entity'
export default abstract class PgScriptRepository<T extends BaseEntity> {
constructor (private readonly tableName: string) {}
protected generateInsert (fields: Array<TEntityFieldsNames<T>>, returning?: Array<TEntityFieldsNames<T>>, upSert?: Array<TEntityFieldsNames<T>>): string {
const params = fields.map((_, index) => {
return '$'.concat((index + 1).toString())
})
return `INSERT INTO ${this.tableName} (${fields.toString()}) VALUES(${params.toString()})
${upSert ? `ON CONFLICT (${upSert.toString()}) DO NOTHING ` : ''} ${returning ? `Returning ${returning.toString()}` : ''};`
}
protected generateSelect (fields: Array<TEntityFieldsNames<T>>, options?: Omit<TFindOptions<T>, 'params'>): string {
let sql: string = `SELECT ${fields.toString()} FROM ${this.tableName}`
if (options?.where) {
sql += ` where ${options.where}`
}
if (options?.orderBy) {
const order = new Array<string>()
Object.values(options.orderBy).forEach((value) => {
order.push(`${Object.keys(value)} ${Object.values(value)}`)
})
sql += ` order by ${order.join()}`
}
if (options?.Limit) {
sql += ` LIMIT ${options.Limit}`
}
return sql
}
protected generateUpdate (fields: Array<TEntityFieldsNames<T>>, whereFields: Array<TEntityFieldsNames<T>>): string {
let sql: string = `update ${this.tableName} set `
let lastIndex: number = 0
fields.forEach((value, index) => {
lastIndex = index++
sql += `${value} = $${lastIndex + 1}, `
})
const whereScript = whereFields.map((value) => {
lastIndex++
return `${value} = $${lastIndex + 1}`
})
sql = `${sql.trim().slice(0 , -1)} where ${whereScript.join(' and ')}`
return sql
}
protected genereteDelete (fields: Array<TEntityFieldsNames<T>>): string {
const params = fields.map((value, index) => {
return `${value} = $${(index + 1)}`
})
return `DELETE FROM ${this.tableName} where ${params.join(' and ')}`
}
}