/** * Create Zammad objects to match the bridge schema (groups, etc.). * Uses same .env as the bridge (ZAMMAD_URL, ZAMMAD_TOKEN). * * Run from gmail-bridge: node scripts/create-zammad-objects.js */ const axios = require('axios'); const { ZAMMAD } = require('../config'); const baseURL = ZAMMAD.URL?.replace(/\/+$/, '') || ''; const headers = { Authorization: `Token token=${ZAMMAD.TOKEN}`, 'Content-Type': 'application/json' }; async function apiGet(path) { const { data } = await axios.get(`${baseURL}${path}`, { headers }); return data; } async function apiPost(path, body) { const { data } = await axios.post(`${baseURL}${path}`, body, { headers }); return data; } async function main() { if (!baseURL || !ZAMMAD.TOKEN) { console.error('Set ZAMMAD_URL and ZAMMAD_TOKEN in .env'); process.exit(1); } console.log('Zammad base URL:', baseURL); console.log(''); // --- Groups (bridge uses ZAMMAD_EMAIL_GROUP and ZAMMAD_DISCORD_GROUP) --- const groupNames = [ ZAMMAD.EMAIL_GROUP || 'Email Users', ZAMMAD.DISCORD_GROUP || 'Discord Users' ]; let groups; try { groups = await apiGet('/api/v1/groups'); } catch (e) { console.error('GET /api/v1/groups failed:', e.response?.status, e.response?.data || e.message); process.exit(1); } const existingNames = (groups || []).map((g) => g.name); for (const name of groupNames) { if (existingNames.includes(name)) { console.log(`Group "${name}" already exists.`); continue; } try { await apiPost('/api/v1/groups', { name, active: true }); console.log(`Created group: "${name}"`); } catch (e) { console.error(`Create group "${name}" failed:`, e.response?.status, e.response?.data || e.message); } } console.log(''); // --- Ticket priorities (for bridge priority sync: low / normal / high) --- try { const priorities = await apiGet('/api/v1/ticket_priorities'); console.log('Ticket priorities (for /priority and buttons):'); (priorities || []).forEach((p) => { console.log(` id=${p.id} name="${p.name}" default_create=${p.default_create}`); }); } catch (e) { console.error('GET /api/v1/ticket_priorities failed:', e.response?.status, e.message); } console.log(''); // --- Ticket states (bridge uses state "new" on create, "closed" on force-close) --- try { const states = await apiGet('/api/v1/ticket_states'); console.log('Ticket states (bridge uses "new" and "closed"):'); (states || []).forEach((s) => { console.log(` id=${s.id} name="${s.name}" default_create=${s.default_create}`); }); } catch (e) { console.error('GET /api/v1/ticket_states failed:', e.response?.status, e.message); } console.log(''); console.log('Done. Bridge expects group names in .env: ZAMMAD_EMAIL_GROUP, ZAMMAD_DISCORD_GROUP.'); } main().catch((e) => { console.error(e); process.exit(1); });