namirasoft-node 1.3.70 → 1.3.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,193 +1,193 @@
1
- import { ErrorOperation, FilterItem, FilterItemOperator } from "namirasoft-core";
2
-
3
- export interface IFilterableDatabase<WhereOptions>
4
- {
5
- getIn: (filter: FilterItem, values: string[]) => { condition: WhereOptions, partial: boolean };
6
- getNotIn: (filter: FilterItem, values: string[]) => { condition: WhereOptions, partial: boolean };
7
- getLike: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
8
- getNotLike: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
9
- getRegex: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
10
- getNotRegex: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
11
- getEmpty: (filter: FilterItem) => { condition: WhereOptions, partial: boolean };
12
- getNotEmpty: (filter: FilterItem) => { condition: WhereOptions, partial: boolean };
13
- getExists: (filter: FilterItem, not: boolean) => { condition: WhereOptions, partial: boolean };
14
- getStartsWith: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
15
- getNotStartsWith: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
16
- getEndsWith: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
17
- getNotEndsWith: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
18
- getLT: (filter: FilterItem, value: any) => { condition: WhereOptions, partial: boolean };
19
- getLTE: (filter: FilterItem, value: any) => { condition: WhereOptions, partial: boolean };
20
- getGT: (filter: FilterItem, value: any) => { condition: WhereOptions, partial: boolean };
21
- getGTE: (filter: FilterItem, value: any) => { condition: WhereOptions, partial: boolean };
22
- }
23
-
24
- export abstract class BaseDatabase
25
- {
26
- private tables: { [name: string]: any } = {};
27
- abstract init(): void;
28
- abstract connect(): void;
29
- abstract sync(force: boolean): Promise<void>;
30
- addTable(name: string, table: any)
31
- {
32
- this.tables[name] = table;
33
- }
34
- getTable<T>(name: string): T
35
- {
36
- let ans = this.tables[name] as T;
37
- if (!ans)
38
- ErrorOperation.throwHTTP(404, `Table '${name}' not found`);
39
- return ans;
40
- }
41
- paginate(page_number: number, page_size: number, page_size_default?: number): { offset: number, limit: number }
42
- {
43
- // page_number
44
- if (isNaN(page_number))
45
- page_number = 1;
46
- // page_size
47
- if (isNaN(page_size))
48
- if (page_size_default)
49
- page_size = page_size_default;
50
- if (isNaN(page_size))
51
- page_size = 25;
52
- //
53
- let offset = (page_number - 1) * page_size;
54
- let limit = page_size;
55
- return { offset, limit };
56
- }
57
- protected _getFiltersConditions<WhereOptions>(tables: { [table: string]: string[] }, idatabase: IFilterableDatabase<WhereOptions>, filters?: FilterItem[] | undefined): { [table: string]: WhereOptions[] }
58
- {
59
- let ans: { [table: string]: WhereOptions[] } = {};
60
- Object.keys(tables).forEach(table => ans[table] = []);
61
- if (filters)
62
- {
63
- let processed: { [index: number]: boolean } = {};
64
- for (let i = 0; i < filters.length; i++)
65
- if (!processed[i])
66
- {
67
- const filter = filters[i];
68
- if (!tables[filter.table.name])
69
- ErrorOperation.throwHTTP(404, `Invalid table name '${filter.table.name}'. Valid tables are '${Object.keys(tables).join(", ")}'.`);
70
- let values = filter.values;
71
- if (filter.operator.count > 0)
72
- for (let j = i + 1; j < filters.length; j++)
73
- {
74
- const f = filters[j];
75
- if (filter.table.name == f.table.name)
76
- if (filter.column.name == f.column.name)
77
- if (filter.not == f.not)
78
- if (filter.operator.sign == f.operator.sign)
79
- {
80
- processed[j] = true;
81
- values.push(...f.values);
82
- }
83
- }
84
-
85
- let getNumbers = () =>
86
- {
87
- let nums: number[] = values.map(x => parseFloat(x));
88
- if (nums.filter(x => isNaN(x)).length > 0)
89
- ErrorOperation.throwHTTP(400, `Invalid number values for: '${values.join(",")}'`);
90
- return nums;
91
- };
92
- let addCondition = (res: { condition: WhereOptions, partial: boolean }) =>
93
- {
94
- if (res.partial)
95
- {
96
- let wh: any = {};
97
- wh[filter.column.name] = res.condition;
98
- ans[filter.table.name].push(wh);
99
- }
100
- else
101
- ans[filter.table.name].push(res.condition);
102
- };
103
- if (filter.operator == FilterItemOperator.all.equals)
104
- {
105
- if (filter.not)
106
- addCondition(idatabase.getNotIn(filter, values));
107
- else
108
- addCondition(idatabase.getIn(filter, values));
109
- }
110
- else if (filter.operator == FilterItemOperator.all.contains)
111
- {
112
- values.forEach(value =>
113
- {
114
- if (filter.not)
115
- addCondition(idatabase.getNotLike(filter, value));
116
- else
117
- addCondition(idatabase.getLike(filter, value));
118
- });
119
- }
120
- else if (filter.operator == FilterItemOperator.all.regex)
121
- {
122
- values.forEach(value =>
123
- {
124
- if (filter.not)
125
- addCondition(idatabase.getNotRegex(filter, value));
126
- else
127
- addCondition(idatabase.getRegex(filter, value));
128
- });
129
- }
130
- else if (filter.operator == FilterItemOperator.all.empty)
131
- {
132
- if (filter.not)
133
- addCondition(idatabase.getNotEmpty(filter));
134
- else
135
- addCondition(idatabase.getEmpty(filter));
136
- }
137
- else if (filter.operator == FilterItemOperator.all.exists)
138
- {
139
- addCondition(idatabase.getExists(filter, filter.not));
140
- }
141
- else if (filter.operator == FilterItemOperator.all.startswith)
142
- {
143
- values.forEach(value =>
144
- {
145
- if (filter.not)
146
- addCondition(idatabase.getNotStartsWith(filter, value));
147
- else
148
- addCondition(idatabase.getStartsWith(filter, value));
149
- });
150
- }
151
- else if (filter.operator == FilterItemOperator.all.endswith)
152
- {
153
- values.forEach(value =>
154
- {
155
- if (filter.not)
156
- addCondition(idatabase.getNotEndsWith(filter, value));
157
- else
158
- addCondition(idatabase.getEndsWith(filter, value));
159
- });
160
- }
161
- else if (filter.operator == FilterItemOperator.all.lessthan)
162
- {
163
- if (filter.not)
164
- addCondition(idatabase.getGTE(filter, Math.max(...getNumbers())));
165
- else
166
- addCondition(idatabase.getLT(filter, Math.max(...getNumbers())));
167
- }
168
- else if (filter.operator == FilterItemOperator.all.lessthanequal)
169
- {
170
- if (filter.not)
171
- addCondition(idatabase.getGT(filter, Math.max(...getNumbers())));
172
- else
173
- addCondition(idatabase.getLTE(filter, Math.max(...getNumbers())));
174
- }
175
- else if (filter.operator == FilterItemOperator.all.morethan)
176
- {
177
- if (filter.not)
178
- addCondition(idatabase.getLTE(filter, Math.max(...getNumbers())));
179
- else
180
- addCondition(idatabase.getGT(filter, Math.max(...getNumbers())));
181
- }
182
- else if (filter.operator == FilterItemOperator.all.morethanequal)
183
- {
184
- if (filter.not)
185
- addCondition(idatabase.getLT(filter, Math.max(...getNumbers())));
186
- else
187
- addCondition(idatabase.getGTE(filter, Math.max(...getNumbers())));
188
- }
189
- }
190
- }
191
- return ans;
192
- }
1
+ import { ErrorOperation, FilterItem, FilterItemOperator } from "namirasoft-core";
2
+
3
+ export interface IFilterableDatabase<WhereOptions>
4
+ {
5
+ getIn: (filter: FilterItem, values: string[]) => { condition: WhereOptions, partial: boolean };
6
+ getNotIn: (filter: FilterItem, values: string[]) => { condition: WhereOptions, partial: boolean };
7
+ getLike: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
8
+ getNotLike: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
9
+ getRegex: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
10
+ getNotRegex: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
11
+ getEmpty: (filter: FilterItem) => { condition: WhereOptions, partial: boolean };
12
+ getNotEmpty: (filter: FilterItem) => { condition: WhereOptions, partial: boolean };
13
+ getExists: (filter: FilterItem, not: boolean) => { condition: WhereOptions, partial: boolean };
14
+ getStartsWith: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
15
+ getNotStartsWith: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
16
+ getEndsWith: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
17
+ getNotEndsWith: (filter: FilterItem, value: string) => { condition: WhereOptions, partial: boolean };
18
+ getLT: (filter: FilterItem, value: any) => { condition: WhereOptions, partial: boolean };
19
+ getLTE: (filter: FilterItem, value: any) => { condition: WhereOptions, partial: boolean };
20
+ getGT: (filter: FilterItem, value: any) => { condition: WhereOptions, partial: boolean };
21
+ getGTE: (filter: FilterItem, value: any) => { condition: WhereOptions, partial: boolean };
22
+ }
23
+
24
+ export abstract class BaseDatabase
25
+ {
26
+ private tables: { [name: string]: any } = {};
27
+ abstract init(): void;
28
+ abstract connect(): void;
29
+ abstract sync(force: boolean): Promise<void>;
30
+ addTable(name: string, table: any)
31
+ {
32
+ this.tables[name] = table;
33
+ }
34
+ getTable<T>(name: string): T
35
+ {
36
+ let ans = this.tables[name] as T;
37
+ if (!ans)
38
+ ErrorOperation.throwHTTP(404, `Table '${name}' not found`);
39
+ return ans;
40
+ }
41
+ paginate(page_number: number, page_size: number, page_size_default?: number): { offset: number, limit: number }
42
+ {
43
+ // page_number
44
+ if (isNaN(page_number))
45
+ page_number = 1;
46
+ // page_size
47
+ if (isNaN(page_size))
48
+ if (page_size_default)
49
+ page_size = page_size_default;
50
+ if (isNaN(page_size))
51
+ page_size = 25;
52
+ //
53
+ let offset = (page_number - 1) * page_size;
54
+ let limit = page_size;
55
+ return { offset, limit };
56
+ }
57
+ protected _getFiltersConditions<WhereOptions>(tables: { [table: string]: string[] }, idatabase: IFilterableDatabase<WhereOptions>, filters?: FilterItem[] | undefined): { [table: string]: WhereOptions[] }
58
+ {
59
+ let ans: { [table: string]: WhereOptions[] } = {};
60
+ Object.keys(tables).forEach(table => ans[table] = []);
61
+ if (filters)
62
+ {
63
+ let processed: { [index: number]: boolean } = {};
64
+ for (let i = 0; i < filters.length; i++)
65
+ if (!processed[i])
66
+ {
67
+ const filter = filters[i];
68
+ if (!tables[filter.table.name])
69
+ ErrorOperation.throwHTTP(404, `Invalid table name '${filter.table.name}'. Valid tables are '${Object.keys(tables).join(", ")}'.`);
70
+ let values = filter.values;
71
+ if (filter.operator.count > 0)
72
+ for (let j = i + 1; j < filters.length; j++)
73
+ {
74
+ const f = filters[j];
75
+ if (filter.table.name == f.table.name)
76
+ if (filter.column.name == f.column.name)
77
+ if (filter.not == f.not)
78
+ if (filter.operator.sign == f.operator.sign)
79
+ {
80
+ processed[j] = true;
81
+ values.push(...f.values);
82
+ }
83
+ }
84
+
85
+ let getNumbers = () =>
86
+ {
87
+ let nums: number[] = values.map(x => parseFloat(x));
88
+ if (nums.filter(x => isNaN(x)).length > 0)
89
+ ErrorOperation.throwHTTP(400, `Invalid number values for: '${values.join(",")}'`);
90
+ return nums;
91
+ };
92
+ let addCondition = (res: { condition: WhereOptions, partial: boolean }) =>
93
+ {
94
+ if (res.partial)
95
+ {
96
+ let wh: any = {};
97
+ wh[filter.column.name] = res.condition;
98
+ ans[filter.table.name].push(wh);
99
+ }
100
+ else
101
+ ans[filter.table.name].push(res.condition);
102
+ };
103
+ if (filter.operator == FilterItemOperator.all.equals)
104
+ {
105
+ if (filter.not)
106
+ addCondition(idatabase.getNotIn(filter, values));
107
+ else
108
+ addCondition(idatabase.getIn(filter, values));
109
+ }
110
+ else if (filter.operator == FilterItemOperator.all.contains)
111
+ {
112
+ values.forEach(value =>
113
+ {
114
+ if (filter.not)
115
+ addCondition(idatabase.getNotLike(filter, value));
116
+ else
117
+ addCondition(idatabase.getLike(filter, value));
118
+ });
119
+ }
120
+ else if (filter.operator == FilterItemOperator.all.regex)
121
+ {
122
+ values.forEach(value =>
123
+ {
124
+ if (filter.not)
125
+ addCondition(idatabase.getNotRegex(filter, value));
126
+ else
127
+ addCondition(idatabase.getRegex(filter, value));
128
+ });
129
+ }
130
+ else if (filter.operator == FilterItemOperator.all.empty)
131
+ {
132
+ if (filter.not)
133
+ addCondition(idatabase.getNotEmpty(filter));
134
+ else
135
+ addCondition(idatabase.getEmpty(filter));
136
+ }
137
+ else if (filter.operator == FilterItemOperator.all.exists)
138
+ {
139
+ addCondition(idatabase.getExists(filter, filter.not));
140
+ }
141
+ else if (filter.operator == FilterItemOperator.all.startswith)
142
+ {
143
+ values.forEach(value =>
144
+ {
145
+ if (filter.not)
146
+ addCondition(idatabase.getNotStartsWith(filter, value));
147
+ else
148
+ addCondition(idatabase.getStartsWith(filter, value));
149
+ });
150
+ }
151
+ else if (filter.operator == FilterItemOperator.all.endswith)
152
+ {
153
+ values.forEach(value =>
154
+ {
155
+ if (filter.not)
156
+ addCondition(idatabase.getNotEndsWith(filter, value));
157
+ else
158
+ addCondition(idatabase.getEndsWith(filter, value));
159
+ });
160
+ }
161
+ else if (filter.operator == FilterItemOperator.all.lessthan)
162
+ {
163
+ if (filter.not)
164
+ addCondition(idatabase.getGTE(filter, Math.max(...getNumbers())));
165
+ else
166
+ addCondition(idatabase.getLT(filter, Math.max(...getNumbers())));
167
+ }
168
+ else if (filter.operator == FilterItemOperator.all.lessthanequal)
169
+ {
170
+ if (filter.not)
171
+ addCondition(idatabase.getGT(filter, Math.max(...getNumbers())));
172
+ else
173
+ addCondition(idatabase.getLTE(filter, Math.max(...getNumbers())));
174
+ }
175
+ else if (filter.operator == FilterItemOperator.all.morethan)
176
+ {
177
+ if (filter.not)
178
+ addCondition(idatabase.getLTE(filter, Math.max(...getNumbers())));
179
+ else
180
+ addCondition(idatabase.getGT(filter, Math.max(...getNumbers())));
181
+ }
182
+ else if (filter.operator == FilterItemOperator.all.morethanequal)
183
+ {
184
+ if (filter.not)
185
+ addCondition(idatabase.getLT(filter, Math.max(...getNumbers())));
186
+ else
187
+ addCondition(idatabase.getGTE(filter, Math.max(...getNumbers())));
188
+ }
189
+ }
190
+ }
191
+ return ans;
192
+ }
193
193
  }
@@ -1,39 +1,39 @@
1
- import nodemailer from 'nodemailer';
2
- import Mail, { AttachmentLike } from "nodemailer/lib/mailer";
3
- import { Readable } from "stream";
4
-
5
- export abstract class BaseEmailService
6
- {
7
- username: string;
8
- constructor(username: string)
9
- {
10
- this.username = username;
11
- }
12
- protected abstract getTransform(): any;
13
- send(from: string | null, to: string, subject: string, text: string, html?: string | Buffer | Readable | AttachmentLike | undefined, callback?: (err: Error | null, info: any) => void)
14
- {
15
- let transform = this.getTransform();
16
- let transporter = nodemailer.createTransport(transform);
17
-
18
- let mailOptions: Mail.Options = {
19
- from: from ?? this.username,
20
- to,
21
- subject,
22
- text,
23
- html
24
- };
25
- if (html)
26
- mailOptions.html = html;
27
-
28
- transporter.sendMail(mailOptions, function (error, info)
29
- {
30
- if (callback)
31
- callback(error, info);
32
- else
33
- {
34
- if (error)
35
- console.log(error);
36
- }
37
- });
38
- }
1
+ import nodemailer from 'nodemailer';
2
+ import Mail, { AttachmentLike } from "nodemailer/lib/mailer";
3
+ import { Readable } from "stream";
4
+
5
+ export abstract class BaseEmailService
6
+ {
7
+ username: string;
8
+ constructor(username: string)
9
+ {
10
+ this.username = username;
11
+ }
12
+ protected abstract getTransform(): any;
13
+ send(from: string | null, to: string, subject: string, text: string, html?: string | Buffer | Readable | AttachmentLike | undefined, callback?: (err: Error | null, info: any) => void)
14
+ {
15
+ let transform = this.getTransform();
16
+ let transporter = nodemailer.createTransport(transform);
17
+
18
+ let mailOptions: Mail.Options = {
19
+ from: from ?? this.username,
20
+ to,
21
+ subject,
22
+ text,
23
+ html
24
+ };
25
+ if (html)
26
+ mailOptions.html = html;
27
+
28
+ transporter.sendMail(mailOptions, function (error, info)
29
+ {
30
+ if (callback)
31
+ callback(error, info);
32
+ else
33
+ {
34
+ if (error)
35
+ console.log(error);
36
+ }
37
+ });
38
+ }
39
39
  }