packages/core/src/awsService/apigateway/vue/invokeApi.vue (115 lines of code) (raw):

/*! * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ <template> <div id="app"> <div class="container button-container" style="justify-content: space-between"> <h1>API: {{ initialData.ApiName }} ({{ initialData.ApiId }})</h1> <div v-if="errors.length"> <b>Validation error(s):</b> <ul> <li v-for="error in errors" :key="error">{{ error }}</li> </ul> </div> <div> <button class="" @click="sendInput" :disabled="isLoading">{{ invokeText }}</button> </div> </div> <pre>{{ initialData.ApiArn }}</pre> <h3>Select a resource:</h3> <select v-model="selectedApiResource" v-on:change="setApiResource"> <option disabled value="">Select a resource</option> <option v-for="resource in initialData.Resources" :key="resource.id" :disabled="!resource.resourceMethods" :value="resource.id" > {{ `${resource.path}${resource.resourceMethods === undefined ? ' -- No methods' : ''}` }} </option> </select> <h3>Select a method:</h3> <select v-if="selectedApiResource" v-model="selectedMethod"> <option disabled value="">Select a method</option> <option v-for="method in methods" :key="method" :value="method"> {{ method }} </option> </select> <select v-else> <option disabled value="">Select a resource first</option> </select> <br /> <h3>Query string (optional)</h3> <input type="text" v-model="queryString" /> <br /> <br /> <textarea style="width: 100%; margin-bottom: 10px" rows="10" cols="90" v-model="jsonInput"></textarea> </div> </template> <script lang="ts"> import { defineComponent } from 'vue' import { WebviewClientFactory } from '../../../webviews/client' import saveData from '../../../webviews/mixins/saveData' import { InvokeRemoteRestApiInitialData, RemoteRestInvokeWebview } from './invokeRemoteRestApi' const client = WebviewClientFactory.create<RemoteRestInvokeWebview>() const defaultInitialData: InvokeRemoteRestApiInitialData = { ApiName: '', ApiId: '', ApiArn: '', Resources: {}, Region: '', localizedMessages: { noApiResource: 'noApiResource', noMethod: 'noMethod', }, } export default defineComponent({ mixins: [saveData], data: () => ({ initialData: defaultInitialData, selectedApiResource: '', selectedMethod: '', methods: [] as string[], jsonInput: '', queryString: '', errors: [] as string[], isLoading: false, }), async created() { this.initialData = (await client.init()) ?? this.initialData }, methods: { setApiResource: async function () { const methods = await client.listValidMethods(this.initialData.Resources[this.selectedApiResource]) this.methods = methods this.selectedMethod = methods[0] }, sendInput: function () { this.errors = [] if (!this.selectedApiResource) { this.errors.push(this.initialData.localizedMessages.noApiResource) } if (!this.selectedMethod) { this.errors.push(this.initialData.localizedMessages.noMethod) } if (this.errors.length > 0) { return } this.isLoading = true client .invokeApi({ body: this.jsonInput, api: this.initialData.ApiId, selectedApiResource: this.initialData.Resources[this.selectedApiResource], selectedMethod: this.selectedMethod, queryString: this.queryString, region: this.initialData.Region, }) .finally(() => (this.isLoading = false)) }, }, computed: { invokeText() { return this.isLoading ? 'Invoking...' : 'Invoke' }, }, }) </script>