npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

moodle-client

v0.5.2

Published

Node.js client for Moodle web services API

Downloads

8,643

Readme

moodle-client

Build Status

node.js client for moodle web services API

Requirements

  • moodle web services via REST protocol enabled.

Installation

$ npm install moodle-client

Usage

The client exposes promises API via bluebird implementation.

Call the init() function provided by the module to get a promise of a new instance of the client. The promise fulfills with the instance of the client ready to use for other requests.

var moodle_client = require("moodle-client");

moodle_client.init({
    wwwroot: "http://localhost/moodle/",
    token: "d457b5e5b0cc31c05ccf38628e4dfc14"

}).then(function(client) {
    return do_something(client);

}).catch(function(err) {
    console.log("Unable to initialize the client: " + err);
});

Instead of providing the token explicitly, you can let the client authenticate via provided username and password.

var moodle_client = require("moodle-client");

moodle_client.init({
    wwwroot: "http://localhost/moodle/",
    username: "mysystemusername",
    password: "my$y$tem pa33w0rd"

}).then(function(client) {
    return do_something(client);

}).catch(function(err) {
    console.log("Unable to initialize the client: " + err);
});

Use the client's call() method to execute a web service function at the remote moodle site. The returned promise fulfills with the data returned by the remote function.

var moodle_client = require("moodle-client");

moodle_client.init({
    wwwroot: "http://localhost/moodle/",
    token: "d457b5e5b0cc31c05ccf38628e4dfc14"

}).then(function(client) {
    return do_something(client);

}).catch(function(err) {
    console.log("Unable to initialize the client: " + err);
});

function do_something(client) {
    return client.call({
        wsfunction: "core_webservice_get_site_info",

    }).then(function(info) {
        console.log("Hello %s, welcome to %s", info.fullname, info.sitename);
        return;
    });
}

To debug and/or log the client functionality, install and use the winston logger.

var moodle_client = require("moodle-client");
var winston = require("winston");

var logger = winston.createLogger({
    level: "debug",
    format: winston.format.simple(),
    transports: [
        new winston.transports.Console()
    ]
});

moodle_client.init({
    logger: logger,
    wwwroot: "http://localhost/moodle/",
    token: "d457b5e5b0cc31c05ccf38628e4dfc14"

}).then(function(client) {
    return do_something(client);

}).catch(function(err) {
    console.log("Unable to initialize the client: " + err);
});

To use a custom web service, provide its shortname when creating a new instance of the client. If the service is not specified, the client defaults to using the moodle_mobile_app service.

var init = moodle_client.init({
    wwwroot: "http://localhost/moodle/",
    token: "d457b5e5b0cc31c05ccf38628e4dfc14",
    service: "our_cohorts_management"
});

init.then(...);

To pass arguments to the web service function, provide them via the args object. To use POST rather than the default GET request method, set the method property of the call options.

init.then(function(client) {
    return client.call({
        wsfunction: "core_message_unblock_contacts",
        method: "POST",
        args: {
            userids: [1, 2, 3, 4, 5]
        }

    }).then(function() {
        console.log("Done");
        return;
    });
});

The client uses request-promise to actually perform the requests. Which in turn uses qs to stringify the args into the query string. Please refer to the qs module documentation for how to pass complex data structures. For example, when calling the function core_cohort_add_cohort_members the passed arguments should look something like

args: {
    members: [
        {
            cohorttype: {
                type: "id",
                value: "1"
            },
            usertype: {
                type: "id",
                value: "3"
            }
        },
        {
            cohorttype: {
                type: "id",
                value: "1"
            },
            usertype: {
                type: "id",
                value: "4"
            }
        }
    ]
}

Additional settings can be provided via the settings object, such as the response data formatting. See moodle dev docs for details.

var mycall = client.call({
    wsfunction: "local_myplugin_my_function",
    args: {
        answer: 42
    },
    settings: {
        raw: false,
        filter: true
    }
);

mycall.then(...);

If you are connecting via HTTPS to a Moodle site with self-signed certificate, you may need to set the strictSSL option to false.

var init = moodle_client.init({
    wwwroot: "https://localhost/moodle/",
    token: "d457b5eo5b0cc31c05ccf38628e4dfc14",
    strictSSL: false
});

init.then(...);

Downloading Moodle files

Call the download() method of the client to download a file from the Moodle file system. The returned promise fulfills with the buffer object with the file contents.

client.download({
    filepath: "/62/user/private/demo/remote.png",
    preview: "bigthumb",
    offline: true

}).then(function(filebuffer) {
    fs.writeFile("/tmp/local.png", filebuffer, "binary");
    return;

}).catch(function(err) {
    console.log("Error downloading the file: " + err);
    return;
});

Uploading files to Moodle

The client can be used to upload files into the user's draft files area within the Moodle file system. Supported are both files with dynamically generated contents as well as files already stored in the local file system. See https://github.com/request/request#multipartform-data-multipart-form-uploads for details on how to specify the data in both cases.

var files = {
    myfile1: {
        value: "This text was uploaded by a client",
        options: {
            filename: "helloworld.txt",
            contentType: "text/plain"
        }
    },
    myfile2: fs.createReadStream("/tmp/upload.png"),
};

Once you have such a list of files prepared, call the upload() method to upload them to the user's draft files area. The returned promise fulfills with an array of objects describing the created files.

client.upload({
    files: files

}).then(function(draftfiles) {
    console.log(draftfiles);
    return;

}).catch(function(err) {
    console.log("Error uploading the file: " + err);
    return;
});

The method allows you to hard-code the itemid within the user's draft area to upload files to and eventually the target path for uploaded files, too.

To make use of uploaded files in Moodle, you typically call a webservice function that accepts the id of draft item containing the uploaded files. For example, to copy files from the temporary draft files area to the persistent private files area, use the function core_user_add_user_private_files:

client.upload({
    files: files

}).then(function(draftfiles) {

    // Copy files from the draft area to the persistent private files area.
    return client.call({
        wsfunction: "core_user_add_user_private_files",
        args: {
            draftid: draftfiles[0].itemid
        }

    }).then(function() {
        console.log("Total of %d files uploaded to your private files area!", draftfiles.length);
        return;
    });

}).catch(function(err) {
    console.log("Error uploading the file: " + err);
    return;
});

Changes

0.5.0

  • Added support for downloading files from Moodle. Credit goes to @MayaLekova for the initial implementation of the feature.
  • Added support for uploading files to Moodle.
  • Added basic support for travis-co prechecks.

0.4.0

  • Massive non backwards compatible changes in the API.
  • Now uses request-promise to actually perform the requests.
  • The API changed to return promises (via bluebird).
  • The eventual authentication happens if needed during the initialization.
  • The module does not provide create() any more, use init() returning the promise now.

0.3.0

  • Fixed usage over HTTPS (#4). Added support for self-signed SSL certificates (#5).

0.2.0

  • The initialization and API/signatures improved (#1).
  • Added ability to authenticate by explicitly provided token (#3).
  • Added tests.

0.1.0

  • Initial release. The API should not be considered stable yet (as the version number suggests).