amocrm-client
Version:
JS Library for AmoCRM
79 lines (69 loc) • 3.06 kB
text/typescript
import { ICollectionResponse, IEntityAttributes, IResourceEntity, IResourceFactory } from "../interfaces/api";
import { IClientRequest } from "../common/ClientRequest";
import { instanceToPlain, plainToClassFromExist } from "class-transformer";
import ResourceEntity from "./ResourceEntity";
import { EventEmitter } from "../common/EventEmitter";
import { TConstructor } from "../types";
/**
* Основной класс фабрики сущностей. Класс-фабрика служит для создания
* новых сущностей. Например, {@link LeadFactory} отвечает за {@link Lead}
* */
export default abstract class ResourceFactory<T extends IResourceEntity<IResourceFactory<T>>>
extends EventEmitter
implements IResourceFactory<T>
{
protected readonly request: IClientRequest;
constructor(request: IClientRequest) {
super();
this.request = request;
}
abstract getBaseUrl(): string;
abstract getEmbeddedKey(): string;
getEmbedded<A extends IEntityAttributes>(data: ICollectionResponse<A>): A[] {
const key = this.getEmbeddedKey();
const { _embedded = {} } = data;
return _embedded[key!] || [];
}
/**
* @returns новый экземпляр сущности. Например, {@link LeadFactory} вернёт {@link Lead}
* */
createEntity(attributes?: object) {
const className = this.getEntityClass();
return new className(this, attributes);
}
abstract getEntityClass(): TConstructor<T>;
/**
* Возвращает ссылку на объект запроса
* */
getRequest(): IClientRequest {
return this.request;
}
/**
* Форматирует адрес на основе baseUrl фабрики
* */
getUrl(path = ''): string {
return this.getBaseUrl() + path;
}
/**
* Создаёт сущность и заполняет её атрибутами, которые
* будут синхронизироваться с порталом AmoCRM
* */
from(attributes?: object): T {
if (!attributes || Object.keys(attributes).length === 0) return this.createEntity();
return plainToClassFromExist(this.createEntity(attributes), attributes);
}
/**
* Приводит все переданные объекты-сущности в массиве
* criteriaData к их объекту-атрибутов (ключ-значение)
* @param criteriaData массив plain JavaScript-объектов или сущностей
* @returns массив plain JavaScript-объектов
* */
getEntityCriteria(criteriaData: (object)[]): IEntityAttributes[] {
return criteriaData.map(criteria => {
if (criteria instanceof ResourceEntity) {
return instanceToPlain(criteria);
}
return criteria;
});
}
}