āĻĄāĻžāϟāĻž āĻ•āĻžāύ⧇āĻ•ā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ, āĻĄāĻžāϟāĻž āĻ•āĻžāύ⧇āĻ•ā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

Firebase Admin SDK āĻšāϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāϰ āĻāĻ•āϟāĻŋ āϏ⧇āϟ āϝāĻž āφāĻĒāύāĻžāϕ⧇ āĻŦāĻŋāĻļ⧇āώ āϏ⧁āĻŦāĻŋāϧāĻžāĻĒā§āϰāĻžāĻĒā§āϤ āĻĒāϰāĻŋāĻŦ⧇āĻļ āĻĨ⧇āϕ⧇ Firebase-āĻāϰ āϏāĻžāĻĨ⧇ āχāĻ¨ā§āϟāĻžāϰāĻ…ā§āϝāĻžāĻ•ā§āϟ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧ āϝ⧇āĻŽāύ āĻāĻ•āϟāĻŋ Firebase Data Connect āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϝāĻŧ āĻŦāĻžāĻ˛ā§āĻ• āĻĄā§‡āϟāĻž āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ āĻāĻŦāĻ‚ āωāĻ¨ā§āύāϤ āĻŦāĻŋāĻļ⧇āώāĻžāϧāĻŋāĻ•āĻžāϰ āĻāĻŦāĻ‚ āĻ›āĻĻā§āĻŽāĻŦ⧇āĻļā§€ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āϏāĻš āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻĄā§‡āϟāĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϤ⧇ āϕ⧁āϝāĻŧ⧇āϰāĻŋ āĻāĻŦāĻ‚ āĻŽāĻŋāωāĻŸā§‡āĻļāύāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝāĨ¤

Admin SDK āφāĻĒāύāĻžāϕ⧇ āϰāĻŋāĻĄ/āϰāĻžāχāϟ āĻāĻŦāĻ‚ āϰāĻŋāĻĄ-āĻ“āύāϞāĻŋ āĻŽā§‹āĻĄā§‡ āĻ•āϞ āĻ…āĻĒāĻžāϰ⧇āĻļāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ API āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĒāĻ āύāϝ⧋āĻ—ā§āϝ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇, āφāĻĒāύāĻŋ āĻĒā§āϰāĻļāĻžāϏāύāĻŋāĻ• āĻĢāĻžāĻ‚āĻļāύāϗ⧁āϞāĻŋ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āĻŽāĻžāύāϏāĻŋāĻ• āĻļāĻžāĻ¨ā§āϤāĻŋ āĻĒāĻžāĻŦ⧇āύ āϝāĻž āφāĻĒāύāĻžāϰ āĻĄā§‡āϟāĻžāĻŦ⧇āϏ⧇ āĻĄā§‡āϟāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻžāĨ¤

āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ SDK āϏ⧇āϟāφāĻĒ

āφāĻĒāύāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ Firebase Data Connect āĻāϰ āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇, āφāĻĒāύāĻžāϕ⧇ āĻĒā§āϰāĻĨāĻŽā§‡ Node.js āĻāϰ āϜāĻ¨ā§āϝ Admin SDK āχāύāĻ¸ā§āϟāϞ āĻāĻŦāĻ‚ āϏ⧇āϟ āφāĻĒ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

āφāĻĒāύāĻžāϰ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟāϗ⧁āϞāĻŋāϤ⧇ āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ SDK āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ⧎

SDK āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇, Data Connect āĻāĻ•ā§āϏāĻŸā§‡āύāĻļāύāϗ⧁āϞāĻŋ āφāĻŽāĻĻāĻžāύāĻŋ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āφāχāĻĄāĻŋ āĻāĻŦāĻ‚ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āĻ˜ā§‹āώāĻŖāĻž āĻ•āϰ⧁āύ⧎


import { initializeApp } from 'firebase-admin/app';
import { getDataConnect } from 'firebase-admin/data-connect';

// If you'd like to use OAuth2 flows and other credentials to log in,
// visit https://firebase.google.com/docs/admin/setup#initialize-sdk
// for alternative ways to initialize the SDK.

const app = initializeApp();

