namirasoft-node 1.4.2 → 1.4.4

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,194 @@
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(): Promise<void>;
28
+ abstract connect(): void;
29
+ abstract sync(force: boolean): Promise<void>;
30
+ abstract fill(): Promise<void>;
31
+ addTable(name: string, table: any)
32
+ {
33
+ this.tables[name] = table;
34
+ }
35
+ getTable<T>(name: string): T
36
+ {
37
+ let ans = this.tables[name] as T;
38
+ if (!ans)
39
+ ErrorOperation.throwHTTP(404, `Table '${name}' not found`);
40
+ return ans;
41
+ }
42
+ paginate(page_number: number, page_size: number, page_size_default?: number): { offset: number, limit: number }
43
+ {
44
+ // page_number
45
+ if (isNaN(page_number))
46
+ page_number = 1;
47
+ // page_size
48
+ if (isNaN(page_size))
49
+ if (page_size_default)
50
+ page_size = page_size_default;
51
+ if (isNaN(page_size))
52
+ page_size = 25;
53
+ //
54
+ let offset = (page_number - 1) * page_size;
55
+ let limit = page_size;
56
+ return { offset, limit };
57
+ }
58
+ protected _getFiltersConditions<WhereOptions>(tables: { [table: string]: string[] }, idatabase: IFilterableDatabase<WhereOptions>, filters?: FilterItem[] | undefined): { [table: string]: WhereOptions[] }
59
+ {
60
+ let ans: { [table: string]: WhereOptions[] } = {};
61
+ Object.keys(tables).forEach(table => ans[table] = []);
62
+ if (filters)
63
+ {
64
+ let processed: { [index: number]: boolean } = {};
65
+ for (let i = 0; i < filters.length; i++)
66
+ if (!processed[i])
67
+ {
68
+ const filter = filters[i];
69
+ if (!tables[filter.table.name])
70
+ ErrorOperation.throwHTTP(404, `Invalid table name '${filter.table.name}'. Valid tables are '${Object.keys(tables).join(", ")}'.`);
71
+ let values = filter.values;
72
+ if (filter.operator.count > 0)
73
+ for (let j = i + 1; j < filters.length; j++)
74
+ {
75
+ const f = filters[j];
76
+ if (filter.table.name == f.table.name)
77
+ if (filter.column.name == f.column.name)
78
+ if (filter.not == f.not)
79
+ if (filter.operator.sign == f.operator.sign)
80
+ {
81
+ processed[j] = true;
82
+ values.push(...f.values);
83
+ }
84
+ }
85
+
86
+ let getNumbers = () =>
87
+ {
88
+ let nums: number[] = values.map(x => parseFloat(x));
89
+ if (nums.filter(x => isNaN(x)).length > 0)
90
+ ErrorOperation.throwHTTP(400, `Invalid number values for: '${values.join(",")}'`);
91
+ return nums;
92
+ };
93
+ let addCondition = (res: { condition: WhereOptions, partial: boolean }) =>
94
+ {
95
+ if (res.partial)
96
+ {
97
+ let wh: any = {};
98
+ wh[filter.column.name] = res.condition;
99
+ ans[filter.table.name].push(wh);
100
+ }
101
+ else
102
+ ans[filter.table.name].push(res.condition);
103
+ };
104
+ if (filter.operator == FilterItemOperator.all.equals)
105
+ {
106
+ if (filter.not)
107
+ addCondition(idatabase.getNotIn(filter, values));
108
+ else
109
+ addCondition(idatabase.getIn(filter, values));
110
+ }
111
+ else if (filter.operator == FilterItemOperator.all.contains)
112
+ {
113
+ values.forEach(value =>
114
+ {
115
+ if (filter.not)
116
+ addCondition(idatabase.getNotLike(filter, value));
117
+ else
118
+ addCondition(idatabase.getLike(filter, value));
119
+ });
120
+ }
121
+ else if (filter.operator == FilterItemOperator.all.regex)
122
+ {
123
+ values.forEach(value =>
124
+ {
125
+ if (filter.not)
126
+ addCondition(idatabase.getNotRegex(filter, value));
127
+ else
128
+ addCondition(idatabase.getRegex(filter, value));
129
+ });
130
+ }
131
+ else if (filter.operator == FilterItemOperator.all.empty)
132
+ {
133
+ if (filter.not)
134
+ addCondition(idatabase.getNotEmpty(filter));
135
+ else
136
+ addCondition(idatabase.getEmpty(filter));
137
+ }
138
+ else if (filter.operator == FilterItemOperator.all.exists)
139
+ {
140
+ addCondition(idatabase.getExists(filter, filter.not));
141
+ }
142
+ else if (filter.operator == FilterItemOperator.all.startswith)
143
+ {
144
+ values.forEach(value =>
145
+ {
146
+ if (filter.not)
147
+ addCondition(idatabase.getNotStartsWith(filter, value));
148
+ else
149
+ addCondition(idatabase.getStartsWith(filter, value));
150
+ });
151
+ }
152
+ else if (filter.operator == FilterItemOperator.all.endswith)
153
+ {
154
+ values.forEach(value =>
155
+ {
156
+ if (filter.not)
157
+ addCondition(idatabase.getNotEndsWith(filter, value));
158
+ else
159
+ addCondition(idatabase.getEndsWith(filter, value));
160
+ });
161
+ }
162
+ else if (filter.operator == FilterItemOperator.all.lessthan)
163
+ {
164
+ if (filter.not)
165
+ addCondition(idatabase.getGTE(filter, Math.max(...getNumbers())));
166
+ else
167
+ addCondition(idatabase.getLT(filter, Math.max(...getNumbers())));
168
+ }
169
+ else if (filter.operator == FilterItemOperator.all.lessthanequal)
170
+ {
171
+ if (filter.not)
172
+ addCondition(idatabase.getGT(filter, Math.max(...getNumbers())));
173
+ else
174
+ addCondition(idatabase.getLTE(filter, Math.max(...getNumbers())));
175
+ }
176
+ else if (filter.operator == FilterItemOperator.all.morethan)
177
+ {
178
+ if (filter.not)
179
+ addCondition(idatabase.getLTE(filter, Math.max(...getNumbers())));
180
+ else
181
+ addCondition(idatabase.getGT(filter, Math.max(...getNumbers())));
182
+ }
183
+ else if (filter.operator == FilterItemOperator.all.morethanequal)
184
+ {
185
+ if (filter.not)
186
+ addCondition(idatabase.getLT(filter, Math.max(...getNumbers())));
187
+ else
188
+ addCondition(idatabase.getGTE(filter, Math.max(...getNumbers())));
189
+ }
190
+ }
191
+ }
192
+ return ans;
193
+ }
193
194
  }
@@ -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
  }