Support relation query modifiers, count modifier

master
Sven Slootweg 4 months ago
parent 3898211992
commit ab5d6fb5cc

@ -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 }) {

Loading…
Cancel
Save