Skip to content

Commit

Permalink
Merge pull request #269 from wallotapp/263-change-visionary-scholarsh…
Browse files Browse the repository at this point in the history
…ip-module-into-an-api-feature

Change visionary scholarship module into an API feature
  • Loading branch information
kamarmack authored Feb 11, 2025
2 parents 46ed926 + 177fe1e commit 78a1657
Show file tree
Hide file tree
Showing 33 changed files with 389 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { readFileSync } from 'fs';
import { gmail, log } from '../../services.js';
import { variables } from '../../variables.js';
import { directoryPath } from '../../directoryPath.js';
import { gmail, log } from '../../../services.js';
import { variables } from '../../../variables.js';
import { directoryPath } from '../../../directoryPath.js';

const emailTemplateRelativePath =
'visionaryScholarships/visionaryScholarshipConfirmationEmail.html';
Expand Down
1 change: 1 addition & 0 deletions packages/javascript-sdk/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ export * from './orders/index.js';
export * from './parameters/index.js';
export * from './positions/index.js';
export * from './recommendations/index.js';
export * from './scholarshipApplications/index.js';
export * from './users/index.js';
1 change: 1 addition & 0 deletions packages/javascript-sdk/scholarshipApplications/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './models/index.js';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './scholarshipApplicationProperties.js';
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import * as yup from 'yup';
import {
GeneralizedApiResourceCreateParamsRequiredFieldEnum,
GeneralizedApiResourceProperties,
CreateParams,
UpdateParams,
YupHelpers,
getApiResourceSpec,
getEnum,
} from 'ergonomic';
import {
apiYupHelpers,
idPrefixByResourceName,
} from '../../utils/apiYupHelpers.js';

export const ScholarshipApplicationCategoryEnum = getEnum(['default']);
export type ScholarshipApplicationCategory =
keyof typeof ScholarshipApplicationCategoryEnum.obj;

const createParamsRequiredFieldEnum = getEnum([
...GeneralizedApiResourceCreateParamsRequiredFieldEnum.arr,
] as const);
type T = keyof typeof createParamsRequiredFieldEnum.obj;

const _object = 'scholarship_application';
const properties = {
...GeneralizedApiResourceProperties,
_id: apiYupHelpers.id(_object),
_object: YupHelpers.constant(_object),
category: ScholarshipApplicationCategoryEnum.getDefinedSchema(),
// Add more properties here
} as const;
type U = typeof properties;

export const scholarshipApplicationsApi = getApiResourceSpec<keyof U, U, T>({
createParamsRequiredFieldEnum,
idPrefix: idPrefixByResourceName[_object],
properties,
} as const);
export type ScholarshipApplication = yup.InferType<
typeof scholarshipApplicationsApi.apiResourceJsonSchema
>;
export type CreateScholarshipApplicationParams = CreateParams<
ScholarshipApplication,
T
>;
export type UpdateScholarshipApplicationParams =
UpdateParams<ScholarshipApplication>;
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import {
ScholarshipApplication,
scholarshipApplicationsApi,
} from '../models/index.js';

