Apollo-link-rest: [์›ํ•˜๋Š” ๋„์›€๋ง] ๋™์  ๊ฐœ์ฒด ํ‚ค๊ฐ€์žˆ๋Š” ์‘๋‹ต ์ฟผ๋ฆฌ

์— ๋งŒ๋“  2020๋…„ 07์›” 03์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: apollographql/apollo-link-rest

Salesforce ์Šคํ‚ค๋งˆ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ํ˜•์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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๊ฐ€ ์ •์˜ ๋œ ์œ„์น˜) ๋งŒ

"@ apollo / client": "^ 3.0.0-rc.10",
"apollo-link-rest": "^ 0.8.0-beta.0",

questionโ”

๋ชจ๋“  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
   }
  }
`;

(์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ฌธ์„œ์— ๋ฌธ์„œํ™” ๋œ TypePatcher๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค)

๋ชจ๋“  ํ•ญ๋ชฉ์ด ๋™์ผํ•œ ๊ฐ์ฒด ์Šคํ‚ค๋งˆ ์ธ ๊ฒฝ์šฐ 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
+ }
 }`;

Salesforce๋ฅผ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ๋ช‡ ๊ฐœ์˜ ์—ด ์„ ๊ฐ€์งˆ ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•ด์ง€๊ณ  type-patcher๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ์–‘์„ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. API.

์ €๋Š” Salesforce๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ €๋ผ๋ฉด Salesforce ๋‹ด๋‹น์ž์—๊ฒŒ ๊ณต์‹ GraphQL ์˜คํผ๋ง์ด ์žˆ๋Š”์ง€ ๋˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์ œ 3 ์ž ์˜คํผ๋ง์ด ์žˆ๋Š”์ง€ ๋ฌธ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ Google ๊ฒ€์ƒ‰์—์„œ https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000G0l6nUAB- ํ•˜์ง€๋งŒ ๋ฆฌ๋ทฐ๊ฐ€ ํ•˜๋‚˜๋ฟ์ด๋ฏ€๋กœ ์ข‹์€์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@fbartho ๋‹ต์žฅ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ 500 ๊ฐœ๊ฐ€ ๋„˜๋Š” ํ•„๋“œ์ž…๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๋‚˜๋Š” SF ํŒ€๊ณผ ๋ช…ํ™•ํžˆํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข€ ๋” ์‰ฝ๊ฒŒ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ typenamePatcher๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‘๋‹ต์„ ์™„์ „ํžˆ ์žฌ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์€ / ๋” ์ผ๋ฐ˜์ ์ธ ์Šคํ‚ค๋งˆ๋Š” ์‚ฌ์‹ค์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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 ๋“ฑ๊ธ‰