feat(modules-sdk): Remote Query (#4463)

* feat: Remote Query
This commit is contained in:
Carlos R. L. Rodrigues
2023-07-19 15:35:36 -03:00
committed by GitHub
parent 95c538c675
commit 5a8a889c6d
57 changed files with 1286 additions and 423 deletions
@@ -19,7 +19,7 @@ describe("RemoteJoiner.parseQuery", () => {
const rjQuery = parser.parseQuery()
expect(rjQuery).toEqual({
service: "order",
alias: "order",
fields: ["id", "number", "date"],
expands: [],
})
@@ -50,7 +50,7 @@ describe("RemoteJoiner.parseQuery", () => {
const rjQuery = parser.parseQuery()
expect(rjQuery).toEqual({
service: "order",
alias: "order",
fields: ["id", "number", "date"],
expands: [],
args: [
@@ -77,6 +77,44 @@ describe("RemoteJoiner.parseQuery", () => {
})
})
it("Simple query with mapping fields to services", async () => {
const graphqlQuery = `
query {
order {
id
number
date
products {
product_id
variant_id
order
variant {
name
sku
}
}
}
}
`
const parser = new GraphQLParser(graphqlQuery, {})
const rjQuery = parser.parseQuery()
expect(rjQuery).toEqual({
alias: "order",
fields: ["id", "number", "date", "products"],
expands: [
{
property: "products",
fields: ["product_id", "variant_id", "order", "variant"],
},
{
property: "products.variant",
fields: ["name", "sku"],
},
],
})
})
it("Nested query with fields", async () => {
const graphqlQuery = `
query {
@@ -100,7 +138,7 @@ describe("RemoteJoiner.parseQuery", () => {
const rjQuery = parser.parseQuery()
expect(rjQuery).toEqual({
service: "order",
alias: "order",
fields: ["id", "number", "date", "products"],
expands: [
{
@@ -138,7 +176,7 @@ describe("RemoteJoiner.parseQuery", () => {
const rjQuery = parser.parseQuery()
expect(rjQuery).toEqual({
service: "order",
alias: "order",
fields: ["id", "number", "date", "products"],
expands: [
{
@@ -205,7 +243,7 @@ describe("RemoteJoiner.parseQuery", () => {
const rjQuery = parser.parseQuery()
expect(rjQuery).toEqual({
service: "order",
alias: "order",
fields: ["id", "number", "date", "products"],
expands: [
{
@@ -45,8 +45,9 @@ const fetchServiceDataCallback = async (
relationship?: any
) => {
const serviceConfig = expand.serviceConfig
const moduleRegistryName =
lowerCaseFirst(serviceConfig.serviceName) + "Service"
const moduleRegistryName = !serviceConfig.serviceName.endsWith("Service")
? lowerCaseFirst(serviceConfig.serviceName) + "Service"
: serviceConfig.serviceName
const service = container.resolve(moduleRegistryName)
const methodName = relationship?.inverse
@@ -74,7 +75,7 @@ describe("RemoteJoiner", () => {
it("Simple query of a service, its id and no fields specified", async () => {
const query = {
service: "User",
service: "user",
args: [
{
name: "id",
@@ -143,7 +144,7 @@ describe("RemoteJoiner", () => {
it("Query of a service, expanding a property and restricting the fields expanded", async () => {
const query = {
service: "User",
service: "user",
args: [
{
name: "id",
@@ -215,7 +216,7 @@ describe("RemoteJoiner", () => {
it("Query a service expanding multiple nested properties", async () => {
const query = {
service: "Order",
service: "order",
fields: ["number", "date", "products"],
expands: [
{
@@ -49,7 +49,7 @@ describe("RemoteJoiner", () => {
it("Simple query of a service, its id and no fields specified", async () => {
const query = {
service: "User",
service: "user",
args: [
{
name: "id",
@@ -69,20 +69,62 @@ describe("RemoteJoiner", () => {
})
})
it("Transforms main service name into PascalCase", async () => {
it("Simple query of a service by its alias", async () => {
const query = {
service: "user",
alias: "customer",
fields: ["id"],
args: [
{
name: "id",
value: "1",
},
],
}
await joiner.query(query)
expect(serviceMock.userService).toHaveBeenCalledTimes(1)
expect(serviceMock.userService).toHaveBeenCalledWith({
args: [],
fields: ["id"],
options: { id: ["1"] },
})
})
it("Simple query of a service by its alias with extra arguments", async () => {
const query = {
alias: "me",
fields: ["id"],
args: [
{
name: "id",
value: 1,
},
{
name: "arg1",
value: "abc",
},
],
}
await joiner.query(query)
expect(serviceMock.userService).toHaveBeenCalledTimes(1)
expect(serviceMock.userService).toHaveBeenCalledWith({
args: [
{
name: "arg1",
value: "abc",
},
],
fields: ["id"],
options: { id: [1] },
})
})
it("Simple query of a service, its id and a few fields specified", async () => {
const query = {
service: "User",
service: "user",
args: [
{
name: "id",
@@ -148,7 +190,7 @@ describe("RemoteJoiner", () => {
it("Query a service using more than 1 argument, expanding a property with another argument", async () => {
const query = {
service: "User",
service: "user",
args: [
{
name: "id",
@@ -213,7 +255,7 @@ describe("RemoteJoiner", () => {
it("Query a service expanding multiple nested properties", async () => {
const query = {
service: "Order",
service: "order",
fields: ["number", "date", "products"],
expands: [
{