Skip to content

Commit 85f189e

Browse files
author
FOLUSO ONATEMOWO
committed
Added mutationRef's functionality accourding to the api proposal and cleaned up unnecessary code.
1 parent c32b6a3 commit 85f189e

File tree

4 files changed

+74
-92
lines changed

4 files changed

+74
-92
lines changed

dataconnect_test.ts

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/data-connect/data-connect-api-client-internal.ts

Lines changed: 19 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const FIREBASE_DATA_CONNECT_EMULATOR_BASE_URL_FORMAT_WITH_CONNECTOR =
4646
const EXECUTE_GRAPH_QL_ENDPOINT = 'executeGraphql';
4747
const EXECUTE_GRAPH_QL_READ_ENDPOINT = 'executeGraphqlRead';
4848
const EXECUTE_QUERY_ENDPOINT = 'executeQuery';
49-
// const EXECUTE_MUTATION_ENDPOINT = 'executeMutation';
49+
const EXECUTE_MUTATION_ENDPOINT = 'executeMutation';
5050

5151
const DATA_CONNECT_CONFIG_HEADERS = {
5252
'X-Firebase-Client': `fire-admin-node/${utils.getSdkVersion()}`
@@ -81,7 +81,8 @@ export class DataConnectApiClient {
8181
query: string,
8282
options?: GraphqlOptions<Variables>,
8383
): Promise<ExecuteGraphqlResponse<GraphqlResponse>> {
84-
return this.executeGraphqlHelper(query, EXECUTE_GRAPH_QL_ENDPOINT, options);
84+
// return this.executeGraphqlHelper(query, EXECUTE_GRAPH_QL_ENDPOINT, options);
85+
return this.executeHelper(EXECUTE_GRAPH_QL_ENDPOINT,options, query);
8586
}
8687

8788
/**
@@ -100,15 +101,28 @@ export class DataConnectApiClient {
100101
return this.executeHelper(EXECUTE_GRAPH_QL_READ_ENDPOINT,options, query);
101102
}
102103

103-
/**
104-
* Uses the name and the variables parameters to execute a query.
104+
/**
105+
* Execute pre-existing <QueryResult<Data, Variables>> read-only queries
106+
* @param options - GraphQL Options
107+
* @returns A promise that fulfills with a `ExecuteGraphqlResponse`.
108+
* @throws FirebaseDataConnectError
105109
*/
106110
public async executeQuery<Data, Variables>(
107111
options: GraphqlOptions<Variables>,
108112
): Promise<ExecuteGraphqlResponse<Data>>{
109-
// const {data} = await this.executeHelper(options.operationName!, EXECUTE_QUERY_ENDPOINT, options);
110113
return this.executeHelper(EXECUTE_QUERY_ENDPOINT,options);
111114
}
115+
/**
116+
* Execute pre-existing <MutationResult<Data, Variables>> read and write queries
117+
* @param options - GraphQL Options
118+
* @returns A promise that fulfills with a `ExecuteGraphqlResponse`.
119+
* @throws FirebaseDataConnectError
120+
*/
121+
public async executeMutation<Data, Variables>(
122+
options: GraphqlOptions<Variables>,
123+
): Promise<ExecuteGraphqlResponse<Data>>{
124+
return this.executeHelper(EXECUTE_MUTATION_ENDPOINT,options);
125+
}
112126

113127
private async executeHelper<GraphqlResponse, Variables>(
114128
endpoint: string,
@@ -136,8 +150,6 @@ export class DataConnectApiClient {
136150
query: gql,
137151
...(!gql && { name: options?.operationName}),
138152
...(options?.variables && { variables: options?.variables }),
139-
//change to if query != operationName for executeQuery and executeMutation
140-
//Also how was this needed in conjuncton with executeGraphql before? Just the name of an operation normally doesn't that mean this is how it was used before?
141153
...(options?.operationName && { operationName: options?.operationName }),
142154
...(options?.impersonate && { extensions: { impersonate: options?.impersonate } }),
143155
};
@@ -168,55 +180,6 @@ export class DataConnectApiClient {
168180
});
169181
}
170182

