TryGhost/Ghost

View on GitHub
apps/portal/src/utils/errors.js

Summary

Maintainability
A
35 mins
Test Coverage
export class HumanReadableError extends Error {
    /**
     * Returns whether this response from the server is a human readable error and should be shown to the user.
     * @param {Response} res
     * @returns {HumanReadableError|undefined}
     */
    static async fromApiResponse(res) {
        // Bad request + Too many requests
        if (res.status === 400 || res.status === 429) {
            try {
                const json = await res.json();
                if (json.errors && Array.isArray(json.errors) && json.errors.length > 0 && json.errors[0].message) {
                    return new HumanReadableError(json.errors[0].message);
                }
            } catch (e) {
                // Failed to decode: ignore
                return false;
            }
        }
    }

    /**
     * Only output the message of an error if it is a human readable error and should be exposed to the user.
     * Otherwise it returns a default generic message.
     */
    static getMessageFromError(error, defaultMessage) {
        if (error instanceof HumanReadableError) {
            return error.message;
        }
        return defaultMessage;
    }
}