const dataConnect = getDataConnect({
    serviceId: 'serviceId',
    location: 'us-west2'
});

Admin SDK āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĄāĻŋāϜāĻžāχāύ⧇āϰ āĻĒā§āϰāĻļā§āύ āĻāĻŦāĻ‚ āĻŽāĻŋāωāĻŸā§‡āĻļāύ

Admin SDK āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻŦāĻŋāĻŦ⧇āϚāύāĻžāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋāϤ⧇ Data Connect āĻ…āĻĒāĻžāϰ⧇āĻļāύ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧋āĻ—ā§€āĨ¤

SDK āĻāĻŦāĻ‚ @auth(level: NO_ACCESS) āĻ…āĻĒāĻžāϰ⧇āĻļāύ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻŋāĻ•āĻž āĻŦ⧁āĻā§āύ

āϝ⧇āĻšā§‡āϤ⧁ Admin SDK āĻŦāĻŋāĻļ⧇āώāĻžāϧāĻŋāĻ•āĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇, āϤāĻžāχ NO_ACCESS āϞ⧇āϭ⧇āϞ āϏāĻš @auth āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏ⧇āϟ āĻ•āϰāĻž āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āϞ⧇āϭ⧇āϞ āύāĻŋāĻ°ā§āĻŦāĻŋāĻļ⧇āώ⧇ āĻāϟāĻŋ āφāĻĒāύāĻžāϰ āϝ⧇āϕ⧋āύ⧋ āĻĒā§āϰāĻļā§āύ āĻāĻŦāĻ‚ āĻŽāĻŋāωāĻŸā§‡āĻļāύ āϚāĻžāϞāĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻ…āĻĒāĻžāϰ⧇āĻļāύ⧇āϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ, āφāĻĒāύāĻŋ āĻĒā§āϰāĻļāĻžāϏāύāĻŋāĻ• āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‡ āφāĻŽāĻĻāĻžāύāĻŋ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ .gql āϏ⧋āĻ°ā§āϏ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϤ⧇ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻļāĻžāϏāύāĻŋāĻ• āĻĒā§āϰāĻļā§āύ āĻāĻŦāĻ‚ āĻŽāĻŋāωāĻŸā§‡āĻļāύāϗ⧁āϞāĻŋ āϏāĻ‚āĻ—āĻ āĻŋāϤ āĻ•āϰ⧇āύ, āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰ⧇ āϝ⧇ āφāĻĒāύāĻŋ āĻĒā§āϰāĻļāĻžāϏāύāĻŋāĻ• āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒāϗ⧁āϞāĻŋāϕ⧇ āϕ⧋āύāĻ“ āĻ…āύ⧁āĻŽā§‹āĻĻāύ⧇āϰ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ¸ā§āϤāϰ āĻ›āĻžāĻĄāĻŧāĻžāχ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ, āĻŦāĻž āϏāĻŽā§āĻ­āĻŦāϤ āφāϰāĻ“ āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ NO_ACCESS āĻšāĻŋāϏāĻžāĻŦ⧇ āϏ⧇āϟ āĻ•āϰ⧁āύāĨ¤ āϝ⧇āĻ­āĻžāĻŦ⧇āχ āĻšā§‹āĻ•, āĻāϟāĻŋ āĻāχ āϧāϰāύ⧇āϰ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒāϗ⧁āϞāĻŋāϕ⧇ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāĻĻ⧇āϰ āĻ•āĻžāĻ› āĻĨ⧇āϕ⧇ āĻŦāĻž āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ…-āϏ⧁āĻŦāĻŋāϧāĻžāĻĒā§āϰāĻžāĻĒā§āϤ āĻĒā§āϰ⧇āĻ•ā§āώāĻžāĻĒāĻŸā§‡ āϚāĻžāϞāĻžāύ⧋ āĻĨ⧇āϕ⧇ āĻŦāĻžāϧāĻž āĻĻ⧇āϝāĻŧāĨ¤

Data Connect āĻāĻŽā§āϞ⧇āϟāϰ⧇āϰ āϏāĻžāĻĨ⧇ SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

