wrapify is a Go library designed to simplify and standardize API response wrapping for RESTful services. It leverages the Decorator Pattern to dynamically add error handling, metadata, pagination, and other response features in a clean and human-readable format. With Wrapify, you can ensure consistent and extensible API responses with minimal boilerplate. Perfect for building robust, maintainable REST APIs in Go!
- Go version 1.23 or higher
To install, you can use the following commands based on your preference:
- 
For a specific version: go get github.com/sivaosorg/[email protected] 
- 
For the latest version: go get -u github.com/sivaosorg/wrapify@latest 
With Go's module support, go [build|run|test] automatically fetches the necessary dependencies when you add the import in your code:
import "github.com/sivaosorg/wrapify"An example of the wrapper-based standardized API response
{
  "data": "response body here", // The primary data payload of the response.
  "debug": {
    "___abc": "trace sessions_id: 4919e84fc26881e9fe790f5d07465db4",
    "refer": 1234
  }, // Debugging information (useful for development).
  "message": "How are you? I'm good", // A message providing additional context about the response.
  "meta": {
    "api_version": "v0.0.1", // API version used for the request.
    "custom_fields": {
      "fields": "userID: 103"
    }, // Additional custom metadata fields.
    "locale": "en_US", // Locale used for the request, e.g., "en-US".
    "request_id": "80eafc6a1655ec5a06595d155f1e6951", // Unique identifier for the request, useful for debugging.
    "requested_time": "2024-12-14T20:24:23.983839+07:00" // Timestamp when the request was made.
  }, // Metadata about the API response.
  "pagination": {
    "is_last": true, // Indicates whether this is the last page.
    "page": 1000, // Current page number.
    "per_page": 2, // Number of items per page.
    "total_items": 120, // Total number of items available.
    "total_pages": 34 // Total number of pages.
  }, // Pagination details, if applicable.
  "path": "/api/v1/users", // Request path for which the response is generated.
  "status_code": 200, // HTTP status code for the response.
  "total": 1 // Total number of items (used in non-paginated responses).
}Structure of the wrapper-based standardized API response
// R represents a wrapper around the main `wrapper` struct.
// It is used as a high-level abstraction to provide a simplified interface for handling API responses.
// The `R` type allows for easier manipulation of the wrapped data, metadata,
// and other response components, while maintaining the flexibility of the underlying `wrapper` structure.
type R struct {
    *wrapper
}
// Available checks whether the `wrapper` instance is non-nil.
func (w *wrapper) Available() bool
// Body retrieves the body data associated with the `wrapper` instance.
func (w *wrapper) Body() interface{}
// Cause traverses the error chain and returns the underlying cause of the error
// associated with the `wrapper` instance.
func (w *wrapper) Cause() error
// Debugging retrieves the debugging information from the `wrapper` instance.
func (w *wrapper) Debugging() map[string]interface{}
// Error retrieves the error associated with the `wrapper` instance.
func (w *wrapper) Error() string
// Header retrieves the `header` associated with the `wrapper` instance.
func (w *wrapper) Header() *header
// IsBodyPresent checks whether the body data is present in the `wrapper` instance.
func (w *wrapper) IsBodyPresent() bool
// IsClientError checks whether the HTTP status code indicates a client error.
func (w *wrapper) IsClientError() bool
// IsDebuggingKeyPresent checks whether a specific key exists in the `debug` information.
func (w *wrapper) IsDebuggingKeyPresent(key string) bool
// IsDebuggingPresent checks whether debugging information is present in the `wrapper` instance.
func (w *wrapper) IsDebuggingPresent() bool
// IsError checks whether there is an error present in the `wrapper` instance.
// This function returns `true` if the `wrapper` contains an error, which can be any of the following:
//   - An error present in the `errors` field.
//   - A client error (4xx status code) or a server error (5xx status code).
func (w *wrapper) IsError() bool
// IsErrorPresent checks whether an error is present in the `wrapper` instance.
func (w *wrapper) IsErrorPresent() bool
// IsHeaderPresent checks whether header information is present in the `wrapper` instance.
func (w *wrapper) IsHeaderPresent() bool
// IsLastPage checks whether the current page is the last page of results.
func (w *wrapper) IsLastPage() bool
// IsMetaPresent checks whether metadata information is present in the `wrapper` instance.
func (w *wrapper) IsMetaPresent() bool
// IsPagingPresent checks whether pagination information is present in the `wrapper` instance.
func (w *wrapper) IsPagingPresent() bool
// IsRedirection checks whether the HTTP status code indicates a redirection response.
func (w *wrapper) IsRedirection() bool
// IsServerError checks whether the HTTP status code indicates a server error.
func (w *wrapper) IsServerError() bool
// IsStatusCodePresent checks whether a valid status code is present in the `wrapper` instance.
func (w *wrapper) IsStatusCodePresent() bool
// IsSuccess checks whether the HTTP status code indicates a successful response.
func (w *wrapper) IsSuccess() bool
// IsTotalPresent checks whether the total number of items is present in the `wrapper` instance.
func (w *wrapper) IsTotalPresent() bool
// Json serializes the `wrapper` instance into a compact JSON string.
func (w *wrapper) Json() string
// JsonPretty serializes the `wrapper` instance into a prettified JSON string.
func (w *wrapper) JsonPretty() string
// Message retrieves the message associated with the `wrapper` instance.
func (w *wrapper) Message() string
// Meta retrieves the `meta` information from the `wrapper` instance.
func (w *wrapper) Meta() *meta
// OnKeyDebugging retrieves the value of a specific debugging key from the `wrapper` instance.
func (w *wrapper) OnKeyDebugging(key string) interface{}
// Pagination retrieves the `pagination` instance associated with the `wrapper`.
func (w *wrapper) Pagination() *pagination
// R represents a wrapper around the main `wrapper` struct. It is used as a high-level
// abstraction to provide a simplified interface for handling API responses.
// The `R` type allows for easier manipulation of the wrapped data, metadata, and other
// response components, while maintaining the flexibility of the underlying `wrapper` structure.
func (w *wrapper) Reply() R
// Respond generates a map representation of the `wrapper` instance.
func (w *wrapper) Respond() map[string]interface{}
// StatusCode retrieves the HTTP status code associated with the `wrapper` instance.
func (w *wrapper) StatusCode() int
// StatusText returns a human-readable string representation of the HTTP status.
func (w *wrapper) StatusText() string
// Total retrieves the total number of items associated with the `wrapper` instance.
func (w *wrapper) Total() int
// WithApiVersion sets the API version in the `meta` field of the `wrapper` instance.
func (w *wrapper) WithApiVersion(v string) *wrapper
// WithApiVersionf sets the API version in the `meta` field of the `wrapper` instance using a formatted string.
func (w *wrapper) WithApiVersionf(format string, args ...interface{}) *wrapper
// WithBody sets the body data for the `wrapper` instance.
func (w *wrapper) WithBody(v interface{}) *wrapper
// WithCustomFieldKV sets a specific custom field key-value pair in the `meta` field of the `wrapper` instance.
func (w *wrapper) WithCustomFieldKV(key string, value interface{}) *wrapper
// WithCustomFieldKVf sets a specific custom field key-value pair in the `meta` field of the `wrapper` instance
// using a formatted value.
func (w *wrapper) WithCustomFieldKVf(key string, format string, args ...interface{}) *wrapper
// WithCustomFields sets the custom fields in the `meta` field of the `wrapper` instance.
func (w *wrapper) WithCustomFields(values map[string]interface{}) *wrapper
// WithDebugging sets the debugging information for the `wrapper` instance.
func (w *wrapper) WithDebugging(v map[string]interface{}) *wrapper
// WithDebuggingKV adds a key-value pair to the debugging information in the `wrapper` instance.
func (w *wrapper) WithDebuggingKV(key string, value interface{}) *wrapper
// WithDebuggingKVf adds a formatted key-value pair to the debugging information in the `wrapper` instance.
func (w *wrapper) WithDebuggingKVf(key string, format string, args ...interface{}) *wrapper
// WithErrMessage adds a plain contextual message to an existing error and sets it for the `wrapper` instance.
func (w *wrapper) WithErrMessage(err error, message string) *wrapper
// WithErrMessagef adds a formatted contextual message to an existing error and sets it for the `wrapper` instance.
func (w *wrapper) WithErrMessagef(err error, format string, args ...interface{}) *wrapper
// WithErrSck sets an error with a stack trace for the `wrapper` instance.
func (w *wrapper) WithErrSck(err error) *wrapper
// WithErrWrap wraps an existing error with an additional message and sets it for the `wrapper` instance.
func (w *wrapper) WithErrWrap(err error, message string) *wrapper
// WithErrWrapf wraps an existing error with a formatted message and sets it for the `wrapper` instance.
func (w *wrapper) WithErrWrapf(err error, format string, args ...interface{}) *wrapper
// WithError sets an error for the `wrapper` instance using a plain error message.
func (w *wrapper) WithError(message string) *wrapper
// WithErrorf sets a formatted error for the `wrapper` instance.
func (w *wrapper) WithErrorf(format string, args ...interface{}) *wrapper
// WithHeader sets the header for the `wrapper` instance.
func (w *wrapper) WithHeader(v *header) *wrapper
// WithIsLast sets whether the current page is the last one in the wrapper's pagination.
func (w *wrapper) WithIsLast(v bool) *wrapper
// WithLocale sets the locale in the `meta` field of the `wrapper` instance.
func (w *wrapper) WithLocale(v string) *wrapper
// WithMessage sets a message for the `wrapper` instance.
func (w *wrapper) WithMessage(message string) *wrapper
// WithMessagef sets a formatted message for the `wrapper` instance.
func (w *wrapper) WithMessagef(message string, args ...interface{}) *wrapper
// WithMeta sets the metadata for the `wrapper` instance.
func (w *wrapper) WithMeta(v *meta) *wrapper
// WithPage sets the current page number in the wrapper's pagination.
func (w *wrapper) WithPage(v int) *wrapper
// WithPagination sets the pagination information for the `wrapper` instance.
func (w *wrapper) WithPagination(v *pagination) *wrapper
// WithPath sets the request path for the `wrapper` instance.
func (w *wrapper) WithPath(v string) *wrapper
// WithPathf sets a formatted request path for the `wrapper` instance.
func (w *wrapper) WithPathf(v string, args ...interface{}) *wrapper
// WithPerPage sets the number of items per page in the wrapper's pagination.
func (w *wrapper) WithPerPage(v int) *wrapper
// WithRequestID sets the request ID in the `meta` field of the `wrapper` instance.
func (w *wrapper) WithRequestID(v string) *wrapper
// WithRequestIDf sets the request ID in the `meta` field of the `wrapper` instance using a formatted string.
func (w *wrapper) WithRequestIDf(format string, args ...interface{}) *wrapper
// WithRequestedTime sets the requested time in the `meta` field of the `wrapper` instance.
func (w *wrapper) WithRequestedTime(v time.Time) *wrapper
// WithStatusCode sets the HTTP status code for the `wrapper` instance.
func (w *wrapper) WithStatusCode(code int) *wrapper
// WithTotal sets the total number of items for the `wrapper` instance.
func (w *wrapper) WithTotal(total int) *wrapper
// WithTotalItems sets the total number of items in the wrapper's pagination.
func (w *wrapper) WithTotalItems(v int) *wrapper
// WithTotalPages sets the total number of pages in the wrapper's pagination.
func (w *wrapper) WithTotalPages(v int) *wrapperParse JSON string to wrapper-based standardized API response
package main
import (
	"fmt"
	"log"
	"time"
	"github.com/sivaosorg/wrapify"
)
func main() {
	jsonStr := `{
		"data": "response body here",
		"debug": {
		  "___abc": "trace sessions_id: 4919e84fc26881e9fe790f5d07465db4",
		  "refer": 1234
		},
		"message": "How do you do? I'm good",
		"meta": {
		  "api_version": "v0.0.1",
		  "custom_fields": {
			"fields": "userID: 103"
		  },
		  "locale": "en_US",
		  "request_id": "80eafc6a1655ec5a06595d155f1e6951",
		  "requested_time": "2024-12-14T20:24:23.983839+07:00"
		},
		"pagination": {
		  "is_last": true,
		  "page": 1000,
		  "per_page": 2,
		  "total_items": 120,
		  "total_pages": 34
		},
		"path": "/api/v1/users",
		"status_code": 200,
		"total": 1
	  }`
	t := time.Now()
	w, err := wrapify.Parse(jsonStr)
	diff := time.Since(t)
	if err != nil {
		log.Fatalf("Error parsing JSON: %v", err)
	}
	fmt.Printf("Exe time: %+v\n", diff.String())
	fmt.Printf("%+v\n", w.OnKeyDebugging("___abc"))
	fmt.Printf("%+v\n", w.JsonPretty())
}Example of creating a wrapper-based standardized API response
package main
import (
	"fmt"
	"github.com/sivaosorg/unify4g"
	"github.com/sivaosorg/wrapify"
)
func main() {
	p := wrapify.NewPagination().
		WithIsLast(true).
		WithPage(1).
		WithTotalItems(120).
		WithPage(1000).
		WithTotalPages(34).
		WithPerPage(2)
	w := wrapify.New().
		WithStatusCode(200).
		WithTotal(1).
		WithMessagef("How are you? %v", "I'm good").
		WithDebuggingKV("refer", 1234).
		WithDebuggingKVf("___abc", "trace sessions_id: %v", unify4g.GenerateCryptoID()).
		WithBody("response body here").
		WithPath("/api/v1/users").
		WithCustomFieldKVf("fields", "userID: %v", 103).
		WithPagination(p)
	if !w.Available() {
		return
	}
	fmt.Println(w.Json())
	fmt.Println(w.StatusCode())
	fmt.Println(w.StatusText())
	fmt.Println(w.Message())
	fmt.Println(w.Body())
	fmt.Println(w.IsSuccess())
	fmt.Println(w.Respond())
	fmt.Println(w.Meta().IsCustomFieldPresent())
	fmt.Println(w.Meta().IsApiVersionPresent())
	fmt.Println(w.Meta().IsRequestIDPresent())
	fmt.Println(w.Meta().IsRequestedTimePresent())
}| Scenario | HTTP Status Codes | Example | 
|---|---|---|
| Successful Resource Retrieval | 200 OK, 304 Not Modified | GET /users/123- Returns user data or indicates cached content is valid. | 
| Resource Creation | 201 Created | POST /users- Creates a new user, with a location header for the resource URL. | 
| Asynchronous Processing | 202 Accepted | POST /large-file- File upload starts, and the client polls for result. | 
| Validation Errors | 400 Bad Request | POST /users- Missingnamefield or invalid input format. | 
| Authentication Issues | 401 Unauthorized, 403 Forbidden | Accessing a secured endpoint without valid credentials or insufficient permissions. | 
| Rate Limiting | 429 Too Many Requests | Exceeded allowed API requests within a time window. | 
| Missing Resource | 404 Not Found | GET /users/999- User ID not found. | 
| Server Failures | 500 Internal Server Error, 503 Service Unavailable | Database failure, unhandled exception, or server in maintenance mode. | 
| Version Conflicts | 409 Conflict | PUT /resource/123with an outdated version, causing a conflict. | 
| Partial Responses | 206 Partial Content | Video streaming or fetching paginated results. | 
| Redirecting Resources | 302 Found, 307 Temporary Redirect, 308 Permanent Redirect | URL redirection during resource movement or temporary relocation. | 
| Client Data Too Large | 413 Payload Too Large, 414 URI Too Long | Request body or URL exceeds server-defined limits. | 
| Unsupported Content Type | 415 Unsupported Media Type | Client uploads a file format not accepted by the server. | 
| Preconditions in Requests | 428 Precondition Required | Conditional requests missing headers like If-Match. | 
| Unavailable Legal Restrictions | 451 Unavailable For Legal Reasons | Server refuses access due to legal constraints (e.g., copyright violations). | 
| Teapot Joke (RFC 2324) | 418 I'm a Teapot | Easter egg for servers implementing the Hyper Text Coffee Pot Control Protocol. | 
| HTTP Status Code | Category | Description | Example | 
|---|---|---|---|
| 100 Continue | Informational | Request headers received; client can proceed with the request body. | Client sends a large payload after server's readiness. | 
| 200 OK | Successful | General success for GET, POST, PUT, or DELETE requests. | Returns requested resource or success confirmation. | 
| 201 Created | Successful | Resource successfully created. | POST /userscreates a new user. | 
| 202 Accepted | Successful | Request accepted but processing is asynchronous. | Long-running jobs or file uploads. | 
| 204 No Content | Successful | Request successful, but no response body is returned. | DELETE /users/123successfully deletes a user. | 
| 301 Moved Permanently | Redirection | Resource has moved permanently to a new location. | Redirect from http://tohttps://. | 
| 304 Not Modified | Redirection | Cached content is still valid. | GETreturns no new data if resource is unchanged. | 
| 400 Bad Request | Client Error | Malformed or invalid request from the client. | Missing required fields or invalid input. | 
| 401 Unauthorized | Client Error | Authentication is required but missing or invalid. | Accessing protected routes without valid credentials. | 
| 403 Forbidden | Client Error | Access is denied due to insufficient permissions. | Non-admin user attempting to access admin resources. | 
| 404 Not Found | Client Error | Requested resource could not be found. | GET /users/999where the user doesn't exist. | 
| 409 Conflict | Client Error | Conflict with the current resource state. | Versioning conflicts during updates. | 
| 429 Too Many Requests | Client Error | Too many requests sent by the client in a time window. | Exceeding API rate limits for a free-tier user. | 
| 500 Internal Server Error | Server Error | Generic error due to unexpected server conditions. | Unhandled exception or database failure. | 
| 503 Service Unavailable | Server Error | Server is temporarily unavailable (e.g., maintenance or overload). | Server in maintenance mode. | 
| 504 Gateway Timeout | Server Error | Upstream server timeout occurred. | API service failed while calling a dependent service. | 
| 205 Reset Content | Successful | Client should reset the view or form after the request. | Clearing form data after a successful submission. | 
| 206 Partial Content | Successful | Partial data returned, typically for range requests. | Video or file streaming. | 
| 302 Found | Redirection | Resource temporarily located at a different URI. | Temporary URL redirection during maintenance. | 
| 307 Temporary Redirect | Redirection | POST request redirect maintaining HTTP method and body. | Redirecting after login to the original page. | 
| 308 Permanent Redirect | Redirection | Resource has permanently moved; all requests must use the new location. | Updating bookmarks for a relocated API endpoint. | 
| 413 Payload Too Large | Client Error | Request entity exceeds the server’s capacity limits. | Uploading a file exceeding the server's maximum size. | 
| 414 URI Too Long | Client Error | Request URI is too long for the server to process. | Query parameters exceed the allowed URL length. | 
| 415 Unsupported Media Type | Client Error | Media format of the request is not supported by the server. | Uploading a .exefile when only.pngis allowed. | 
| 416 Range Not Satisfiable | Client Error | Client requested an invalid range of data. | Requesting byte range beyond the end of a file. | 
| 422 Unprocessable Entity | Client Error | Server understands the request but is unable to process the content. | Semantic validation errors for a JSON payload. | 
| 451 Unavailable For Legal Reasons | Client Error | Resource cannot be provided due to legal restrictions. | Region-based content restrictions. | 
| 500 Internal Server Error | Server Error | Catch-all for unexpected server errors. | Database unavailable or unhandled exceptions. | 
| 501 Not Implemented | Server Error | Server lacks the functionality to fulfill the request. | Unsupported HTTP method (e.g., TRACE). | 
| 502 Bad Gateway | Server Error | Server acting as a gateway received an invalid response from the upstream server. | Reverse proxy errors. | 
| 504 Gateway Timeout | Server Error | Timeout occurred while waiting for an upstream server. | API dependency fails to respond in time. | 
| 511 Network Authentication Required | Server Error | Network requires authentication to gain access. | Captive portals in public Wi-Fi networks. | 
| Test Case Scenario | Expected HTTP Status Code(s) | Description | 
|---|---|---|
| User successfully logs in | 200 OK | API response includes user details and authentication token. | 
| User account created successfully | 201 Created | Resource (user account) is created, and the location of the new resource is returned. | 
| File uploaded successfully but no additional data | 204 No Content | File upload completed successfully without a response body. | 
| User submits invalid login credentials | 401 Unauthorized | Login fails due to incorrect username or password. | 
| Accessing a protected resource without login | 403 Forbidden | User is not authorized to view the resource, even with authentication. | 
| User attempts to access a non-existent endpoint | 404 Not Found | Requested API endpoint or resource does not exist. | 
| Validation error on a user registration form | 422 Unprocessable Entity | Form data does not pass validation rules (e.g., password too short). | 
| Request body too large (e.g., large file upload) | 413 Payload Too Large | File upload or JSON body exceeds server limits. | 
| Incorrect file format uploaded (e.g., .exe file) | 415 Unsupported Media Type | Server does not support the uploaded file type. | 
| Pagination requested beyond total pages | 416 Range Not Satisfiable | Client requests data outside the valid range of pages or records. | 
| Server fails to connect to the database | 500 Internal Server Error | Unhandled error when the database connection cannot be established. | 
| Feature not yet implemented in the API | 501 Not Implemented | HTTP method or endpoint is recognized but not implemented. | 
| API request timeout due to heavy backend processing | 504 Gateway Timeout | Upstream server takes too long to process the request. | 
| Resource moved to a new location | 301 Moved Permanently, 308 Permanent Redirect | URL of the resource has changed permanently; clients should update their links. | 
| Resource temporarily relocated during maintenance | 302 Found, 307 Temporary Redirect | Temporary redirect to another URL while the primary resource is unavailable. | 
| Rate-limiting: Too many API requests | 429 Too Many Requests | Client exceeds the allowed number of API requests in a given time window. | 
| Precondition headers fail validation | 412 Precondition Failed | Conditional request fails because resource has been modified. | 
| JSON body missing required fields | 400 Bad Request | Client sends a malformed or incomplete request body. | 
| Legal restriction prevents content access | 451 Unavailable For Legal Reasons | Server is legally restricted from providing access to the resource. | 
| Client loses connection before the request completes | 499 Client Closed Request | Client aborts the connection before receiving a response (commonly logged, not directly sent). | 
| Authentication required by proxy server | 407 Proxy Authentication Required | Proxy server requires authentication to forward the request. | 
| File partially downloaded for video streaming | 206 Partial Content | Only a specific byte range of the resource is delivered for streaming or download resumption. | 
| Form submission resets after success | 205 Reset Content | Server advises client to clear the form view post submission. | 
| HTTP protocol not supported by server | 505 HTTP Version Not Supported | Server rejects the request because it uses an unsupported HTTP protocol version. | 
| Conflict during resource creation (e.g., duplicate) | 409 Conflict | Duplicate data (e.g., username already taken) prevents successful resource creation. | 
| Request missing mandatory headers | 428 Precondition Required | Server expects precondition headers but they are not provided in the request. | 
| Server unavailable for scheduled maintenance | 503 Service Unavailable | API temporarily down due to maintenance. | 
| Captive portal blocking request | 511 Network Authentication Required | Network requires user to authenticate via a captive portal (e.g., public Wi-Fi). | 
| User attempts to delete a resource they don’t own | 403 Forbidden | User lacks the necessary permissions to delete the resource. | 
| Successful logout action | 204 No Content | Logout succeeds, and no further information is needed in the response body. | 
| Failed payment during checkout | 402 Payment Required | Payment processing fails due to insufficient funds or invalid card details. | 
| Retryable error while interacting with an API | 503 Service Unavailable, 429 Too Many Requests | Server advises client to retry the request later due to high load or maintenance. | 
| Resource has been permanently removed | 410 Gone | The requested resource is no longer available and has been intentionally removed. | 
| Attempting to use deprecated API functionality | 426 Upgrade Required | Server indicates the client must switch to a newer API version or feature. | 
| Server encounters infinite loop in processing | 508 Loop Detected | Recursive dependency or circular reference causes server to fail. | 
| Client request rejected for failing security policy | 403 Forbidden | Request rejected due to IP block, WAF policy, or lack of role-based access. | 
| Data synchronization between microservices fails | 424 Failed Dependency | Dependent service failure causes the current request to fail. | 
| Cache expired and client retries fetching resource | 304 Not Modified | Client reuses cached data because the resource hasn’t been modified. | 
| Conditional GET succeeds with ETag header validation | 200 OK | ETag or Last-Modified headers validate that the resource is still current. | 
| Debugging API errors via enhanced logs | 500 Internal Server Error | Logs include additional debugging information in non-production environments. | 
| Database deadlock during bulk update | 503 Service Unavailable | Server temporarily pauses due to contention in backend services (e.g., database). | 
| Sending an OPTIONS request for CORS preflight | 204 No Content | Preflight request checks permissions and provides headers without returning a body. | 
| User provides outdated resource version for update | 409 Conflict | Request fails because the resource version has changed (optimistic locking conflict). | 
| Authorization header missing for private API | 401 Unauthorized | Server denies access to private endpoints due to missing or invalid authorization credentials. | 
| Request triggers alert for potential bot activity | 429 Too Many Requests | Server throttles requests due to rate limits exceeded by suspected bot. | 
| Returning localized error messages | 422 Unprocessable Entity | Localized error message (e.g., user-facing validation errors) is included in the response. | 
| API downtime monitored by a health check service | 503 Service Unavailable | Health check detects outage, and server signals unavailability for monitoring tools. | 
| Proxy service fails to resolve the target server | 502 Bad Gateway | Reverse proxy server cannot reach the upstream server. | 
| User requests unsupported language or locale | 406 Not Acceptable | Server cannot fulfill request due to missing translation or unsupported Accept-Language header. | 
| Request contains missing parameters | 400 Bad Request | Request body or query parameters are incomplete or improperly formatted. | 
| Rate-limited error with Retry-After header | 429 Too Many Requests | Response includes a Retry-After header to indicate when the client can send another request. | 
| Simultaneous update results in inconsistent state | 409 Conflict | Two users updating the same resource simultaneously cause a conflict. | 
| Long-running process accepted but not completed yet | 202 Accepted | Request acknowledged and being processed asynchronously; no result yet. | 
| Streaming file in chunks for large downloads | 206 Partial Content | Response delivers file in chunks using Content-Range headers. | 
| Server limits resource creation per account | 429 Too Many Requests | Too many POST requests for creating new resources are detected from the same account. | 
| Request contains invalid authentication token | 401 Unauthorized | JWT token expired, malformed, or signed with an invalid key. | 
| Custom error page for 404 not found | 404 Not Found | Server renders a user-friendly 404 error page for missing resources. | 
| JSON parsing error during request processing | 400 Bad Request | Malformed JSON request body results in a bad request error. | 
| File uploaded to a temporary storage location | 201 Created | Temporary resource is created, and location is returned in response headers. | 
| Upstream server returns a malformed response | 502 Bad Gateway | Reverse proxy reports an invalid or unexpected response from the upstream server. | 
| Deprecation warning in response headers | 200 OK | Warning header advises clients that the endpoint or feature will be deprecated in future. | 
| Custom quota limits for premium users | 429 Too Many Requests | Rate-limiting based on user’s subscription tier is enforced. | 
| User provides invalid credentials | 401 Unauthorized | Authentication fails due to incorrect or missing credentials in the request. | 
| User requests a resource that no longer exists | 410 Gone | Requested resource was previously available but has been permanently deleted. | 
| File upload is too large | 413 Payload Too Large | User attempts to upload a file that exceeds the allowed size. | 
| Access is denied due to insufficient permissions | 403 Forbidden | User lacks permissions to access the requested resource, even though they are authenticated. | 
| User tries to access a resource they are not authorized for | 403 Forbidden | The user is authenticated, but their role does not permit access to the resource. | 
| API version mismatch | 426 Upgrade Required | The client needs to upgrade to a supported API version. | 
| API successfully processes a request | 200 OK | Request is processed successfully, and the server returns the result. | 
| Resource creation is successful | 201 Created | A new resource is created (e.g., new user, new item) and the response includes a location header. | 
| User tries to update a resource with invalid data | 400 Bad Request | The user has sent invalid data or missing required parameters in the request body. | 
| Invalid input format or type in request body | 400 Bad Request | Malformed JSON, XML, or any unsupported data format received in the body. | 
| Client exceeds rate limit for API calls | 429 Too Many Requests | Too many requests sent in a given time frame, exceeding the rate limit. | 
| Resource is temporarily unavailable due to maintenance | 503 Service Unavailable | Service is down due to scheduled or unscheduled maintenance. | 
| Requested resource does not exist | 404 Not Found | The server cannot find the resource requested by the client. | 
| User is logged out or session expired | 401 Unauthorized | Session has expired, requiring the user to authenticate again. | 
| API request is valid but cannot be processed immediately | 202 Accepted | Request is accepted, but processing is deferred (asynchronous). | 
| Invalid request headers | 400 Bad Request | Client sends improper headers, such as missing required headers or unsupported content types. | 
| File type not supported during upload | 415 Unsupported Media Type | The server refuses to process the file because its type is not supported. | 
| Client attempts to access a restricted IP address | 403 Forbidden | Server blocks access from a specific IP address for security reasons. | 
| Required query parameters are missing | 400 Bad Request | A required query parameter is missing from the request, making it invalid. | 
| Client sends an invalid or expired authentication token | 401 Unauthorized | Authentication fails due to the expiration or invalidity of the provided authentication token. | 
| The request is processed but some resources fail | 206 Partial Content | The request was partially fulfilled; some resources were returned, but others failed. | 
| Client requested a resource that has been moved | 301 Moved Permanently | The requested resource has been permanently moved to a new URL. | 
| Client requests an old resource version | 409 Conflict | A conflict occurs, typically when trying to update a resource that has been modified by others. | 
| Resource modification fails due to business rules | 422 Unprocessable Entity | The resource update fails due to invalid data (e.g., violating constraints or business rules). | 
| Server error during processing due to unexpected issue | 500 Internal Server Error | Generic error indicating that the server encountered an unexpected condition. | 
| Proxy server encounters an error while communicating with the backend | 502 Bad Gateway | The reverse proxy server is unable to forward the request to the backend service. | 
| Request body exceeds maximum allowed size | 413 Payload Too Large | The client sends a request with a body larger than what the server is willing or able to process. | 
| User attempts to upload a file without authorization | 403 Forbidden | User is authenticated, but lacks permission to upload files to the server. | 
| API request violates business logic (e.g., attempting to submit an empty form) | 400 Bad Request | Request violates API business logic or validation rules (e.g., submitting empty or invalid fields). | 
| Server does not support the requested HTTP method | 405 Method Not Allowed | The client attempts to use an unsupported HTTP method (e.g., using PUT on a read-only endpoint). | 
| Client attempts to submit a request with too many parameters | 400 Bad Request | Request contains too many parameters or exceeds the API’s parameter limits. | 
| Service is temporarily unavailable | 503 Service Unavailable | The service is temporarily unavailable due to reasons like server overload, maintenance, etc. | 
| Invalid request format (e.g., XML instead of JSON) | 415 Unsupported Media Type | Server responds with an error when an unsupported content type (like XML) is sent in the request. | 
| File not found in requested location | 404 Not Found | Client requests a file that does not exist on the server. | 
| Server experiences a timeout when processing request | 504 Gateway Timeout | The server was unable to get a timely response from an upstream server. | 
| Incorrect authentication method provided | 400 Bad Request | Authentication method provided by the client is not supported by the server (e.g., Basic Auth instead of OAuth). | 
| Request sent in unsupported language | 406 Not Acceptable | The server cannot provide a response in the requested language. | 
| Client sends invalid API version | 426 Upgrade Required | API version used in the request is outdated and no longer supported by the server. | 
| The API is receiving an unexpected large number of requests | 429 Too Many Requests | The client exceeded the rate limit defined for the API endpoint. | 
| Client requests a resource that is locked | 423 Locked | The requested resource is locked and cannot be modified. | 
| Request failed due to a custom business rule violation | 422 Unprocessable Entity | The request contains valid input, but a business rule prevents it from being processed. | 
| Client tries to access a deprecated endpoint | 410 Gone | The endpoint has been deprecated and is no longer available. | 
| The server is unable to process the request due to a backend error | 502 Bad Gateway | Backend or upstream server issues prevent the processing of the request. | 
| The client’s request is incomplete (missing necessary fields) | 400 Bad Request | Request cannot be processed because it lacks necessary fields or contains invalid values. | 
| User reaches the maximum limit of API calls per day | 429 Too Many Requests | The user has exceeded their daily API quota limit and must wait until the next period. | 
| Client tries to access a resource that requires a higher subscription tier | 403 Forbidden | Client is attempting to access a resource that is restricted based on their subscription tier. | 
| Client sends a request with a malformed header | 400 Bad Request | A malformed or missing required header causes the request to be rejected. | 
| Server successfully processes a POST request to create a new entity | 201 Created | The POST request creates a new entity (such as a user or item), and the server returns the URI of the newly created entity. | 
| Client submits a valid request for batch processing | 207 Multi-Status | A batch request is processed with mixed success, returning the status of each request in the batch. | 
| Request for an unsupported API version | 426 Upgrade Required | The requested API version is unsupported, and the client must upgrade. | 
To contribute to project, follow these steps:
- 
Clone the repository: git clone --depth 1 https://github.com/sivaosorg/wrapify.git 
- 
Navigate to the project directory: cd wrapify
- 
Prepare the project environment: go mod tidy