Apollo-link-rest: [рд╕рд╣рд╛рдпрддрд╛ рдЪрд╛рд╣рддрд╛ рдерд╛] рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╢реНрди рдЬрд╣рд╛рдВ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБ рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдЬреБрд▓ре░ 2020  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: apollographql/apollo-link-rest

рдореИрдВ рд╕реЗрд▓реНрд╕рдлреЛрд░реНрд╕ рд╕реНрдХреАрдорд╛ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рдХрд╛ рдПрдХ рдкреНрд░рд╛рд░реВрдк рд╣реИ

res = {
  Id: { name, type, label },
  IsDeleted: { type, name, label },
  MasterRecordId: { type, name, label },
 ...and so on
}

рддреЛ, рдХреНрд╖реЗрддреНрд░ рдЧрддрд┐рд╢реАрд▓ рд╣реИрдВред

query.js рдореЗрдВ рдореИрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

export const GET_SALESFORCE_FIELDS = gql`
  query SalesforceFields {
    salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
       // What should be here??
   }
  }
`;
`

рдореИрдВ рдЧрддрд┐рд╢реАрд▓ рднрд╛рдЧ рдХрд╛ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕реНрдХреАрдорд╛ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ query.js (useQuery рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП) рдФрд░ client.js (рдЬрд╣рд╛рдВ рдирдпрд╛ ApolloClient рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)

"@ рдЕрдкреЛрд▓реЛ/рдХреНрд▓рд╛рдЗрдВрдЯ": "^3.0.0-рдЖрд░рд╕реА.10",
"рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ": "^0.8.0-рдмреАрдЯрд╛.0",

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@ssuvorov - рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?

рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░: рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░реВрдВрдЧрд╛:

export const GET_SALESFORCE_FIELDS = gql`
  query SalesforceFields {
    salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
       Id {
         type, name, label
       }
       IsDeleted {
         type, name, label
       }
       # тАжremaining fields
   }
  }
`;

- рдЕрдм, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ GraphQL рдХреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдирд╛рдо рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ:

export const GET_SALESFORCE_FIELDS = gql`
  query SalesforceFields {
    salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
-      Id {
+      Id @type(name: "FieldDescriptor") {
         type, name, label
       }
-      IsDeleted {
+      IsDeleted @type(name: "FieldDescriptor") {
         type, name, label
       }
       # тАжremaining fields
   }
  }
`;

(рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рдЯрд╛рдЗрдкрдкреИрдЪрд░ рдХреЗ рд╕рд╛рде рд╣реИ - рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд)

рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдПрдХ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдХреАрдорд╛ рд╣реИ, рддреЛ рдЖрдк рдЕрдкрдиреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП Fragment рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

export const GET_SALESFORCE_FIELDS = gql`
  query SalesforceFields {
    salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
       Id @type(name: "FieldDescriptor") {
-          type, name, label
+          ...FieldFrag
       }
       IsDeleted @type(name: "FieldDescriptor") {
-          type, name, label
+          ...FieldFrag
       }
       # тАжremaining fields
   }
+ fragment FieldFrag on FieldDescriptor {
+    type
+    name
+    label
+ }
 }`;

рдпрджрд┐ рдЖрдк рд╕реЗрд▓реНрд╕рдлреЛрд░реНрд╕ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕

рдореИрдВ рд╕реЗрд▓реНрд╕рдлреЛрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ - рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдореИрдВ рд╣реЛрддрд╛, рддреЛ рдореИрдВ рдЕрдкрдиреЗ рд╕реЗрд▓реНрд╕рдлреЛрд░реНрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реЗ рдкреВрдЫрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рдХрд┐ рдХреНрдпрд╛ рдЙрдирдХреЗ рдкрд╛рд╕ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдкреЗрд╢рдХрд╢ рд╣реИ, рдпрд╛ рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдЗрд╕реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдзрдиреНрдп рддреГрддреАрдп рдкрдХреНрд╖ рдХреА рдкреЗрд╢рдХрд╢ рд╣реИред

рдПрдХ рддреНрд╡рд░рд┐рдд Google рдЦреЛрдЬ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ: https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000G0l6nUAB - рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдХреЗрд╡рд▓ рдПрдХ рд╕рдореАрдХреНрд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@fbartho рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ 500 рд╕реЗ рдЕрдзрд┐рдХ рдлрд╝реАрд▓реНрдб рд╣реИред рдЦреИрд░, рдореИрдВ рдПрд╕рдПрдл рдЯреАрдо рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЯрд╛рдЗрдкрдирд╛рдо рдкреИрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреЛрдмрд╛рд░рд╛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реБрдХ рджреЗрдЧрд╛ред

рдПрдХ рдмреЗрд╣рддрд░/рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдХреАрдорд╛ рд╡рд╕реНрддреБрддрдГ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:

type MyResponse (
  columns: [Column!]!
}
type Column {
  name: String!
  type: String!
  label: String!
}

@fbartho рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЗрд╕ рддрд░рд╣ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред

// queries.js
export const GET_SALESFORCE_FIELDS = gql`
  query SalesforceFields {
    salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFieldsPayload", path: "/fields") {
      items @type(name: "Salesforce")
    }
  }
`;

// client.js
const restLink = new RestLink({
  ...,
  typePatcher: {
    SalesforceFieldsPayload: (
      data,
      outerType,
      patchDeeper
    ) => {
      if (data != null) {
        data.items = Object.keys(data).map(field => ({ __typename: "Salesforce", ...data[field] }));
      }
      return data;
    }
  }
});
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

joemphilips picture joemphilips  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dphaener picture dphaener  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chimon2000 picture chimon2000  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

genomics-geek picture genomics-geek  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MichelDiz picture MichelDiz  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