Home Reference Source Repository

src/apis/ticket.js

import { RequestHandler } from '../request/handler';
import { auth } from '../auth';

/**
 * Ingresse Ticket's API
 *
 * API to get, create, update or remove tickets.
 *
 * @example
 * var Sdk = require('ingresse-sdk');
 * var ingresse = new Sdk();
 *
 * // You will have access to this API
 * // after instantiate the Sdk.
 * var ticket = ingresse.ticket;
 */
export class Ticket extends RequestHandler {
    /**
     * Ticket Api
     *
     * @param {object} [custom={}] - Initialize Ticket Api settings.
     */
    constructor(custom = {}) {
        let settings = Object.assign({
            auth    : auth.Jwt.type(),
            resource: 'ticket',
        }, custom);

        super(settings);

        this.settings = settings;
    }

    /**
     * Get a list of ticket types
     * This method will return a `Promise` so you can use
     * `.then` and `.catch` methods.
     *
     * @param {object} [query] - Optional request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * ingresse.ticket.getTypes()
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    getTypes(query = {}) {
        return this.get('/types', query);
    }

    /**
     * Get a list of ticket items
     * This method will return a `Promise` so you can use
     * `.then` and `.catch` methdos.
     *
     * @param {object} [query] - Optional request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * ingresse.ticket.getItems()
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    getItems(query = {}) {
        return this.get('/items', query);
    }

    /**
     * Get item by ID
     *
     * @param {string|number} id - The item ID to get.
     * @param {object} [query]   - Optional request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * ingresse.ticket.getItem(200)
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    getItem(id, query = {}) {
        return this.get(`/items/${id}`, query);
    }

    /**
     * Create new Ticket item
     *
     * @param {object} data    - Data to create a new ticket item.
     * @param {object} [query] - Optional request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * ingresse.ticket.newItem({ name: 'My Ticket Name' })
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    newItem(data = {}, query = {}) {
        return this.post('/items', data, query);
    }

    /**
     * Update a ticket item
     *
     * @param {string|number} id - The item ID to update.
     * @param {object} data      - Data to update item.
     * @param {object} [query]   - Optional request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * ingresse.ticket.updateItem(200, { name: 'My Updated Ticket Name' })
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    updateItem(id, data = {}, query = {}) {
        return this.put(`/items/${id}`, data, query);
    }

    /**
     * Remove a ticket item
     *
     * @param {string|number} id - The item ID to remove.
     * @param {object} [query]   - Optional request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * ingresse.ticket.removeItem(200)
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    removeItem(id, query = {}) {
        return this.put(`/items/${id}`, query);
    }

    /**
     * Create new ticket attribute
     *
     * @param {number} id        - The item ID to create attribute.
     * @param {object} attribute - The attribute data.
     * @param {object} [query]   - Optional request parameters.
     *
     * @returns Promise
     *
     * @example
     * ...
     *
     * ingresse.ticket.newAttribute(200, { key: 'min', value: '1', type: 'integer' })
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    newAttribute(id, attribute, query) {
        return this.post(`/items/${id}/attributes`, attribute, query);
    }

    /**
     * Updated ticket attribute
     *
     * @param {number} id          - The item ID to update attribute.
     * @param {object} attribute   - The attribute data.
     * @param {object} [query]     - Optional request parameters.
     *
     * @returns Promise
     *
     * @example
     * ...
     *
     * ingresse.ticket.updateAttribute(200, { key: 'minimum', value: 5, type: 'integer' })
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    updateAttribute(id, attribute, query) {
        return this.put(`/items/${id}/attributes`, attribute, query);
    }

    /**
     * Create new sale period to ticket
     *
     * @param {number} id         - The item ID to create sale period.
     * @param {object} salePeriod - The sale period data.
     * @param {object} [query]    - Optional request parameters.
     *
     * @returns Promise
     *
     * @example
     * ...
     *
     * ingresse.ticket.newSalePeriod({
     *          appCategoryId: 1,
     *          start: '2016-10-10 20:20:00',
     *          finish: '2016-11-10 20:20:00',
     *          available: 1
     *      })
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    newSalePeriod(id, salePeriod, query) {
        return this.post(`/items/${id}/sales-period`, salePeriod, query);
    }

    /**
     * Updated ticket sale period
     *
     * @param {number} id         - The item ID to update the sale period.
     * @param {object} salePeriod - The salePeriod data.
     * @param {object} [query]    - Optional request parameters.
     *
     * @returns Promise
     *
     * @example
     * ...
     *
     * ingresse.ticket.updateSalePeriod(200, {
     *          appCategoryId: 1,
     *          start: '2016-11-20 10:10:00',
     *          finish: '2016-12-20 10:10:00',
     *          available: 1
     *      })
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    updateSalePeriod(id, salePeriod, query) {
        return this.put(`/items/${id}/sales-period`, salePeriod, query);
    }

    /**
     * Create new values to ticket
     *
     * @param {number} id      - The item ID to create values.
     * @param {object} values  - The values data.
     * @param {object} [query] - Optional request parameters.
     *
     * @returns Promise
     *
     * @example
     * ...
     *
     * ingresse.ticket.newValues({
     *          price: 10000,
     *          feeSale: 500,
     *          feeProducer: 500
     *      })
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    newValues(id, values, query) {
        return this.post(`/items/${id}/values`, values, query);
    }

    /**
     * Updated ticket values
     *
     * @param {number} id      - The item ID to update values.
     * @param {object} values  - The values data.
     * @param {object} [query] - Optional request parameters.
     *
     * @returns Promise
     *
     * @example
     * ...
     *
     * ingresse.ticket.updateValues(200, {
     *          price: 20000,
     *          feeSale: 1000,
     *          feeProducer: 1000
     *      })
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    updateValues(id, values, query) {
        return this.put(`/items/${id}/values`, values, query);
    }

    /**
     * Get a list of triggers
     * This method will return a `Promise` so you can use
     * `.then` and `.catch` methods.
     *
     * @param {number} id      - The item ID to get the triggers.
     * @param {object} [query] - Optional request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * ingresse.ticket.getTriggers(10000040)
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    getTriggers(id, query = {}) {
        return this.get(`/items/${id}/triggers`, query);
    }

    /**
     * Get the tax calculated
     *
     * @param {Object} query - The request parameters.
     * @param {Number} [query.producerId] - The producer id.
     * @param {Number} [query.eventId] - The event id.
     * @param {Number} [query.price] - The ticket's price in cents.
     * @param {Number} [query.taxDistribution] - The tax payed by customer (in percent).
     * @param {Number} [query.tax] - The custom tax in cents.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * var query = {
     *  eventId: 123, // must be informed one eventId or producerId.
     *  taxDistribution: 50
     * };
     *
     * ingresse.ticket.getTax(query)
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    getTax(query = {}) {
        return this.get('/tax', query);
    }

    /**
     * Get the ticket passkeys list.
     *
     * @param {Object} query - The request parameters.
     * @param {Number} query.eventId - The event id.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * var query = {
     *  eventId: 123, // must be informed one eventId.
     * };
     *
     * ingresse.ticket.getPasskeys(query)
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    getPasskeys(query = {}) {
        return this.get('/passkeys', query);
    }

    /**
     * Get the ticket passkeys by id.
     *
     * @param {number} id      - The passkey id.
     * @param {Object} [query] - The request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * ingresse.ticket.getPasskeyById(id, query)
     *     .then(function (response) {
     *         console.log(response);
     *     })
     *     .catch(function (error) {
     *         console.log(error);
     *     });
     */
    getPasskeyById(id, query = {}) {
        return this.get(`/passkeys/${id}`, query);
    }

