feat: Implement pagination logic and use with getExecutions query

This commit is contained in:
Faruk AYDIN
2022-03-10 23:20:54 +03:00
committed by Ömer Faruk Aydın
parent 906a8d0644
commit 44623cc384
3 changed files with 55 additions and 5 deletions

View File

@@ -1,16 +1,22 @@
import Context from '../../types/express/context';
import paginate from '../../helpers/pagination';
type Params = {
limit: number;
offset: number;
};
const getExecutions = async (
_parent: unknown,
_params: unknown,
params: Params,
context: Context
) => {
const executions = await context.currentUser
const executions = context.currentUser
.$relatedQuery('executions')
.withGraphFetched('flow')
.orderBy('created_at', 'asc');
.orderBy('created_at', 'desc');
return executions;
return paginate(executions, params.limit, params.offset);
};
export default getExecutions;

View File

@@ -7,7 +7,7 @@ type Query {
getFlow(id: String!): Flow
getFlows: [Flow]
getStepWithTestExecutions(stepId: String!): [Step]
getExecutions: [Execution]
getExecutions(limit: Int!, offset: Int!): ExecutionConnection
}
type Mutation {
@@ -354,6 +354,20 @@ type User {
updatedAt: String
}
type PageInfo {
currentPage: Int!
totalPages: Int!
}
type ExecutionEdge {
node: Execution
}
type ExecutionConnection {
edges: [ExecutionEdge]
pageInfo: PageInfo
}
schema {
query: Query
mutation: Mutation

View File

@@ -0,0 +1,30 @@
import { QueryBuilder, Model } from 'objection';
const paginate = async (
query: QueryBuilder<Model, Model[]>,
limit: number,
offset: number
) => {
if (limit < 1 || limit > 100) {
throw new Error('Limit must be between 1 and 100');
}
const [records, count] = await Promise.all([
query.limit(limit).offset(offset),
query.resultSize(),
]);
return {
pageInfo: {
currentPage: Math.ceil(offset / limit + 1),
totalPages: Math.ceil(count / limit),
},
edges: records.map((record: Model) => {
return {
node: record,
};
}),
};
};
export default paginate;