| name | mongez-http-resource |
| description | @mongez/http `Resource` class — zero-boilerplate RESTful CRUD: `list`, `get`, `create`, `update`, `patch`, `delete`, `bulkDelete`, `publish`, `action`, `path`, `actionPath`, `useHttp`. Lazy `http` getter from `getCurrentHttp()`. Extend with a `route` string. Implements `ResourceService`.
|
Resource class
Zero-boilerplate RESTful CRUD helper. Extend and set route.
class Resource {
route: string = ''
defaultListParams: HttpParams = {}
list<T>(params?: HttpParams, options?: RequestOptions): CancellablePromise<HttpResult<T>>
get<T>(id: number | string, options?: RequestOptions): CancellablePromise<HttpResult<T>>
create<T>(data: HttpData, options?: RequestOptions): CancellablePromise<HttpResult<T>>
update<T>(id: number | string, data: HttpData, options?: RequestOptions): CancellablePromise<HttpResult<T>>
patch<T>(id: number | string, options?: RequestOptions): CancellablePromise<HttpResult<T>>
delete<T>(id: number | string, options?: RequestOptions): CancellablePromise<HttpResult<T>>
bulkDelete<T>(data: HttpData, options?: RequestOptions): CancellablePromise<HttpResult<T>>
publish<T>(id, published, publishKey?, options?): CancellablePromise<HttpResult<T>>
action<T>(
id: number | string,
actionName: string,
data?: HttpData,
options?: RequestOptions,
method?: HttpMethod,
): CancellablePromise<HttpResult<T>>
path(suffix?: string | number): string
actionPath(id: string | number, actionName: string): string
useHttp(instance: Http): this
}
Usage
import { Resource } from '@mongez/http';
import type { User } from './types';
class UsersResource extends Resource {
route = '/users';
}
export const usersResource = new UsersResource();
const { data: users, error } = await usersResource.list<User[]>({ page: 1, limit: 20 });
const { data: user } = await usersResource.get<User>(42);
const { data: newUser } = await usersResource.create<User>({ name: 'Alice', email: 'a@b.com' });
const { data: updated } = await usersResource.update<User>(42, { name: 'Alice Updated' });
await usersResource.patch(42, { data: { avatar: 'url' } });
await usersResource.delete(42);
await usersResource.bulkDelete({ ids: [1, 2, 3] });
await usersResource.publish(42, true);
await usersResource.publish(42, false, 'active');
await usersResource.action(42, 'activate');
await usersResource.action(5, 'refund', { amount: 100 });
await usersResource.action(1, 'publish', undefined, {}, 'PATCH');
Http resolution
Resource.http is a lazy getter — it calls getCurrentHttp() on first access.
Call setCurrentHttp(http) at app bootstrap; all Resources resolve it at request time.
To use a different Http instance for a single resource:
const adminHttp = new Http({ baseURL: 'https://admin.api.com', auth: adminToken });
export const adminUsers = new UsersResource().useHttp(adminHttp);
Nested resources
class PostCommentsResource extends Resource {
constructor(postId: number) {
super();
this.route = `/posts/${postId}/comments`;
}
}
const comments = new PostCommentsResource(5);
await comments.list();
Pagination helper subclass
class PaginatedResource<T> extends Resource {
async page(n: number, perPage = 20) {
return this.list<{ data: T[]; total: number }>({
page: n,
per_page: perPage,
});
}
}
class UsersResource extends PaginatedResource<User> {
route = '/users';
}
const { data } = await new UsersResource().page(2, 50);