@dbs-portal/core-api
Version:
HTTP client and API utilities for DBS Portal
183 lines • 4.77 kB
JavaScript
/**
* MSW response building utilities
*/
import { HttpResponse } from 'msw';
/**
* Create a mock HTTP response from API response data
*/
export function createMockResponse(apiResponse, options = {}) {
const status = options.status || (apiResponse.success ? 200 : 400);
const headers = {
'Content-Type': 'application/json',
...options.headers,
};
return HttpResponse.json(apiResponse, { status, headers });
}
/**
* Create a success response
*/
export function createSuccessResponse(data, message = 'Success', options = {}) {
const apiResponse = {
success: true,
data,
message,
meta: {
timestamp: new Date().toISOString(),
requestId: generateRequestId(),
version: '1.0.0',
...options.meta,
},
};
return createMockResponse(apiResponse, options);
}
/**
* Create an error response
*/
export function createErrorResponse(error, options = {}) {
const apiError = typeof error === 'string'
? { code: 'GENERIC_ERROR', message: error }
: error;
const apiResponse = {
success: false,
message: apiError.message,
errors: [apiError],
meta: {
timestamp: new Date().toISOString(),
requestId: generateRequestId(),
version: '1.0.0',
...options.meta,
},
};
return createMockResponse(apiResponse, {
status: options.status || 400,
...(options.headers && { headers: options.headers }),
});
}
/**
* Create a validation error response
*/
export function createValidationErrorResponse(errors, options = {}) {
const apiErrors = errors.map(error => ({
code: error.code || 'VALIDATION_ERROR',
message: error.message,
field: error.field,
}));
const apiResponse = {
success: false,
message: 'Validation failed',
errors: apiErrors,
meta: {
timestamp: new Date().toISOString(),
requestId: generateRequestId(),
version: '1.0.0',
...options.meta,
},
};
return createMockResponse(apiResponse, {
status: options.status || 422,
...(options.headers && { headers: options.headers }),
});
}
/**
* Create a not found response
*/
export function createNotFoundResponse(resource = 'Resource', options = {}) {
return createErrorResponse({
code: 'NOT_FOUND',
message: `${resource} not found`,
}, {
status: 404,
...options,
});
}
/**
* Create an unauthorized response
*/
export function createUnauthorizedResponse(message = 'Unauthorized', options = {}) {
return createErrorResponse({
code: 'UNAUTHORIZED',
message,
}, {
status: 401,
...options,
});
}
/**
* Create a forbidden response
*/
export function createForbiddenResponse(message = 'Forbidden', options = {}) {
return createErrorResponse({
code: 'FORBIDDEN',
message,
}, {
status: 403,
...options,
});
}
/**
* Create a server error response
*/
export function createServerErrorResponse(message = 'Internal server error', options = {}) {
return createErrorResponse({
code: 'INTERNAL_ERROR',
message,
}, {
status: 500,
...options,
});
}
/**
* Mock response builder class
*/
export class MockResponseBuilderImpl {
responseData = null;
statusCode = 200;
responseHeaders = {};
// private responseDelay: number | [number, number] | null = null
responseError = null;
data(data) {
this.responseData = data;
return this;
}
status(code) {
this.statusCode = code;
return this;
}
headers(headers) {
this.responseHeaders = { ...this.responseHeaders, ...headers };
return this;
}
delay(_ms) {
// TODO: Implement delay functionality
return this;
}
error(error) {
this.responseError = error;
return this;
}
build() {
if (this.responseError) {
return createErrorResponse(this.responseError, {
status: this.statusCode,
headers: this.responseHeaders,
});
}
return createSuccessResponse(this.responseData, 'Success', {
status: this.statusCode,
headers: this.responseHeaders,
});
}
}
/**
* Create a response builder
*/
export function createResponseBuilder() {
return new MockResponseBuilderImpl();
}
/**
* Generate a unique request ID
*/
function generateRequestId() {
return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
}
//# sourceMappingURL=response-builder.js.map