RocketChat/Rocket.Chat

View on GitHub
apps/meteor/app/lib/server/functions/parseUrlsInMessage.ts

Summary

Maintainability
A
0 mins
Test Coverage
import type { IMessage, AtLeast } from '@rocket.chat/core-typings';

import { getMessageUrlRegex } from '../../../../lib/getMessageUrlRegex';
import { Markdown } from '../../../markdown/server';
import { settings } from '../../../settings/server';

// TODO move this function to message service to be used like a "beforeSaveMessage" hook
export const parseUrlsInMessage = (message: AtLeast<IMessage, 'msg'> & { parseUrls?: boolean }, previewUrls?: string[]) => {
    if (message.parseUrls === false) {
        return message;
    }

    message.html = message.msg;
    message = Markdown.code(message);

    const urls = message.html?.match(getMessageUrlRegex()) || [];
    if (urls) {
        message.urls = [...new Set(urls)].map((url) => ({
            url,
            meta: {},
            ...(previewUrls && !previewUrls.includes(url) && !url.includes(settings.get('Site_Url')) && { ignoreParse: true }),
        }));
    }

    message = Markdown.mountTokensBack(message, false);
    message.msg = message.html || message.msg;
    delete message.html;
    delete message.tokens;
};