    /**
     * Create a new passkey
     *
     * @param {object} data         - Data to create a new passkey.
     * @param {number} data.eventId - The event id.
     * @param {string} data.passkey - The passkey.
     * @param {date}   [data.start] - The date that this passkey will works.
     * @param {date}   [data.finish]- The data that this passkey will stop works.
     * @param {Object} [query]      - The request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     *ingresse.ticket.createPasskey({
     *    "eventId": 26899,
     *    "passkey": "passkey",
     *    "start"  : "2018-10-31 12:00:00",
     *    "finish" : "2019-11-10 20:20:00"
     *})
     *.then(function (response) {
     *    console.log(response);
     *})
     *.catch(function (error) {
     *    console.log(error);
     *});
     */
    createPasskey(data, query = {}) {
        return this.post('/passkeys', data,  query);
    }

    /**
     * Delete a passkey
     *
     * @param {number} id      - The passkey id.
     * @param {object} [data]  - Data to delete passkey.
     * @param {Object} [query] - The request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     *ingresse.ticket.deletePasskey(123)
     *.then(function (response) {
     *    console.log(response);
     *})
     *.catch(function (error) {
     *    console.log(error);
     *});
     */
    deletePasskey(id, data = {}, query = {}) {
        return this.delete(`/passkeys/${id}`, query, data);
    }

