Files
broccolini-bot/scripts/create-zammad-objects.js
root 519788c633 Initial commit
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-10 08:22:19 -06:00

98 lines
2.9 KiB
JavaScript

/**
* 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);
});