Skip to content
This repository was archived by the owner on Jun 22, 2021. It is now read-only.

fix(deps): Updates core to 6.0.2. #11

Merged
merged 2 commits into from
Feb 12, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
command: npm run lint
- run:
name: Checking Code Duplication
command: npm run duplication -- --limit 10
command: npm run duplication -- --limit 15
- deploy:
name: Semantic Release
command: npm run semantic-release
27 changes: 13 additions & 14 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@
"check-coverage": true
},
"dependencies": {
"@js-entity-repos/core": "^4.1.2",
"@js-entity-repos/core": "^6.0.2",
"axios": "^0.17.1",
"http-status-codes": "^1.3.0",
"lodash": "^4.17.4"
},
"devDependencies": {
"@ht2-labs/semantic-release": "1.0.27",
"@ht2-labs/typescript-project": "1.0.9",
"@js-entity-repos/memory": "1.0.3",
"@js-entity-repos/memory": "^3.0.0",
"@types/body-parser": "1.16.8",
"@types/dotenv": "4.0.2",
"@types/express": "4.11.1",
Expand Down
44 changes: 25 additions & 19 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,53 +4,59 @@
### Usage
1. Install it with `npm i @js-entity-repos/axios`.
1. For each entity you will need to do the following.
1. [Create Id and Entity interfaces](#id-and-entity-interface).
1. [Create a facade config](#facade-config).
1. [Construct the facade with the config and interfaces](#calling-the-facade).
1. [Create an Entity interface](#entity-interface).
1. [Create a factory config](#factory-config).
1. [Construct the facade](#construct-the-facade).
1. [Use the facade](https://github.com/js-entity-repos/core/blob/master/docs/facade.md).

### Id and Entity Interface
### Entity Interface

```ts
export interface TodoId {
readonly id: string;
}
import Entity from '@js-entity-repos/core/dist/types/Entity';

export interface TodoEntity extends TodoId {
export interface TodoEntity extends Entity {
readonly description: string;
readonly completed: boolean;
}
```

### Facade Config
### Factory Config

```ts
import FacadeConfig from '@js-entity-repos/axios/dist/Config';
import connectToDb from '@js-entity-repos/axios/dist/utils/connectToDb';
import FactoryConfig from '@js-entity-repos/axios/dist/FactoryConfig';
import axios from 'axios';

const todoFacadeConfig: FacadeConfig = {
const todoFactoryConfig: FactoryConfig = {
axios: axios.create({
baseURL: `http://localhost:80/api/todos`,
}),
constructDocument: (id, patch) => {
// Converts an entity to a document for the database.
return { ...patch, ...id }
constructDocument: (patch) => {
// Optional property that converts an entity to a document for the database.
return patch;
},
constructEntity: (document) => {
// Converts a document from the database to an entity.
// Optional property that converts a document from the database to an entity.
return document;
},
constructFilter: (filter) => {
// Optional property that converts an entity filter to a filter for the DB.
return filter;
},
constructSort: (sort) => {
// Optional property that converts an entity sort to a sort for the DB.
return sort;
},
defaultPaginationLimit: 100, // Optional property.
entityName: 'todo',
};
```

The tests in this package contain a [demonstration of how to implement an Express router for the functions in this facade](./src/utils/express).
The tests in this package contain a [demonstration of how to implement an Express router for the functions in this facade](./src/utils/expressPresenter).

### Construct the Facade

```ts
import facade from '@js-entity-repos/axios/dist/facade';
import factory from '@js-entity-repos/axios/dist/factory';

const todosFacade = facade<TodoId, TodoEntity>(todoFacadeConfig);
const todosFacade = factory(todoFactoryConfig);
```
10 changes: 0 additions & 10 deletions src/Config.ts

This file was deleted.

16 changes: 16 additions & 0 deletions src/FacadeConfig.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import Entity from '@js-entity-repos/core/dist/types/Entity';
import { Filter } from '@js-entity-repos/core/dist/types/Filter';
import Sort from '@js-entity-repos/core/dist/types/Sort';
import { AxiosInstance } from 'axios';

export type Document = any;

export default interface FacadeConfig<E extends Entity> {
readonly axios: AxiosInstance;
readonly constructDocument: (patch: Partial<E>) => Document;
readonly constructEntity: (document: Document) => E;
readonly constructFilter: (filter: Filter<E>) => any;
readonly constructSort: (sort: Sort<E>) => any;
readonly defaultPaginationLimit: number;
readonly entityName: string;
}
16 changes: 16 additions & 0 deletions src/FactoryConfig.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import Entity from '@js-entity-repos/core/dist/types/Entity';
import { Filter } from '@js-entity-repos/core/dist/types/Filter';
import Sort from '@js-entity-repos/core/dist/types/Sort';
import { AxiosInstance } from 'axios';

export type Document = any;

export default interface FactoryConfig<E extends Entity> {
readonly axios: AxiosInstance;
readonly constructDocument?: (patch: Partial<E>) => Document;
readonly constructEntity?: (document: Document) => E;
readonly constructFilter?: (filter: Filter<E>) => any;
readonly constructSort?: (sort: Sort<E>) => any;
readonly defaultPaginationLimit?: number;
readonly entityName: string;
}
25 changes: 0 additions & 25 deletions src/facade.ts

This file was deleted.

12 changes: 5 additions & 7 deletions src/facade.test.ts → src/factory.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import * as sourceMapSupport from 'source-map-support';
sourceMapSupport.install();

import facadeTest from '@js-entity-repos/core/dist/tests';
import { TestEntity, TestId } from '@js-entity-repos/core/dist/tests/utils/testEntity';
import { TestEntity } from '@js-entity-repos/core/dist/tests/utils/testEntity';
import axios from 'axios';
import { config } from 'dotenv';
import 'mocha'; // tslint:disable-line:no-import-side-effect
import facade from './facade';
import factory from './factory';
import createTestServer from './utils/createTestServer';
config();

Expand All @@ -27,15 +27,13 @@ before(async () => {
});

after(async () => {
const app = await testServer;
app.close();
const server = await testServer;
server.close();
});

facadeTest(facade<TestId, TestEntity>({
facadeTest(factory<TestEntity>({
axios: axios.create({
baseURL: `http://localhost:${testServerPort}${testServerRoute}`,
}),
constructDocument: (id, patch) => ({ ...patch, ...id }),
constructEntity: (document) => document,
entityName: 'Test Entity',
}));
33 changes: 33 additions & 0 deletions src/factory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import Facade from '@js-entity-repos/core/dist/Facade';
import Entity from '@js-entity-repos/core/dist/types/Entity';
import FacadeConfig from './FacadeConfig';
import FactoryConfig from './FactoryConfig';
import countEntities from './functions/countEntities';
import createEntity from './functions/createEntity';
import getEntities from './functions/getEntities';
import getEntity from './functions/getEntity';
import patchEntity from './functions/patchEntity';
import removeEntities from './functions/removeEntities';
import removeEntity from './functions/removeEntity';
import replaceEntity from './functions/replaceEntity';

export default <E extends Entity>(factoryConfig: FactoryConfig<E>): Facade<E> => {
const facadeConfig: FacadeConfig<E> = {
constructDocument: (patch) => patch,
constructEntity: (document) => document,
constructFilter: (filter) => filter,
constructSort: (sort) => sort,
defaultPaginationLimit: 100,
...factoryConfig,
};
return {
countEntities: countEntities<E>(facadeConfig),
createEntity: createEntity<E>(facadeConfig),
getEntities: getEntities<E>(facadeConfig),
getEntity: getEntity<E>(facadeConfig),
patchEntity: patchEntity<E>(facadeConfig),
removeEntities: removeEntities<E>(facadeConfig),
removeEntity: removeEntity<E>(facadeConfig),
replaceEntity: replaceEntity<E>(facadeConfig),
};
};
10 changes: 6 additions & 4 deletions src/functions/countEntities.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import CountEntities from '@js-entity-repos/core/dist/signatures/CountEntities';
import Config from '../Config';
import Entity from '@js-entity-repos/core/dist/types/Entity';
import FacadeConfig from '../FacadeConfig';

export default <Id, Entity extends Id>(config: Config<Id, Entity>): CountEntities<Entity> => {
return async ({ filter }) => {
const params = { filter: JSON.stringify(filter) };
export default <E extends Entity>(config: FacadeConfig<E>): CountEntities<E> => {
return async ({ filter = {} }) => {
const constructedFilter = config.constructFilter(filter);
const params = { filter: JSON.stringify(constructedFilter) };
const response = await Promise.resolve(config.axios.get('/count', { params }));
return { count: response.data };
};
Expand Down
7 changes: 4 additions & 3 deletions src/functions/createEntity.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import ConflictingEntityError from '@js-entity-repos/core/dist/errors/ConflictingEntityError';
import CreateEntity from '@js-entity-repos/core/dist/signatures/CreateEntity';
import Entity from '@js-entity-repos/core/dist/types/Entity';
import { CONFLICT } from 'http-status-codes';
import Config from '../Config';
import FacadeConfig from '../FacadeConfig';

export default <Id, Entity extends Id>(config: Config<Id, Entity>): CreateEntity<Id, Entity> => {
export default <E extends Entity>(config: FacadeConfig<E>): CreateEntity<E> => {
return async ({ id, entity }) => {
const data = config.constructDocument(id, entity);
const data = config.constructDocument({ ...entity as any, id });
const response = await config.axios.post('', data).catch((err) => {
if (err.response.status === CONFLICT) {
throw new ConflictingEntityError(config.entityName, id);
Expand Down
20 changes: 15 additions & 5 deletions src/functions/getEntities.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
import GetEntities from '@js-entity-repos/core/dist/signatures/GetEntities';
import Config from '../Config';
import Entity from '@js-entity-repos/core/dist/types/Entity';
import Sort from '@js-entity-repos/core/dist/types/Sort';
import FacadeConfig from '../FacadeConfig';

export default <Id, Entity extends Id>(config: Config<Id, Entity>): GetEntities<Entity> => {
return async ({ filter, sort, pagination }) => {
export default <E extends Entity>(config: FacadeConfig<E>): GetEntities<E> => {
const defaultPagination = {
cursor: undefined,
forward: true,
limit: config.defaultPaginationLimit,
};
const defaultSort = { id: true } as Sort<E>;
return async ({ filter = {}, sort = defaultSort, pagination = defaultPagination }) => {
const constructedFilter = config.constructFilter(filter);
const constructedSort = config.constructSort(sort);
const params = {
cursor: pagination.cursor,
filter: JSON.stringify(filter),
filter: JSON.stringify(constructedFilter),
forward: pagination.forward,
limit: pagination.limit,
sort: JSON.stringify(sort),
sort: JSON.stringify(constructedSort),
};
const response = await Promise.resolve(config.axios.get('', { params }));

Expand Down
12 changes: 7 additions & 5 deletions src/functions/getEntity.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import MissingEntityError from '@js-entity-repos/core/dist/errors/MissingEntityError';
import GetEntity from '@js-entity-repos/core/dist/signatures/GetEntity';
import Entity from '@js-entity-repos/core/dist/types/Entity';
import { NOT_FOUND } from 'http-status-codes';
import Config from '../Config';
import FacadeConfig from '../FacadeConfig';

export default <Id, Entity extends Id>(config: Config<Id, Entity>): GetEntity<Id, Entity> => {
return async ({ id }) => {
const params = { id: JSON.stringify(id) };
const response = await config.axios.get('', { params }).catch((err) => {
export default <E extends Entity>(config: FacadeConfig<E>): GetEntity<E> => {
return async ({ id, filter = {} }) => {
const constructedFilter = config.constructFilter(filter);
const params = { filter: JSON.stringify(constructedFilter) };
const response = await config.axios.get(`/${id}`, { params }).catch((err) => {
if (err.response.status === NOT_FOUND) {
throw new MissingEntityError(config.entityName, id);
}
Expand Down
Loading