diff --git a/lib/provisioning/account.js b/lib/provisioning/account.js index f2c8566c..cc5bf723 100644 --- a/lib/provisioning/account.js +++ b/lib/provisioning/account.js @@ -121,19 +121,32 @@ function user(user_id, options = {}, callback) { * @param [user_ids] {string[]} - A list of up to 100 user IDs. When provided, other parameters are ignored. * @param [prefix] {string} - Returns users where the name or email address begins with the specified case-insensitive * string. - * @param [sub_account_id[ {string} - Only returns users who have access to the specified account. - * @param [options] {object} - See {@link https://cloudinary.com/documentation/cloudinary_sdks#configuration_parameters|Configuration parameters} in the SDK documentation. + * @param [sub_account_id] {string} - Only returns users who have access to the specified account. + * @param [options] {object} - Configuration options. Can include: + * - lastLogin {boolean} - Returns users based on their last login within a specified date range. true for users who logged in, false for users who haven't logged in, undefined for all users. + * - fromDate {Date|string} - Last login start date. + * - toDate {Date|string} - Last login end date. + * See {@link https://cloudinary.com/documentation/cloudinary_sdks#configuration_parameters|Configuration parameters} in the SDK documentation. * @param [callback] {function} */ function users(pending, user_ids, prefix, sub_account_id, options = {}, callback) { + // Handle optional callback argument + if (typeof options === 'function') { + callback = options; + options = {}; + } + let uri = ['users']; let params = { ids: user_ids, pending, prefix, - sub_account_id + sub_account_id, + last_login: options.lastLogin, + from: options.fromDate, + to: options.toDate }; - return call_account_api('GET', uri, pickOnlyExistingValues(params, "ids", "pending", "prefix", "sub_account_id"), callback, options); + return call_account_api('GET', uri, pickOnlyExistingValues(params, "ids", "pending", "prefix", "sub_account_id", "last_login", "from", "to"), callback, options); } /** diff --git a/test/integration/api/provisioning/account_spec.js b/test/integration/api/provisioning/account_spec.js index cd0f9bd4..4d949c64 100644 --- a/test/integration/api/provisioning/account_spec.js +++ b/test/integration/api/provisioning/account_spec.js @@ -199,6 +199,33 @@ runOnlyForInternalPRs('account API - Provisioning', function () { expect(result.users.length).to.eql(1); }); + it("Gets users by last login", async () => { + const today = new Date(); + const result1 = await cloudinary.provisioning.account.users( + null, + [USER_ID_1], + null, + null, + { + lastLogin: true, + fromDate: today, + toDate: today + } + ); + expect(result1.users.length).to.eql(0); + + const result2 = await cloudinary.provisioning.account.users( + null, + [USER_ID_1], + null, + null, + { + lastLogin: false + } + ); + expect(result2.users.length).to.eql(1); + }); + it('Should throw an error when attempting to get users by a nonexistent sub_account_id', async () => { const random_id = Math.floor(Math.random() * 100000); try { diff --git a/types/index.d.ts b/types/index.d.ts index 601be7cd..3e5db75e 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1495,7 +1495,7 @@ declare module 'cloudinary' { function user(userId: string, options?: ProvisioningApiOptions, callback?: ResponseCallback): Promise; - function users(pending: boolean, userIds?: string[], prefix?: string, subAccountId?: string, options?: ProvisioningApiOptions, callback?: ResponseCallback): Promise; + function users(pending: boolean, userIds?: string[], prefix?: string, subAccountId?: string, options?: ProvisioningApiOptions | { lastLogin?: boolean; fromDate?: Date | string; toDate?: Date | string }, callback?: ResponseCallback): Promise; function create_user(name: string, email: string, role: string, subAccountIds?: string[], options?: ProvisioningApiOptions, callback?: ResponseCallback): Promise;