UNPKG

@cocalc/server

Version:

CoCalc server functionality: functions used by either the hub and the next.js server

104 lines 4.2 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const logger_1 = require("@cocalc/backend/logger"); const site_url_1 = __importDefault(require("@cocalc/server/settings/site-url")); const get_name_1 = __importStar(require("@cocalc/server/accounts/get-name")); const zendesk_client_1 = __importDefault(require("./zendesk-client")); const util_1 = require("./util"); const log = (0, logger_1.getLogger)("support:create-ticket"); async function createTicket(options) { log.debug("createTicket", options); const client = await (0, zendesk_client_1.default)(); const { account_id, email, files, type, subject, url, info } = options; const user = await getUser(email, account_id); // create corresponding zendesk user, or get current user if already created. const userResult = await client.users.createOrUpdate(user); let { body } = options; if (url) { body += `\n\n\nURL:\n${url}\n`; } if (files && files.length > 0) { body += "\n\n\nRELEVANT FILES:\n\n"; for (const file of files) { body += `\n\n- ${await toURL(file)}\n`; } } if (info) { body += "\n\n\nBROWSER INFO:\n\n"; body += `\n\n- userAgent="${info.userAgent}"`; body += `\n\n- browser="${info.browser}"`; } body += "\n\n\nUSER:\n\n"; body += `\n\n- account_id="${account_id}"`; body += `\n\n- email="${email}"`; // It's very helpful to look https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/node-zendesk/index.d.ts // and // https://github.com/blakmatrix/node-zendesk/tree/master/examples // https://developer.zendesk.com/api-reference/ const ticket = { ticket: { comment: { body }, external_id: account_id, subject, type: type, // @ts-ignore: @types/node-zendesk is wrong: requester_id: userResult.id, }, }; log.debug("ticket ", ticket); const ticketResult = await client.tickets.create(ticket); log.debug("got ", { ticketResult }); // @ts-ignore: @types/node-zendesk is wrong about fields in ticketResult. return (0, util_1.urlToUserURL)(ticketResult.url); } exports.default = createTicket; async function toURL({ project_id, path, }) { let s = (await (0, site_url_1.default)()) + "/" + encodeURI(`projects/${project_id}`); if (!path) return s; return s + encodeURI(`/files/${path}`); } async function getUser(email, account_id) { let name = undefined; if (account_id) { name = await (0, get_name_1.default)(account_id); } if (!name) { name = await (0, get_name_1.getNameByEmail)(email); } // name: must be at least one character, even " " is causing errors // https://developer.zendesk.com/rest_api/docs/core/users if (!name?.trim()) { name = email; } return { user: { name, email, external_id: account_id ?? null }, }; } //# sourceMappingURL=create-ticket.js.map