From 0e2c9a9ea990e8f62bae39c4df13488f3b5c496f Mon Sep 17 00:00:00 2001 From: renat Date: Thu, 12 May 2022 11:03:20 +0400 Subject: [PATCH 1/2] feat: return organization list by username --- schemas/organization.list.json | 5 ++ src/actions/organization/list.js | 63 ++++++++++++++++++------ src/configs/organizations.js | 2 +- test/configs/core.js | 2 +- test/suites/actions/organization/list.js | 12 +++++ 5 files changed, 68 insertions(+), 16 deletions(-) diff --git a/schemas/organization.list.json b/schemas/organization.list.json index 9da3b7994..b7a0db1aa 100644 --- a/schemas/organization.list.json +++ b/schemas/organization.list.json @@ -23,6 +23,11 @@ "criteria": { "type": "string" }, + "username": { + "type": "string", + "minLength": 1, + "maxLength": 50 + }, "expiration": { "type": "integer" }, diff --git a/src/actions/organization/list.js b/src/actions/organization/list.js index b2445b310..8abc426e3 100644 --- a/src/actions/organization/list.js +++ b/src/actions/organization/list.js @@ -5,8 +5,44 @@ const { ActionTransport } = require('@microfleet/plugin-router'); const redisKey = require('../../utils/key'); const { getOrganizationMetadata, getInternalData } = require('../../utils/organization'); +const getMetadata = require('../../utils/get-metadata'); +const { getUserId } = require('../../utils/userData'); const { ORGANIZATIONS_INDEX, ORGANIZATIONS_DATA } = require('../../constants'); +async function findUserOrganization(username) { + const { audience: orgAudience } = this.config.organizations; + + const userId = await getUserId.call(this, username, true); + const res = await getMetadata.call(this, userId, orgAudience); + + return [Object.keys(res[orgAudience])]; +} + +async function findOrganization({ + criteria, + order, + strFilter, + currentTime, + offset, + limit, + expiration, +}) { + const organizationsIds = await this.redis.fsort( + ORGANIZATIONS_INDEX, + redisKey('*', ORGANIZATIONS_DATA), + criteria, + order, + strFilter, + currentTime, + offset, + limit, + expiration + ); + const length = +organizationsIds.pop(); + + return [organizationsIds, length]; +} + /** * @api {amqp} .list Retrieve Organizations list * @apiVersion 1.0.0 @@ -19,6 +55,7 @@ const { ORGANIZATIONS_INDEX, ORGANIZATIONS_DATA } = require('../../constants'); * @apiParam (Payload) {Number} [offset=0] - cursor for pagination * @apiParam (Payload) {Number} [limit=10] - profiles per page * @apiParam (Payload) {String="ASC","DESC"} [order=ASC] - sort order + * @apiParam (Payload) {String} [username] - if supplied, return user organizations * @apiParam (Payload) {String} [criteria] - if supplied, sort will be performed based on this field * @apiParam (Payload) {Object} [filter] to use, consult https://github.com/makeomatic/redis-filtered-sort, can already be stringified @@ -36,7 +73,6 @@ const { ORGANIZATIONS_INDEX, ORGANIZATIONS_DATA } = require('../../constants'); * @apiSuccess (Response) {Number} meta.total - total. */ async function getOrganizationsList({ params }) { - const { redis } = this; const { criteria, audience, @@ -45,24 +81,23 @@ async function getOrganizationsList({ params }) { order = 'ASC', expiration = 30000, filter, + username, // return only user orgnization, ignore other filters and pagination } = params; const strFilter = typeof filter === 'string' ? filter : fsort.filter(filter || {}); const currentTime = Date.now(); - const organizationsIds = await redis.fsort( - ORGANIZATIONS_INDEX, - redisKey('*', ORGANIZATIONS_DATA), - criteria, - order, - strFilter, - currentTime, - offset, - limit, - expiration - ); - - const length = +organizationsIds.pop(); + const [organizationsIds, length = 0] = username + ? await findUserOrganization.call(this, username) + : await findOrganization.call(this, { + criteria, + order, + strFilter, + currentTime, + offset, + limit, + expiration, + }); const organizations = await Promise.map(organizationsIds, async (organizationId) => { const [organization, metadata] = await Promise.all([ diff --git a/src/configs/organizations.js b/src/configs/organizations.js index f3ce289c0..23c6165b7 100644 --- a/src/configs/organizations.js +++ b/src/configs/organizations.js @@ -3,5 +3,5 @@ * @type {Object} */ exports.organizations = { - audience: '*.localhost', + audience: 'organizations', }; diff --git a/test/configs/core.js b/test/configs/core.js index f84cf37e1..8d9cf490b 100644 --- a/test/configs/core.js +++ b/test/configs/core.js @@ -27,7 +27,7 @@ module.exports = { waitChallenge: true, }, oauth: { - enabled: true, + enabled: false, providers: { facebook: { enabled: true, diff --git a/test/suites/actions/organization/list.js b/test/suites/actions/organization/list.js index eadaa1ab8..633b568d7 100644 --- a/test/suites/actions/organization/list.js +++ b/test/suites/actions/organization/list.js @@ -68,4 +68,16 @@ describe('#organizations list', function registerSuite() { assert.deepEqual(data[0].attributes, organization); }); }); + + it('must be able to return organizations by username', async function test() { + const opts = { + username: this.userNames[0].email, + }; + const { members, invites, ...organization } = this.organization; + + return this.users.dispatch('organization.list', { params: opts }) + .then(({ data }) => { + assert.deepEqual(data[0].attributes, organization); + }); + }); }); From 95eb961b120b71e634ec3c0d8acc8c4041060211 Mon Sep 17 00:00:00 2001 From: renat Date: Thu, 12 May 2022 11:04:36 +0400 Subject: [PATCH 2/2] fix: misc fix --- test/configs/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/configs/core.js b/test/configs/core.js index 8d9cf490b..f84cf37e1 100644 --- a/test/configs/core.js +++ b/test/configs/core.js @@ -27,7 +27,7 @@ module.exports = { waitChallenge: true, }, oauth: { - enabled: false, + enabled: true, providers: { facebook: { enabled: true,