Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 24 additions & 5 deletions src/actions/organization/list.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,31 @@ const fsort = require('redis-filtered-sort');
const { ActionTransport } = require('@microfleet/plugin-router');

const redisKey = require('../../utils/key');
const { getOrganizationMetadata, getInternalData } = require('../../utils/organization');
const { getOrganizationMetadata, getInternalData, getOrganizationMemberDetails } = 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) {
async function findUserOrganization(userId) {
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])];
}

function relatedMember(member) {
const { id, ...props } = member;

return {
id,
type: 'organizationMember',
attributes: {
...props,
},
};
}

async function findOrganization({
criteria,
order,
Expand Down Expand Up @@ -87,8 +98,10 @@ async function getOrganizationsList({ params }) {
const strFilter = typeof filter === 'string' ? filter : fsort.filter(filter || {});
const currentTime = Date.now();

const userId = username ? await getUserId.call(this, username, true) : null;

const [organizationsIds, length = 0] = username
? await findUserOrganization.call(this, username)
? await findUserOrganization.call(this, userId)
: await findOrganization.call(this, {
criteria,
order,
Expand All @@ -100,14 +113,20 @@ async function getOrganizationsList({ params }) {
});

const organizations = await Promise.map(organizationsIds, async (organizationId) => {
const [organization, metadata] = await Promise.all([
const getMember = userId ? [getOrganizationMemberDetails.call(this, organizationId, userId)] : [];

const [organization, metadata, member] = await Promise.all([
getInternalData.call(this, organizationId, true),
getOrganizationMetadata.call(this, organizationId, audience),
...getMember,
]);

const relatedData = member ? { relationships: relatedMember({ id: userId, ...member }) } : {};

return {
...organization,
metadata,
...relatedData,
};
});

Expand Down
15 changes: 15 additions & 0 deletions src/utils/organization/get-organization-member-details.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const { getMemberData } = require('./get-organization-members');
const { ORGANIZATIONS_MEMBERS } = require('../../constants');
const redisKey = require('../key');

async function getOrganizationMemberDetails(organizationId, userId) {
const memberKey = redisKey(organizationId, ORGANIZATIONS_MEMBERS, userId);
const data = await getMemberData.call(this, memberKey);

const { accepted } = data || {};

return {
joinedAt: accepted,
};
}
module.exports = getOrganizationMemberDetails;
2 changes: 2 additions & 0 deletions src/utils/organization/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const getInternalData = require('./get-internal-data');
const getOrganizationMetadataAndMembers = require('./get-organization-metadata-and-members');
const getOrganizationMembers = require('./get-organization-members');
const getOrganizationMemberDisplayName = require('./get-organization-member-display-name');
const getOrganizationMemberDetails = require('./get-organization-member-details');
const getOrganizationMetadata = require('./get-organization-metadata');
const checkOrganizationExists = require('./check-organization-exists');

Expand All @@ -14,6 +15,7 @@ module.exports = {
getOrganizationMetadataAndMembers,
getOrganizationMembers,
getOrganizationMemberDisplayName,
getOrganizationMemberDetails,
getOrganizationMetadata,
checkOrganizationExists,
};
24 changes: 23 additions & 1 deletion test/suites/actions/organization/list.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,29 @@ describe('#organizations list', function registerSuite() {

return this.users.dispatch('organization.list', { params: opts })
.then(({ data }) => {
assert.deepEqual(data[0].attributes, organization);
const { relationships, ...org } = data[0].attributes;

assert.ok(relationships);
assert.deepEqual(org, organization);
});
});

it('responds with member details on request byusername', async function test() {
const opts = {
username: this.userNames[0].email,
};

return this.users.dispatch('organization.list', { params: opts })
.then(({ data }) => {
const organization = data[0].attributes;

assert(organization.relationships);
const member = organization.relationships;
assert(member);
assert(member.id);
assert.strictEqual(member.type, 'organizationMember');
assert(member.attributes);
assert(member.attributes.joinedAt);
});
});
});