127 lines
3.4 KiB
TypeScript
127 lines
3.4 KiB
TypeScript
import * as crypto from 'crypto';
|
|
|
|
// Configuration
|
|
const JWT_SECRET =
|
|
'eebc122aa65adde8c76c6a0847d9649b2b67a06db1504693e6c912e51499b76e';
|
|
const API_URL = 'http://localhost:3000/api';
|
|
|
|
// Helper to sign JWT
|
|
function signJwt(payload: any) {
|
|
const header = { alg: 'HS256', typ: 'JWT' };
|
|
const encodedHeader = Buffer.from(JSON.stringify(header)).toString(
|
|
'base64url',
|
|
);
|
|
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
|
|
'base64url',
|
|
);
|
|
|
|
const signature = crypto
|
|
.createHmac('sha256', JWT_SECRET)
|
|
.update(encodedHeader + '.' + encodedPayload)
|
|
.digest('base64url');
|
|
|
|
return `${encodedHeader}.${encodedPayload}.${signature}`;
|
|
}
|
|
|
|
async function main() {
|
|
// 1. Generate Token for Editor01 (ID 3)
|
|
const token = signJwt({ username: 'editor01', sub: 3 });
|
|
console.log('Generated Token:', token);
|
|
|
|
const headers = {
|
|
'Content-Type': 'application/json',
|
|
Authorization: `Bearer ${token}`,
|
|
};
|
|
|
|
try {
|
|
// 1.5 Check Permissions
|
|
console.log('\nChecking Permissions...');
|
|
const permRes = await fetch(`${API_URL}/users/me/permissions`, { headers });
|
|
if (permRes.ok) {
|
|
const perms = await permRes.json();
|
|
console.log('My Permissions:', perms);
|
|
} else {
|
|
console.error(
|
|
'Failed to get permissions:',
|
|
permRes.status,
|
|
await permRes.text(),
|
|
);
|
|
}
|
|
|
|
// 2. Create Correspondence
|
|
console.log('\nCreating Correspondence...');
|
|
const createRes = await fetch(`${API_URL}/correspondences`, {
|
|
method: 'POST',
|
|
headers,
|
|
body: JSON.stringify({
|
|
projectId: 1,
|
|
typeId: 1, // Assuming ID 1 exists (e.g., RFA or Memo)
|
|
// originatorId: 1, // Removed for Admin user
|
|
title: 'Manual Verification Doc',
|
|
details: { note: 'Created via script' },
|
|
}),
|
|
});
|
|
|
|
if (!createRes.ok) {
|
|
throw new Error(
|
|
`Create failed: ${createRes.status} ${await createRes.text()}`,
|
|
);
|
|
}
|
|
|
|
const doc: any = await createRes.json();
|
|
console.log('Created Document:', doc.id, doc.correspondenceNumber);
|
|
|
|
// 3. Submit Workflow
|
|
console.log('\nSubmitting Workflow...');
|
|
const submitRes = await fetch(
|
|
`${API_URL}/correspondences/${doc.id}/submit`,
|
|
{
|
|
method: 'POST',
|
|
headers,
|
|
body: JSON.stringify({
|
|
templateId: 1, // Assuming Template ID 1 exists
|
|
}),
|
|
},
|
|
);
|
|
|
|
if (!submitRes.ok) {
|
|
const text = await submitRes.text();
|
|
console.error(`Submit failed: ${submitRes.status} ${text}`);
|
|
if (text.includes('template')) {
|
|
console.warn(
|
|
'⚠️ Template ID 1 not found. Please ensure a Routing Template exists.',
|
|
);
|
|
}
|
|
return;
|
|
}
|
|
|
|
console.log('Workflow Submitted Successfully');
|
|
|
|
// 4. Approve Workflow (as same user for simplicity, assuming logic allows or user has permission)
|
|
console.log('\nApproving Workflow...');
|
|
const approveRes = await fetch(
|
|
`${API_URL}/correspondences/${doc.id}/workflow/action`,
|
|
{
|
|
method: 'POST',
|
|
headers,
|
|
body: JSON.stringify({
|
|
action: 'APPROVE',
|
|
comment: 'Approved via script',
|
|
}),
|
|
},
|
|
);
|
|
|
|
if (!approveRes.ok) {
|
|
throw new Error(
|
|
`Approve failed: ${approveRes.status} ${await approveRes.text()}`,
|
|
);
|
|
}
|
|
|
|
console.log('Workflow Approved Successfully');
|
|
} catch (error: any) {
|
|
console.error('Error:', error.message);
|
|
}
|
|
}
|
|
|
|
main().catch((err) => console.error(err));
|