Changeset View
Changeset View
Standalone View
Standalone View
lib/app/base-chips/field-types/single_reference.js
"use strict"; | |||||
const locreq = require("locreq")(__dirname); | const locreq = require("locreq")(__dirname); | ||||
const Collection = locreq("lib/chip-types/collection.js"); | const Collection = locreq("lib/chip-types/collection.js"); | ||||
const Promise = require("bluebird"); | const Promise = require("bluebird"); | ||||
module.exports = function(app) { | module.exports = function(app) { | ||||
return { | return { | ||||
name: "single_reference", | name: "single_reference", | ||||
has_index: () => 1, | has_index: () => 1, | ||||
is_proper_value: function(context, params, new_value) { | is_proper_value(context, params, new_value) { | ||||
const collection = new Collection(app, params.collection); | const collection = new Collection(app, params.collection); | ||||
const filter = params.filter || {}; | const filter = params.filter || {}; | ||||
if (new_value === "") { | if (new_value === "") { | ||||
return Promise.resolve(); | return Promise.resolve(); | ||||
} | } | ||||
let resource_id; | let resource_id; | ||||
if (typeof new_value === "string") { | if (typeof new_value === "string") { | ||||
Show All 17 Lines | is_proper_value(context, params, new_value) { | ||||
? Promise.resolve() | ? Promise.resolve() | ||||
: Promise.reject( | : Promise.reject( | ||||
`Nie masz dostępu do danego zasobu z kolekcji ${ | `Nie masz dostępu do danego zasobu z kolekcji ${ | ||||
collection.name | collection.name | ||||
} lub on nie istnieje.` | } lub on nie istnieje.` | ||||
) | ) | ||||
); | ); | ||||
}, | }, | ||||
encode: function(context, params, value_in_code) { | encode(context, params, value_in_code) { | ||||
let resource_id; | let resource_id; | ||||
if (typeof value_in_code === "string") { | if (typeof value_in_code === "string") { | ||||
resource_id = value_in_code; | resource_id = value_in_code; | ||||
} else if (typeof value_in_code === "object") { | } else if (typeof value_in_code === "object") { | ||||
resource_id = value_in_code.id; | resource_id = value_in_code.id; | ||||
} | } | ||||
return resource_id; | return resource_id; | ||||
}, | }, | ||||
format: function(context, params, decoded_value, format) { | format(context, params, decoded_value, format) { | ||||
// format can be "expand" or "deep-expand:<depth>", like "deep-expand:3" | // format can be "expand" or "deep-expand:<depth>", like "deep-expand:3" | ||||
if (!format) { | if (!format) { | ||||
return decoded_value; // just the ID | return decoded_value; // just the ID | ||||
} | } | ||||
if (decoded_value === "") { | if (decoded_value === "") { | ||||
return null; // no reference here; | return null; // no reference here; | ||||
} | } | ||||
Show All 11 Lines | format(context, params, decoded_value, format) { | ||||
const collection = new Collection(app, params.collection); | const collection = new Collection(app, params.collection); | ||||
const resource_id = decoded_value; | const resource_id = decoded_value; | ||||
const query_format = {}; | const query_format = {}; | ||||
if (format_params[0] === "deep-expand" && format_params[1] > 1) { | if (format_params[0] === "deep-expand" && format_params[1] > 1) { | ||||
for (const field_name in collection.fields) { | for (const field_name in collection.fields) { | ||||
const field = collection.fields[field_name]; | const field = collection.fields[field_name]; | ||||
if (field.type.name === "single_reference") { | if (field.type.name === "single_reference") { | ||||
query_format[field_name] = `deep-expand:${parseInt( | query_format[field_name] = `deep-expand:${parseInt( | ||||
format_params[1] | format_params[1], | ||||
10 | |||||
) - 1}`; | ) - 1}`; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
return app.run_action( | return app.run_action( | ||||
context, | context, | ||||
["collections", collection.name, resource_id], | ["collections", collection.name, resource_id], | ||||
"show", | "show", | ||||
{ format: query_format } | { format: query_format } | ||||
); | ); | ||||
}, | }, | ||||
filter_to_query: async function(context, params, field_filter) { | async filter_to_query(context, params, field_filter) { | ||||
// treating filter as a query here | // treating filter as a query here | ||||
if (typeof field_filter !== "object") { | if (typeof field_filter !== "object") { | ||||
return { | return { | ||||
$eq: field_filter, | $eq: field_filter, | ||||
}; | }; | ||||
} | } | ||||
const collection = new Collection(app, params.collection); | const collection = new Collection(app, params.collection); | ||||
const { items: resources } = await app.run_action( | const { items: resources } = await app.run_action( | ||||
context, | context, | ||||
["collections", collection.name], | ["collections", collection.name], | ||||
"show", | "show", | ||||
{ | { | ||||
filter: field_filter, | filter: field_filter, | ||||
} | } | ||||
); | ); | ||||
return { $in: resources.map(resource => resource.id) }; | return { $in: resources.map(resource => resource.id) }; | ||||
}, | }, | ||||
get_aggregation_stages: function( | get_aggregation_stages( | ||||
context, | context, | ||||
params, | params, | ||||
field_name, | field_name, | ||||
field_value_path, | field_value_path, | ||||
query | query | ||||
) { | ) { | ||||
const collection = new Collection(app, params.collection); | const collection = new Collection(app, params.collection); | ||||
const filter = {}; | const filter = {}; | ||||
const temp_field_name = | const temp_field_name = | ||||
collection.name + | `${collection.name}-` + | ||||
"-" + | `lookup${Math.floor( | ||||
"lookup" + | Math.random().toString() * Math.pow(10, 7) | ||||
Math.floor(Math.random().toString() * Math.pow(10, 7)); | )}`; | ||||
const request_filter = query.filter && query.filter[field_name]; | const request_filter = query.filter && query.filter[field_name]; | ||||
if (!request_filter || Object.keys(request_filter).length === 0) | if (!request_filter || Object.keys(request_filter).length === 0) | ||||
return []; | return []; | ||||
if (typeof request_filter === "string") { | if (typeof request_filter === "string") { | ||||
return [{ $match: { [field_value_path]: request_filter } }]; | return [{ $match: { [field_value_path]: request_filter } }]; | ||||
} | } | ||||
if (request_filter instanceof Array) { | if (request_filter instanceof Array) { | ||||
let _in = request_filter; | let _in = request_filter; | ||||
if (request_filter[0] instanceof Array) _in = request_filter[0]; | if (request_filter[0] instanceof Array) _in = request_filter[0]; | ||||
return [ | return [ | ||||
{ | { | ||||
$match: { | $match: { | ||||
[field_value_path]: { $in: _in }, | [field_value_path]: { $in: _in }, | ||||
}, | }, | ||||
}, | }, | ||||
]; | ]; | ||||
} | } | ||||
for (let field_name in request_filter) { | for (let _field_name in request_filter) { | ||||
let field = collection.fields[field_name]; | let field = collection.fields[_field_name]; | ||||
if (!field) | if (!field) | ||||
return Promise.reject( | return Promise.reject( | ||||
"Unknown field in filter for '" + | `Unknown field in filter for '${ | ||||
collection.name + | collection.name | ||||
"': " + | }': ${_field_name}` | ||||
field_name | |||||
); | ); | ||||
filter[ | filter[ | ||||
`${temp_field_name}.0.${field_name}` | `${temp_field_name}.0.${_field_name}` | ||||
] = field.filter_to_query(context, request_filter[field_name]); | ] = field.filter_to_query(context, request_filter[_field_name]); | ||||
} | } | ||||
return Promise.props(filter).then(function(_filter) { | return Promise.props(filter).then(_filter => { | ||||
return [ | return [ | ||||
{ | { | ||||
$lookup: { | $lookup: { | ||||
from: collection.name, | from: collection.name, | ||||
localField: field_value_path, | localField: field_value_path, | ||||
foreignField: "sealious_id", | foreignField: "sealious_id", | ||||
as: temp_field_name, | as: temp_field_name, | ||||
}, | }, | ||||
}, | }, | ||||
{ $match: _filter }, | { $match: _filter }, | ||||
]; | ]; | ||||
}); | }); | ||||
}, | }, | ||||
}; | }; | ||||
}; | }; |