@anot/http-response-builder
Version:
A robust and type-safe library for constructing HTTP responses with optional paging and metadata. Designed for TypeScript and JavaScript, it ensures correct typing while simplifying the creation of various HTTP response types.
286 lines (285 loc) • 12.6 kB
JavaScript
export class Paging {
constructor(page, size, total) {
this.setPage(page);
this.setSize(size);
this.setTotal(total);
}
setPage(page) {
if (page !== undefined) {
if (page < 0) {
throw new TypeError('Page number cannot be negative');
}
this.page = page;
}
return this;
}
setSize(size) {
if (size !== undefined) {
if (size <= 0) {
throw new TypeError('Page size must be greater than 0');
}
this.size = size;
}
return this;
}
setTotal(total) {
if (total !== undefined) {
if (total < 0) {
throw new TypeError('Total count cannot be negative');
}
this.total = total;
}
return this;
}
getPage() {
return this.page;
}
getSize() {
return this.size;
}
getTotal() {
return this.total;
}
}
export class HttpResponseBuilder {
constructor(status, message) {
this.setStatus(status);
this.setMessage(message);
}
static customResponse() {
return new HttpResponseBuilder();
}
static continue() {
return new HttpResponseBuilder(HttpStatusCode.CONTINUE, HttpStatusMessage.CONTINUE);
}
static switchingProtocols() {
return new HttpResponseBuilder(HttpStatusCode.SWITCHING_PROTOCOLS, HttpStatusMessage.SWITCHING_PROTOCOLS);
}
static processing() {
return new HttpResponseBuilder(HttpStatusCode.PROCESSING, HttpStatusMessage.PROCESSING);
}
static ok() {
return new HttpResponseBuilder(HttpStatusCode.OK, HttpStatusMessage.OK);
}
static created() {
return new HttpResponseBuilder(HttpStatusCode.CREATED, HttpStatusMessage.CREATED);
}
static accepted() {
return new HttpResponseBuilder(HttpStatusCode.ACCEPTED, HttpStatusMessage.ACCEPTED);
}
static nonAuthoritativeInformation() {
return new HttpResponseBuilder(HttpStatusCode.NON_AUTHORITATIVE_INFORMATION, HttpStatusMessage.NON_AUTHORITATIVE_INFORMATION);
}
static noContent() {
return new HttpResponseBuilder(HttpStatusCode.NO_CONTENT, HttpStatusMessage.NO_CONTENT);
}
static resetContent() {
return new HttpResponseBuilder(HttpStatusCode.RESET_CONTENT, HttpStatusMessage.RESET_CONTENT);
}
static partialContent() {
return new HttpResponseBuilder(HttpStatusCode.PARTIAL_CONTENT, HttpStatusMessage.PARTIAL_CONTENT);
}
static multipleChoices() {
return new HttpResponseBuilder(HttpStatusCode.MULTIPLE_CHOICES, HttpStatusMessage.MULTIPLE_CHOICES);
}
static movedPermanently() {
return new HttpResponseBuilder(HttpStatusCode.MOVED_PERMANENTLY, HttpStatusMessage.MOVED_PERMANENTLY);
}
static found() {
return new HttpResponseBuilder(HttpStatusCode.FOUND, HttpStatusMessage.FOUND);
}
static seeOther() {
return new HttpResponseBuilder(HttpStatusCode.SEE_OTHER, HttpStatusMessage.SEE_OTHER);
}
static notModified() {
return new HttpResponseBuilder(HttpStatusCode.NOT_MODIFIED, HttpStatusMessage.NOT_MODIFIED);
}
static temporaryRedirect() {
return new HttpResponseBuilder(HttpStatusCode.TEMPORARY_REDIRECT, HttpStatusMessage.TEMPORARY_REDIRECT);
}
static permanentRedirect() {
return new HttpResponseBuilder(HttpStatusCode.PERMANENT_REDIRECT, HttpStatusMessage.PERMANENT_REDIRECT);
}
static badRequest() {
return new HttpResponseBuilder(HttpStatusCode.BAD_REQUEST, HttpStatusMessage.BAD_REQUEST);
}
static unauthorized() {
return new HttpResponseBuilder(HttpStatusCode.UNAUTHORIZED, HttpStatusMessage.UNAUTHORIZED);
}
static paymentRequired() {
return new HttpResponseBuilder(HttpStatusCode.PAYMENT_REQUIRED, HttpStatusMessage.PAYMENT_REQUIRED);
}
static forbidden() {
return new HttpResponseBuilder(HttpStatusCode.FORBIDDEN, HttpStatusMessage.FORBIDDEN);
}
static notFound() {
return new HttpResponseBuilder(HttpStatusCode.NOT_FOUND, HttpStatusMessage.NOT_FOUND);
}
static internalServerError() {
return new HttpResponseBuilder(HttpStatusCode.INTERNAL_SERVER_ERROR, HttpStatusMessage.INTERNAL_SERVER_ERROR);
}
static notImplemented() {
return new HttpResponseBuilder(HttpStatusCode.NOT_IMPLEMENTED, HttpStatusMessage.NOT_IMPLEMENTED);
}
static badGateway() {
return new HttpResponseBuilder(HttpStatusCode.BAD_GATEWAY, HttpStatusMessage.BAD_GATEWAY);
}
static serviceUnavailable() {
return new HttpResponseBuilder(HttpStatusCode.SERVICE_UNAVAILABLE, HttpStatusMessage.SERVICE_UNAVAILABLE);
}
static gatewayTimeout() {
return new HttpResponseBuilder(HttpStatusCode.GATEWAY_TIMEOUT, HttpStatusMessage.GATEWAY_TIMEOUT);
}
setData(data) {
this.data = data;
return this;
}
setMessage(msg) {
if (typeof msg === "undefined") {
return this;
}
if (typeof msg !== 'string') {
throw new TypeError('Message must be a string');
}
this.message = msg;
return this;
}
setStatus(status) {
if (typeof status === "undefined") {
return this;
}
if (typeof status === 'number') {
if (status >= 100 && status <= 599) {
this.status = status;
return this;
}
else {
throw new TypeError('Invalid status: Status code must be between 100 and 599');
}
}
throw new TypeError("Status must be a number");
}
setPaging(paging) {
if (paging !== null && paging !== undefined) {
if (!(paging instanceof Paging)) {
throw new TypeError(`Invalid type: Expected instance of Paging, received ${typeof paging}`);
}
this.paging = paging;
}
return this;
}
setMetadata(metadata) {
if (typeof metadata !== 'object' || metadata === null || Array.isArray(metadata)) {
throw new TypeError('Invalid metadata: Metadata must be a non-null object');
}
this.metadata = metadata;
return this;
}
getMetadata() {
return this.metadata;
}
getStatus() {
return this.status;
}
getMessage() {
return this.message;
}
getData() {
return this.data;
}
getPaging() {
return this.paging;
}
}
export var HttpStatusCode;
(function (HttpStatusCode) {
HttpStatusCode[HttpStatusCode["CONTINUE"] = 100] = "CONTINUE";
HttpStatusCode[HttpStatusCode["SWITCHING_PROTOCOLS"] = 101] = "SWITCHING_PROTOCOLS";
HttpStatusCode[HttpStatusCode["PROCESSING"] = 102] = "PROCESSING";
HttpStatusCode[HttpStatusCode["OK"] = 200] = "OK";
HttpStatusCode[HttpStatusCode["CREATED"] = 201] = "CREATED";
HttpStatusCode[HttpStatusCode["ACCEPTED"] = 202] = "ACCEPTED";
HttpStatusCode[HttpStatusCode["NON_AUTHORITATIVE_INFORMATION"] = 203] = "NON_AUTHORITATIVE_INFORMATION";
HttpStatusCode[HttpStatusCode["NO_CONTENT"] = 204] = "NO_CONTENT";
HttpStatusCode[HttpStatusCode["RESET_CONTENT"] = 205] = "RESET_CONTENT";
HttpStatusCode[HttpStatusCode["PARTIAL_CONTENT"] = 206] = "PARTIAL_CONTENT";
HttpStatusCode[HttpStatusCode["MULTIPLE_CHOICES"] = 300] = "MULTIPLE_CHOICES";
HttpStatusCode[HttpStatusCode["MOVED_PERMANENTLY"] = 301] = "MOVED_PERMANENTLY";
HttpStatusCode[HttpStatusCode["FOUND"] = 302] = "FOUND";
HttpStatusCode[HttpStatusCode["SEE_OTHER"] = 303] = "SEE_OTHER";
HttpStatusCode[HttpStatusCode["NOT_MODIFIED"] = 304] = "NOT_MODIFIED";
HttpStatusCode[HttpStatusCode["TEMPORARY_REDIRECT"] = 307] = "TEMPORARY_REDIRECT";
HttpStatusCode[HttpStatusCode["PERMANENT_REDIRECT"] = 308] = "PERMANENT_REDIRECT";
HttpStatusCode[HttpStatusCode["BAD_REQUEST"] = 400] = "BAD_REQUEST";
HttpStatusCode[HttpStatusCode["UNAUTHORIZED"] = 401] = "UNAUTHORIZED";
HttpStatusCode[HttpStatusCode["PAYMENT_REQUIRED"] = 402] = "PAYMENT_REQUIRED";
HttpStatusCode[HttpStatusCode["FORBIDDEN"] = 403] = "FORBIDDEN";
HttpStatusCode[HttpStatusCode["NOT_FOUND"] = 404] = "NOT_FOUND";
HttpStatusCode[HttpStatusCode["INTERNAL_SERVER_ERROR"] = 500] = "INTERNAL_SERVER_ERROR";
HttpStatusCode[HttpStatusCode["NOT_IMPLEMENTED"] = 501] = "NOT_IMPLEMENTED";
HttpStatusCode[HttpStatusCode["BAD_GATEWAY"] = 502] = "BAD_GATEWAY";
HttpStatusCode[HttpStatusCode["SERVICE_UNAVAILABLE"] = 503] = "SERVICE_UNAVAILABLE";
HttpStatusCode[HttpStatusCode["GATEWAY_TIMEOUT"] = 504] = "GATEWAY_TIMEOUT";
})(HttpStatusCode || (HttpStatusCode = {}));
export var HttpStatusMessage;
(function (HttpStatusMessage) {
HttpStatusMessage["CONTINUE"] = "Continue";
HttpStatusMessage["SWITCHING_PROTOCOLS"] = "Switching Protocols";
HttpStatusMessage["PROCESSING"] = "Processing";
HttpStatusMessage["OK"] = "OK";
HttpStatusMessage["CREATED"] = "Created";
HttpStatusMessage["ACCEPTED"] = "Accepted";
HttpStatusMessage["NON_AUTHORITATIVE_INFORMATION"] = "Non-Authoritative Information";
HttpStatusMessage["NO_CONTENT"] = "No Content";
HttpStatusMessage["RESET_CONTENT"] = "Reset Content";
HttpStatusMessage["PARTIAL_CONTENT"] = "Partial Content";
HttpStatusMessage["MULTIPLE_CHOICES"] = "Multiple Choices";
HttpStatusMessage["MOVED_PERMANENTLY"] = "Moved Permanently";
HttpStatusMessage["FOUND"] = "Found";
HttpStatusMessage["SEE_OTHER"] = "See Other";
HttpStatusMessage["NOT_MODIFIED"] = "Not Modified";
HttpStatusMessage["TEMPORARY_REDIRECT"] = "Temporary Redirect";
HttpStatusMessage["PERMANENT_REDIRECT"] = "Permanent Redirect";
HttpStatusMessage["BAD_REQUEST"] = "Bad Request";
HttpStatusMessage["UNAUTHORIZED"] = "Unauthorized";
HttpStatusMessage["PAYMENT_REQUIRED"] = "Payment Required";
HttpStatusMessage["FORBIDDEN"] = "Forbidden";
HttpStatusMessage["NOT_FOUND"] = "Not Found";
HttpStatusMessage["INTERNAL_SERVER_ERROR"] = "Internal Server Error";
HttpStatusMessage["NOT_IMPLEMENTED"] = "Not Implemented";
HttpStatusMessage["BAD_GATEWAY"] = "Bad Gateway";
HttpStatusMessage["SERVICE_UNAVAILABLE"] = "Service Unavailable";
HttpStatusMessage["GATEWAY_TIMEOUT"] = "Gateway Timeout";
})(HttpStatusMessage || (HttpStatusMessage = {}));
export function getHttpStatusMessage(code) {
const mapping = {
[HttpStatusCode.CONTINUE]: HttpStatusMessage.CONTINUE,
[HttpStatusCode.SWITCHING_PROTOCOLS]: HttpStatusMessage.SWITCHING_PROTOCOLS,
[HttpStatusCode.PROCESSING]: HttpStatusMessage.PROCESSING,
[HttpStatusCode.OK]: HttpStatusMessage.OK,
[HttpStatusCode.CREATED]: HttpStatusMessage.CREATED,
[HttpStatusCode.ACCEPTED]: HttpStatusMessage.ACCEPTED,
[HttpStatusCode.NON_AUTHORITATIVE_INFORMATION]: HttpStatusMessage.NON_AUTHORITATIVE_INFORMATION,
[HttpStatusCode.NO_CONTENT]: HttpStatusMessage.NO_CONTENT,
[HttpStatusCode.RESET_CONTENT]: HttpStatusMessage.RESET_CONTENT,
[HttpStatusCode.PARTIAL_CONTENT]: HttpStatusMessage.PARTIAL_CONTENT,
[HttpStatusCode.MULTIPLE_CHOICES]: HttpStatusMessage.MULTIPLE_CHOICES,
[HttpStatusCode.MOVED_PERMANENTLY]: HttpStatusMessage.MOVED_PERMANENTLY,
[HttpStatusCode.FOUND]: HttpStatusMessage.FOUND,
[HttpStatusCode.SEE_OTHER]: HttpStatusMessage.SEE_OTHER,
[HttpStatusCode.NOT_MODIFIED]: HttpStatusMessage.NOT_MODIFIED,
[HttpStatusCode.TEMPORARY_REDIRECT]: HttpStatusMessage.TEMPORARY_REDIRECT,
[HttpStatusCode.PERMANENT_REDIRECT]: HttpStatusMessage.PERMANENT_REDIRECT,
[HttpStatusCode.BAD_REQUEST]: HttpStatusMessage.BAD_REQUEST,
[HttpStatusCode.UNAUTHORIZED]: HttpStatusMessage.UNAUTHORIZED,
[HttpStatusCode.PAYMENT_REQUIRED]: HttpStatusMessage.PAYMENT_REQUIRED,
[HttpStatusCode.FORBIDDEN]: HttpStatusMessage.FORBIDDEN,
[HttpStatusCode.NOT_FOUND]: HttpStatusMessage.NOT_FOUND,
[HttpStatusCode.INTERNAL_SERVER_ERROR]: HttpStatusMessage.INTERNAL_SERVER_ERROR,
[HttpStatusCode.NOT_IMPLEMENTED]: HttpStatusMessage.NOT_IMPLEMENTED,
[HttpStatusCode.BAD_GATEWAY]: HttpStatusMessage.BAD_GATEWAY,
[HttpStatusCode.SERVICE_UNAVAILABLE]: HttpStatusMessage.SERVICE_UNAVAILABLE,
[HttpStatusCode.GATEWAY_TIMEOUT]: HttpStatusMessage.GATEWAY_TIMEOUT,
};
return mapping[code];
}