describe('ScholarshipApplication', () => {
test('exampleScholarshipApplication', () => {
const { apiResourceDefaultJson } = scholarshipApplicationsApi;
const exampleScholarshipApplication: ScholarshipApplication = {
...apiResourceDefaultJson,
category: 'default',
name: 'My ScholarshipApplication',
};
expect(exampleScholarshipApplication).toEqual<
typeof exampleScholarshipApplication
>({
_id: expect.any(String),
_date_last_modified: expect.any(String),
_created_by: expect.any(String),
_object: 'scholarship_application',
category: 'default',
_archived: false,
_date_created: expect.any(String),
_deleted: false,
description: '',
name: 'My ScholarshipApplication',
});
});
});
2 changes: 2 additions & 0 deletions packages/javascript-sdk/utils/apiYupHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export const idPrefixByResourceName = {
parameter: 'param',
position: 'pos',
recommendation: 'rec',
scholarship_application: 'sch',
user: 'usr',
} as const;
export const apiYupHelpers = getApiResourceYupHelpers(
Expand All @@ -39,6 +40,7 @@ export const apiYupHelpers = getApiResourceYupHelpers(
'parameter',
'position',
'recommendation',
'scholarship_application',
'user',
],
idPrefixByResourceName,
Expand Down
3 changes: 3 additions & 0 deletions packages/javascript-sdk/utils/getApiResourceSpec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { ordersApi } from '../orders/index.js';
import { parametersApi } from '../parameters/index.js';
import { positionsApi } from '../positions/index.js';
import { recommendationsApi } from '../recommendations/index.js';
import { scholarshipApplicationsApi } from '../scholarshipApplications/index.js';
import { usersApi } from '../users/index.js';

export const getApiResourceSpec = (
Expand Down Expand Up @@ -57,6 +58,8 @@ export const getApiResourceSpec = (
return positionsApi as unknown as GeneralizedApiResourceSpec;
case 'recommendation':
return recommendationsApi as unknown as GeneralizedApiResourceSpec;
case 'scholarship_application':
return scholarshipApplicationsApi as unknown as GeneralizedApiResourceSpec;
case 'user':
return usersApi as unknown as GeneralizedApiResourceSpec;
default:
Expand Down
1 change: 0 additions & 1 deletion packages/javascript-sdk/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,3 @@ export * from './getNewYorkDate.js';
export * from './investingGoal.js';
export * from './riskPreference.js';
export * from './userExperienceMachine.js';
export * from './visionaryScholarships/index.js';

This file was deleted.

This file was deleted.

22 changes: 22 additions & 0 deletions packages/react-sdk/src/features/scholarshipApplications/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [ScholarshipApplications feature](#scholarshipapplications-feature)
- [Definition](#definition)
- [Example ScholarshipApplication Resource](#example-scholarshipapplication-resource)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# ScholarshipApplications feature

<-- Add a brief description of what a ScholarshipApplication is here -->

## Definition

<-- Add a detailed description of a ScholarshipApplication here -->

## Example ScholarshipApplication Resource

```json
<-- Add an example ScholarshipApplication resource here -->
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [`features/scholarshipApplications/api` Directory](#featuresscholarshipapplicationsapi-directory)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# `features/scholarshipApplications/api` Directory

The api folder should contain exported API request declarations and api hooks related to the ScholarshipApplications feature.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { generalizedFirestoreDocumentCreateOperation } from 'ergonomic-react/src/features/data';
import {
CreateScholarshipApplicationParams,
ScholarshipApplication,
scholarshipApplicationsApi,
} from '@wallot/js';
import { GeneralizedApiResourceSpec } from 'ergonomic';

export const createScholarshipApplication =
generalizedFirestoreDocumentCreateOperation<
CreateScholarshipApplicationParams,
ScholarshipApplication
>(scholarshipApplicationsApi as unknown as GeneralizedApiResourceSpec);
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { GeneralizedApiResourceSpec } from 'ergonomic';
import { generalizedFirestoreCollectionPageQuery } from 'ergonomic-react/src/features/data';
import { ScholarshipApplication, scholarshipApplicationsApi } from '@wallot/js';

export const queryScholarshipApplicationPage =
generalizedFirestoreCollectionPageQuery<ScholarshipApplication>(
scholarshipApplicationsApi as unknown as GeneralizedApiResourceSpec,
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { generalizedFirestoreDocumentUpdateOperation } from 'ergonomic-react/src/features/data';
import {
UpdateScholarshipApplicationParams,
scholarshipApplicationsApi,
} from '@wallot/js';
import { GeneralizedApiResourceSpec } from 'ergonomic';

export const updateScholarshipApplication =
generalizedFirestoreDocumentUpdateOperation<UpdateScholarshipApplicationParams>(
scholarshipApplicationsApi as unknown as GeneralizedApiResourceSpec,
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [`features/scholarshipApplications/assets` Directory](#featuresscholarshipapplicationsassets-directory)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# `features/scholarshipApplications/assets` Directory

The assets folder should contain all the static files related to the ScholarshipApplications feature.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [`features/scholarshipApplications/components` Directory](#featuresscholarshipapplicationscomponents-directory)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# `features/scholarshipApplications/components` Directory

The components folder should contain all the components specific to the ScholarshipApplications feature.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [`features/scholarshipApplications/hooks` Directory](#featuresscholarshipapplicationshooks-directory)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# `features/scholarshipApplications/hooks` Directory

The hooks folder should contain all the React hooks specific to the ScholarshipApplications feature.
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { useMutation } from '@tanstack/react-query';
import { createScholarshipApplication } from '@wallot/react/src/features/scholarshipApplications/api/createScholarshipApplication';
import {
CreateScholarshipApplicationMutationData,
CreateScholarshipApplicationMutationError,
CreateScholarshipApplicationMutationParams,
UseCreateScholarshipApplicationMutationOptions,
} from '@wallot/react/src/features/scholarshipApplications/types/ScholarshipApplicationReactTypes';

export function useCreateScholarshipApplicationMutation(
options?: UseCreateScholarshipApplicationMutationOptions,
) {
return useMutation<
CreateScholarshipApplicationMutationData,
CreateScholarshipApplicationMutationError,
CreateScholarshipApplicationMutationParams
>(
(params: CreateScholarshipApplicationMutationParams) =>
createScholarshipApplication(params),
{
onError: (error: CreateScholarshipApplicationMutationError) => {
console.error('Create operation failed:', error);
},
onSuccess: (data: CreateScholarshipApplicationMutationData) => {
console.log('Create operation successful', data);
},
...options,
},
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import * as R from 'ramda';
import * as ReactQuery from '@tanstack/react-query';
import { queryScholarshipApplicationPage } from '@wallot/react/src/features/scholarshipApplications/api/queryScholarshipApplicationPage';
import {
UseQueryScholarshipApplicationPageQueryKeyFn,
UseQueryScholarshipApplicationPageOptionsFn,
UseQueryScholarshipApplicationPageProps,
} from '@wallot/react/src/features/scholarshipApplications/types/ScholarshipApplicationReactTypes';

export const getQueryScholarshipApplicationPageReactQueryKey: UseQueryScholarshipApplicationPageQueryKeyFn =
(params) =>
[
'scholarship_application',
JSON.stringify(R.omit(['startAfterDocumentReference'], params)),
] as const;

export const getQueryScholarshipApplicationPageReactQueryOptions: UseQueryScholarshipApplicationPageOptionsFn =
(props) => ({
queryFn: () => queryScholarshipApplicationPage(props.firestoreQueryOptions),
queryKey: getQueryScholarshipApplicationPageReactQueryKey(
props.firestoreQueryOptions,
),
...(props.reactQueryOptions ?? {}),
});

export function useQueryScholarshipApplicationPage({
firestoreQueryOptions,
reactQueryOptions = {},
}: UseQueryScholarshipApplicationPageProps) {
return ReactQuery.useQuery(
getQueryScholarshipApplicationPageReactQueryOptions({
firestoreQueryOptions,
reactQueryOptions,
}),
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { useMutation } from '@tanstack/react-query';
import { updateScholarshipApplication } from '@wallot/react/src/features/scholarshipApplications/api/updateScholarshipApplication';
import {
UpdateScholarshipApplicationMutationData,
UpdateScholarshipApplicationMutationError,
UpdateScholarshipApplicationMutationParams,
UseUpdateScholarshipApplicationMutationOptions,
} from '@wallot/react/src/features/scholarshipApplications/types/ScholarshipApplicationReactTypes';

export function useUpdateScholarshipApplicationMutation(
options?: UseUpdateScholarshipApplicationMutationOptions,
) {
return useMutation<
UpdateScholarshipApplicationMutationData,
UpdateScholarshipApplicationMutationError,
UpdateScholarshipApplicationMutationParams
>(
(params: UpdateScholarshipApplicationMutationParams) =>
updateScholarshipApplication(params),
{
onError: (error: UpdateScholarshipApplicationMutationError) => {
console.error('Update operation failed:', error);
},
onSuccess: (data: UpdateScholarshipApplicationMutationData) => {
console.log('Update operation successful', data);
},
...options,
},
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export * from '@wallot/react/src/features/scholarshipApplications/hooks/useCreateScholarshipApplicationMutation';
export * from '@wallot/react/src/features/scholarshipApplications/hooks/useQueryScholarshipApplicationPage';
export * from '@wallot/react/src/features/scholarshipApplications/hooks/useUpdateScholarshipApplicationMutation';
export * from '@wallot/react/src/features/scholarshipApplications/types/ScholarshipApplicationReactTypes';
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [`features/scholarshipApplications/routes` Directory](#featuresscholarshipapplicationsroutes-directory)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# `features/scholarshipApplications/routes` Directory

The routes folder should contain all the route components for the ScholarshipApplications feature pages.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [`features/scholarshipApplications/stores` Directory](#featuresscholarshipapplicationsstores-directory)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# `features/scholarshipApplications/stores` Directory

The stores folder should contain all the state stores for the ScholarshipApplications feature.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [`features/scholarshipApplications/types` Directory](#featuresscholarshipapplicationstypes-directory)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# `features/scholarshipApplications/types` Directory

The types folder should contain all the TypeScript types for the ScholarshipApplications feature domain.
Loading

0 comments on commit 78a1657

Please sign in to comment.