171-
private async executeGraphqlHelper<GraphqlResponse, Variables>(
172-
query: string,
173-
endpoint: string,
174-
options?: GraphqlOptions<Variables>,
175-
): Promise<ExecuteGraphqlResponse<GraphqlResponse>> {
176-
if (!validator.isNonEmptyString(query)) {
177-
throw new FirebaseDataConnectError(
178-
DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
179-
'`query` must be a non-empty string.');
180-
}
181-
if (typeof options !== 'undefined') {
182-
if (!validator.isNonNullObject(options)) {
183-
throw new FirebaseDataConnectError(
184-
DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,
185-
'GraphqlOptions must be a non-null object');
186-
}
187-
}
188-
const data = {
189-
query,
190-
...(options?.variables && { variables: options?.variables }),
191-
...(options?.operationName && { operationName: options?.operationName }),
192-
...(options?.impersonate && { extensions: { impersonate: options?.impersonate } }),
193-
};
194-
return this.getUrl(API_VERSION, this.connectorConfig.location, this.connectorConfig.serviceId, endpoint)
195-
.then(async (url) => {
196-
const request: HttpRequestConfig = {
197-
method: 'POST',
198-
url,
199-
headers: DATA_CONNECT_CONFIG_HEADERS,
200-
data,
201-
};
202-
const resp = await this.httpClient.send(request);
203-
if (resp.data.errors && validator.isNonEmptyArray(resp.data.errors)) {
204-
const allMessages = resp.data.errors.map((error: { message: any; }) => error.message).join(' ');
205-
throw new FirebaseDataConnectError(
206-
DATA_CONNECT_ERROR_CODE_MAPPING.QUERY_ERROR, allMessages);
207-
}
208-
return Promise.resolve({
209-
data: resp.data.data as GraphqlResponse,
210-
});
211-
})
212-
.then((resp) => {
213-
return resp;
214-
})
215-
.catch((err) => {
216-
throw this.toFirebaseError(err);
217-
});
218-
}
219-
220183
private async getUrl(version: string, locationId: string, serviceId: string, endpointId: string, connector?: string): Promise<string> {
221184
return this.getProjectId()
222185
.then((projectId) => {

src/data-connect/data-connect.ts

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -191,25 +191,28 @@ export class DataConnect {
191191
* @param name Name of Mutation
192192
* @returns MutationRef
193193
*/
194-
// public mutationRef<Data>(name: string): MutationRef<Data, undefined>;
194+
public mutationRef<Data>(name: string): MutationRef<Data, undefined>;
195195
/**
196196
*
197197
* Returns Mutation Reference
198198
* @param name Name of Mutation
199199
* @param variables
200200
* @returns MutationRef
201201
*/
202-
// public mutationRef<Data, Variables>(name: string, variables: Variables): MutationRef<Data, Variables>;
202+
public mutationRef<Data, Variables>(name: string, variables: Variables): MutationRef<Data, Variables>;
203203
/**
204204
*
205205
* Returns Query Reference
206206
* @param name Name of Mutation
207207
* @param variables
208208
* @returns MutationRef
209209
*/
210-
// public mutationRef<Data, Variables>(name: string, variables?: Variables): MutationRef<Data, Variables> {
211-
// return new MutationRef(name, variables as Variables, this.client);
212-
// }
210+
public mutationRef<Data, Variables>(name: string, variables?: Variables): MutationRef<Data, Variables> {
211+
if (!("connector" in this.connectorConfig)){
212+
throw new FirebaseDataConnectError(DATA_CONNECT_ERROR_CODE_MAPPING.INVALID_ARGUMENT,'executeQuery requires a connector');
213+
}
214+
return new MutationRef(this, name, variables as Variables, this.client);
215+
}
213216
}
214217

215218
abstract class OperationRef<Data, Variables> {
@@ -229,14 +232,13 @@ interface OperationResult<Data, Variables> {
229232
export interface QueryResult<Data, Variables> extends OperationResult<Data, Variables> {
230233
ref: QueryRef<Data, Variables>;
231234
}
232-
// interface MutationResult<Data, Variables> extends OperationResult<Data, Variables> {
233-
// ref: MutationRef<Data, Variables>;
234-
// }
235+
export interface MutationResult<Data, Variables> extends OperationResult<Data, Variables> {
236+
ref: MutationRef<Data, Variables>;
237+
}
235238

236239
class QueryRef<Data, Variables> extends OperationRef<Data, Variables> {
237240
option_params:GraphqlOptions<Variables>;
238241
async execute(): Promise<QueryResult<Data, Variables>> {
239-
// return this.client.executeQuery(this.name, this.variables);
240242
const option_params = {
241243
variables: this.variables,
242244
operationName: this.name
@@ -252,8 +254,20 @@ class QueryRef<Data, Variables> extends OperationRef<Data, Variables> {
252254
}
253255
}
254256

255-
// class MutationRef<Data, Variables> extends OperationRef<Data, Variables> {
256-
// execute(): Promise<MutationResult<Data, Variables>> {
257-
// return this.client.executeMutation(this.name, this.variables);
258-
// }
259-
// }
257+
class MutationRef<Data, Variables> extends OperationRef<Data, Variables> {
258+
option_params:GraphqlOptions<Variables>;
259+
async execute(): Promise<MutationResult<Data, Variables>> {
260+
const option_params = {
261+
variables: this.variables,
262+
operationName: this.name
263+
};
264+
const {data} = await this.client.executeMutation<Data, Variables>(option_params)
265+
266+
return {
267+
ref: this,
268+
data: data,
269+
variables: this.variables,
270+
dataConnect: this.dataConnect
271+
}
272+
}
273+
}

test-dataconnect/dataconnect_test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { getDataConnect } from '../lib/data-connect';
2+
import { initializeApp } from '../lib/app';
3+
4+
initializeApp();
5+
6+
const config = {
7+
serviceId: "your-service-id",
8+
location: "us-central1",
9+
connector:"movie-connector"
10+
};
11+
12+
const dataConnect = getDataConnect(config);
13+
14+
async function queryref_test (){
15+
// const listOfMovies_res = await dataConnect.queryRef('ListMovies', {orderByRating: "DESC",orderByReleaseYear: "DESC", limit: 3}).execute();
16+
// const getActorsDetails = await dataConnect.queryRef('GetActorById', {id: "11111111222233334444555555555555"}).execute()
17+
// const graphqlRead_listOfMovies_res = await dataConnect.executeGraphqlRead(" query { movies {id, title}}");
18+
// const graphql_listOfMovies_res= await dataConnect.executeGraphql(`mutation {user_insert(data: {id: "66666666667777777770", username: "coder_bot"})}`);
19+
// const graphql_listOfMovies_res_with_operation= await dataConnect.executeGraphql(`mutation {user_insert(data: {id: "66666666667777777773", username: "night_agent"})}`);
20+
// const graphql_query_listOfMovies_res = await dataConnect.executeGraphql(" query { movies {id, title}}");
21+
// const Upsert_user_res = await dataConnect.mutationRef('UpsertUser', {id: "66666666667777777771",username: "Hola"}).execute();
22+
const GetUserBy_Id_res = await dataConnect.queryRef("GetUserById",{id:"66666666667777777771"}).execute()
23+
24+
console.log(GetUserBy_Id_res.data)
25+
}
26+
27+
queryref_test()

0 commit comments

Comments
 (0)