Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding Api for Plugin using smaple_data in api #3294

Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -2728,6 +2728,20 @@ A field whose value conforms to the standard E.164 format as specified in: https
"""
scalar PhoneNumber

type Plugin {
"""Creator of the plugin"""
pluginCreatedBy: String

"""Description of the plugin"""
pluginDesc: String

"""Name of the plugin"""
pluginName: String

"""List of organization IDs where plugin is not installed"""
uninstalledOrgs: [String!]
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add non-null constraints to required fields.

The Plugin type fields should be marked as non-null for required fields to ensure type safety at the GraphQL schema level.

 type Plugin {
   """Creator of the plugin"""
-  pluginCreatedBy: String
+  pluginCreatedBy: String!

   """Description of the plugin"""
-  pluginDesc: String
+  pluginDesc: String!

   """Name of the plugin"""
-  pluginName: String
+  pluginName: String!

   """List of organization IDs where plugin is not installed"""
   uninstalledOrgs: [String!]
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
type Plugin {
"""Creator of the plugin"""
pluginCreatedBy: String
"""Description of the plugin"""
pluginDesc: String
"""Name of the plugin"""
pluginName: String
"""List of organization IDs where plugin is not installed"""
uninstalledOrgs: [String!]
}
type Plugin {
"""Creator of the plugin"""
pluginCreatedBy: String!
"""Description of the plugin"""
pluginDesc: String!
"""Name of the plugin"""
pluginName: String!
"""List of organization IDs where plugin is not installed"""
uninstalledOrgs: [String!]
}


type Post {
"""Array of attachments."""
attachments: [PostAttachment!]
Expand Down Expand Up @@ -2870,6 +2884,10 @@ type Query {

"""Query field to read an organization."""
organization(input: QueryOrganizationInput!): Organization
plugin(input: QueryPluginInput!): Plugin

"""Fetch all available plugins"""
plugins: [Plugin!]

"""Query field to read a post."""
post(input: QueryPostInput!): Post
Expand Down Expand Up @@ -2961,6 +2979,11 @@ input QueryOrganizationInput {
id: String!
}

input QueryPluginInput {
"""Name of the plugin to query"""
pluginName: String!
}

""""""
input QueryPostInput {
"""Global id of the post."""
Expand Down
18 changes: 18 additions & 0 deletions src/graphql/inputs/QueryPluginInput.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// src/graphql/inputs/QueryPluginInput.ts
import { z } from "zod";
import { builder } from "~/src/graphql/builder";

export const queryPluginInputSchema = z.object({
pluginName: z.string().min(1),
});

export const QueryPluginInput = builder
.inputRef<z.infer<typeof queryPluginInputSchema>>("QueryPluginInput")
.implement({
fields: (t) => ({
pluginName: t.string({
description: "Name of the plugin to query",
required: true,
}),
}),
});
40 changes: 40 additions & 0 deletions src/graphql/types/Plugins/Plugins.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { z } from "zod";
// src/graphql/types/Plugin/Plugin.ts
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Fix incorrect file path in the comment.

The comment references src/graphql/types/Plugin/Plugin.ts (singular) but the actual path uses the plural form Plugins.

-// src/graphql/types/Plugin/Plugin.ts
+// src/graphql/types/Plugins/Plugins.ts
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// src/graphql/types/Plugin/Plugin.ts
// src/graphql/types/Plugins/Plugins.ts

import { builder } from "~/src/graphql/builder";

// Define the Plugin type
type Plugin = {
pluginName: string;
pluginCreatedBy: string;
pluginDesc: string;
uninstalledOrgs: string[];
};

// Define validation schema
export const pluginSchema = z.object({
pluginName: z.string().min(1),
pluginCreatedBy: z.string().min(1),
pluginDesc: z.string().min(1),
uninstalledOrgs: z.array(z.string()),
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Add maximum length constraints to string fields.

While minimum length validation is implemented, consider adding maximum length constraints to prevent potential issues with extremely long strings.

 export const pluginSchema = z.object({
-  pluginName: z.string().min(1),
-  pluginCreatedBy: z.string().min(1),
-  pluginDesc: z.string().min(1),
+  pluginName: z.string().min(1).max(100),
+  pluginCreatedBy: z.string().min(1).max(50),
+  pluginDesc: z.string().min(1).max(500),
   uninstalledOrgs: z.array(z.string()),
 });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const pluginSchema = z.object({
pluginName: z.string().min(1),
pluginCreatedBy: z.string().min(1),
pluginDesc: z.string().min(1),
uninstalledOrgs: z.array(z.string()),
});
export const pluginSchema = z.object({
pluginName: z.string().min(1).max(100),
pluginCreatedBy: z.string().min(1).max(50),
pluginDesc: z.string().min(1).max(500),
uninstalledOrgs: z.array(z.string()),
});


// Create Plugin object reference
export const PluginRef = builder.objectRef<Plugin>("Plugin");

// Implement Plugin type
PluginRef.implement({
fields: (t) => ({
pluginName: t.exposeString("pluginName", {
description: "Name of the plugin",
}),
pluginCreatedBy: t.exposeString("pluginCreatedBy", {
description: "Creator of the plugin",
}),
pluginDesc: t.exposeString("pluginDesc", {
description: "Description of the plugin",
}),
uninstalledOrgs: t.exposeStringList("uninstalledOrgs", {
description: "List of organization IDs where plugin is not installed",
}),
}),
});
26 changes: 26 additions & 0 deletions src/graphql/types/Plugins/pluginData.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
[
{
"pluginName": "Posts",
"pluginCreatedBy": "Talawa Team",
"pluginDesc": "Allow users to create, comment and like and share the content in the form of Pictures and Videos.",
"uninstalledOrgs": ["62ccfccd3eb7fd2a30f41601", "62ccfccd3eb7fd2a30f41601"]
},
{
"pluginName": "Events",
"pluginCreatedBy": "Talawa Team",
"pluginDesc": "Allow users to register and attend for new events with a inbuilt calendar to keep track of daily events.",
"uninstalledOrgs": ["62ccfccd3eb7fd2a30f41601", "62ccfccd3eb7fd2a30f41601"]
},
{
"pluginName": "Donation",
"pluginCreatedBy": "Talawa Team",
"pluginDesc": "Enables members of the organization to do one time or reccurinng donations to an organization",
"uninstalledOrgs": ["62ccfccd3eb7fd2a30f41601", "62ccfccd3eb7fd2a30f41601"]
},
{
"pluginName": "Chats",
"pluginCreatedBy": "Talawa Team",
"pluginDesc": "User can share messages with other users in a chat user interface.",
"uninstalledOrgs": ["62ccfccd3eb7fd2a30f41601", "62ccfccd3eb7fd2a30f41601"]
}
]
1 change: 1 addition & 0 deletions src/graphql/types/Query/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,4 @@ import "./tag";
import "./tagFolder";
import "./user";
import "./venue";
import "./plugin";
101 changes: 101 additions & 0 deletions src/graphql/types/Query/plugin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import { builder } from "~/src/graphql/builder";
import { QueryPluginInput } from "~/src/graphql/inputs/QueryPluginInput";
import { TalawaGraphQLError } from "~/src/utilities/TalawaGraphQLError";
import { PluginRef } from "../Plugins/Plugins";
import pluginsData from "../Plugins/pluginData.json" assert { type: "json" };
Comment on lines +1 to +5
Copy link

@coderabbitai coderabbitai bot Feb 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Imports look fine, but please address formatting issues.

All imports appear valid and necessary. However, according to the pipeline failures, the codebase's formatting checks are failing on this file. Please ensure you run the project's formatter to resolve any style inconsistencies.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you format it and i do change in my code

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# First, let's retrieve the full content of the file
cat src/graphql/types/Query/plugin.ts

# Check if there are specific formatting tools/commands used in the project
ls -la package.json
cat package.json | grep -E "format|lint" | grep -v "ignore"

Length of output: 4501


🏁 Script executed:

#!/bin/bash
# Check for common formatter/linter config files
ls -la .eslintrc* .prettierrc* .editorconfig* tsconfig.json

# Check package.json scripts to find format commands
jq '.scripts' package.json

# Try to find formatting-related dependencies
jq '.devDependencies' package.json | grep -E 'eslint|prettier|format'

Length of output: 2107


🏁 Script executed:

#!/bin/bash
# Check for biome configuration file
ls -la biome.json

# If biome configuration exists, display it
if [ -f biome.json ]; then
  cat biome.json
fi

# Try to run the project's formatter command on the file
pnpm fix_code_quality src/graphql/types/Query/plugin.ts || npm run fix_code_quality src/graphql/types/Query/plugin.ts

Length of output: 432


@MayankJha014 I ran the project's formatter command (pnpm fix_code_quality) on your file, but it reported "No fixes applied", which suggests the file is already correctly formatted according to the project's standards.

import { builder } from "~/src/graphql/builder";
import { QueryPluginInput } from "~/src/graphql/inputs/QueryPluginInput";
import { TalawaGraphQLError } from "~/src/utilities/TalawaGraphQLError";
import { PluginRef } from "../Plugins/Plugins";
import pluginsData from "../Plugins/pluginData.json" assert { type: "json" };

builder.queryField("getPlugins", (t) =>
	t.field({
		type: [PluginRef],
		description: "Fetch all available plugins",
		resolve: async (_parent, _args, ctx) => {
			try {
				// Check authentication
				if (!ctx.currentClient.isAuthenticated) {
					throw new TalawaGraphQLError({
						extensions: {
							code: "unauthenticated",
						},
					});
				}

				return pluginsData;
			} catch (error) {
				if (error instanceof TalawaGraphQLError) {
					throw error;
				}
				throw new TalawaGraphQLError({
					extensions: {
						code: "unexpected",
					},
				});
			}
		},
	}),
);

// Create a cache based on plugin ID
const pluginCacheById = new Map(
	pluginsData.map((plugin) => [plugin.id, plugin]),
);

// Create a cache based on plugin name (case insensitive)
const pluginCacheByName = new Map(
	pluginsData.map((plugin) => [plugin.pluginName.toLowerCase(), plugin]),
);

builder.queryField("plugin", (t) =>
	t.field({
		type: PluginRef,
		args: {
			input: t.arg({
				type: QueryPluginInput,
				required: true,
			}),
		},
		resolve: async (_parent, { input }, ctx) => {
			try {
				// Check authentication
				if (!ctx.currentClient.isAuthenticated) {
					throw new TalawaGraphQLError({
						extensions: {
							code: "unauthenticated",
						},
					});
				}

				// Validate input (either ID or pluginName must be provided)
				if (!input.pluginName?.trim() && !input.id?.trim()) {
					throw new TalawaGraphQLError({
						extensions: {
							code: "invalid_arguments",
							issues: [
								{
									argumentPath: ["input"],
									message: "Either plugin ID or plugin name must be provided",
								},
							],
						},
					});
				}
				let plugin: (typeof pluginsData)[0] | undefined;

				// Lookup by ID first if provided, otherwise by plugin name
				if (input.id) {
					plugin = pluginCacheById.get(input.id);
				} else if (input.pluginName) {
					plugin = pluginCacheByName.get(input.pluginName.toLowerCase());
				}

				if (!plugin) {
					throw new TalawaGraphQLError({
						extensions: {
							code: "arguments_associated_resources_not_found",
							issues: [
								{
									argumentPath: ["input"],
								},
							],
						},
					});
				}

				return plugin;
			} catch (error) {
				if (error instanceof TalawaGraphQLError) {
					throw error;
				}
				throw new TalawaGraphQLError({
					extensions: {
						code: "unexpected",
					},
				});
			}
		},
	}),
);

builder.mutationField("updatePluginStatus", (t) =>
	t.field({
		type: PluginRef,
		description: "Toggle plugin installation status for an organization",
		args: {
			pluginId: t.arg.string({ required: true }),
			orgId: t.arg.string({ required: true }),
		},
		resolve: async (_parent, { pluginId, orgId }, ctx) => {
			try {
				// Check authentication
				if (!ctx.currentClient.isAuthenticated) {
					throw new TalawaGraphQLError({
						extensions: {
							code: "unauthenticated",
						},
					});
				}

				// Find plugin
				const plugin = pluginCacheById.get(pluginId);
				if (!plugin) {
					throw new TalawaGraphQLError({
						extensions: {
							code: "arguments_associated_resources_not_found",
							issues: [
								{
									argumentPath: ["pluginId"],
								},
							],
						},
					});
				}

				// Check if the org is already in uninstalledOrgs
				const isUninstalled = plugin.uninstalledOrgs.includes(orgId);

				if (isUninstalled) {
					// Remove from uninstalledOrgs (installing the plugin)
					plugin.uninstalledOrgs = plugin.uninstalledOrgs.filter(
						(org) => org !== orgId,
					);
				} else {
					// Add to uninstalledOrgs (uninstalling the plugin)
					plugin.uninstalledOrgs.push(orgId);
				}

				// Update cache
				pluginCacheById.set(pluginId, plugin);

				return plugin;
			} catch (error) {
				if (error instanceof TalawaGraphQLError) {
					throw error;
				}
				throw new TalawaGraphQLError({
					extensions: {
						code: "unexpected",
					},
				});
			}
		},
	}),
);

The code looks well-structured with consistent indentation and proper spacing. If you're still experiencing pipeline failures, it might be related to:

  1. Line ending issues (CRLF vs LF)
  2. Different formatting rules in CI vs local
  3. Other files that might need formatting

You can try running the full project formatter with pnpm fix_code_quality without specifying files to fix all formatting issues across the codebase.


builder.queryField("plugins", (t) =>
t.field({
type: [PluginRef],
description: "Fetch all available plugins",
resolve: async (_parent, _args, ctx) => {
try {
// Check authentication
if (!ctx.currentClient.isAuthenticated) {
throw new TalawaGraphQLError({
extensions: {
code: "unauthenticated",
},
});
}

return pluginsData;
} catch (error) {
if (error instanceof TalawaGraphQLError) {
throw error;
}
throw new TalawaGraphQLError({
extensions: {
code: "unexpected",
},
});
}
},
}),
);

builder.queryField("plugin", (t) =>
t.field({
type: PluginRef,
args: {
input: t.arg({
type: QueryPluginInput,
required: true,
}),
},
resolve: async (_parent, { input }, ctx) => {
try {
// Check authentication
if (!ctx.currentClient.isAuthenticated) {
throw new TalawaGraphQLError({
extensions: {
code: "unauthenticated",
},
});
}
// Validate input
if (!input.pluginName?.trim()) {
throw new TalawaGraphQLError({
extensions: {
code: "invalid_arguments",
issues: [
{
argumentPath: ["input", "pluginName"],
message: "Plugin name cannot be empty",
},
],
},
});
}

const plugin = pluginsData.find(
(p) => p.pluginName.toLowerCase() === input.pluginName.toLowerCase(),
);

if (!plugin) {
throw new TalawaGraphQLError({
extensions: {
code: "arguments_associated_resources_not_found",
issues: [
{
argumentPath: ["input", "pluginName"],
},
],
},
});
}

return plugin;
} catch (error) {
if (error instanceof TalawaGraphQLError) {
throw error;
}
throw new TalawaGraphQLError({
extensions: {
code: "unexpected",
},
});
}
},
}),
);
6 changes: 6 additions & 0 deletions test/routes/graphql/gql.tada-cache.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,11 @@ declare module 'gql.tada' {
TadaDocumentNode<{ deleteOrganization: { id: string; name: string | null; countryCode: "at" | "pg" | "ad" | "ae" | "af" | "ag" | "ai" | "al" | "am" | "ao" | "aq" | "ar" | "as" | "au" | "aw" | "ax" | "az" | "ba" | "bb" | "bd" | "be" | "bf" | "bg" | "bh" | "bi" | "bj" | "bl" | "bm" | "bn" | "bo" | "bq" | "br" | "bs" | "bt" | "bv" | "bw" | "by" | "bz" | "ca" | "cc" | "cd" | "cf" | "cg" | "ch" | "ci" | "ck" | "cl" | "cm" | "cn" | "co" | "cr" | "cu" | "cv" | "cw" | "cx" | "cy" | "cz" | "de" | "dj" | "dk" | "dm" | "do" | "dz" | "ec" | "ee" | "eg" | "eh" | "er" | "es" | "et" | "fi" | "fj" | "fk" | "fm" | "fo" | "fr" | "ga" | "gb" | "gd" | "ge" | "gf" | "gg" | "gh" | "gi" | "gl" | "gm" | "gn" | "gp" | "gq" | "gr" | "gs" | "gt" | "gu" | "gw" | "gy" | "hk" | "hm" | "hn" | "hr" | "ht" | "hu" | "id" | "ie" | "il" | "im" | "in" | "io" | "iq" | "ir" | "is" | "it" | "je" | "jm" | "jo" | "jp" | "ke" | "kg" | "kh" | "ki" | "km" | "kn" | "kp" | "kr" | "kw" | "ky" | "kz" | "la" | "lb" | "lc" | "li" | "lk" | "lr" | "ls" | "lt" | "lu" | "lv" | "ly" | "ma" | "mc" | "md" | "me" | "mf" | "mg" | "mh" | "mk" | "ml" | "mm" | "mn" | "mo" | "mp" | "mq" | "mr" | "ms" | "mt" | "mu" | "mv" | "mw" | "mx" | "my" | "mz" | "na" | "nc" | "ne" | "nf" | "ng" | "ni" | "nl" | "no" | "np" | "nr" | "nu" | "nz" | "om" | "pa" | "pe" | "pf" | "ph" | "pk" | "pl" | "pm" | "pn" | "pr" | "ps" | "pt" | "pw" | "py" | "qa" | "re" | "ro" | "rs" | "ru" | "rw" | "sa" | "sb" | "sc" | "sd" | "se" | "sg" | "sh" | "si" | "sj" | "sk" | "sl" | "sm" | "sn" | "so" | "sr" | "ss" | "st" | "sv" | "sx" | "sy" | "sz" | "tc" | "td" | "tf" | "tg" | "th" | "tj" | "tk" | "tl" | "tm" | "tn" | "to" | "tr" | "tt" | "tv" | "tw" | "tz" | "ua" | "ug" | "um" | "us" | "uy" | "uz" | "va" | "vc" | "ve" | "vg" | "vi" | "vn" | "vu" | "wf" | "ws" | "ye" | "yt" | "za" | "zm" | "zw" | null; } | null; }, { input: { id: string; }; }, void>;
"mutation Mutation_deleteOrganizationMembership($input: MutationDeleteOrganizationMembershipInput!) {\n deleteOrganizationMembership(input: $input) {\n id\n name\n countryCode\n }\n}":
TadaDocumentNode<{ deleteOrganizationMembership: { id: string; name: string | null; countryCode: "at" | "pg" | "ad" | "ae" | "af" | "ag" | "ai" | "al" | "am" | "ao" | "aq" | "ar" | "as" | "au" | "aw" | "ax" | "az" | "ba" | "bb" | "bd" | "be" | "bf" | "bg" | "bh" | "bi" | "bj" | "bl" | "bm" | "bn" | "bo" | "bq" | "br" | "bs" | "bt" | "bv" | "bw" | "by" | "bz" | "ca" | "cc" | "cd" | "cf" | "cg" | "ch" | "ci" | "ck" | "cl" | "cm" | "cn" | "co" | "cr" | "cu" | "cv" | "cw" | "cx" | "cy" | "cz" | "de" | "dj" | "dk" | "dm" | "do" | "dz" | "ec" | "ee" | "eg" | "eh" | "er" | "es" | "et" | "fi" | "fj" | "fk" | "fm" | "fo" | "fr" | "ga" | "gb" | "gd" | "ge" | "gf" | "gg" | "gh" | "gi" | "gl" | "gm" | "gn" | "gp" | "gq" | "gr" | "gs" | "gt" | "gu" | "gw" | "gy" | "hk" | "hm" | "hn" | "hr" | "ht" | "hu" | "id" | "ie" | "il" | "im" | "in" | "io" | "iq" | "ir" | "is" | "it" | "je" | "jm" | "jo" | "jp" | "ke" | "kg" | "kh" | "ki" | "km" | "kn" | "kp" | "kr" | "kw" | "ky" | "kz" | "la" | "lb" | "lc" | "li" | "lk" | "lr" | "ls" | "lt" | "lu" | "lv" | "ly" | "ma" | "mc" | "md" | "me" | "mf" | "mg" | "mh" | "mk" | "ml" | "mm" | "mn" | "mo" | "mp" | "mq" | "mr" | "ms" | "mt" | "mu" | "mv" | "mw" | "mx" | "my" | "mz" | "na" | "nc" | "ne" | "nf" | "ng" | "ni" | "nl" | "no" | "np" | "nr" | "nu" | "nz" | "om" | "pa" | "pe" | "pf" | "ph" | "pk" | "pl" | "pm" | "pn" | "pr" | "ps" | "pt" | "pw" | "py" | "qa" | "re" | "ro" | "rs" | "ru" | "rw" | "sa" | "sb" | "sc" | "sd" | "se" | "sg" | "sh" | "si" | "sj" | "sk" | "sl" | "sm" | "sn" | "so" | "sr" | "ss" | "st" | "sv" | "sx" | "sy" | "sz" | "tc" | "td" | "tf" | "tg" | "th" | "tj" | "tk" | "tl" | "tm" | "tn" | "to" | "tr" | "tt" | "tv" | "tw" | "tz" | "ua" | "ug" | "um" | "us" | "uy" | "uz" | "va" | "vc" | "ve" | "vg" | "vi" | "vn" | "vu" | "wf" | "ws" | "ye" | "yt" | "za" | "zm" | "zw" | null; } | null; }, { input: { organizationId: string; memberId: string; }; }, void>;
"\n query tag($input:QueryTagInput!) {\n tag(input: $input) {\n id\n name\n organization {\n id\n }\n createdAt\n }\n}":
TadaDocumentNode<{ tag: { id: string; name: string | null; organization: { id: string; } | null; createdAt: string | null; } | null; }, { input: { id: string; }; }, void>;
"\n mutation CreateTag($input:MutationCreateTagInput!) {\n createTag(input: $input) {\n id\n name\n createdAt\n organization{\n id\n name\n createdAt\n\n }\n }\n }":
TadaDocumentNode<{ createTag: { id: string; name: string | null; createdAt: string | null; organization: { id: string; name: string | null; createdAt: string | null; } | null; } | null; }, { input: { organizationId: string; name: string; folderId?: string | null | undefined; }; }, void>;
"\n query Organization($input: QueryOrganizationInput!, $first: Int!) {\n organization(input: $input) {\n id\n name\n members(first: $first) {\n edges {\n node {\n id\n name\n }\n }\n }\n }\n }\n ":
TadaDocumentNode<{ organization: { id: string; name: string | null; members: { edges: ({ node: { id: string; name: string | null; } | null; } | null)[] | null; } | null; } | null; }, { first: number; input: { id: string; }; }, void>;
}
}
Loading