Skip to content

Commit

Permalink
fix: fixed function factory
Browse files Browse the repository at this point in the history
- fixed issue where functions from the firebaseFunctionMapFactory were returning the HttpsCallable's result (which has data in an object), instead of the callable's result data directly
  • Loading branch information
dereekb committed Jun 22, 2022
1 parent 8173e65 commit f722fb5
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 11 deletions.
31 changes: 24 additions & 7 deletions packages/firebase/src/lib/client/function/function.callable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,36 @@ export interface MapHttpsCallable<I, O, A, B> {
* @param wrap
* @returns
*/
export function mapHttpsCallable<I, O, A, B = unknown>(callable: HttpsCallable<A, B>, wrap: MapHttpsCallable<I, O, A, B>): HttpsCallable<I, O> {
export function mapHttpsCallable<I, O, A, B = unknown>(callable: HttpsCallable<A, B>, wrap: MapHttpsCallable<I, O, A, B>): HttpsCallable<I, O>;
export function mapHttpsCallable<I, O, A, B = unknown>(callable: HttpsCallable<A, B>, wrap: MapHttpsCallable<I, O, A, B>, directData: false): HttpsCallable<I, O>;
export function mapHttpsCallable<I, O, A, B = unknown>(callable: HttpsCallable<A, B>, wrap: MapHttpsCallable<I, O, A, B>, directData: true): DirectDataHttpsCallable<HttpsCallable<I, O>>;
export function mapHttpsCallable<I, O, A, B = unknown>(callable: HttpsCallable<A, B>, wrap: MapHttpsCallable<I, O, A, B>, directData?: boolean): HttpsCallable<I, O> | DirectDataHttpsCallable<HttpsCallable<I, O>>;
export function mapHttpsCallable<I, O, A, B = unknown>(callable: HttpsCallable<A, B>, wrap: MapHttpsCallable<I, O, A, B>, directData = false): HttpsCallable<I, O> | DirectDataHttpsCallable<HttpsCallable<I, O>> {
const { mapInput = (x: Maybe<I>) => x as unknown as A, mapOutput = (x: Maybe<B>) => x as unknown as O } = wrap;

return async (inputData?: Maybe<I>): Promise<HttpsCallableResult<O>> => {
return (async (inputData?: Maybe<I>): Promise<HttpsCallableResult<O> | O> => {
const data: A = await mapInput(inputData);

const result: HttpsCallableResult<B> = await callable(data);
const resultData: Maybe<B> = result.data;
const mappedResultData: O = await mapOutput(resultData);

return {
...result,
data: mappedResultData
};
};
if (directData) {
return mappedResultData;
} else {
return {
...result,
data: mappedResultData
};
}
}) as HttpsCallable<I, O> | DirectDataHttpsCallable<HttpsCallable<I, O>>;
}

/**
* Wraps an HttpsCallable value so it returns only the data from the result, rather than an object with data attached.
*/
export type DirectDataHttpsCallable<C extends HttpsCallable<any, any>> = C extends HttpsCallable<infer I, infer O> ? (data?: I | null) => Promise<O> : never;

export function directDataHttpsCallable<I, O, C extends HttpsCallable<I, O> = HttpsCallable<I, O>>(callable: C): DirectDataHttpsCallable<C> {
return ((data: I) => callable(data).then((x) => x.data)) as DirectDataHttpsCallable<C>;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { cachedGetter, ClassLikeType, Getter, mapObjectMap, Maybe } from '@dereekb/util';
import { Functions, httpsCallable, HttpsCallableOptions } from 'firebase/functions';
import { FirebaseFunctionMap, FirebaseFunctionMapFunction, FirebaseFunctionTypeMap } from './function';
import { directDataHttpsCallable } from './function.callable';

// MARK: Functions Factory
export interface FirebaseFunctionTypeConfig {
Expand All @@ -25,7 +26,7 @@ export function firebaseFunctionMapFactory<M extends FirebaseFunctionTypeMap>(co
httpCallableOptions = config.options;
}

const fn: FirebaseFunctionMapFunction<M, K> = httpsCallable(functionsInstance, key as string, httpCallableOptions);
const fn: FirebaseFunctionMapFunction<M, K> = directDataHttpsCallable<M[K][0], M[K][1]>(httpsCallable<M[K][0], M[K][1]>(functionsInstance, key as string, httpCallableOptions));
return fn;
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,15 +82,15 @@ export function modelFirebaseFunctionMapFactory<M extends FirebaseFunctionTypeMa
const modelTypeCruds = {};

if (crudFunctions.has('create')) {
(modelTypeCruds as any)[`create${modelTypeSuffix}`] = mapHttpsCallable(_createFn(), { mapInput: (data) => onCallTypedModelParams(modelType, data) as OnCallUpdateModelParams });
(modelTypeCruds as any)[`create${modelTypeSuffix}`] = mapHttpsCallable(_createFn(), { mapInput: (data) => onCallTypedModelParams(modelType, data) as OnCallUpdateModelParams }, true);
}

if (crudFunctions.has('update')) {
(modelTypeCruds as any)[`update${modelTypeSuffix}`] = mapHttpsCallable(_updateFn(), { mapInput: (data) => onCallTypedModelParams(modelType, data) as OnCallUpdateModelParams });
(modelTypeCruds as any)[`update${modelTypeSuffix}`] = mapHttpsCallable(_updateFn(), { mapInput: (data) => onCallTypedModelParams(modelType, data) as OnCallUpdateModelParams }, true);
}

if (crudFunctions.has('delete')) {
(modelTypeCruds as any)[`delete${modelTypeSuffix}`] = mapHttpsCallable(_deleteFn(), { mapInput: (data) => onCallTypedModelParams(modelType, data) as OnCallDeleteModelParams });
(modelTypeCruds as any)[`delete${modelTypeSuffix}`] = mapHttpsCallable(_deleteFn(), { mapInput: (data) => onCallTypedModelParams(modelType, data) as OnCallDeleteModelParams }, true);
}

// tslint:disable-next-line
Expand Down

0 comments on commit f722fb5

Please sign in to comment.