UNPKG

2.19 kBJavaScriptView Raw
1/**
2 * @copyright Copyright (c) 2019 Maxim Khorin <maksimovichu@gmail.com>
3 */
4'use strict';
5
6module.exports = class QueryHelper {
7
8 static getAttr (model, name) {
9 return model instanceof ActiveRecord ? model.get(name) : model[name];
10 }
11
12 static indexObjects (docs, key) {
13 const result = {};
14 for (const doc of docs) {
15 result[typeof key === 'function' ? key(doc) : doc[key]] = doc;
16 }
17 return result;
18 }
19
20 static indexModels (models, key) {
21 const result = {};
22 for (const model of models) {
23 result[typeof key === 'function' ? key(model) : model.get(key)] = model;
24 }
25 return result;
26 }
27
28 static normalizeRelations (model, data) {
29 const result = {};
30 let tail, relation;
31 for (let name of Object.keys(data)) {
32 const value = data[name];
33 const pos = name.indexOf('.');
34 if (pos > 0) {
35 tail = name.substring(pos + 1);
36 name = name.substring(0, pos);
37 }
38 if (Object.prototype.hasOwnProperty.call(result, name)) {
39 relation = result[name];
40 } else {
41 relation = model.getRelation(name);
42 if (!relation) {
43 continue;
44 }
45 relation.primaryModel = null;
46 result[name] = relation;
47 }
48 if (tail) { // sub-relations -> order.customer.address...
49 relation.with({[tail]: value});
50 } else if (typeof value === 'function') {
51 value(relation);
52 }
53 }
54 return result;
55 }
56
57 static unlinkInternal (ref, link, model, key) {
58 if (Array.isArray(ref)) {
59 const index = ArrayHelper.indexOf(link, ref);
60 if (index !== - 1) {
61 ref.splice(index, 1);
62 }
63 } else {
64 model.set(key, null);
65 }
66 return model.forceSave();
67 }
68};
69
70const ArrayHelper = require('./ArrayHelper');
71const ActiveRecord = require('../db/ActiveRecord');
\No newline at end of file