|
|
|
@ -69,6 +69,46 @@ function applyFilterArgument(query, filter) {
|
|
|
|
|
return query;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function applyModifiersToQuery(query, { filter, orderBy, skip, limit }) {
|
|
|
|
|
if (filter != null) {
|
|
|
|
|
query = applyFilterArgument(query, filter);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (orderBy != null) {
|
|
|
|
|
let ascending = !orderBy.startsWith("-");
|
|
|
|
|
|
|
|
|
|
let orderField = (ascending === true)
|
|
|
|
|
? orderBy
|
|
|
|
|
: orderBy.slice(1);
|
|
|
|
|
|
|
|
|
|
query = query.orderBy(orderField, (ascending === true) ? "asc" : "desc");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (skip != null) {
|
|
|
|
|
query = query.offset(skip);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (limit != null) {
|
|
|
|
|
query = query.limit(limit);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return query;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function resultsToType(result, first, makeType) {
|
|
|
|
|
if (first === true) {
|
|
|
|
|
if (result.length > 0) {
|
|
|
|
|
return makeType(result[0].id);
|
|
|
|
|
} else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return result.map((item) => {
|
|
|
|
|
return makeType(item.id);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
lessThan: function (value) {
|
|
|
|
|
return {
|
|
|
|
@ -141,18 +181,29 @@ module.exports = {
|
|
|
|
|
sourceColumn: foreignKey.column,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
remoteTypes[remoteTypeName][remoteField] = async function(_, { $make, $getProperty, knex }) {
|
|
|
|
|
remoteTypes[remoteTypeName][remoteField] = async function({ count, filter, orderBy, skip, limit, first }, { $make, $getProperty, knex }) {
|
|
|
|
|
let tx = (knex ?? globalKnex);
|
|
|
|
|
|
|
|
|
|
let result = await wrapErrors(async () => {
|
|
|
|
|
return tx(tableName).columns("id").where({
|
|
|
|
|
[idFieldName]: await $getProperty(this, primaryKey)
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
if (count === true) {
|
|
|
|
|
let query = tx(tableName).count("id").first();
|
|
|
|
|
query = applyModifiersToQuery(query, { filter });
|
|
|
|
|
return query;
|
|
|
|
|
} else {
|
|
|
|
|
let query = tx(tableName).columns("id").where({
|
|
|
|
|
[idFieldName]: await $getProperty(this, primaryKey)
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return result.map((item) => {
|
|
|
|
|
return $make(typeName, { id: item.id });
|
|
|
|
|
query = applyModifiersToQuery(query, { filter, orderBy, skip, limit });
|
|
|
|
|
return query;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (count === true) {
|
|
|
|
|
return parseInt(result.count);
|
|
|
|
|
} else {
|
|
|
|
|
return resultsToType(result, first, (id) => $make(typeName, { id: id }));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
@ -228,48 +279,27 @@ module.exports = {
|
|
|
|
|
},
|
|
|
|
|
rootQueries: {
|
|
|
|
|
// top-level stuff? but expect the developer to place that in a specific location
|
|
|
|
|
list: async function ({ filter, orderBy, skip, limit, first }, { $make, knex }) {
|
|
|
|
|
list: async function ({ count, filter, orderBy, skip, limit, first }, { $make, knex }) {
|
|
|
|
|
let tx = (knex ?? globalKnex);
|
|
|
|
|
|
|
|
|
|
let query = tx(tableName).column(primaryKey);
|
|
|
|
|
|
|
|
|
|
if (filter != null) {
|
|
|
|
|
query = applyFilterArgument(query, filter);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (orderBy != null) {
|
|
|
|
|
let ascending = !orderBy.startsWith("-");
|
|
|
|
|
|
|
|
|
|
let orderField = (ascending === true)
|
|
|
|
|
? orderBy
|
|
|
|
|
: orderBy.slice(1);
|
|
|
|
|
|
|
|
|
|
query = query.orderBy(orderField, (ascending === true) ? "asc" : "desc");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (skip != null) {
|
|
|
|
|
query = query.offset(skip);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (limit != null) {
|
|
|
|
|
query = query.limit(limit);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let result = await wrapErrors(async () => {
|
|
|
|
|
return query;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// TODO: Map result(s) to types
|
|
|
|
|
if (first === true) {
|
|
|
|
|
if (result.length > 0) {
|
|
|
|
|
return $make(typeName, { id: result[0].id });
|
|
|
|
|
} else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (count === true) {
|
|
|
|
|
let query = tx(tableName).count(primaryKey).first();
|
|
|
|
|
query = applyModifiersToQuery(query, { filter });
|
|
|
|
|
|
|
|
|
|
let result = await wrapErrors(async () => {
|
|
|
|
|
return query;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return parseInt(result.count);
|
|
|
|
|
} else {
|
|
|
|
|
return result.map((item) => {
|
|
|
|
|
return $make(typeName, { id: item.id });
|
|
|
|
|
let query = tx(tableName).column(primaryKey);
|
|
|
|
|
query = applyModifiersToQuery(query, { filter, orderBy, skip, limit });
|
|
|
|
|
|
|
|
|
|
let result = await wrapErrors(async () => {
|
|
|
|
|
return query;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return resultsToType(result, first, (id) => $make(typeName, { id: id }));
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
delete: async function ({ filter }, { knex }) {
|
|
|
|
|