Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Knowledge Base Category Subscription Widget

Lee Herbert
Tera Expert

I am currently working on creating a widget for the csm portal. The use case is to build a widget that will display all  Knowledge bases and their categories allowing the user to subscribe to a specific knowledge base category (if they have read access to the knowledge base). 

The following server script allows me to achieve this use case but I have been asked to further restrict the knowledge bases returned based on the service portal the knowledge bases are associated with. For example, I need to only return knowledge bases that are associated with the CSM portal. Can anyone help?

 

(function() {
    // Initialize the data structure to hold knowledge bases
    data.knowledgeBases = [];

    // Create a GlideRecord object for the kb_knowledge_base table
    var kbGR = new GlideRecord('kb_knowledge_base');
    if (!kbGR.isValid()) {
        gs.info('Table kb_knowledge_base not found or inaccessible.');
        return;
    }

    // Query all records in the kb_knowledge_base table
    kbGR.query();
    gs.info('kb_knowledge_base records found: ' + kbGR.getRowCount());

    // Get current user's ID
    var userId = gs.getUserID();

    // Loop through each knowledge base record
    while (kbGR.next()) {
        // Check if the current user has access to this knowledge base
        if (!kbGR.canRead()) {
            gs.info('User does not have access to KB: ' + kbGR.sys_id);
            continue; // Skip this knowledge base if the user cannot read it
        }

        // Retrieve the title field instead of name
        var kbTitle = kbGR.title ? kbGR.title.toString() : "Unnamed Knowledge Base";

        // Create an object for each knowledge base with its id and title
        var kb = {
            id: kbGR.sys_id.toString(),
            name: kbTitle,  // Using 'title' now instead of 'name'
            categories: []
        };

        gs.info('Processing Knowledge Base: ' + kb.id + ' - ' + kb.name); // Log each KB to verify title retrieval

        // Fetch categories associated with this knowledge base
        var catGR = new GlideRecord('kb_category');
        if (!catGR.isValid()) {
            gs.info('Table kb_category not found or inaccessible.');
            return;
        }

        // Adjust the query if the field is not 'parent_id'
        catGR.addQuery('parent_id', kbGR.sys_id); // or 'knowledge_base' if 'parent_id' is incorrect
        catGR.query();
        gs.info('Categories found for KB ' + kbGR.sys_id + ': ' + catGR.getRowCount());

        // Loop through each category record for the current knowledge base
        while (catGR.next()) {
            // Check subscription status for the current category
            var isSubscribed = false; // Default value

            // Query the subscription table to see if the user is subscribed to the category
            var subGR = new GlideRecord('u_knowledge_base_category_subscription');
            subGR.addQuery('u_category', catGR.sys_id);
            subGR.addQuery('u_user', userId);
            subGR.query();

            if (subGR.hasNext()) {
                isSubscribed = true; // User is subscribed if a record exists
            }

            kb.categories.push({
                id: catGR.sys_id.toString(),
                name: catGR.label ? catGR.label.toString() : "Unnamed Category",  // Using 'label' for category name
                isSubscribed: isSubscribed // Set the subscription status
            });
        }

        // Only add the processed knowledge base if it has categories
        if (kb.categories.length > 0) {
            data.knowledgeBases.push(kb);
        }
    }

    // Final log to confirm total knowledge bases processed
    gs.info('Total Knowledge Bases processed: ' + data.knowledgeBases.length);
})();

 




0 REPLIES 0