Graphql 图Ql:来自阵列芯片的继电器连接

Graphql 图Ql:来自阵列芯片的继电器连接,graphql,apollo,graphql-relay,Graphql,Apollo,Graphql Relay,没有任何文档说明如何使用facebook的graphql relay js helper库实现数组元信息(arrayLength和sliceStart) 我使用以下实现成功地实现了它,但是我猜有一种更简单/更正确的方法来实现 从数据库中检索行和行数 function transformRole(role: Role) { return { ...role, roleId: role.id }; } async function getRolesSlice({ roleId, afte

没有任何文档说明如何使用facebook的graphql relay js helper库实现数组元信息(arrayLength和sliceStart)

我使用以下实现成功地实现了它,但是我猜有一种更简单/更正确的方法来实现

从数据库中检索行和行数

function transformRole(role: Role) {
    return { ...role, roleId: role.id };
}

async function getRolesSlice({ roleId, after, first, last, before }: any): Promise<[Role[], number]> {    
    const queryBuilder = repository.createQueryBuilder();

    if (roleId !== undefined) {
        queryBuilder.where('id = :roleId', { roleId });
    }

    if (before) {
        const beforeId = cursorToOffset(before);
        queryBuilder.where('id < :id', { id: beforeId });
    }

    if (after) {
        const afterId = cursorToOffset(after);
        queryBuilder.where({
            id: MoreThan(Number(afterId))
        });
    }

    if (first === undefined && last === undefined) {
        queryBuilder.orderBy('id', 'ASC');
    }

    if (first) {
        queryBuilder.orderBy('id', 'ASC').limit(first);
    }

    if (last) {
        queryBuilder.orderBy('id', 'DESC').limit(last);
    }

    return Promise.all([
        queryBuilder.getMany()
            .then(roles => roles.map(transformRole)),
        repository.count() // Total number of roles
    ]);
}
编辑:

这是我想出的,它是一个小清洁,似乎是正确的工作

const initialize = () => {
    repository = getConnection().getRepository(Role);
}

function transformRole(role: Role) {
    return { ...role, roleId: role.id };
}

function getRolesSlice(args: any):
    Promise<[
        Role[],
        any,
        { arrayLength: number; sliceStart: number; }
    ]> {
    if (!repository) initialize();

    const { roleId, after, first, last, before } = args;

    const queryBuilder = repository.createQueryBuilder();

    if (roleId !== undefined) {
        queryBuilder.where('id = :roleId', { roleId });
    }

    if (before !== undefined) {
        const beforeId = cursorToOffset(before);
        queryBuilder.where({
            id: LessThan(beforeId)
       });
    }

    if (after !== undefined) {
        const afterId = cursorToOffset(after);
        queryBuilder.where({
            id: MoreThan(Number(afterId))
        });
    }

    if (first !== undefined) {
        queryBuilder.orderBy('id', 'ASC').limit(first);
    } else if (last !== undefined) {
        queryBuilder.orderBy('id', 'DESC').limit(last);
    } else {
        queryBuilder.orderBy('id', 'ASC');
    }

    return Promise.all([
        queryBuilder.getMany()
            .then(roles => roles.map(transformRole))
            .then(roles => last !== undefined ? roles.slice().reverse() : roles),
        repository.count()
    ]).then(([roles, totalCount]) =>
        [
            roles,
            args,
            {
                arrayLength: totalCount + 1,
                sliceStart: roles[0] && roles[0].roleId
            }
        ]
    );
}

// Resolver
roles: {
    type: rolesConnection,
    args: {
        ...connectionArgs,
        roleId: {
            type: GraphQLString
        }
    },
    resolve: (_, args) =>
        getRolesSlice(args)
            .then((slice) => connectionFromArraySlice(...slice))
},
const initialize=()=>{
repository=getConnection().getRepository(角色);
}
功能转换角色(角色:角色){
返回{…角色,roleId:role.id};
}
函数getRolesSlice(参数:任意):
允诺{
如果(!repository)初始化();
const{roleId,after,first,last,before}=args;
const queryBuilder=repository.createQueryBuilder();
if(roleId!==未定义){
其中('id=:roleId',{roleId});
}
如果(之前!==未定义){
const beforeId=光标偏移量(之前);
queryBuilder.where({
id:LessThan(以前的id)
});
}
如果(之后!==未定义){
常量afterId=游标偏移量(之后);
queryBuilder.where({
id:超过(编号(afterId))
});
}
如果(第一个!==未定义){
queryBuilder.orderBy('id','ASC').limit(第一);
}else if(last!==未定义){
queryBuilder.orderBy('id','DESC').limit(last);
}否则{
orderBy('id','ASC');
}
回报你的承诺([
queryBuilder.getMany()
.then(角色=>roles.map(转换角色))
.然后(角色=>last!==未定义的角色.slice().reverse():角色),
repository.count()
])。然后(([roles,totalCount])=>
[
角色,
args,
{
阵列长度:总计数+1,
sliceStart:角色[0]&角色[0]。角色ID
}
]
);
}
//分解器
角色:{
类型:角色连接,
args:{
…连接args,
罗莱德:{
类型:GraphQLString
}
},
解析:(\uz,args)=>
getRolesSlice(args)
.然后((切片)=>connectionFromArraySlice(…切片))
},
const initialize = () => {
    repository = getConnection().getRepository(Role);
}

function transformRole(role: Role) {
    return { ...role, roleId: role.id };
}

function getRolesSlice(args: any):
    Promise<[
        Role[],
        any,
        { arrayLength: number; sliceStart: number; }
    ]> {
    if (!repository) initialize();

    const { roleId, after, first, last, before } = args;

    const queryBuilder = repository.createQueryBuilder();

    if (roleId !== undefined) {
        queryBuilder.where('id = :roleId', { roleId });
    }

    if (before !== undefined) {
        const beforeId = cursorToOffset(before);
        queryBuilder.where({
            id: LessThan(beforeId)
       });
    }

    if (after !== undefined) {
        const afterId = cursorToOffset(after);
        queryBuilder.where({
            id: MoreThan(Number(afterId))
        });
    }

    if (first !== undefined) {
        queryBuilder.orderBy('id', 'ASC').limit(first);
    } else if (last !== undefined) {
        queryBuilder.orderBy('id', 'DESC').limit(last);
    } else {
        queryBuilder.orderBy('id', 'ASC');
    }

    return Promise.all([
        queryBuilder.getMany()
            .then(roles => roles.map(transformRole))
            .then(roles => last !== undefined ? roles.slice().reverse() : roles),
        repository.count()
    ]).then(([roles, totalCount]) =>
        [
            roles,
            args,
            {
                arrayLength: totalCount + 1,
                sliceStart: roles[0] && roles[0].roleId
            }
        ]
    );
}

// Resolver
roles: {
    type: rolesConnection,
    args: {
        ...connectionArgs,
        roleId: {
            type: GraphQLString
        }
    },
    resolve: (_, args) =>
        getRolesSlice(args)
            .then((slice) => connectionFromArraySlice(...slice))
},