@digione/node-custom-api 0.1.8-beta1 → 0.1.9-alpha10

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.
@@ -90,6 +90,7 @@ export declare const FileAttr: {
90
90
  upload: sequelize.TinyIntegerDataType;
91
91
  custom: sequelize.AbstractDataTypeConstructor;
92
92
  tags: sequelize.AbstractDataTypeConstructor;
93
+ group: sequelize.StringDataType;
93
94
  file_link: sequelize.EnumDataType<"no" | "yes">;
94
95
  file_id: sequelize.StringDataType;
95
96
  uid: sequelize.StringDataType;
@@ -95,6 +95,7 @@ exports.FileAttr = {
95
95
  upload: sequelize.TINYINT({ length: 1 }),
96
96
  custom: sequelize.JSON,
97
97
  tags: sequelize.JSON,
98
+ group: sequelize.STRING({ length: 20 }),
98
99
  file_link: sequelize.ENUM('no', 'yes'),
99
100
  file_id: sequelize.STRING({ length: 15 }),
100
101
  uid: sequelize.STRING({ length: 100 })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digione/node-custom-api",
3
- "version": "0.1.8-beta1",
3
+ "version": "0.1.9-alpha10",
4
4
  "description": "Typescript node digione-api",
5
5
  "author": "Monchai Jirayupong <monchai.j@seven.co.th>",
6
6
  "license": "MIT",
package/utils/db.js CHANGED
@@ -32,7 +32,7 @@ const getWhereVal = (smth) => {
32
32
  return [key, value].join(` ${smth.comparator} `);
33
33
  };
34
34
  const genWhere = (where = {}, { as = "", delimiter = ".", prefix = true, bracket = false } = {}) => {
35
- as = as ? as + delimiter : as;
35
+ as = as ? "`" + as + "`" + delimiter : as;
36
36
  let symbolKeys = Object.getOwnPropertySymbols(where);
37
37
  let rawWhere = (Object.keys(where).concat(symbolKeys)).reduce((result, key) => {
38
38
  let value = where[key];
@@ -48,7 +48,7 @@ const genWhere = (where = {}, { as = "", delimiter = ".", prefix = true, bracket
48
48
  result = `${result}( ${op}) AND `;
49
49
  }
50
50
  else {
51
- result = `${result + key} IN (${value.map(i => "'" + i + "'").join(',')}) AND `;
51
+ result = result + "`" + key + "`" + ` IN (${value.map(i => "'" + i + "'").join(',')}) AND `;
52
52
  }
53
53
  return result;
54
54
  }
@@ -62,10 +62,10 @@ const genWhere = (where = {}, { as = "", delimiter = ".", prefix = true, bracket
62
62
  return result;
63
63
  }
64
64
  else if (typeof value == "object" && value['val']) {
65
- result = `${result}${key}=${value['val']} AND `;
65
+ result = result + "`" + key + "`" + `=${value['val']} AND `;
66
66
  return result;
67
67
  }
68
- result = result + key + "=" + value + " AND ";
68
+ result = result + "`" + key + "`" + "=" + value + " AND ";
69
69
  }
70
70
  return result;
71
71
  }, "");
package/utils/file.d.ts CHANGED
@@ -124,11 +124,12 @@ export declare class FileUtil {
124
124
  tags?: TagFile;
125
125
  group?: any;
126
126
  }): Promise<any>;
127
- uploadByReq(req: Request, slug: string, user_id: any, { parent_id, parent_slug, name, root, thumb, width, height, input, is_hidden, tags, group }?: {
127
+ uploadByReq(req: Request, slug: string, user_id: any, { parent_id, parent_slug, name, root, format, thumb, width, height, input, is_hidden, tags, group }?: {
128
128
  parent_id?: number;
129
129
  parent_slug?: string;
130
130
  name?: any;
131
131
  root?: boolean;
132
+ format?: boolean;
132
133
  thumb?: boolean;
133
134
  width?: number;
134
135
  height?: number;
@@ -146,7 +147,7 @@ export declare class FileUtil {
146
147
  hidden?: number;
147
148
  input?: {};
148
149
  }): Promise<any>;
149
- createFileByPath(files: Array<string>, slug: string, user_id: any, { parent_slug, type, name, root, upload, tags, group }?: {
150
+ createFileByPath(files: Array<any>, slug: string, user_id: any, { parent_slug, type, name, root, upload, tags, group }?: {
150
151
  parent_slug?: string;
151
152
  type?: string;
152
153
  name?: any;
@@ -156,7 +157,8 @@ export declare class FileUtil {
156
157
  group?: any;
157
158
  }): Promise<any>;
158
159
  allowedFileType(extension: any): Promise<any>;
159
- formatFile(folder_id: any, user_id: any, reqs: Array<any>, files: Array<any>, { use_id, field, formatDateTime, input, is_hidden, tags, group }?: {
160
+ formatFile(folder_id: any, user_id: any, reqs: Array<any>, files: Array<any>, { format, use_id, field, formatDateTime, input, is_hidden, tags, group }?: {
161
+ format?: boolean;
160
162
  use_id?: boolean;
161
163
  field?: any[];
162
164
  formatDateTime?: string;
@@ -169,7 +171,7 @@ export declare class FileUtil {
169
171
  user_id: any;
170
172
  organ_id: any;
171
173
  organ_by: any;
172
- sort: string;
174
+ sort: any;
173
175
  date_added: string;
174
176
  name: any;
175
177
  filename: any;
@@ -179,10 +181,12 @@ export declare class FileUtil {
179
181
  extension: string;
180
182
  type: any;
181
183
  is_hidden: any;
182
- tags: TagFile;
184
+ tags: any;
185
+ custom: any;
183
186
  group: any;
184
187
  }[]>;
185
- insertFileUnique(results: Array<any>, { thumb, width, height }?: {
188
+ insertFileUnique(results: Array<any>, { format, thumb, width, height }?: {
189
+ format?: boolean;
186
190
  thumb?: boolean;
187
191
  width?: number;
188
192
  height?: number;
package/utils/file.js CHANGED
@@ -133,6 +133,7 @@ class FileUtil {
133
133
  let reqs = [], results = [];
134
134
  for (let file of files) {
135
135
  let extension = mime.extension(file.mimetype);
136
+ extension = extension ? extension : String(file.mimetype).split('/')[1];
136
137
  let input = {
137
138
  Bucket: this.bucket,
138
139
  Key: this.ref + "/" + (0, helper_1.getDateTime)().format('X') + '.' + (0, helper_1.getSlug)(32) + '.' + extension,
@@ -256,7 +257,7 @@ class FileUtil {
256
257
  result[width + 'x' + height] = thumb;
257
258
  yield (0, db_1.update)(this.ref, file_1.FileModel.getTableName().toString(), { thumb: JSON.stringify(result) }, { where: { id: item['id'] } });
258
259
  }
259
- if (item['filename'] == path) {
260
+ if (thumb && item['filename'] == path) {
260
261
  yield this.getStorage();
261
262
  let data = yield this.afterQueryFile({ filename: thumb, path: thumb });
262
263
  thumb = data.path;
@@ -392,7 +393,7 @@ class FileUtil {
392
393
  return (yield this.findAllFile({ where: Object.assign({ id }, where), full, file_link, parent_folder, limit: 1, tags, group }))[0] || null;
393
394
  });
394
395
  }
395
- uploadByReq(req, slug, user_id, { parent_id = 0, parent_slug = "", name = undefined, root = false, thumb = false, width = 0, height = 0, input = {}, is_hidden = undefined, tags = undefined, group = undefined } = {}) {
396
+ uploadByReq(req, slug, user_id, { parent_id = 0, parent_slug = "", name = undefined, root = false, format = false, thumb = false, width = 0, height = 0, input = {}, is_hidden = undefined, tags = undefined, group = undefined } = {}) {
396
397
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
397
398
  req.files = req.file ? [req.file] : (req.files || []);
398
399
  if (req.files.length && slug) {
@@ -406,6 +407,7 @@ class FileUtil {
406
407
  let folder = yield this.createFolder(slug, { parent_id, root, name });
407
408
  for (let file of req.files) {
408
409
  let extension = mime.extension(file.mimetype);
410
+ extension = extension ? extension : String(file.mimetype).split('/')[1];
409
411
  let input = {
410
412
  Bucket: this.bucket,
411
413
  Key: this.ref + "/" + (0, helper_1.getDateTime)().format('X') + '.' + (0, helper_1.getSlug)(32) + '.' + extension,
@@ -419,7 +421,7 @@ class FileUtil {
419
421
  }
420
422
  let results = yield this.upload(files);
421
423
  results = yield this.formatFile(folder['id'], user_id, reqs, results, { input, is_hidden, tags, group });
422
- return yield this.insertFileUnique(results, { thumb, width, height });
424
+ return yield this.insertFileUnique(results, { format, thumb, width, height });
423
425
  }
424
426
  return Promise.reject(errors_1.generalError.BAD_REQUEST);
425
427
  });
@@ -470,8 +472,13 @@ class FileUtil {
470
472
  let folder = yield this.createFolder(slug, { parent_id, root, name });
471
473
  let results = [], reqs = [];
472
474
  files.forEach((item) => {
473
- results.push({ Location: item, Key: item });
474
- reqs.push({ originalname: (0, helper_1.getSlug)(32), mimetype: null, size: 0, type });
475
+ let addition = {}, path = item;
476
+ if (typeof item == "object") {
477
+ addition = item;
478
+ path = item['path'];
479
+ }
480
+ results.push({ Location: path, Key: path });
481
+ reqs.push(Object.assign({ originalname: (0, helper_1.getSlug)(32), mimetype: null, size: 0, type }, addition));
475
482
  });
476
483
  results = yield this.formatFile(folder['id'], user_id, reqs, results, { input, tags, group });
477
484
  return yield this.insertFileUnique(results);
@@ -557,7 +564,7 @@ class FileUtil {
557
564
  return type;
558
565
  });
559
566
  }
560
- formatFile(folder_id, user_id, reqs, files, { use_id = true, field = [], formatDateTime = "X", input = {}, is_hidden = undefined, tags = undefined, group = undefined } = {}) {
567
+ formatFile(folder_id, user_id, reqs, files, { format = false, use_id = true, field = [], formatDateTime = "X", input = {}, is_hidden = undefined, tags = undefined, group = undefined } = {}) {
561
568
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
562
569
  try {
563
570
  let result = yield Promise.all(files.map((file, key) => tslib_1.__awaiter(this, void 0, void 0, function* () {
@@ -574,30 +581,30 @@ class FileUtil {
574
581
  path = (index < 0) ? protocol + path : path;
575
582
  }
576
583
  let extension = mime.extension(reqs[key].mimetype);
577
- let format = Object.assign(Object.assign({}, input), { folder_id,
584
+ extension = extension ? extension : String(reqs[key].mimetype).split('/')[1];
585
+ let item = Object.assign(Object.assign({}, input), { folder_id,
578
586
  user_id,
579
587
  organ_id,
580
- organ_by,
581
- sort,
582
- date_added, name: reqs[key].originalname || (0, helper_1.getSlug)(32), filename: reqs[key].Key || file.Key || input['filename'], path, mimetype: reqs[key].mimetype, filesize: reqs[key].size, extension: (extension ? "." + extension : ''), type: reqs[key].type || file.type || input['type'], is_hidden,
583
- tags,
584
- group });
588
+ organ_by, sort: reqs[key].sort || sort, date_added, name: reqs[key].originalname || (0, helper_1.getSlug)(32), filename: reqs[key].Key || file.Key || input['filename'], path, mimetype: reqs[key].mimetype, filesize: reqs[key].size, extension: (extension ? "." + extension : ''), type: reqs[key].type || file.type || input['type'], is_hidden, tags: reqs[key].tags || tags, custom: reqs[key].custom || input['custom'], group });
589
+ if (format) {
590
+ item = yield this.afterQueryFile(item);
591
+ }
585
592
  if (use_id) {
586
- format['id'] = id;
593
+ item['id'] = id;
587
594
  }
588
595
  if (reqs[key].mimetype && reqs[key].mimetype.split('/')[0] == "image") {
589
596
  try {
590
597
  let body = reqs[key].Body || reqs[key].buffer;
591
598
  let image = yield jimp.read(body);
592
- format['height'] = image.bitmap.height;
593
- format['width'] = image.bitmap.width;
599
+ item['height'] = image.bitmap.height;
600
+ item['width'] = image.bitmap.width;
594
601
  }
595
602
  catch (err) { }
596
603
  }
597
604
  if (field.length) {
598
- format = _.pick(format, field);
605
+ item = _.pick(item, field);
599
606
  }
600
- return format;
607
+ return item;
601
608
  })));
602
609
  return result;
603
610
  }
@@ -606,7 +613,7 @@ class FileUtil {
606
613
  }
607
614
  });
608
615
  }
609
- insertFileUnique(results, { thumb = false, width = 0, height = 0 } = {}) {
616
+ insertFileUnique(results, { format = false, thumb = false, width = 0, height = 0 } = {}) {
610
617
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
611
618
  try {
612
619
  let data = yield file_1.FileModel.schema(this.ref, "_").bulkCreate(results);
@@ -614,15 +621,14 @@ class FileUtil {
614
621
  return Promise.reject(errors_1.generalError.BAD_REQUEST);
615
622
  }
616
623
  let result = data.map(item => item.toJSON());
617
- if (thumb) {
618
- // create thumb
624
+ if (format || thumb) {
625
+ // format or create thumb
619
626
  result = yield Promise.all(result.map((item) => tslib_1.__awaiter(this, void 0, void 0, function* () {
620
- if (item['type'] == 'i') {
621
- item['thumb'] = null;
622
- let thumb = yield this.findImageThumb(item, { width, height });
623
- return Object.assign(Object.assign({}, item), { thumb });
627
+ let include = (yield this.afterQueryFile(item)) || {};
628
+ if (thumb && item['type'] == 'i') {
629
+ include['thumb'] = yield this.findImageThumb(item, { width, height });
624
630
  }
625
- return item;
631
+ return Object.assign(Object.assign({}, item), include);
626
632
  })));
627
633
  }
628
634
  return result;
@@ -630,7 +636,7 @@ class FileUtil {
630
636
  catch (err) {
631
637
  if (err.errors && err.errors[0].validatorKey == "not_unique") {
632
638
  results = results.map(item => (Object.assign(Object.assign({}, item), { id: (0, uuid_1.v4)().replace(/-/gi, '').substring(0, 15) })));
633
- return yield this.insertFileUnique(results, { thumb, width, height });
639
+ return yield this.insertFileUnique(results, { format, thumb, width, height });
634
640
  }
635
641
  return Promise.reject(errors_1.generalError.BAD_REQUEST);
636
642
  }
@@ -639,7 +645,7 @@ class FileUtil {
639
645
  uploadRawFormat(files, { field = ['name', 'filename', 'path', 'mimetype', 'filesize', 'extension', 'type', 'height', 'width'] } = {}) {
640
646
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
641
647
  let query = yield this.uploadRaw(files);
642
- return yield this.formatFile(0, 0, files, query, { field });
648
+ return yield this.formatFile(0, 0, files, query, { format: true, field });
643
649
  });
644
650
  }
645
651
  updateFile(id, input = {}, { paths = [] } = {}) {
package/utils/helper.d.ts CHANGED
@@ -18,8 +18,9 @@ export declare const getTimestampMysql: (date?: any) => number;
18
18
  export declare const getDateTime: (time?: any, { utc }?: {
19
19
  utc?: boolean;
20
20
  }) => moment.Moment;
21
- export declare const getValueFunctionFile: (key: any) => (value: any, { result, fileUtil }?: {
21
+ export declare const getValueFunctionFile: (key: any) => (value: any, { result, json, fileUtil }?: {
22
22
  result?: {};
23
+ json?: {};
23
24
  fileUtil?: any;
24
25
  }) => Promise<void>;
25
26
  export declare const getValueFunctionLang: (key: any) => (value?: {}, { result, transform, spread, spread_all, raw, lang_code }?: {
@@ -63,7 +64,7 @@ export declare const randomRef: ({ length_digital, length_alphabet }?: {
63
64
  length_alphabet?: number;
64
65
  }) => string;
65
66
  export declare const treeToArray: (items: Array<any>, array?: Array<any>, level?: number) => Promise<any[]>;
66
- export declare const buildTree: (nodes: Array<any>, { index, field_children, json_convert, key_index, key_parent, root, to_array }?: {
67
+ export declare const buildTree: (nodes: Array<any>, { index, field_children, json_convert, key_index, key_parent, root, to_array, notfound_parent }?: {
67
68
  index?: any;
68
69
  field_children?: string;
69
70
  json_convert?: boolean;
@@ -71,6 +72,7 @@ export declare const buildTree: (nodes: Array<any>, { index, field_children, jso
71
72
  key_parent?: string;
72
73
  root?: any;
73
74
  to_array?: boolean;
75
+ notfound_parent?: boolean;
74
76
  }) => Promise<any[]>;
75
77
  export declare const expandTree: (items: Array<any>, { array, parent, level, prefix, field_index, field_children, key_value }?: {
76
78
  array?: any[];
package/utils/helper.js CHANGED
@@ -79,8 +79,16 @@ const getDateTime = (time = undefined, { utc = true } = {}) => {
79
79
  };
80
80
  exports.getDateTime = getDateTime;
81
81
  const getValueFunctionFile = (key) => {
82
- return (value, { result = {}, fileUtil = undefined } = {}) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
83
- if (value[key]) {
82
+ return (value, { result = {}, json = {}, fileUtil = undefined } = {}) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
83
+ if (json[key]) {
84
+ try {
85
+ result[key] = JSON.parse(json[key]);
86
+ }
87
+ catch (err) {
88
+ result[key] = null;
89
+ }
90
+ }
91
+ else if (value[key]) {
84
92
  result[key] = yield fileUtil.findOneFileById(value[key]);
85
93
  }
86
94
  });
@@ -220,7 +228,7 @@ const treeToArray = (items, array = [], level = 1) => tslib_1.__awaiter(void 0,
220
228
  return array;
221
229
  });
222
230
  exports.treeToArray = treeToArray;
223
- const buildTree = (nodes, { index = undefined, field_children = "children", json_convert = false, key_index = "id", key_parent = "parent", root = undefined, to_array = false } = {}) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
231
+ const buildTree = (nodes, { index = undefined, field_children = "children", json_convert = false, key_index = "id", key_parent = "parent", root = undefined, to_array = false, notfound_parent = false } = {}) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
224
232
  if (!nodes) {
225
233
  return null;
226
234
  }
@@ -258,11 +266,16 @@ const buildTree = (nodes, { index = undefined, field_children = "children", json
258
266
  }
259
267
  }
260
268
  parent[field_children] = results;
269
+ delete children[parent[key_index]];
261
270
  }
262
271
  };
263
272
  for (let i = 0, len = roots.length; i < len; ++i) {
264
273
  findChildren(roots[i]);
265
274
  }
275
+ if (notfound_parent) {
276
+ let items = Object.keys(children).reduce((total, key) => total.concat(children[key]), []);
277
+ roots.unshift({ [key_index]: -1, [field_children]: items });
278
+ }
266
279
  if (index)
267
280
  roots = roots[0];
268
281
  if (roots && to_array) {
package/utils/stream.d.ts CHANGED
@@ -5,16 +5,20 @@ import { Request } from 'express';
5
5
  import * as Joi from 'joi';
6
6
  export declare const getValueFunctionRelationship: (key: any, { field_data }?: {
7
7
  field_data?: {};
8
- }) => (value: any, { result, ref, lang_code }?: {
8
+ }) => (value: any, { result, json, ref, raw, lang_code }?: {
9
9
  result?: {};
10
+ json?: {};
10
11
  ref?: string;
12
+ raw?: boolean;
11
13
  lang_code?: string;
12
14
  }) => Promise<void>;
13
15
  export declare const getValueFunctionMultiple: (key: any, { field_data }?: {
14
16
  field_data?: {};
15
- }) => (value: any, { result, ref, lang_code }?: {
17
+ }) => (value: any, { result, json, ref, raw, lang_code }?: {
16
18
  result?: {};
19
+ json?: {};
17
20
  ref?: string;
21
+ raw?: boolean;
18
22
  lang_code?: string;
19
23
  }) => Promise<void>;
20
24
  interface Field {
@@ -36,7 +40,7 @@ export declare class StreamUtil {
36
40
  private fileUtil;
37
41
  private languageUtil;
38
42
  constructor(ref?: string, option?: QueryParamOption, fileUtil?: FileUtil);
39
- findField(slug: string, namespace: string, { index, option, no_lang, field_slug, field_only, field_required, lang, lang_code, is_required, default_value, addition, include, include_only, convert_option, field_option, require, multiple_table, multiple_spread, text, bullets, multiple, relationship, file, image, field_exclude, section }?: {
43
+ findField(slug: string, namespace: string, { index, option, no_lang, field_slug, field_only, field_required, lang, lang_code, is_required, default_value, addition, include, include_only, convert_option, convert_value, field_option, require, multiple_table, multiple_spread, text, bullets, multiple, relationship, file, image, field_exclude, section }?: {
40
44
  index?: string;
41
45
  option?: {};
42
46
  no_lang?: boolean;
@@ -51,6 +55,7 @@ export declare class StreamUtil {
51
55
  include?: any;
52
56
  include_only?: boolean;
53
57
  convert_option?: boolean;
58
+ convert_value?: boolean;
54
59
  field_option?: {};
55
60
  require?: boolean;
56
61
  multiple_table?: boolean;
@@ -71,14 +76,16 @@ export declare class StreamUtil {
71
76
  include?: any;
72
77
  include_only?: boolean;
73
78
  }): any;
74
- buildStream(slug: string, namespace: string, { query, builder, fetch, attribute, attributes, field_exclude, include }?: {
79
+ buildStream(slug: string, namespace: string, { query, builder, fetch, label, attribute, attributes, field_exclude, include, include_all }?: {
75
80
  query?: boolean;
76
81
  builder?: boolean;
77
82
  fetch?: boolean;
83
+ label?: boolean;
78
84
  attribute?: boolean;
79
85
  attributes?: any;
80
86
  field_exclude?: any[];
81
87
  include?: {};
88
+ include_all?: boolean;
82
89
  }): Promise<{
83
90
  stream: any;
84
91
  fields: any;
@@ -99,7 +106,19 @@ export declare class StreamUtil {
99
106
  raw?: boolean;
100
107
  lang_code?: any;
101
108
  }): Promise<{}>;
102
- genField(streams: Array<any>, { index, option, slug, id_stream, prefix, multiple_table, multiple_spread, addition, convert_option, field_option, default_value, default_lang, lang_code, no_lang, lang, country, section }?: {
109
+ getValueByJson(slug: string, namespace: string, value: any, json: any, { query, lang_code }?: {
110
+ query?: boolean;
111
+ lang_code?: any;
112
+ }): Promise<{}>;
113
+ getStoreJson(slug: string, namespace: string, value: any, { query, lang_code, exclude_type }?: {
114
+ query?: boolean;
115
+ lang_code?: any;
116
+ exclude_type?: {};
117
+ }): Promise<{
118
+ result: {};
119
+ labels: any[];
120
+ }>;
121
+ genField(streams: Array<any>, { index, option, slug, id_stream, prefix, multiple_table, multiple_spread, addition, convert_option, convert_value, field_option, default_value, default_lang, lang_code, no_lang, lang, country, section }?: {
103
122
  index?: string;
104
123
  option?: {};
105
124
  slug?: string;
@@ -109,6 +128,7 @@ export declare class StreamUtil {
109
128
  multiple_spread?: boolean;
110
129
  addition?: {};
111
130
  convert_option?: boolean;
131
+ convert_value?: boolean;
112
132
  field_option?: {};
113
133
  default_value?: any;
114
134
  default_lang?: string;
package/utils/stream.js CHANGED
@@ -24,10 +24,22 @@ const i18n_1 = require("i18n");
24
24
  const _ = require("lodash");
25
25
  const Joi = require("joi");
26
26
  const getValueFunctionRelationship = (key, { field_data = {} } = {}) => {
27
- return (value, { result = {}, ref = '', lang_code = '' } = {}) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
28
- if (value[key] && field_data['table']) {
27
+ return (value, { result = {}, json = {}, ref = '', raw = false, lang_code = '' } = {}) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
28
+ if (field_data['table']) {
29
29
  let title_column = field_data['title_column'] || "title";
30
- result[key] = yield (0, db_1.findOne)(ref + '_' + field_data['table'], { where: { id: value[key] }, attributes: ['*'] });
30
+ if (json[key]) {
31
+ try {
32
+ result[key] = JSON.parse(json[key]);
33
+ }
34
+ catch (err) {
35
+ result[key] = null;
36
+ }
37
+ }
38
+ else if (value[key]) {
39
+ result[key] = yield (0, db_1.findOne)(ref + '_' + field_data['table'], { where: { id: value[key] }, attributes: ['*'] });
40
+ }
41
+ if (raw)
42
+ return;
31
43
  if (result[key]) {
32
44
  (0, helper_2.getValueFunctionLang)(title_column)(result[key], { result: result[key], lang_code });
33
45
  }
@@ -36,10 +48,22 @@ const getValueFunctionRelationship = (key, { field_data = {} } = {}) => {
36
48
  };
37
49
  exports.getValueFunctionRelationship = getValueFunctionRelationship;
38
50
  const getValueFunctionMultiple = (key, { field_data = {} } = {}) => {
39
- return (value, { result = {}, ref = '', lang_code = '' } = {}) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
40
- if (field_data['association'] && field_data['table']) {
51
+ return (value, { result = {}, json = {}, ref = '', raw = false, lang_code = '' } = {}) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
52
+ if (field_data['table']) {
41
53
  let title_column = field_data['title_column'] || "title";
42
- result[key] = yield (0, db_1.findAll)(ref + '_' + field_data['table'], { where: { [`m.row_id`]: { [sequelize_1.Op.eq]: value['id'] } }, attributes: [`${ref + '_' + field_data['table']}.*`], association: [`INNER JOIN ${ref}_${field_data['association']} m ON ${ref + '_' + field_data['table']}.id = m.${field_data['table'] + '_id'}`] });
54
+ if (json[key]) {
55
+ try {
56
+ result[key] = JSON.parse(json[key]);
57
+ }
58
+ catch (err) {
59
+ result[key] = [];
60
+ }
61
+ }
62
+ else if (field_data['association']) {
63
+ result[key] = yield (0, db_1.findAll)(ref + '_' + field_data['table'], { where: { [`m.row_id`]: { [sequelize_1.Op.eq]: value['id'] } }, attributes: [`${ref + '_' + field_data['table']}.*`], association: [`INNER JOIN ${ref}_${field_data['association']} m ON ${ref + '_' + field_data['table']}.id = m.${field_data['table'] + '_id'}`] });
64
+ }
65
+ if (raw)
66
+ return;
43
67
  if (result[key] && result[key].length) {
44
68
  result[key] = result[key].map(i => (0, helper_2.getValueByLang)(i, { result: i, field: [title_column], lang_code }));
45
69
  }
@@ -77,7 +101,7 @@ class StreamUtil {
77
101
  this.fileUtil = fileUtil || new file_2.FileUtil(this.ref, this.option);
78
102
  this.languageUtil = new language_1.LanguageUtil(this.ref, this.option);
79
103
  }
80
- findField(slug, namespace, { index = "", option = {}, no_lang = false, field_slug = [], field_only = true, field_required = true, lang = [], lang_code = "en", is_required = "", default_value = {}, addition = {}, include = undefined, include_only = false, convert_option = false, field_option = {}, require = false, multiple_table = false, multiple_spread = false, text = false, bullets = false, multiple = false, relationship = false, file = false, image = false, field_exclude = [], section = false } = {}) {
104
+ findField(slug, namespace, { index = "", option = {}, no_lang = false, field_slug = [], field_only = true, field_required = true, lang = [], lang_code = "en", is_required = "", default_value = {}, addition = {}, include = undefined, include_only = false, convert_option = false, convert_value = false, field_option = {}, require = false, multiple_table = false, multiple_spread = false, text = false, bullets = false, multiple = false, relationship = false, file = false, image = false, field_exclude = [], section = false } = {}) {
81
105
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
82
106
  let data;
83
107
  let where = {};
@@ -160,7 +184,7 @@ class StreamUtil {
160
184
  }
161
185
  }
162
186
  if (convert_option) {
163
- data['fields'] = yield this.genField(data['fields'], { index, option, slug, id_stream: data['id'], prefix: data['stream_prefix'], multiple_table, multiple_spread, addition, field_option, default_value, lang_code, no_lang, lang, section });
187
+ data['fields'] = yield this.genField(data['fields'], { index, option, slug, id_stream: data['id'], prefix: data['stream_prefix'], multiple_table, multiple_spread, addition, convert_value, field_option, default_value, lang_code, no_lang, lang, section });
164
188
  }
165
189
  if (field_only) {
166
190
  return data['fields'];
@@ -211,7 +235,7 @@ class StreamUtil {
211
235
  }
212
236
  return data;
213
237
  }
214
- buildStream(slug, namespace, { query = true, builder = true, fetch = false, attribute = false, attributes = null, field_exclude = [], include = {} } = {}) {
238
+ buildStream(slug, namespace, { query = true, builder = true, fetch = false, label = false, attribute = false, attributes = null, field_exclude = [], include = {}, include_all = false } = {}) {
215
239
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
216
240
  let build = this.builder[slug + "_" + namespace] || { stream: null, fields: null, fetchFn: [], attributes: null };
217
241
  if (!build['fields']) {
@@ -222,7 +246,7 @@ class StreamUtil {
222
246
  build['stream'] = _.omit(data, ['fields']);
223
247
  }
224
248
  if ((fetch || attribute) && build['fields'].length) {
225
- let fetchFn = [];
249
+ let fetchFn = [], fetchLabel = [];
226
250
  attributes = attributes || {};
227
251
  for (let field of build['fields']) {
228
252
  let field_data = field['field_data'] || {};
@@ -232,24 +256,30 @@ class StreamUtil {
232
256
  }
233
257
  if (fetch) {
234
258
  if (field['is_lang'] == "yes") {
259
+ label && fetchLabel.push(field);
235
260
  fetchFn.push((0, helper_2.getValueFunctionLang)(field['field_slug']));
236
261
  }
237
262
  else {
238
263
  switch (field['field_type']) {
239
264
  case "file":
240
265
  case "image":
241
- include[field['field_slug']] && fetchFn.push((0, helper_2.getValueFunctionFile)(field['field_slug']));
266
+ if (include[field['field_slug']] || include_all) {
267
+ label && fetchLabel.push(field);
268
+ fetchFn.push((0, helper_2.getValueFunctionFile)(field['field_slug']));
269
+ }
242
270
  break;
243
271
  case "relationship":
244
272
  case "multiple":
245
- if (include[field['field_slug']] && field_data['choose_stream']) {
273
+ if ((include[field['field_slug']] || include_all) && field_data['choose_stream']) {
246
274
  let stream = yield stream_1.StreamModel.schema(this.ref, "_").findOne({ where: { id: field_data['choose_stream'] }, raw: true, attributes: ['stream_slug', 'stream_prefix', 'title_column'] });
247
275
  if (stream['stream_slug']) {
248
276
  field_data['table'] = stream['stream_prefix'] ? stream['stream_prefix'] + stream['stream_slug'] : stream['stream_slug'];
249
277
  if (field['field_type'] == "relationship") {
278
+ label && fetchLabel.push(field);
250
279
  fetchFn.push((0, exports.getValueFunctionRelationship)(field['field_slug'], { field_data }));
251
280
  }
252
281
  else if (field['field_type'] == "multiple") {
282
+ label && fetchLabel.push(field);
253
283
  field_data['association'] = (build['stream']['stream_prefix'] ? build['stream']['stream_prefix'] + build['stream']['stream_slug'] : build['stream']['stream_slug']) + "_" + field_data['table'];
254
284
  fetchFn.push((0, exports.getValueFunctionMultiple)(field['field_slug'], { field_data }));
255
285
  }
@@ -259,11 +289,12 @@ class StreamUtil {
259
289
  }
260
290
  }
261
291
  }
262
- if (field['field_type'] == "multiple" || field['field_type'] == "any") {
292
+ if ((field['field_type'] == "multiple" && field_data['self_table'] != "yes") || field['field_type'] == "any") {
263
293
  delete attributes[field['field_slug']];
264
294
  }
265
295
  }
266
296
  build['fetchFn'] = fetchFn;
297
+ build['fetchLabel'] = fetchLabel;
267
298
  }
268
299
  if (attributes)
269
300
  build['attributes'] = attributes;
@@ -289,7 +320,34 @@ class StreamUtil {
289
320
  return result;
290
321
  });
291
322
  }
292
- genField(streams, { index = "", option = {}, slug = "", id_stream = "", prefix = "", multiple_table = false, multiple_spread = false, addition = {}, convert_option = true, field_option = {}, default_value = {}, default_lang = "en", lang_code = "en", no_lang = false, lang = [], country = undefined, section = false } = {}) {
323
+ getValueByJson(slug, namespace, value, json, { query = false, lang_code = undefined } = {}) {
324
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
325
+ let result = {};
326
+ let fetchFn = yield this.getBuilder(slug, namespace, { query, index: "fetchFn" });
327
+ lang_code = lang_code || this.option.lang_code;
328
+ for (let f of fetchFn || []) {
329
+ yield f(value, { result, json, ref: this.ref, lang_code, fileUtil: this.fileUtil });
330
+ }
331
+ return result;
332
+ });
333
+ }
334
+ getStoreJson(slug, namespace, value, { query = false, lang_code = undefined, exclude_type = {} } = {}) {
335
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
336
+ let result = {}, labels = [];
337
+ let fetchLabel = yield this.getBuilder(slug, namespace, { query, index: "fetchLabel" });
338
+ lang_code = lang_code || this.option.lang_code;
339
+ for (let f of fetchLabel || []) {
340
+ let field_slug = f['field_slug'];
341
+ let field_type = f['field_type'];
342
+ if (field_slug && !exclude_type[field_type] && typeof value[field_slug] != "undefined") {
343
+ labels.push(field_slug);
344
+ result[field_slug] = JSON.stringify(value[field_slug]);
345
+ }
346
+ }
347
+ return { result, labels };
348
+ });
349
+ }
350
+ genField(streams, { index = "", option = {}, slug = "", id_stream = "", prefix = "", multiple_table = false, multiple_spread = false, addition = {}, convert_option = true, convert_value = false, field_option = {}, default_value = {}, default_lang = "en", lang_code = "en", no_lang = false, lang = [], country = undefined, section = false } = {}) {
293
351
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
294
352
  let fields = [], sections = [];
295
353
  let exclude = option['excludeObj'] || {};
@@ -414,7 +472,9 @@ class StreamUtil {
414
472
  continue;
415
473
  }
416
474
  if (convert_option) {
475
+ let obj_value = {};
417
476
  if (item['field_type'] == "choice") {
477
+ let opt_empty = false;
418
478
  if (field_data['choice_data']) {
419
479
  let data = [];
420
480
  data = field_data['choice_data'].split('\n');
@@ -437,12 +497,16 @@ class StreamUtil {
437
497
  data[k] = { key, value };
438
498
  }
439
499
  else {
500
+ opt_empty = true;
440
501
  data[k] = { key: '', value };
441
502
  }
442
503
  }
443
504
  else {
444
505
  data[k] = { key: v, value: v };
445
506
  }
507
+ if (convert_value && data[k]) {
508
+ obj_value[data[k]['key']] = data[k]['value'];
509
+ }
446
510
  });
447
511
  item['data'] = data;
448
512
  }
@@ -452,9 +516,23 @@ class StreamUtil {
452
516
  if (value && value.indexOf('lang:') > -1) {
453
517
  item['value'] = (0, i18n_1.__)({ phrase: value, locale: lang_code });
454
518
  }
519
+ if (!item['key'])
520
+ opt_empty = true;
521
+ if (convert_value && item['key']) {
522
+ obj_value[item['key']] = item['value'];
523
+ }
455
524
  return item;
456
525
  });
457
526
  }
527
+ if (field_data['default_value'] && !opt_empty && (item['field_value'] == '' || item['field_value'] == null)) {
528
+ item['field_value'] = field_data['default_value'];
529
+ }
530
+ if (convert_value && typeof item['field_value'] != "undefined") {
531
+ let field_value = item['field_value'];
532
+ if (item['field_value'] == null && opt_empty)
533
+ field_value = '';
534
+ field_data['value'] = obj_value[field_value];
535
+ }
458
536
  }
459
537
  else if (!field_option[item['field_slug']] && (item['field_type'] == "relationship" || item['field_type'] == "multiple") && field_data['choose_stream']) {
460
538
  try {
@@ -499,6 +577,9 @@ class StreamUtil {
499
577
  item['title'] = item['title'] ? item['title'] : item[stream['title_column']];
500
578
  (0, helper_2.getValueFunctionLang)('title')(item, { result: item, lang_code });
501
579
  let value = item['title'] ? item['title'] : item['id'];
580
+ if (convert_value && item['id']) {
581
+ obj_value[item['id']] = value;
582
+ }
502
583
  return {
503
584
  key: item['id'],
504
585
  value
@@ -509,6 +590,9 @@ class StreamUtil {
509
590
  }
510
591
  }
511
592
  item['data'] = data;
593
+ if (convert_value && item['field_value']) {
594
+ field_data['value'] = obj_value[item['field_value']];
595
+ }
512
596
  }
513
597
  catch (err) { }
514
598
  }
@@ -1578,8 +1662,10 @@ class StreamUtil {
1578
1662
  }
1579
1663
  }
1580
1664
  }
1581
- let sort_order = yield field_1.FieldModel.schema(this.ref, "_").max('sort_order', { where: { stream_id: stream['id'] } });
1582
- field['sort_order'] = sort_order ? Number(sort_order + 1) : 1;
1665
+ if (typeof field['sort_order'] == "undefined") {
1666
+ let sort_order = yield field_1.FieldModel.schema(this.ref, "_").max('sort_order', { where: { stream_id: stream['id'] } });
1667
+ field['sort_order'] = sort_order ? Number(sort_order + 1) : 1;
1668
+ }
1583
1669
  if (!field['stream_id']) {
1584
1670
  field['stream_id'] = stream['id'];
1585
1671
  }
@@ -1839,11 +1925,13 @@ class StreamUtil {
1839
1925
  allow_type = new RegExp(/^(image.*)$/).test(file[field_slug]['mimetype']);
1840
1926
  if (!allow_type) {
1841
1927
  input[field_slug] = mime.extension(file[field_slug]['mimetype']);
1928
+ input[field_slug] = input[field_slug] ? input[field_slug] : String(file[field_slug]['mimetype']).split('/')[1];
1842
1929
  field = Joi.string().valid('image/*');
1843
1930
  }
1844
1931
  }
1845
1932
  if (!allow_type && field_data['allowed_types']) {
1846
1933
  let extension = String(mime.extension(file[field_slug]['mimetype']));
1934
+ extension = extension ? extension : String(file[field_slug]['mimetype']).split('/')[1];
1847
1935
  if (!new RegExp(`^(${field_data['allowed_types']})$`).test(extension)) {
1848
1936
  input[field_slug] = extension;
1849
1937
  field = Joi.string().valid(...(field_data['allowed_types'].split('|') || []));
package/utils/user.d.ts CHANGED
@@ -40,9 +40,9 @@ export declare const convertAddress: (data: any, { lang_code, transform }?: {
40
40
  lang_code?: string;
41
41
  transform?: boolean;
42
42
  }) => Promise<any>;
43
- export declare const getAddressIndex: (data: any, { condition, lang_code }?: {
43
+ export declare const getAddressIndex: (data: any, { condition, where }?: {
44
44
  condition?: {};
45
- lang_code?: string;
45
+ where?: {};
46
46
  }) => Promise<{}>;
47
47
  export declare const getCountry: (ref: string, { organ_id, lang_code, setting }?: {
48
48
  organ_id?: string;
package/utils/user.js CHANGED
@@ -229,12 +229,11 @@ const convertAddress = (data, { lang_code = "en", transform = false } = {}) => t
229
229
  return data;
230
230
  });
231
231
  exports.convertAddress = convertAddress;
232
- const getAddressIndex = (data, { condition = {}, lang_code = "en" } = {}) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
233
- let result = {}, where = { lang_code: [lang_code, "en"] }, bol = false;
234
- let order = [sequelize.literal(`FIELD(lang_code,${'\'' + where['lang_code'].join('\',\'') + '\''})`)];
232
+ const getAddressIndex = (data, { condition = {}, where = {} } = {}) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
233
+ let result = {}, bol = false;
235
234
  if (!bol && data['country'] && !condition['country_id']) {
236
235
  let country = yield country_1.CountryModel.schema("core", "_").findOne({
237
- raw: true, where: Object.assign(Object.assign({}, where), { country_name: data['country'] }), attributes: ['id'], order
236
+ raw: true, where: Object.assign(Object.assign({}, where), { country_name: data['country'] }), attributes: ['id']
238
237
  });
239
238
  if (country) {
240
239
  result['country_id'] = country['id'];
@@ -245,7 +244,7 @@ const getAddressIndex = (data, { condition = {}, lang_code = "en" } = {}) => tsl
245
244
  if (!bol && data['state'] && !condition['state_id']) {
246
245
  let country_id = condition['country_id'] || null;
247
246
  let state = yield state_1.StateModel.schema("core", "_").findOne({
248
- raw: true, where: Object.assign(Object.assign({}, where), { country_id, state_name: data['state'] }), attributes: ['id'], order
247
+ raw: true, where: Object.assign(Object.assign({}, where), { country_id, state_name: data['state'] }), attributes: ['id']
249
248
  });
250
249
  if (state) {
251
250
  result['state_id'] = state['id'];
@@ -256,7 +255,7 @@ const getAddressIndex = (data, { condition = {}, lang_code = "en" } = {}) => tsl
256
255
  if (!bol && data['city'] && !condition['city_id']) {
257
256
  let state_id = condition['state_id'] || null;
258
257
  let city = yield city_1.CityModel.schema("core", "_").findOne({
259
- raw: true, where: Object.assign(Object.assign({}, where), { state_id, city_name: data['city'] }), attributes: ['id'], order
258
+ raw: true, where: Object.assign(Object.assign({}, where), { state_id, city_name: data['city'] }), attributes: ['id']
260
259
  });
261
260
  if (city) {
262
261
  result['city_id'] = city['id'];
@@ -267,7 +266,7 @@ const getAddressIndex = (data, { condition = {}, lang_code = "en" } = {}) => tsl
267
266
  if (!bol && data['district']) {
268
267
  let city_id = condition['city_id'] || null;
269
268
  let district = yield district_1.DistrictModel.schema("core", "_").findOne({
270
- raw: true, where: Object.assign(Object.assign({}, where), { city_id, district_name: data['district'] }), attributes: ['id'], order
269
+ raw: true, where: Object.assign(Object.assign({}, where), { city_id, district_name: data['district'] }), attributes: ['id']
271
270
  });
272
271
  if (district)
273
272
  result['district_id'] = district['id'];
@@ -277,7 +276,14 @@ const getAddressIndex = (data, { condition = {}, lang_code = "en" } = {}) => tsl
277
276
  exports.getAddressIndex = getAddressIndex;
278
277
  const getCountry = (ref, { organ_id = "", lang_code = "en", setting = {} } = {}) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
279
278
  let where = { status: 1, lang_code }, default_country;
280
- if (setting['country_id']) {
279
+ if (organ_id) {
280
+ let query = yield organ_1.UserOrganModel.schema(ref, "_").findOne({ where: { id: organ_id }, attributes: ['setting'], raw: true });
281
+ setting = query ? (query['setting'] || {}) : {};
282
+ }
283
+ if (setting['mobile_code']) {
284
+ where['mobilecode'] = setting['mobile_code'].split(",");
285
+ }
286
+ else if (setting['country_id']) {
281
287
  where['id'] = setting['country_id'].split(",");
282
288
  }
283
289
  let data = yield country_1.CountryModel.schema("core", "_").findAll({
@@ -57,5 +57,13 @@ export declare const convertService: ({ convert_type, schema }?: {
57
57
  convert_type?: any[];
58
58
  schema?: {};
59
59
  }) => (req: any, res: any, next: any) => Promise<any>;
60
+ export declare const entryValidateService: ({ module, schema }?: {
61
+ module?: string[];
62
+ schema?: {};
63
+ }) => (req: any, res: any, next: any) => Promise<any>;
64
+ export declare const entryParamService: ({ module, schema }?: {
65
+ module?: string[];
66
+ schema?: {};
67
+ }) => (req: any, res: any, next: any) => Promise<any>;
60
68
  export declare const createdByValidate: (req: any, res: any, next: any) => Promise<any>;
61
69
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createdByValidate = exports.convertService = exports.fieldService = exports.dataService = exports.printService = exports.exportService = exports.importService = exports.streamService = exports.multiService = exports.fileService = exports.paramService = exports.validateService = exports.validate = void 0;
3
+ exports.createdByValidate = exports.entryParamService = exports.entryValidateService = exports.convertService = exports.fieldService = exports.dataService = exports.printService = exports.exportService = exports.importService = exports.streamService = exports.multiService = exports.fileService = exports.paramService = exports.validateService = exports.validate = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const Joi = require("joi");
6
6
  const errors_1 = require("../errors");
@@ -291,6 +291,20 @@ const convertService = ({ convert_type = [], schema = {} } = {}) => (req, res, n
291
291
  return (0, exports.validateService)(Joi.object().keys(Object.assign({ ids: Joi.array().items(Joi.number()).min(1), convert_type: Joi.string().valid(...convert_type) }, schema)).unknown())(req, res, next);
292
292
  });
293
293
  exports.convertService = convertService;
294
+ const entryValidateService = ({ module = ['contact'], schema = {} } = {}) => (req, res, next) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
295
+ return (0, exports.validateService)(Joi.object().keys(Object.assign({ module: Joi.string().valid(...module), entry_id: Joi.number().required() }, schema)).unknown())(req, res, next);
296
+ });
297
+ exports.entryValidateService = entryValidateService;
298
+ const entryParamService = ({ module = ['contact'], schema = {} } = {}) => (req, res, next) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
299
+ if (req.query.module) {
300
+ res.locals.option = Object.assign(Object.assign({}, (res.locals.option || {})), { module: req.query.module });
301
+ }
302
+ if (req.query.entry_id) {
303
+ res.locals.option = Object.assign(Object.assign({}, (res.locals.option || {})), { entry_id: req.query.entry_id });
304
+ }
305
+ return (0, exports.paramService)(Joi.object().keys(Object.assign({ module: Joi.string().valid(...module), entry_id: Joi.number().required() }, schema)).unknown())(req, res, next);
306
+ });
307
+ exports.entryParamService = entryParamService;
294
308
  exports.createdByValidate = (0, exports.validateService)(Joi.object().keys({
295
309
  created_by: Joi.alternatives().try(Joi.string(), Joi.number()).required()
296
310
  }).unknown());