Skip to content
Snippets Groups Projects
Select Git revision
  • 65d0d4d5245bd2c81da9996e399927302de029d0
  • main default protected
  • v1.303.0
  • v1.302.0
  • v1.301.0
  • v1.300.0
  • v1.299.0
  • v1.298.0
  • v1.297.0
  • v1.296.0
  • v1.295.0
  • v1.294.0
  • v1.293.0
  • v1.292.0
  • v1.291.0
  • v1.290.0
  • v1.289.0
  • v1.288.0
  • v1.287.0
  • v1.286.0
  • v1.285.0
  • v1.284.0
22 results

responses.go

Blame
  • responses.go 3.84 KiB
    package responses
    
    import (
    	"encoding/json"
    	"net/http"
    
    	"gitlab.com/uafrica/go-utils/logs"
    	"gitlab.com/uafrica/go-utils/utils"
    
    	"github.com/aws/aws-lambda-go/events"
    )
    
    // =============================================================================
    // RESPONSE HELPER / CONVENIENCE FUNCTIONS
    // =============================================================================
    
    var ContentTypeJSONHeader = map[string]string{"Content-Type": "application/json"}
    
    // BadRequestResponse - invalid user input
    func BadRequestResponse(err error) (events.APIGatewayProxyResponse, error) {
    	return GenericResponse(http.StatusBadRequest, err.Error(), nil)
    }
    
    // NotFoundResponse - 404
    func NotFoundResponse(err error) (events.APIGatewayProxyResponse, error) {
    	return GenericResponse(http.StatusNotFound, err.Error(), nil)
    }
    
    func NoContent() (events.APIGatewayProxyResponse, error) {
    	return events.APIGatewayProxyResponse{
    		StatusCode: http.StatusNoContent,
    		Headers:    utils.MergeMaps(utils.CorsHeaders(), ContentTypeJSONHeader),
    	}, nil
    }
    
    func TooManyRequests(message string) (events.APIGatewayProxyResponse, error) {
    
    	response := map[string]string{
    		"message": message,
    	}
    	responseJson, err := json.Marshal(response)
    	if err != nil {
    		logs.Info("Could not create error message for ", message)
    	}
    
    	return events.APIGatewayProxyResponse{
    		StatusCode: http.StatusTooManyRequests,
    		Headers:    utils.MergeMaps(utils.CorsHeaders(), ContentTypeJSONHeader),
    		Body:       string(responseJson),
    	}, nil
    }
    
    func LockedResponse(err error) (events.APIGatewayProxyResponse, error) {
    	return GenericResponse(http.StatusLocked, err.Error(), nil)
    }
    
    // InternalServerErrorResponse - something went wrong
    func InternalServerErrorResponse(err error) (events.APIGatewayProxyResponse, error) {
    	return GenericResponse(http.StatusInternalServerError, err.Error(), nil)
    }
    
    // SuccessResponse - everything worked
    func SuccessResponse(body string) (events.APIGatewayProxyResponse, error) {
    	return GenericResponse(http.StatusOK, body, nil)
    }
    
    // JSONSuccessResponse - try to JSONify any struct and send it as the body of a successful response
    // Return an internal server error if JSON marshalling fails
    // NOTE: struct fields must be exported (i.e. Capitalised) and tagged
    func JSONSuccessResponse(body interface{}) (events.APIGatewayProxyResponse, error) {
    	bodyBytes, err := json.Marshal(body)
    	if err != nil {
    		return InternalServerErrorResponse(err)
    	}
    
    	return GenericResponse(http.StatusOK, string(bodyBytes), ContentTypeJSONHeader)
    }
    
    // GenericResponse - called by the other functions
    func GenericResponse(statusCode int, body string, headers map[string]string) (events.APIGatewayProxyResponse, error) {
    	// Log the response
    	logs.Info("--> [APIGW] %d %s %s\n", statusCode, http.StatusText(statusCode), body)
    	// Return it
    
    	return events.APIGatewayProxyResponse{
    		StatusCode: statusCode,
    		Body:       body + "\n",
    		Headers:    utils.MergeMaps(utils.CorsHeaders(), headers),
    	}, nil
    }
    
    // SuccessResponse - everything worked
    func GenericSuccessResponse(message string) (events.APIGatewayProxyResponse, error) {
    	response := map[string]string{
    		"message": message,
    	}
    	return JSONSuccessResponse(response)
    }
    
    func MaintenanceResponse(message string) events.APIGatewayProxyResponse {
    	return events.APIGatewayProxyResponse{
    		StatusCode: http.StatusTeapot,
    		Body:       message,
    		Headers:    utils.MergeMaps(utils.CorsHeaders(), ContentTypeJSONHeader),
    	}
    }
    
    func RateLimitResponse(message string) events.APIGatewayProxyResponse {
    	return events.APIGatewayProxyResponse{
    		StatusCode: http.StatusTooManyRequests,
    		Body:       message,
    		Headers:    utils.MergeMaps(utils.CorsHeaders(), ContentTypeJSONHeader),
    	}
    }
    
    func OptionsResponse() events.APIGatewayProxyResponse {
    	return events.APIGatewayProxyResponse{
    		StatusCode: http.StatusNoContent,
    		Headers:    utils.MergeMaps(utils.CorsHeaders(), ContentTypeJSONHeader),
    	}
    }