Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
173 lines
7.7 KiB
JavaScript
173 lines
7.7 KiB
JavaScript
exports.seed = async function (knex) {
|
|
// Fetch the tenant first
|
|
const tenantRow = await knex('tenants').select('tenant').first();
|
|
if (!tenantRow) {
|
|
console.warn('No tenant found, skipping ticket seeding.');
|
|
return;
|
|
}
|
|
const tenant = tenantRow.tenant;
|
|
|
|
// Helper function to fetch IDs to reduce repetition
|
|
const getId = async (table, filters, idColumn) => {
|
|
const result = await knex(table).where({ tenant, ...filters }).select(idColumn).first();
|
|
if (!result) {
|
|
console.warn(`Warning: Could not find ID in table '${table}' for filters:`, filters);
|
|
return null; // Or throw an error if required
|
|
}
|
|
return result[idColumn];
|
|
};
|
|
|
|
const getTicketStatusId = async (name, boardId) => {
|
|
if (!boardId) return null;
|
|
return getId('statuses', { name, board_id: boardId }, 'status_id');
|
|
};
|
|
|
|
const getContactId = async (namePattern) => {
|
|
const result = await knex('contacts')
|
|
.where({ tenant })
|
|
.whereRaw(`full_name ILIKE ?`, [`%${namePattern}%`])
|
|
.select('contact_name_id')
|
|
.first();
|
|
if (!result) {
|
|
console.warn(`Warning: Could not find contact ID for pattern: ${namePattern}`);
|
|
return null;
|
|
}
|
|
return result.contact_name_id;
|
|
}
|
|
|
|
// Fetch all required IDs concurrently for efficiency
|
|
const [
|
|
clientEmeraldCityId, clientWonderlandId,
|
|
contactAliceId, contactDorothyId,
|
|
boardUrgentId, boardProjectsId,
|
|
categoryMagicalArtifactsId, categoryCharacterAssistId, categoryRealmMaintenanceId,
|
|
subCategoryEnchantedAccId, subCategoryQuestGuidanceId, subCategoryMagicalInfraId,
|
|
priorityEnchantedId, priorityCuriousId,
|
|
severitySeriousId, severityModerateId,
|
|
urgencyHareId, urgencyTickTockId,
|
|
impactRealmId, impactLocalId,
|
|
userGlindaId, userTinmanId, userMadhatterId, userScarecrowId
|
|
] = await Promise.all([
|
|
getId('clients', { client_name: 'Emerald City' }, 'client_id'),
|
|
getId('clients', { client_name: 'Wonderland' }, 'client_id'),
|
|
getContactId('alice'),
|
|
getContactId('dorothy'),
|
|
getId('boards', { board_name: 'Urgent Matters' }, 'board_id'),
|
|
getId('boards', { board_name: 'Projects' }, 'board_id'),
|
|
getId('categories', { category_name: 'Magical Artifacts' }, 'category_id'),
|
|
getId('categories', { category_name: 'Character Assistance' }, 'category_id'),
|
|
getId('categories', { category_name: 'Realm Maintenance' }, 'category_id'),
|
|
// Assuming subcategories are also in the 'categories' table, identified by name
|
|
getId('categories', { category_name: 'Enchanted Accessories' }, 'category_id'),
|
|
getId('categories', { category_name: 'Quest Guidance' }, 'category_id'),
|
|
getId('categories', { category_name: 'Magical Infrastructure' }, 'category_id'),
|
|
getId('priorities', { priority_name: 'Enchanted Emergency' }, 'priority_id'),
|
|
getId('priorities', { priority_name: 'Curious Conundrum' }, 'priority_id'),
|
|
getId('severities', { severity_name: 'Serious Snarl' }, 'severity_id'),
|
|
getId('severities', { severity_name: 'Moderate Muddle' }, 'severity_id'),
|
|
getId('urgencies', { urgency_name: 'Hare-Paced Hustle' }, 'urgency_id'),
|
|
getId('urgencies', { urgency_name: 'Tick-Tock Task' }, 'urgency_id'),
|
|
getId('impacts', { impact_name: 'Realm-Wide Repercussions' }, 'impact_id'),
|
|
getId('impacts', { impact_name: 'Local Disruption' }, 'impact_id'),
|
|
getId('users', { username: 'glinda' }, 'user_id'),
|
|
getId('users', { username: 'tinman' }, 'user_id'),
|
|
getId('users', { username: 'madhatter' }, 'user_id'),
|
|
getId('users', { username: 'scarecrow' }, 'user_id')
|
|
]);
|
|
|
|
const [statusCuriousId, statusAwaitingId, statusUnfoldingId] = await Promise.all([
|
|
getTicketStatusId('Curious Beginning', boardUrgentId),
|
|
getTicketStatusId('Awaiting Wisdom', boardUrgentId),
|
|
getTicketStatusId('Unfolding Adventure', boardProjectsId)
|
|
]);
|
|
|
|
// Prepare ticket data with resolved IDs
|
|
const ticketsToInsert = [
|
|
{
|
|
tenant: tenant,
|
|
title: 'Missing White Rabbit',
|
|
ticket_number: 'TIC1001', // Explicitly included
|
|
client_id: clientEmeraldCityId,
|
|
contact_name_id: contactAliceId,
|
|
status_id: statusCuriousId,
|
|
board_id: boardUrgentId,
|
|
category_id: categoryMagicalArtifactsId,
|
|
subcategory_id: subCategoryEnchantedAccId,
|
|
priority_id: priorityEnchantedId,
|
|
severity_id: severitySeriousId,
|
|
urgency_id: urgencyHareId,
|
|
impact_id: impactRealmId,
|
|
entered_by: userGlindaId,
|
|
assigned_to: userTinmanId,
|
|
entered_at: knex.fn.now()
|
|
},
|
|
{
|
|
tenant: tenant,
|
|
title: 'Survey Uncharted Areas in Wonderland',
|
|
ticket_number: 'TIC1002', // Explicitly included
|
|
client_id: clientWonderlandId,
|
|
contact_name_id: contactAliceId,
|
|
status_id: statusAwaitingId,
|
|
board_id: boardUrgentId,
|
|
category_id: categoryCharacterAssistId,
|
|
subcategory_id: subCategoryQuestGuidanceId,
|
|
priority_id: priorityEnchantedId,
|
|
severity_id: severityModerateId,
|
|
urgency_id: urgencyTickTockId,
|
|
impact_id: impactLocalId,
|
|
entered_by: userGlindaId,
|
|
assigned_to: userMadhatterId,
|
|
entered_at: knex.raw("CURRENT_TIMESTAMP - INTERVAL '2 months'")
|
|
},
|
|
{
|
|
tenant: tenant,
|
|
title: 'Enhance Emerald City Gardens',
|
|
ticket_number: 'TIC1003', // Explicitly included
|
|
client_id: clientEmeraldCityId,
|
|
contact_name_id: contactDorothyId,
|
|
status_id: statusUnfoldingId,
|
|
board_id: boardProjectsId,
|
|
category_id: categoryRealmMaintenanceId,
|
|
subcategory_id: subCategoryMagicalInfraId,
|
|
priority_id: priorityCuriousId,
|
|
severity_id: severityModerateId,
|
|
urgency_id: urgencyTickTockId,
|
|
impact_id: impactLocalId,
|
|
entered_by: userGlindaId,
|
|
assigned_to: userScarecrowId,
|
|
entered_at: knex.raw("CURRENT_TIMESTAMP - INTERVAL '1 month'")
|
|
}
|
|
];
|
|
|
|
// Filter out any tickets where essential IDs might be missing (if lookups failed)
|
|
const validTickets = ticketsToInsert.filter(ticket =>
|
|
ticket.client_id && ticket.contact_name_id && ticket.status_id &&
|
|
ticket.board_id && ticket.category_id && ticket.subcategory_id &&
|
|
ticket.priority_id && ticket.severity_id && ticket.urgency_id &&
|
|
ticket.impact_id && ticket.entered_by && ticket.assigned_to
|
|
);
|
|
|
|
if (validTickets.length !== ticketsToInsert.length) {
|
|
console.warn(`Warning: Some tickets were skipped due to missing foreign key IDs.`);
|
|
}
|
|
|
|
if (validTickets.length > 0) {
|
|
// Perform the insert one by one to potentially avoid batch insert issues
|
|
console.log(`Attempting to insert ${validTickets.length} tickets individually...`);
|
|
for (const ticket of validTickets) {
|
|
try {
|
|
await knex('tickets').insert(ticket);
|
|
} catch (error) {
|
|
console.error(`Error inserting ticket ${ticket.ticket_number}:`, error);
|
|
console.error('Ticket data:', ticket);
|
|
// Decide if you want to stop on error or continue
|
|
// throw error; // Uncomment to stop on the first error
|
|
}
|
|
}
|
|
console.log(`Finished attempting ticket insertion.`);
|
|
} else {
|
|
console.warn('No valid tickets to insert.');
|
|
}
|
|
};
|
|
|