āĻĒā§āϰ⧋āĻŸā§‹āϟāĻžāχāĻĒ āĻāĻŦāĻ‚ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇, āĻāϟāĻŋ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻĄā§‡āϟāĻžāϤ⧇ āĻĄā§‡āϟāĻž āϏāĻŋāĻĄāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰāϤ⧇ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ Admin SDK āφāĻĒāύāĻžāϕ⧇ āφāĻĒāύāĻžāϰ āĻ•āĻ°ā§āĻŽāĻĒā§āϰāĻŦāĻžāĻšāϕ⧇ āϏāĻšāϜ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧ āĻ•āĻžāϰāĻŖ āĻāϟāĻŋ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻĒā§āϰāĻŦāĻžāĻšā§‡āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻāĻŦāĻ‚ āĻ…āύ⧁āĻŽā§‹āĻĻāύāϕ⧇ āωāĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰ⧇āĨ¤

āϝāĻ–āύ DATA_CONNECT_EMULATOR_HOST āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āϏ⧇āϟ āĻ•āϰāĻž āĻĨāĻžāϕ⧇ āϤāĻ–āύ Firebase āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ SDKāϗ⧁āϞāĻŋ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ Data Connect āĻāĻŽā§āϞ⧇āϟāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻšāϝāĻŧ:

export DATA_CONNECT_EMULATOR_HOST="127.0.0.1:9399"

āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ, āĻĻ⧇āϖ⧁āύ:

āϏāĻžāϧāĻžāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧁āύ

Admin SDK āφāĻĒāύāĻžāϰ āϏāĻŽāĻžāϞ⧋āϚāύāĻžāĻŽā§‚āϞāĻ• āĻĄā§‡āϟāĻžāϤ⧇ āĻŦāĻŋāĻļ⧇āώ āϏ⧁āĻŦāĻŋāϧāĻžāĻĒā§āϰāĻžāĻĒā§āϤ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤

āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ SDK āĻĻ⧁āϟāĻŋ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇:

  • āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ— āϰāĻŋāĻĄ-āϰāĻžāχāϟ āĻŦāĻž āϰāĻŋāĻĄ-āĻ…āύāϞāĻŋ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ, āϝ⧇āĻ–āĻžāύ⧇ āφāĻĒāύāĻžāϰ āϕ⧋āĻĄ āĻĒā§āϰāĻļā§āύ āĻāĻŦāĻ‚ āĻŽāĻŋāωāĻŸā§‡āĻļāύ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āϰāĻŋāĻĄ-āϰāĻžāχāϟ executeGraphql āĻĒāĻĻā§āϧāϤāĻŋāϤ⧇ āĻŦāĻž āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ-āĻĒāĻ āύāϝ⧋āĻ—ā§āϝ executeGraphqlRead āĻĒāĻĻā§āϧāϤāĻŋāϤ⧇ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰ⧇āĨ¤
  • āĻŦāĻžāĻ˛ā§āĻ• āĻĄā§‡āϟāĻž āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļ⧇āώ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ, āϝāĻž āĻœā§‡āύ⧇āϰāĻŋāĻ• executeGraphql āĻĒāĻĻā§āϧāϤāĻŋāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇, āĻŽāĻŋāωāĻŸā§‡āĻļāύ āĻ…āĻĒāĻžāϰ⧇āĻļāύāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āωāĻ¤ā§āϏāĻ°ā§āĻ—ā§€āĻ•ā§ƒāϤ āĻĒāĻĻā§āϧāϤāĻŋāϗ⧁āϞāĻŋāϕ⧇ āĻĒā§āϰāĻ•āĻžāĻļ āĻ•āϰ⧇: insert , insertMany , upsert , āĻāĻŦāĻ‚ upsertMany āĨ¤

executeGraphql āĻĒāĻĻā§āϧāϤāĻŋāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĄā§‡āϟāĻž āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ

Admin SDK āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĄā§‡āϟāĻž āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

āĻĒā§āϰāĻļāĻžāϏāύāĻŋāĻ• āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

āĻĒā§āϰāĻļāĻžāϏāύāĻŋāĻ• āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĄā§‡āϟāĻž āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāĻž āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϏāĻšāϜ āĻĒāĻĻā§āϧāϤāĻŋāĨ¤

// User can be publicly accessible, or restricted to admins
const query = "query getProfile(id: AuthID) { user(id: $id) { id name } }";

