feat(scripts): add getEventById and join-url extractor

This commit is contained in:
beo3000 2026-05-06 20:59:23 +02:00
parent 95cb27e53a
commit 997e9411b9
2 changed files with 49 additions and 1 deletions

View File

@ -95,4 +95,36 @@ async function getCalendarEvents(daysAhead = 7) {
return (response.value || []).map(parseEventToMeeting);
}
module.exports = { isRecurring, parseEventToMeeting, formatEventChoice, getCalendarEvents };
function extractJoinUrlFromBody(body) {
if (!body) return null;
const m = body.match(/https:\/\/teams\.microsoft\.com\/l\/meetup-join\/[^\s"'<>]+/);
return m ? m[0] : null;
}
async function getEventById(eventId) {
const env = loadEnv();
const cca = new ConfidentialClientApplication({
auth: {
clientId: env.AZURE_CLIENT_ID,
clientSecret: env.AZURE_CLIENT_SECRET,
authority: `https://login.microsoftonline.com/${env.AZURE_TENANT_ID}`
}
});
const tokenResponse = await cca.acquireTokenByClientCredential({
scopes: ['https://graph.microsoft.com/.default']
});
const client = Client.init({
authProvider: (done) => done(null, tokenResponse.accessToken)
});
const event = await client
.api(`/users/${env.AZURE_USER_EMAIL}/events/${eventId}`)
.select('id,subject,start,end,body,attendees,seriesMasterId,onlineMeeting')
.get();
return event;
}
module.exports = {
isRecurring, parseEventToMeeting, formatEventChoice,
getCalendarEvents, getEventById, extractJoinUrlFromBody
};

View File

@ -80,3 +80,19 @@ describe('isRecurring', () => {
assert.equal(isRecurring({ seriesMasterId: null }), false);
});
});
const { extractJoinUrlFromBody } = require('../lib/o365-calendar.js');
describe('extractJoinUrlFromBody', () => {
it('extracts teams meeting join URL from body html', () => {
const html = '<a href="https://teams.microsoft.com/l/meetup-join/19%3aabc/0?context=foo">Join</a>';
assert.equal(
extractJoinUrlFromBody(html),
'https://teams.microsoft.com/l/meetup-join/19%3aabc/0?context=foo'
);
});
it('returns null when no teams url present', () => {
assert.equal(extractJoinUrlFromBody('<p>nothing</p>'), null);
});
});