UNPKG

7.39 kBJavaScriptView Raw
1"use strict";
2const Mongoose = require('mongoose');
3//import aa = require('mongoose');
4const Enumerable = require('linq');
5const document_strict_1 = require('./enums/document-strict');
6const decorators_1 = require('../core/constants/decorators');
7const mongooseSchemaGenerator_1 = require("./mongooseSchemaGenerator");
8const decorator_type_1 = require('../core/enums/decorator-type');
9const utils_1 = require("../core/metadata/utils");
10const index_1 = require("../core/enums/index");
11exports._arrayPropListSchema = {};
12class 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 // Skip autogenerated primary column
37 //if (prop === primaryKeyProp) {
38 // continue;
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 // add array props in _arrayPropListSchema dictonary.
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 //var schemaType = this.getSchemaTypeForType(paramType);
72 //if (paramType.rel) {
73 // //var metaData = Utils.getPrimaryKeyMetadata(paramType.itemType);
74 // //var relSchema;
75 // //if ((<any>fieldMetadata.params).embedded) {
76 // // schema[field] = paramType.isArray ? [Types.Mixed] : Mongoose.Schema.Types.Mixed;
77 // //} else {
78 // // relSchema = { ref: paramType.rel, type: Mongoose.Schema.Types.ObjectId };
79 // // schema[field] = paramType.isArray ? [relSchema] : relSchema;
80 // //}
81 // // need to handle embedding vs foreign key refs
82 // return paramType.isArray ? [schemaType] : schemaType;
83 //}
84 //return paramType.isArray ? [schemaType] : {type : schemaType, es_indexed : true};
85 }
86 getSchemaTypeForParam(fieldMetadata) {
87 var schemaType = this.getSchemaTypeForType(fieldMetadata.getType());
88 return fieldMetadata.propertyType.isArray ? (this.isJsonMapTypeProp(fieldMetadata) ? {} : [schemaType]) : schemaType;
89 //var schemaType = this.getSchemaTypeForType(paramType.itemType);
90 //if (paramType.rel) {
91 // //var metaData = Utils.getPrimaryKeyMetadata(paramType.itemType);
92 // //var relSchema;
93 // //if ((<any>fieldMetadata.params).embedded) {
94 // // schema[field] = paramType.isArray ? [Types.Mixed] : Mongoose.Schema.Types.Mixed;
95 // //} else {
96 // // relSchema = { ref: paramType.rel, type: Mongoose.Schema.Types.ObjectId };
97 // // schema[field] = paramType.isArray ? [relSchema] : relSchema;
98 // //}
99 // // need to handle embedding vs foreign key refs
100 // return paramType.isArray ? [schemaType] : schemaType;
101 //}
102 //return paramType.isArray ? [schemaType] : schemaType;
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 //case undefined: return Mongoose.Schema.Types.Mixed;
114 // any or no types
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}
163exports.DynamicSchema = DynamicSchema;
164
165//# sourceMappingURL=dynamic-schema.js.map