1 | var _ = require("underscore");
|
2 | var EventedClass = require("./EventedClass");
|
3 |
|
4 | module.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 |
|
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?:\/\//)){
|
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){
|
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{
|
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 | });
|