From 399add4f689fbe348afdda2aab148c9730b2f0aa Mon Sep 17 00:00:00 2001 From: Vitaliy Makeev Date: Tue, 20 Jul 2021 10:59:17 +0500 Subject: [PATCH] feat(endpoints): - add PUT /new (not implemented) - add POST entity/{type} (collection only) --- TODO.md | 20 +++++------- package.json | 2 +- src/model/api/endpoints.ts | 55 +++++++++++++++++++++++++------- test/model/api/endpoints.test.ts | 21 ++++++++++-- 4 files changed, 71 insertions(+), 27 deletions(-) diff --git a/TODO.md b/TODO.md index dceff58..ac4c36e 100644 --- a/TODO.md +++ b/TODO.md @@ -1,15 +1,4 @@ -#TODO - -- [ ] Расширить Expand для записи полей через запятую - - ```ts - Expand - ``` -- [ ] Подумать как работать с обобщенными запросами - - ```ts - ms.GET(nextHref, query) - ``` +# TODO - [ ] Нужен еще один слой Create как и для Patch? @@ -17,3 +6,10 @@ Подобная типизация позволит, к примеру, проверить, что корректно указаны пользовательские аттрибуты в поле `attributes` по типу сущности в href + +- [ ] Переделать тип `EndpointInterface` (response зависит не только от Method + и Endpoint, но и от Payload). + + Скорее всего нужно ввести типы: + - `PayloadType` + - `ResponseType` diff --git a/package.json b/package.json index eee9f9e..eadf15c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "moysklad-api-model", - "version": "0.2.7", + "version": "0.2.8", "description": "Объектная модель API МойСклад для TypeScript проектов", "main": "build/src/index.js", "types": "build/src/index.d.ts", diff --git a/src/model/api/endpoints.ts b/src/model/api/endpoints.ts index 27c08be..e7aad2d 100644 --- a/src/model/api/endpoints.ts +++ b/src/model/api/endpoints.ts @@ -1,7 +1,8 @@ import type { EntityByMetaType, DocumentWithPositionsMetaType } from '..' import type { Collection } from '../Collection' -import type { DocumentMetaType } from '../Document' -import type { Expand, Patch } from '../utils' +import type { Document, DocumentMetaType } from '../Document' +import type { Meta } from '../Meta' +import type { Expand, Patch, PatchCollection, Template } from '../utils' import type { DomineEntityMetaType } from './types' export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' @@ -52,7 +53,7 @@ export type EndpointInterface< string extends Endpoint ? EndpointInterfaceInfo - // entity/{type}/{id} + // entity/{type}/{..} : Endpoint extends `entity/${infer EntityType}/${string}` ? EntityType extends DomineEntityMetaType // GET entity/{type}/{id} @@ -63,13 +64,31 @@ export type EndpointInterface< ExpandStr > - // PUT entity/{type}/{id} + // PUT entity/{type}/{..} : Method extends 'PUT' - ? EndpointInterfaceInfo< - Patch, - EntityByMetaType[EntityType], - ExpandStr - > + ? Endpoint extends `entity/${EntityType}/${infer Rest}` + + // PUT entity/{type}/new + ? Rest extends 'new' + ? EntityType extends DocumentMetaType + ? EntityByMetaType[EntityType] extends Document + ? EndpointInterfaceInfo< + // TODO Для разных типов могут быть разные поля + any, + // TODO Не прописаны сущности для всех документов + unknown, // Template, + ExpandStr + > + : never + : never + + // PUT entity/{type}/{id} + : EndpointInterfaceInfo< + Patch, + EntityByMetaType[EntityType], + ExpandStr + > + : never // Unknown method : EndpointInterfaceInfo @@ -83,7 +102,21 @@ export type EndpointInterface< // GET entity/{type} ? Method extends 'GET' ? EndpointInterfaceInfo, ExpandStr> - : EndpointInterfaceInfo - : EndpointInterfaceInfo + // FIXME Нужно переделать с зависимостью от Payload + // POST entity/{type} + : Method extends 'POST' + ? EndpointInterfaceInfo< + Array & { meta?: Meta }>, + EntityByMetaType[EntityType][], + ExpandStr + > + + // Unknown method + : EndpointInterfaceInfo + + // Unknown {type} + : EndpointInterfaceInfo + + // Unknown endpoint : EndpointInterfaceInfo diff --git a/test/model/api/endpoints.test.ts b/test/model/api/endpoints.test.ts index 0b39012..1a49338 100644 --- a/test/model/api/endpoints.test.ts +++ b/test/model/api/endpoints.test.ts @@ -18,9 +18,6 @@ const t2: 'foo' = {} as EndpointInterface< 'entity/customerorder' >['response'] -const t3: EndpointInterface<'POST', 'entity/customerorder'>['response'] = - 'unknown' - const t4: IsExtends< EndpointInterface<'GET', 'entity/customerorder'>['response'], Collection<'customerorder'> @@ -100,6 +97,9 @@ const t11_1: Partial = { // @ts-expect-error const t11_2 = request('PUT', 'entity/customerorder/123-456', t11_1) +// TODO [PUT ../new] не реализован +const t11_3: unknown = request('PUT', 'entity/invoiceout/new', t11_1) + // Expand const t12_1 = request( @@ -112,3 +112,18 @@ const t12_1 = request( t12_1.rows[0].agent.name t12_1.rows[0].positions.rows[0].assortment.id + +// POST + +const t13_1: CustomerOrder[] = request('POST', 'entity/customerorder', [ + { + meta: { + type: 'customerorder', + href: '' + }, + name: 'foo' + }, + { + description: 'bar' + } +])