UNPKG

4.38 kBJavaScriptView Raw
1var _ = require("underscore");
2var EventedClass = require("./EventedClass");
3
4module.exports = EventedClass.extend("DataLayer", {
5
6 primaryKey: "_id",
7
8 constructor: function(env, structure_name, name){
9 var Prototype = this.constructor;
10 this.env = env;
11 Prototype.setupDatabase(this, env, name);
12 EventedClass.apply(this, arguments);
13 }
14
15}, {
16 baseMethods: _.methods(EventedClass.prototype),
17 setMethods: function(parent, child){
18 child.methods = _.unique(
19 _.difference(
20 _.methods(parent).concat(_.methods(child)),
21 this.baseMethods
22 )
23 );
24 },
25
26 handleSeedOptions: function(ctx, cb, source){
27 if(!ctx.config.options) return cb(null, ctx);
28 var seed = ctx.config.options.seed;
29 if(seed === true || (seed && seed[ctx.name])){
30 var seed_source;
31 function createRecords(data, parsed){
32 if(!parsed && ctx.Prototype.parseSeed){
33 return ctx.Prototype.parseSeed(data, function(err, parsed_data){
34 if(err) return cb(err);
35 createRecords(parsed_data, true );
36 });
37 }
38 if(!Array.isArray(data)) data = [data];
39 ctx.env.helpers.amap(data, function(obj, cb){
40 ctx.instance.create(obj, {}, cb);
41 }, function(err, objects){
42 if(err) return cb(err);
43 ctx.env.i.do("log.sys", "DataLayer:seed", "Seeded "+data.length+" models for data layer \"" + ctx.name + "\"" );
44 cb(null, ctx);
45 });
46
47 }
48 if(source) seed_source = source;
49 else if(seed === true || seed[ctx.name] === true){
50 // Try to find seed from Layer properties
51 seed_source = ctx.instance.seed;
52 }
53 else seed_source = seed[ctx.name];
54 if(!seed_source) return cb(null, ctx);
55 if(typeof seed_source === "string"){
56 if(seed_source.match(/^https?:\/\//)){ // match url
57 var request = require("request");
58 return request.get(seed_source, function(err, res, body){
59 if(res.statusCode !== 200) return cb("Error "+res.statusCode +" ("+seed_source+")");
60 var data, error, parsed = false;
61 if(ctx.Prototype.parseSeed){
62 ctx.Prototype.parseSeed(body, function(err, _data){
63 if(err) {
64 error = true;
65 return cb(err);
66 }
67 data = _data, parsed = true;
68 });
69 }
70 else{
71 try{
72 data = JSON.parse(body);
73 }
74 catch(err){
75 return cb("Can't parse seed source "+" ("+seed_source+")" );
76 }
77 }
78 if(!error) createRecords(data, parsed);
79 });
80 }
81 else if(seed_source.indexOf("/")!==-1){ // match fs path
82 var path = require("path"), fs = require("fs");
83 seed_source = path.join(process.cwd(), seed_source);
84 if(fs.existsSync(seed_source)){
85 try{
86 var seed_data = require(seed_source);
87 if(typeof seed_data === "function") return this.handleSeedOptions(ctx, cb, seed_data);
88 if(ctx.Prototype.parseSeed){
89 return ctx.Prototype.parseSeed(seed_data, function(err, parsed_data){
90 if(err) return cb(err);
91 createRecords(seed_data, true);
92 });
93 }
94 else{
95 return createRecords(seed_data);
96 }
97 }
98 catch(err){ return cb(err); }
99 }
100 else return cb("Error - can't find file ("+seed_source+")");
101 }
102 else{ // match config path
103 var seed_data = ctx.env.helpers.resolve(ctx.config, seed_source);
104 if(typeof seed_data === "string") return this.handleSeedOptions(ctx, cb, seed_data);
105 else return createRecords(seed_data);
106 }
107
108 }
109 else if(typeof seed_source === "function"){
110 return seed_source.call(ctx.instance, function(err, models){
111 if(err) return cb(err);
112 createRecords(models);
113 });
114 }
115 else if(Array.isArray(seed_source)) return createRecords(seed_source);
116 else return createRecords([seed_source]);
117 }
118 else cb(null, ctx);
119 }
120
121});