Comparing version 1.13.9 to 1.13.10
@@ -127,2 +127,6 @@ /// <reference types="fibjs" /> | ||
} | ||
interface FibAppIneternalApiFindResult<ReponseT = any> { | ||
count: number | ||
results: ReponseT[] | ||
} | ||
@@ -224,4 +228,17 @@ interface FibAppInternalViewApis { | ||
order?: string | ||
// it's numberType, but it's designed as boolean | ||
/** | ||
* it's numberType, but it's designed as boolean like count_required | ||
* @history this is mostly for arg from http get url like | ||
* | ||
* // from http | ||
* `http://localhost:8080/api/user?count=1` | ||
*/ | ||
count?: number | ||
/** | ||
* // from http | ||
* `http://localhost:8080/api/user?count_required=1&skip=10` -> `count_required = true` | ||
* `http://localhost:8080/api/user?count_required=0&skip=10` -> `count_required = true` | ||
* `http://localhost:8080/api/user?count_required=&skip=10` -> `count_required = false` | ||
*/ | ||
count_required?: boolean | ||
@@ -228,0 +245,0 @@ [extraField: string]: any; |
v1.13.9 / 2018-12-10 | ||
v1.13.10 / 2018-12-13 | ||
================== | ||
* [grahpql]support paging in *2m assoc (including reverse-hasOne and hasMany) | ||
* comment update. | ||
* more clean internal find work-flow. | ||
* add test case about extend fields' filter. | ||
v1.13.9 / 2018-12-10 | ||
==================== | ||
* Release v1.13.9 | ||
* upgrade orm version | ||
@@ -6,0 +15,0 @@ * [injected rest request info] little fix; robust for `attachInteralApiRequestInfoToInstnace`. |
@@ -0,0 +0,0 @@ const mq = require("mq"); |
@@ -0,0 +0,0 @@ const orm = require("@fxjs/orm"); |
@@ -10,2 +10,3 @@ /// <reference types="@fxjs/orm" /> | ||
const orm_assoc_1 = require("../utils/orm-assoc"); | ||
const query_1 = require("../utils/query"); | ||
function map_ro_result(ro) { | ||
@@ -119,3 +120,3 @@ return { | ||
return { | ||
success: _find(req, cls.find()) | ||
success: query_1.found_result_selector(_find(req, cls.find()), !query_1.is_count_required(req.query) ? 'results' : '') | ||
}; | ||
@@ -122,0 +123,0 @@ }; |
@@ -10,2 +10,3 @@ Object.defineProperty(exports, "__esModule", { value: true }); | ||
const orm_assoc_1 = require("../utils/orm-assoc"); | ||
const query_1 = require("../utils/query"); | ||
function map_ro_result(ro) { | ||
@@ -218,3 +219,3 @@ return { | ||
return { | ||
success: _find(req, obj.inst[_association.getAccessor].call(obj.inst), obj.inst, extend) | ||
success: query_1.found_result_selector(_find(req, obj.inst[_association.getAccessor].call(obj.inst), obj.inst, extend), !query_1.is_count_required(req.query) ? 'results' : '') | ||
}; | ||
@@ -221,0 +222,0 @@ }; |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -32,2 +32,7 @@ const util = require("util"); | ||
}; | ||
function get_extend_paging_unique_name(m, rel_model, extend) { | ||
if (rel_model.type === 'hasOne' && rel_model.reversed) | ||
return `extend_paging__reverse_${rel_model.model.model_name}_${rel_model.type}_${extend}_${m.model_name}`; | ||
return `extend_paging__${m.model_name}_${rel_model.type}_${extend}_${rel_model.model.model_name}`; | ||
} | ||
module.exports = function (app, db) { | ||
@@ -55,11 +60,11 @@ var types = {}; | ||
case 'find_only': | ||
args.count = 0; | ||
args.count_required = false; | ||
break; | ||
case 'count_only': | ||
args.count = 1; | ||
args.count_required = true; | ||
args.limit = 0; | ||
selector = success => success.count; | ||
selector = (success) => success.count; | ||
break; | ||
case 'paging': | ||
args.count = 1; | ||
args.count_required = true; | ||
break; | ||
@@ -78,13 +83,3 @@ } | ||
} | ||
function paging_resolve(m) { | ||
return { | ||
results: { | ||
type: new graphql.GraphQLList(types[m.model_name].type), | ||
}, | ||
count: { | ||
type: graphql.GraphQLInt | ||
} | ||
}; | ||
} | ||
function get_resolve_one(m, f) { | ||
function eget_resolve(m, f) { | ||
return (function (parent, args, req) { | ||
@@ -104,4 +99,13 @@ var res = debug_1.debugFunctionWrapper(app.api.eget)({ | ||
} | ||
function get_resolve_many(m, f) { | ||
function efind_many_resolve(m, f, mode = '') { | ||
const is_paging_mode = mode === 'paging'; | ||
return (function (parent, args, req) { | ||
if (is_paging_mode) { | ||
args.count = 1; | ||
args.count_required = true; | ||
} | ||
else { | ||
args.count = 0; | ||
args.count_required = false; | ||
} | ||
var res = debug_1.debugFunctionWrapper(app.api.efind)({ | ||
@@ -118,6 +122,11 @@ session: req.session, | ||
} | ||
function get_resolve_extra_in_many(m, f) { | ||
return (function (parent, args, req) { | ||
return parent.extra; | ||
}); | ||
function paging_fields(list_item_type) { | ||
return { | ||
results: { | ||
type: list_item_type, | ||
}, | ||
count: { | ||
type: graphql.GraphQLInt | ||
} | ||
}; | ||
} | ||
@@ -142,3 +151,5 @@ function get_fields_hasmanyextra_alone(m, extend, many_association, getter) { | ||
}), | ||
resolve: get_resolve_extra_in_many(m, extend) | ||
resolve: function (parent, args, req) { | ||
return parent.extra; | ||
} | ||
}; | ||
@@ -163,2 +174,3 @@ return basic_fields; | ||
} | ||
var extend_paging_types = {}; | ||
function get_fields(m, no_extra_fields = false) { | ||
@@ -186,30 +198,50 @@ return (function () { | ||
type: types[rel_model.model.model_name].type, | ||
resolve: get_resolve_one(m, f) | ||
resolve: eget_resolve(m, f) | ||
}; | ||
else | ||
else { | ||
let type_has_many = new graphql.GraphQLList(types[rel_model.model.model_name].type); | ||
let type_has_many_mixin_extra = null; | ||
let has_many_association = null; | ||
if (!no_extra_fields) { | ||
has_many_association = orm_assoc_1.check_hasmany_extend_extraprops((new m()), f); | ||
if (has_many_association) { | ||
// hasMany-assoc-style result: alone mode(recommendation) | ||
type_has_many = new graphql.GraphQLList(new graphql.GraphQLObjectType({ | ||
name: `${m.model_name}__${f}__aloneExtraWrapper`, | ||
fields: get_fields_hasmanyextra_alone(m, f, has_many_association, get_fields(rel_model.model, true)), | ||
})); | ||
// hasMany-assoc-style result: mixin mode | ||
type_has_many_mixin_extra = new graphql.GraphQLList(new graphql.GraphQLObjectType({ | ||
name: `${m.model_name}__${f}__mixinExtraWrapper`, | ||
fields: get_fields_hasmanyextra_mixins(m, has_many_association, get_fields(rel_model.model, true)), | ||
})); | ||
} | ||
} | ||
fields[f] = { | ||
type: new graphql.GraphQLList(types[rel_model.model.model_name].type), | ||
type: type_has_many, | ||
args: hasManyArgs, | ||
resolve: get_resolve_many(m, f) | ||
resolve: efind_many_resolve(m, f) | ||
}; | ||
if (no_extra_fields) | ||
continue; | ||
var has_many_association = orm_assoc_1.check_hasmany_extend_extraprops((new m()), f); | ||
if (has_many_association) { | ||
fields[`${f}`] = { | ||
type: new graphql.GraphQLList(new graphql.GraphQLObjectType({ | ||
name: `${m.model_name}__${f}__aloneExtraWrapper`, | ||
fields: get_fields_hasmanyextra_alone(m, f, has_many_association, get_fields(rel_model.model, true)), | ||
})), | ||
var extend_paging_uname = get_extend_paging_unique_name(m, rel_model, f); | ||
fields[`paging_${f}`] = { | ||
type: ( | ||
/** | ||
* there maybe repeative call to `get_fields`, and the name of this type should always keep unique | ||
*/ | ||
extend_paging_types[extend_paging_uname] = extend_paging_types[extend_paging_uname] | ||
|| new graphql.GraphQLObjectType({ | ||
name: extend_paging_uname, | ||
args: hasManyArgs, | ||
fields: paging_fields(fields[f].type) | ||
})), | ||
args: hasManyArgs, | ||
resolve: get_resolve_many(m, f) | ||
resolve: efind_many_resolve(m, f, 'paging') | ||
}; | ||
fields[`${f}__extra`] = { | ||
type: new graphql.GraphQLList(new graphql.GraphQLObjectType({ | ||
name: `${m.model_name}__${f}__mixinExtraWrapper`, | ||
fields: get_fields_hasmanyextra_mixins(m, has_many_association, get_fields(rel_model.model, true)), | ||
})), | ||
args: hasManyArgs, | ||
resolve: get_resolve_many(m, f) | ||
}; | ||
if (type_has_many_mixin_extra) { | ||
fields[`${f}__extra`] = { | ||
type: type_has_many_mixin_extra, | ||
args: hasManyArgs, | ||
resolve: efind_many_resolve(m, f) | ||
}; | ||
} | ||
} | ||
@@ -250,3 +282,3 @@ } | ||
name: `paging_${k}`, | ||
fields: paging_resolve(m) | ||
fields: paging_fields(new graphql.GraphQLList(types[m.model_name].type)) | ||
}), | ||
@@ -253,0 +285,0 @@ args: hasManyArgs, |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
module.exports = require('./app'); |
@@ -0,0 +0,0 @@ /// <reference path="../../@types/index.d.ts" /> |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -0,0 +0,0 @@ /// <reference types="@fxjs/orm" /> |
@@ -0,0 +0,0 @@ const orm = require("@fxjs/orm"); |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -0,0 +0,0 @@ var Viz = require('viz.js'); |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -0,0 +0,0 @@ /// <reference path="../../@types/index.d.ts" /> |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -33,3 +33,3 @@ const checkout_acl_1 = require("./checkout_acl"); | ||
}); | ||
if (query_1.isCountOnly(query)) | ||
if (query_1.is_count_required(query)) | ||
return { | ||
@@ -39,3 +39,6 @@ results: objs, | ||
}; | ||
return objs; | ||
return { | ||
results: objs, | ||
count: 0 | ||
}; | ||
}; |
@@ -0,0 +0,0 @@ /// <reference path="../../@types/index.d.ts" /> |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -0,0 +0,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -26,5 +26,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.filterLimit = filterLimit; | ||
function isCountOnly(query) { | ||
return query.count == 1; | ||
function is_count_required(query) { | ||
if (!query) | ||
return false; | ||
return query.count_required == true || query.count == 1; | ||
} | ||
exports.isCountOnly = isCountOnly; | ||
exports.is_count_required = is_count_required; | ||
function found_result_selector(result, fetch_field = '') { | ||
return fetch_field ? result[fetch_field] : result; | ||
} | ||
exports.found_result_selector = found_result_selector; |
{ | ||
"name": "fib-app", | ||
"version": "1.13.9", | ||
"version": "1.13.10", | ||
"description": "", | ||
@@ -5,0 +5,0 @@ "main": "./lib", |
143224
2814