1 | "use strict";
|
2 | const Mongoose = require('mongoose');
|
3 |
|
4 | const Enumerable = require('linq');
|
5 | const document_strict_1 = require('./enums/document-strict');
|
6 | const decorators_1 = require('../core/constants/decorators');
|
7 | const mongooseSchemaGenerator_1 = require("./mongooseSchemaGenerator");
|
8 | const decorator_type_1 = require('../core/enums/decorator-type');
|
9 | const utils_1 = require("../core/metadata/utils");
|
10 | const index_1 = require("../core/enums/index");
|
11 | exports._arrayPropListSchema = {};
|
12 | class DynamicSchema {
|
13 | constructor(target, name) {
|
14 | this.target = target;
|
15 | this.schemaName = name;
|
16 | this.parsedSchema = this.parse(target);
|
17 | }
|
18 | getSchema() {
|
19 | var fieldMetaArr = utils_1.MetaUtils.getMetaData(this.target, decorators_1.Decorators.FIELD);
|
20 | utils_1.resetFieldDecoratorCache();
|
21 | var idx = Enumerable.from(fieldMetaArr)
|
22 | .where((keyVal) => keyVal && keyVal.params && (keyVal.params).searchIndex).any();
|
23 | var options = this.getMongooseOptions(this.target);
|
24 | var mongooseOptions = { options: options, searchIndex: idx };
|
25 | return mongooseSchemaGenerator_1.schemaGenerator.createSchema(this.parsedSchema, mongooseOptions);
|
26 | }
|
27 | parse(target) {
|
28 | if (!target || !(target instanceof Object)) {
|
29 | throw TypeError;
|
30 | }
|
31 | var schema = {};
|
32 | var primaryKeyProp;
|
33 | var metaDataMap = this.getAllMetadataForSchema(target);
|
34 | let arrayProps = [];
|
35 | for (var field in metaDataMap) {
|
36 |
|
37 |
|
38 |
|
39 |
|
40 | var fieldMetadata = metaDataMap[field];
|
41 | if (fieldMetadata.params && fieldMetadata.params.primary) {
|
42 | let type = fieldMetadata.getType();
|
43 | if (type == Object)
|
44 | continue;
|
45 | }
|
46 |
|
47 | if (fieldMetadata.propertyType.isArray && !this.isJsonMapTypeProp(fieldMetadata)) {
|
48 | arrayProps.push(field);
|
49 | }
|
50 | if (fieldMetadata.decoratorType !== decorator_type_1.DecoratorType.PROPERTY) {
|
51 | continue;
|
52 | }
|
53 | if (fieldMetadata.params && fieldMetadata.params.searchIndex) {
|
54 | schema[field] = this.getSearchSchemaTypeForParam(fieldMetadata);
|
55 | }
|
56 | else {
|
57 | schema[field] = this.getSchemaTypeForParam(fieldMetadata);
|
58 | }
|
59 | }
|
60 | exports._arrayPropListSchema[this.schemaName] = arrayProps;
|
61 | return schema;
|
62 | }
|
63 | getSearchSchemaTypeForParam(fieldMetadata) {
|
64 | var schemaType = this.getSchemaTypeForType(fieldMetadata.getType());
|
65 | if (fieldMetadata.params && fieldMetadata.params.rel) {
|
66 | return fieldMetadata.propertyType.isArray ? [schemaType] : schemaType;
|
67 | }
|
68 | else {
|
69 | return fieldMetadata.propertyType.isArray ? [schemaType] : { type: schemaType, es_indexed: true };
|
70 | }
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
82 |
|
83 |
|
84 |
|
85 | }
|
86 | getSchemaTypeForParam(fieldMetadata) {
|
87 | var schemaType = this.getSchemaTypeForType(fieldMetadata.getType());
|
88 | return fieldMetadata.propertyType.isArray ? (this.isJsonMapTypeProp(fieldMetadata) ? {} : [schemaType]) : schemaType;
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 |
|
102 |
|
103 | }
|
104 | getSchemaTypeForType(type) {
|
105 | switch (type) {
|
106 | case Mongoose.Types.ObjectId: return Mongoose.Schema.Types.ObjectId;
|
107 | case String: return String;
|
108 | case Number: return Number;
|
109 | case Buffer: return Buffer;
|
110 | case Date: return Date;
|
111 | case Boolean: return Boolean;
|
112 | case Array: return Array;
|
113 |
|
114 |
|
115 | case Object:
|
116 | default: return Mongoose.Schema.Types.Mixed;
|
117 | }
|
118 | }
|
119 | getMongooseOptions(target) {
|
120 | var meta = utils_1.MetaUtils.getMetaData(target, decorators_1.Decorators.DOCUMENT);
|
121 | var documentMeta = meta[0];
|
122 | var options = {};
|
123 | var params = (documentMeta.params || {});
|
124 | switch (params.strict) {
|
125 | case document_strict_1.Strict.true:
|
126 | options.strict = true;
|
127 | break;
|
128 | case document_strict_1.Strict.false:
|
129 | options.strict = false;
|
130 | break;
|
131 | case document_strict_1.Strict.throw:
|
132 | options.strict = "throw";
|
133 | break;
|
134 | default:
|
135 | options.strict = true;
|
136 | break;
|
137 | }
|
138 | return options;
|
139 | }
|
140 | isSchemaDecorator(decorator) {
|
141 | return decorator === decorators_1.Decorators.FIELD || decorator === decorators_1.Decorators.ONETOMANY || decorator === decorators_1.Decorators.MANYTOONE || decorator === decorators_1.Decorators.MANYTOMANY || decorator === decorators_1.Decorators.ONETOONE;
|
142 | }
|
143 | getAllMetadataForSchema(target) {
|
144 | var metaDataMap = utils_1.MetaUtils.getMetaData(target);
|
145 | var metaDataMapFiltered = {};
|
146 | for (var i in metaDataMap) {
|
147 | var meta = metaDataMap[i];
|
148 | if (!this.isSchemaDecorator(meta.decorator))
|
149 | continue;
|
150 | if (metaDataMapFiltered[meta.propertyKey])
|
151 | throw "A property cannot have more than one schema decorator";
|
152 | metaDataMapFiltered[meta.propertyKey] = meta;
|
153 | }
|
154 | return metaDataMapFiltered;
|
155 | }
|
156 | isJsonMapTypeProp(fieldMetadata) {
|
157 | if (!fieldMetadata.params) {
|
158 | return false;
|
159 | }
|
160 | return fieldMetadata.params.storageType === index_1.StorageType.JSONMAP;
|
161 | }
|
162 | }
|
163 | exports.DynamicSchema = DynamicSchema;
|
164 |
|
165 |
|