    /**
     * Update a passkey
     *
     * @param {string|number} id    - The passkey id to update.
     * @param {object} data         - Data to update a passkey.
     * @param {number} data.eventId - The event id.
     * @param {string} data.passkey - The passkey.
     * @param {date}   [data.start] - The date that this passkey will works (can not be lower than current day).
     * @param {date}   [data.finish]- The data that this passkey will stop works.
     * @param {Object} [query]      - The request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * ingresse.ticket.updatePasskey(200, {
     *    "eventId": 26899,
     *    "passkey": "passkey",
     *    "start"  : "2018-10-31 12:00:00",
     *    "finish" : "2019-11-10 20:20:00"
     *})
     *.then(function (response) {
     *    console.log(response);
     *})
     *.catch(function (error) {
     *   console.log(error);
     *});
     */
    updatePasskey(id, data = {}, query = {}) {
        return this.put(`/passkeys/${id}`, data, query);
    }

    /**
     * Associate a passkey to items
     *
     * @param {string|number} id    - The passkey id to update.
     * @param {object} data         - Data to be updated.
     * @param {array}  data.itemIds - An array with tickets id.
     * @param {Object} [query]      - The request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * ingresse.ticket.associatePasskey(820, { itemIds: [ 1, 2, 3] })
     *.then(function (response) {
     *    console.log(response);
     *})
     *.catch(function (error) {
     *   console.log(error);
     *});
     */
    associatePasskey(id, data = {}, query = {}) {
        return this.put(`/passkeys/${id}/items`, data, query);
    }

    /**
     * Create many passkeys and associate it for many tickets.
     *
     * @param {number}         eventId        - The event id.
     * @param {object}         data           - Data with passkeys details.
     * @param {array[string]}  data.codes     - Array with passkeys strings.
     * @param {array[integer]} [data.itemIds] - Array with tickets id.
     * @param {date}           [data.start]   - The date that this passkey will works (can not be lower than current day).
     * @param {date}           [data.finish]  - The data that this passkey will stop works.
     * @param {integer}        [data.limit]   - The usage limit.
     * @param {Object}         [query]        - The request parameters.
     * @returns {Promise}
     *
     * @example
     * ...
     *
     * ingresse.ticket.batchPasskeys(200, {
     *    "codes"  : ["passkey1", "passkey2", "passkey3"],
     *    "itemIds": [1,2,3],
     *    "limit"  : 100,
     *    "start"  : "2018-10-31 12:00:00",
     *    "finish" : "2019-11-10 20:20:00"
     * })
     *.then(function (response) {
     *    console.log(response);
     *})
     *.catch(function (error) {
     *   console.log(error);
     *});
     */
    batchPasskeys(eventId, data = {}, query = {}) {
        return this.post(`/event/${eventId}/passkeys`, data, query);
    }

    /**
     * Upload External Codes via CSV file
     *
     * @param {number} eventId
     * @param {object} formData
     * @param {file}   formData.file
     * @param {object} [query]
     *
     * @return {Promise}
     *
     * @example
     * ....
     *
     * var uploadData = new FormData();
     *
     * uploadData.append('file', document.getElementById('input-file-id').value);
     *
     * ingresse.ticket.uploadExternals(21232, uploadData)
     * .then(function (response) {
     *     console.log(response);
     * })
     * .catch(function (error) {
     *    console.log(error);
     * });
     *
     */
    uploadExternals(eventId, formData = {}, query = {}) {
        return this.upload(`/events/${eventId}/codes`, formData, query);
    }

    /**
     * Get External Item Codes
     *
     * @param {number} itemId
     * @param {object} [query]
     *
     * @return {Promise}
     *
     * @example
     * ....
     *
     * ingresse.ticket.getExternalCodes(456789)
     * .then(function (response) {
     *     console.log(response);
     * })
     * .catch(function (error) {
     *    console.log(error);
     * });
     *
     */
    getExternalCodes(itemId, query = {}) {
        return this.get(`/items/${itemId}/codes`, query);
    }

    /**
     * Delete External Item
     *
     * @param {number} eventId
     * @param {object} [query]
     *
     * @return {Promise}
     *
     * @example
     * ....
     *
     * ingresse.ticket.deleteExternal(21232, { name: 'My Ticket Name' })
     * .then(function (response) {
     *     console.log(response);
     * })
     * .catch(function (error) {
     *    console.log(error);
     * });
     *
     */
    deleteExternal(eventId, query = {}) {
        return this.delete(`/events/${eventId}/codes`, query);
    }

    /**
     * Delete External Item Code
     *
     * @param {number} itemId
     * @param {number|string} codeId
     * @param {object} [query]
     *
     * @return {Promise}
     *
     * @example
     * ....
     *
     * ingresse.ticket.deleteExternalCode(123456, 987654321)
     * .then(function (response) {
     *     console.log(response);
     * })
     * .catch(function (error) {
     *    console.log(error);
     * });
     *
     */
    deleteExternalCode(itemId, codeId, query = {}) {
        return this.delete(`/items/${itemId}/codes/${codeId}`, query);
    }
}