interface UserData {
  user: {
    id: string;
    name: string;
  };
}

export interface UserVariables {
  id: string;
}

const options:GraphqlOptions<UserVariables> = { variables: { id: "QVBJcy5ndXJ1" } };

// executeGraphql
const gqlResponse = await dataConnect.executeGraphql<UserData, UserVariables>(query, options);

// executeGraphqlRead (similar to previous sample but only for read operations)
const gqlResponse = await dataConnect.executeGraphqlRead<UserData, UserVariables>(query, options);

// gqlResponse -> { "data": { "user": { "id": "QVBJcy5ndXJ1", "name": "Fred" } } }

āĻ›āĻĻā§āĻŽāĻŦ⧇āĻļā§€ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ

āĻāĻŽāύ āĻ•āĻŋāϛ⧁ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ“ āϰāϝāĻŧ⧇āϛ⧇ āϝ⧇āĻ–āĻžāύ⧇ āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟāϗ⧁āϞāĻŋāϕ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĒāĻ•ā§āώ⧇ āϏ⧀āĻŽāĻŋāϤ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĄā§‡āϟāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āϚāĻžāύ⧎ āĻāχ āĻĒāĻĻā§āϧāϤāĻŋāϟāĻŋ āϏāĻ°ā§āĻŦāύāĻŋāĻŽā§āύ āĻŦāĻŋāĻļ⧇āώāĻžāϧāĻŋāĻ•āĻžāϰ⧇āϰ āύ⧀āϤāĻŋāϕ⧇ āϏāĻŽā§āĻŽāĻžāύ āĻ•āϰ⧇āĨ¤

āĻāχ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇, āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜāĻĄ JWT āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻŸā§‹āϕ⧇āύ āĻĨ⧇āϕ⧇ āϤāĻĨā§āϝ āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰ⧁āύ āϝāĻž Authentication āĻŸā§‹āϕ⧇āύ āĻĢāĻ°ā§āĻŽā§āϝāĻžāϟ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻŸā§‹āϕ⧇āύ āĻ—āĻžāχāĻĄ āĻĻ⧇āϖ⧁āύāĨ¤

// Get the current user's data
const queryGetUserImpersonation = `
    query getUser @auth(level: USER) {
        user(key: {uid_expr: "auth.uid"}) {
            id,
            name
        }
    }`;

// Impersonate a user with the specified auth claims
const optionsAuthenticated: GraphqlOptions<undefined> = {
    impersonate: {
        authClaims: {
            sub: 'QVBJcy5ndXJ1'
        }
    }
};

// executeGraphql with impersonated authenticated user scope
const gqlResponse = await dataConnect.executeGraphql<UserData, undefined>(queryGetUserImpersonation, optionsAuthenticated);

// gqlResponse -> { "data": { "user": { "id": "QVBJcy5ndXJ1", "name": "Fred" } } }

executeGraphql āĻĒāĻĻā§āϧāϤāĻŋāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĒāĻžāĻŦāϞāĻŋāĻ• āĻĄā§‡āϟāĻž āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ

āφāĻĒāύāĻŋ SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻ°ā§āĻŦāϜāύ⧀āύāĻ­āĻžāĻŦ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏāϝ⧋āĻ—ā§āϝ āĻĄā§‡āϟāĻž āύāĻŋāϝāĻŧ⧇ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āĻāĻ•āϟāĻŋ āĻ…āύāύ⧁āĻŽā§‹āĻĻāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ›āĻĻā§āĻŽāĻŦ⧇āĻļ āϧāĻžāϰāĻŖ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ⧎

// Query to get posts, with authentication level PUBLIC
const queryGetPostsImpersonation = `
    query getPosts @auth(level: PUBLIC) {
        posts {
          description
        }
    }`;

// Attempt to access data as an unauthenticated user
const optionsUnauthenticated: GraphqlOptions<undefined> = {
    impersonate: {
        unauthenticated: true
    }
};

// executeGraphql with impersonated unauthenticated user scope
const gqlResponse = await dataConnect.executeGraphql<UserData, undefined>(queryGetPostsImpersonation, optionsUnauthenticated);

