diff --git a/src/V2/Products.ts b/src/V2/Products.ts index 7906158..3e2a542 100644 --- a/src/V2/Products.ts +++ b/src/V2/Products.ts @@ -1,5 +1,5 @@ import { JSONObject } from '../Client'; -import ResourceServiceBase, { ResourceBulkCreateable, ResourceCRUable, ResourcePatchable } from './ResourceServiceBase' +import ResourceServiceBase, { IResourceBulkCreateable, IResourceCreateable, IResourcePatchable, IResourceReadable, IResourceSearchable, IResourceUpdateable, ResourceBulkCreateable, ResourceCRUable, ResourcePatchable } from './ResourceServiceBase' type ProductConfigurationProfileType = { id: number; @@ -126,5 +126,14 @@ const ProductsService = ResourcePatchable, + IResourceSearchable, + IResourceCreateable, + IResourceUpdateable, + IResourcePatchable, + IResourceBulkCreateable {}; +export const Products = new ProductsService() as IProductsService; export default Products; diff --git a/src/V2/ResourceServiceBase.ts b/src/V2/ResourceServiceBase.ts index a711c4d..b95fb3e 100644 --- a/src/V2/ResourceServiceBase.ts +++ b/src/V2/ResourceServiceBase.ts @@ -45,11 +45,21 @@ export abstract class ResourceServiceBase implements // eslint-disable-next-line @typescript-eslint/no-explicit-any type ResourceServiceBaseConstructor = new (...args: any[]) => TResult; +export interface IResourceReadable { + /** + * Retrieve a single resource by id. + * + * @param client - The client to use for the request. If not provided, the default client will be used. + * @param id - The id of the resource. + */ + getOne({ client, id }: { client?: Client, id: string|number }): Promise; +}; + export function ResourceReadable< T extends ResourceServiceBaseConstructor>, RecordType, CollectionType=RecordType[], >(Base: T) { - return class extends Base { + return class ResourceReadable extends Base implements IResourceReadable { async getOne({ client, id }: { client?: Client, id: string|number }): Promise { client ||= SubscribePro.client; @@ -62,13 +72,16 @@ export function ResourceReadable< type SearchParamBasicValues = string | string[] | number | number[] type SearchParamValues = SearchParamBasicValues | Record; export type SearchParamsBase = Record +export interface IResourceSearchable { + getAll({ client, params }: { client?: Client, params?: SearchParams }): Promise>; +}; export function ResourceSearchable< T extends ResourceServiceBaseConstructor>, SearchParams extends SearchParamsBase, RecordType, CollectionType=RecordType[] >(Base: T) { - return class extends Base { + return class ResourceSearchable extends Base implements IResourceSearchable { preProcessSearchParams(params: SearchParamsBase): URLSearchParams { const searchParams = new URLSearchParams(); for (const key of Object.keys(params)) { @@ -98,13 +111,16 @@ export function ResourceSearchable< }; }; +export interface IResourceCreateable> { + createOne({ client, data }: { client?: Client, data: CreateType }): Promise; +}; export function ResourceCreateable< T extends ResourceServiceBaseConstructor>, RecordType, CreateType=Partial, CollectionType=RecordType[] >(Base: T) { - return class extends Base { + return class ResourceCreateable extends Base implements IResourceCreateable { async createOne({ client, data }: { client?: Client, data: CreateType }): Promise { client ||= SubscribePro.client; const {_meta, ...params} = {_meta: undefined, ...data}; @@ -119,13 +135,17 @@ export function ResourceCreateable< }; }; +export interface IResourceUpdateable> { + updateOne({ client, id, data }: {client?: Client; id: string | number; data: UpdateType;}): + Promise; +}; export function ResourceUpdateable< T extends ResourceServiceBaseConstructor>, RecordType, UpdateType=Partial, CollectionType=RecordType[] >(Base: T) { - return class extends Base { + return class ResourceUpdateable extends Base implements IResourceUpdateable { async updateOne({ client, id, data }: { client?: Client, id: string|number, data: UpdateType }): Promise { client ||= SubscribePro.client; const {_meta, ...params} = {_meta: undefined, ...data}; @@ -160,14 +180,16 @@ export function ResourceCRUable< ); }; +export interface IResourceDeleteable { + delete({ client, id }: { client?: Client, id: string|number }): Promise; +}; export function ResourceDeleteable< - // eslint-disable-next-line @typescript-eslint/no-explicit-any T extends ResourceServiceBaseConstructor>, RecordType, CollectionType=RecordType[] >(Base: T) { - return class extends Base { + return class ResourceDeleteable extends Base implements IResourceDeleteable { async delete({ client, id }: { client?: Client, id: string|number }): Promise { client ||= SubscribePro.client; @@ -180,15 +202,18 @@ export function ResourceDeleteable< } }; +export interface IResourceBulkCreateable, MetaType=never> { + createAll({ client, data, _meta }: { client?: Client, data: PatchType, _meta?: MetaType }): Promise; +}; + export function ResourceBulkCreateable< - // eslint-disable-next-line @typescript-eslint/no-explicit-any T extends ResourceServiceBaseConstructor>, RecordType, BulkCreateType, CollectionType=RecordType[], MetaType=never >(Base: T) { - return class extends Base { + return class ResourceBulkCreateable extends Base implements IResourceBulkCreateable { async createAll({ client, data, _meta }: { client?: Client, data: BulkCreateType, _meta?: MetaType }): Promise { client ||= SubscribePro.client; @@ -208,14 +233,17 @@ export type JSONPatchData = { path: string; value?: JSONValue; }; +export interface IResourcePatchable { + patchOne({ client, id, data }: { client?: Client, id: string|number, data: JSONPatchData }): Promise; + patchAll({ client, data }: { client?: Client, data: JSONPatchData[] }): Promise; +}; export function ResourcePatchable< - // eslint-disable-next-line @typescript-eslint/no-explicit-any T extends ResourceServiceBaseConstructor>, RecordType, CollectionType=RecordType[] >(Base: T) { - return class extends Base { + return class ResourcePatchable extends Base implements IResourcePatchable { async patchOne({ client, id, data }: { client?: Client, id: string|number, data: JSONPatchData }): Promise { client ||= SubscribePro.client;