* WIP - got one API test to pass yay * adds group update endpoint * added group policies * adds groups.list API * adds groups.info * remove comment * WIP * tests for delete * adds group membership list * adds tests for groups list * add and remove user endpoints for group * ask some questions * fix up some issues around primary keys * remove export from group permissions Co-Authored-By: Tom Moor <tom.moor@gmail.com> * remove random file * only create events on actual updates, add tests to ensure * adds uniqueness validation to group name * throw validation errors on model and let it pass through the controller * fix linting * WIP * WIP * WIP * WIP * WIP basic edit and delete * basic CRUD for groups and memberships in place * got member counts working * add member count and limit the number of users sent over teh wire to 6 * factor avatar with AvatarWithPresence into its own class * wip * WIP avatars in group lists * WIP collection groups * add and remove group endpoints * wip add collection groups * wip get group adding to collections to work * wip get updating collection group memberships to work * wip get new group modal working * add tests for collection index * include collection groups in the withmemberships scope * tie permissions to group memberships * remove unused import * Update app/components/GroupListItem.js update title copy Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update server/migrations/20191211044318-create-groups.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update server/api/groups.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update server/api/groups.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update app/menus/CollectionMenu.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update server/models/Group.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * minor fixes * Update app/scenes/CollectionMembers/AddGroupsToCollection.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update app/menus/GroupMenu.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update app/menus/GroupMenu.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update app/menus/GroupMenu.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update app/scenes/Collection.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update app/scenes/CollectionMembers/CollectionMembers.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update app/scenes/GroupNew.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update app/scenes/GroupNew.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update app/scenes/Settings/Groups.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update server/api/documents.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * Update app/scenes/CollectionMembers/components/CollectionGroupMemberListItem.js Co-Authored-By: Tom Moor <tom.moor@gmail.com> * address comments * WIP - getting websocket stuff up and running * socket event for group deletion * wrapped up cascading deletes * lint * flow * fix: UI feedback * fix: Facepile size * fix: Lots of missing await's * Allow clicking facepile on group list item to open members * remove unused route push, grammar * fix: Remove bad analytics events feat: Add group events to audit log * collection. -> collections. * Add groups to entity websocket events (sync create/update/delete) between clients * fix: Users should not be able to see groups they are not a member of * fix: Not caching errors in UI when changing group memberships * fix: Hide unusable UI * test * fix: Tweak language * feat: Automatically open 'add member' modal after creating group Co-authored-by: Tom Moor <tom.moor@gmail.com>
152 lines
3.4 KiB
JavaScript
152 lines
3.4 KiB
JavaScript
// @flow
|
|
import { createQueue } from './utils/queue';
|
|
import services from './services';
|
|
|
|
export type UserEvent =
|
|
| {
|
|
name: | 'users.create' // eslint-disable-line
|
|
| 'users.update'
|
|
| 'users.suspend'
|
|
| 'users.activate'
|
|
| 'users.delete',
|
|
userId: string,
|
|
teamId: string,
|
|
actorId: string,
|
|
}
|
|
| {
|
|
name: 'users.invite',
|
|
teamId: string,
|
|
actorId: string,
|
|
data: {
|
|
email: string,
|
|
name: string,
|
|
},
|
|
};
|
|
|
|
export type DocumentEvent =
|
|
| {
|
|
name: | 'documents.create' // eslint-disable-line
|
|
| 'documents.publish'
|
|
| 'documents.delete'
|
|
| 'documents.pin'
|
|
| 'documents.unpin'
|
|
| 'documents.archive'
|
|
| 'documents.unarchive'
|
|
| 'documents.restore'
|
|
| 'documents.star'
|
|
| 'documents.unstar',
|
|
documentId: string,
|
|
collectionId: string,
|
|
teamId: string,
|
|
actorId: string,
|
|
}
|
|
| {
|
|
name: 'documents.move',
|
|
documentId: string,
|
|
collectionId: string,
|
|
teamId: string,
|
|
actorId: string,
|
|
data: {
|
|
collectionIds: string[],
|
|
documentIds: string[],
|
|
},
|
|
}
|
|
| {
|
|
name: 'documents.update',
|
|
documentId: string,
|
|
collectionId: string,
|
|
teamId: string,
|
|
actorId: string,
|
|
data: {
|
|
autosave: boolean,
|
|
done: boolean,
|
|
},
|
|
};
|
|
|
|
export type CollectionEvent =
|
|
| {
|
|
name: | 'collections.create' // eslint-disable-line
|
|
| 'collections.update'
|
|
| 'collections.delete',
|
|
collectionId: string,
|
|
teamId: string,
|
|
actorId: string,
|
|
}
|
|
| {
|
|
name: 'collections.add_user' | 'collections.remove_user',
|
|
userId: string,
|
|
collectionId: string,
|
|
teamId: string,
|
|
actorId: string,
|
|
}
|
|
| {
|
|
name: 'collections.add_group' | 'collections.remove_group',
|
|
collectionId: string,
|
|
teamId: string,
|
|
actorId: string,
|
|
data: { name: string, groupId: string },
|
|
ip: string,
|
|
};
|
|
|
|
export type GroupEvent =
|
|
| {
|
|
name: 'groups.create' | 'groups.delete' | 'groups.update',
|
|
actorId: string,
|
|
modelId: string,
|
|
teamId: string,
|
|
data: { name: string },
|
|
ip: string,
|
|
}
|
|
| {
|
|
name: 'groups.add_user' | 'groups.remove_user',
|
|
actorId: string,
|
|
userId: string,
|
|
modelId: string,
|
|
teamId: string,
|
|
data: { name: string },
|
|
ip: string,
|
|
};
|
|
|
|
export type IntegrationEvent = {
|
|
name: 'integrations.create' | 'integrations.update',
|
|
modelId: string,
|
|
teamId: string,
|
|
actorId: string,
|
|
};
|
|
|
|
export type Event =
|
|
| UserEvent
|
|
| DocumentEvent
|
|
| CollectionEvent
|
|
| IntegrationEvent
|
|
| GroupEvent;
|
|
|
|
const globalEventsQueue = createQueue('global events');
|
|
const serviceEventsQueue = createQueue('service events');
|
|
|
|
// this queue processes global events and hands them off to service hooks
|
|
globalEventsQueue.process(async job => {
|
|
const names = Object.keys(services);
|
|
names.forEach(name => {
|
|
const service = services[name];
|
|
if (service.on) {
|
|
serviceEventsQueue.add(
|
|
{ service: name, ...job.data },
|
|
{ removeOnComplete: true }
|
|
);
|
|
}
|
|
});
|
|
});
|
|
|
|
// this queue processes an individual event for a specific service
|
|
serviceEventsQueue.process(async job => {
|
|
const event = job.data;
|
|
const service = services[event.service];
|
|
|
|
if (service.on) {
|
|
service.on(event);
|
|
}
|
|
});
|
|
|
|
export default globalEventsQueue;
|