āĻŦāĻžāĻ˛ā§āĻ• āĻĄā§‡āϟāĻž āĻ…āĻĒāĻžāϰ⧇āĻļāύ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰ⧁āύ

āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āφāĻĒāύāĻžāϕ⧇ āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āĻŦāĻžāĻ˛ā§āĻ• āĻĄā§‡āϟāĻž āĻ…āĻĒāĻžāϰ⧇āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ Admin SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻĒāϰāĻžāĻŽāĻ°ā§āĻļ āĻĻ⧇āϝāĻŧāĨ¤

SDK āĻŦāĻžāĻ˛ā§āĻ• āĻĄā§‡āϟāĻž āύāĻŋāϝāĻŧ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĒāĻĻā§āϧāϤāĻŋāϗ⧁āϞāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇⧎ āĻĒā§āϰāĻĻāĻ¤ā§āϤ āφāĻ°ā§āϗ⧁āĻŽā§‡āĻ¨ā§āϟ āĻĨ⧇āϕ⧇, āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒāĻĻā§āϧāϤāĻŋ āĻāĻ•āϟāĻŋ GraphQL āĻŽāĻŋāωāĻŸā§‡āĻļāύ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϚāĻžāϞāĻžāϝāĻŧāĨ¤


// Methods of the bulk operations API
// dc is a Data Connect admin instance from getDataConnect

const resp = await dc.insert("movie" /*table name*/, data[0]);
const resp = await dc.insertMany("movie" /*table name*/, data);
const resp = await dc.upsert("movie" /*table name*/, data[0]);
const resp = await dc.upsertMany("movie" /*table name*/, data);

āĻŦāĻžāĻ˛ā§āĻ• āĻ…āĻĒāĻžāϰ⧇āĻļāύ āϜāĻ¨ā§āϝ āĻ•āĻ°ā§āĻŽāĻ•ā§āώāĻŽāϤāĻž āύ⧋āϟ

āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄā§‡āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ āĻ•ā§āϞāĻžāωāĻĄ āĻāϏāĻ•āĻŋāωāĻāϞ-āĻ āĻāĻ• āϰāĻžāωāĻ¨ā§āĻĄ āĻŸā§āϰāĻŋāĻĒ āĻ•āϰāĻŦ⧇, āϤāĻžāχ āφāĻĒāύāĻŋ āϝāϤ āĻŦ⧇āĻļāĻŋ āĻŦā§āϝāĻžāϚ āĻ•āϰāĻŦ⧇āύ, āĻĨā§āϰ⧁āĻĒ⧁āϟ āϤāϤ āĻŦ⧇āĻļāĻŋ āĻšāĻŦ⧇āĨ¤

āϝāĻžāχāĻšā§‹āĻ•, āĻŦā§āϝāĻžāĻšā§‡āϰ āφāĻ•āĻžāϰ āϝāϤ āĻŦāĻĄāĻŧ āĻšāĻŦ⧇, āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāĻž SQL āĻ¸ā§āĻŸā§‡āϟāĻŽā§‡āĻ¨ā§āϟ āϤāϤ āĻŦ⧇āĻļāĻŋ āĻšāĻŦ⧇āĨ¤ āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰ⧇āĻāϏāĻ•āĻŋāωāĻāϞ āĻāϏāĻ•āĻŋāωāĻāϞ āĻ¸ā§āĻŸā§‡āϟāĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āĻĻ⧈āĻ°ā§āĻ˜ā§āϝ āϏ⧀āĻŽāĻž āĻĒ⧌āρāϛ⧇ āϗ⧇āϞ⧇, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋāϰ āϏāĻŽā§āĻŽā§āĻ–ā§€āύ āĻšāĻŦ⧇āύāĨ¤

āĻ…āύ⧁āĻļā§€āϞāύ⧇, āφāĻĒāύāĻžāϰ āĻ•āĻžāĻœā§‡āϰ āϚāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧁āĻ•ā§āϤ āĻŦā§āϝāĻžāĻšā§‡āϰ āφāĻ•āĻžāϰ āϖ⧁āρāĻœā§‡ āĻĒ⧇āϤ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύāĨ¤

āĻāϰāĻĒāϰ āĻ•āĻŋ?