Global actions
This page documents all the root level mutations powered by Global actions in the openai-screenwriter-tutorial-v2 API.
Action Result format
Each API action returns results in the same format that includes a success indicator, errors, and the actual result if the action succeeded. The result is the record that was acted on for a model action, or a list of records for a bulk action, or a JSON blob for Global Actions. Model actions that delete the record don't return the record.
The success
field returns a boolean indicating if the action executed as expected. Any execution errors are returned in the errors
object, which will always be null
if success
is true or contain ExecutionError
objects if success
is false.
ExecutionError
objects always have a message
describing what error prevented the action from succeeding, as well as a code
attribute that gives a stable, searchable, human-readable error class code for referencing this specific error. Details on each error code can be found in the Errors documentation. All ExecutionError
object types returned by the GraphQL object can be one of many types of error, where some types have extra data that is useful for remedying the error. All error types will always have message
and code
properties, but some, like InvalidRecordError
have extra fields for use by clients.
Errors when using the generated client
The generated JavaScript client automatically interprets errors from invoking actions and throws JavaScript Error
instances if the action didn't succeed. The Error
objects it throws are rich, and expose extra error properties beyond just message
and code
if they exist.
Errors thrown by the JavaScript client are easiest to catch by using a try/catch
statement around an await
, like so:
1import {2 GadgetOperationError,3 InvalidRecordError,4} from "@gadgetinc/api-client-core";56// must be in an async function to use await` syntax7export async function run({ api }) {8 try {9 return await api.exampleModel.create({ name: "example record name" });10 } catch (error) {11 if (error instanceof GadgetOperationError) {12 // a recognized general error has occurred, retry the operation or inspect \error.code\`13 console.error(error);14 } else if (error instanceof InvalidRecordError) {15 // the submitted input data for the action was invalid, inspect the invalid fields which \`InvalidRecordError\` exposes16 console.error(error.validationErrors);17 } else {18 // an unrecognized error occurred like an HTTP connection interrupted error or a syntax error. Re-throw it because it's not clear what to do to fix it19 throw error;20 }21 }22}
1import {2 GadgetOperationError,3 InvalidRecordError,4} from "@gadgetinc/api-client-core";56// must be in an async function to use await` syntax7export async function run({ api }) {8 try {9 return await api.exampleModel.create({ name: "example record name" });10 } catch (error) {11 if (error instanceof GadgetOperationError) {12 // a recognized general error has occurred, retry the operation or inspect \error.code\`13 console.error(error);14 } else if (error instanceof InvalidRecordError) {15 // the submitted input data for the action was invalid, inspect the invalid fields which \`InvalidRecordError\` exposes16 console.error(error.validationErrors);17 } else {18 // an unrecognized error occurred like an HTTP connection interrupted error or a syntax error. Re-throw it because it's not clear what to do to fix it19 throw error;20 }21 }22}
For more information on error codes, consult the Errors documentation.
ingestData
const result = await api.ingestData();
1const ExampleRunIngestDataComponent = () => {2 const [{ data, error, fetching }, ingestData] = useGlobalAction(api.ingestData);34 return (5 <>6 <button7 onClick={async () => {8 await ingestData();9 }}10 >11 Run Action12 </button>13 Result: {JSON.stringify(data)}14 </>15 );16};
1mutation IngestData {2 ingestData {3 success4 errors {5 message6 }7 result8 }9}
const result = await api.ingestData();
1const ExampleRunIngestDataComponent = () => {2 const [{ data, error, fetching }, ingestData] = useGlobalAction(api.ingestData);34 return (5 <>6 <button7 onClick={async () => {8 await ingestData();9 }}10 >11 Run Action12 </button>13 Result: {JSON.stringify(data)}14 </>15 );16};
Output
ingestData returns whatever data the effects within it produce.
type IngestDataResult {success: Boolean!errors: [ExecutionError!]result: JSON}
findSimilarMovies
Input
findSimilarMovies accepts the following input parameters
export type FindSimilarMoviesArguments = {quote?: (Scalars["String"] | null) | null;};
input FindSimilarMoviesArguments {quote: String}
export type FindSimilarMoviesArguments = {quote?: (Scalars["String"] | null) | null;};
const result = await api.findSimilarMovies({quote: "example value for quote",});
1const ExampleRunFindSimilarMoviesComponent = () => {2 const [{ data, error, fetching }, findSimilarMovies] = useGlobalAction(api.findSimilarMovies);34 return (5 <>6 <button7 onClick={async () => {8 await findSimilarMovies({9 quote: "example value for quote",10 });11 }}12 >13 Run Action14 </button>15 Result: {JSON.stringify(data)}16 </>17 );18};
1mutation FindSimilarMovies($quote: String) {2 findSimilarMovies(quote: $quote) {3 success4 errors {5 message6 }7 result8 }9}
const result = await api.findSimilarMovies({quote: "example value for quote",});
1const ExampleRunFindSimilarMoviesComponent = () => {2 const [{ data, error, fetching }, findSimilarMovies] = useGlobalAction(api.findSimilarMovies);34 return (5 <>6 <button7 onClick={async () => {8 await findSimilarMovies({9 quote: "example value for quote",10 });11 }}12 >13 Run Action14 </button>15 Result: {JSON.stringify(data)}16 </>17 );18};
Output
findSimilarMovies returns whatever data the effects within it produce.
type FindSimilarMoviesResult {success: Boolean!errors: [ExecutionError!]result: JSON}
Returning data
You can use a return
statement to return data from a global action call.
export const run: ActionRun = async ({ api, logger }) => {return "Hello, World";};
export const run: ActionRun = async ({ api, logger }) => {return "Hello, World";};