Skip to content

Commit e738606

Browse files
author
SJ Pratt
committed
clarify distinction & relationship btwn user + member; simplify idm user data integration
1 parent 5097fe7 commit e738606

155 files changed

Lines changed: 1572 additions & 1941 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/common/actions/cycle.js

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import {normalize} from 'normalizr'
2+
import socketCluster from 'socketcluster-client'
23

34
import {flatten, getGraphQLFetcher} from 'src/common/util'
4-
import {findUsers} from './user'
5+
import {findMembers} from './member'
56
import types from './types'
67
import schemas from './schemas'
78
import queries from './queries'
@@ -25,33 +26,48 @@ export function getCycleVotingResults(options = {}) {
2526

2627
return dispatch(action)
2728
.then(() => {
28-
return options.withUsers ? _findUsersForCycleVotingResults(dispatch, getState) : null
29+
return options.withMembers ? _findMembersForCycleVotingResults(dispatch, getState) : null
2930
})
3031
}
3132
}
3233

33-
export function receivedCycleVotingResults(cycleVotingResults) {
34+
export function subscribeToCycleVotingResults(cycleId) {
3435
return (dispatch, getState) => {
35-
dispatch(_receivedCycleVotingResultsWithoutLoadingUsers(cycleVotingResults))
36-
return _findUsersForCycleVotingResults(dispatch, getState)
36+
if (cycleId) {
37+
console.log(`subscribing to voting results for cycle ${cycleId} ...`)
38+
this.socket = socketCluster.connect()
39+
this.socket.on('connect', () => console.log('... socket connected'))
40+
this.socket.on('disconnect', () => console.log('socket disconnected, will try to reconnect socket ...'))
41+
this.socket.on('connectAbort', () => null)
42+
this.socket.on('error', error => console.warn(error.message))
43+
const cycleVotingResultsChannel = this.socket.subscribe(`cycleVotingResults-${cycleId}`)
44+
cycleVotingResultsChannel.watch(cycleVotingResults => {
45+
const response = normalize(cycleVotingResults, schemas.cycleVotingResults)
46+
dispatch({type: types.RECEIVED_CYCLE_VOTING_RESULTS, response})
47+
dispatch(_findMembersForCycleVotingResults(dispatch, getState))
48+
})
49+
}
3750
}
3851
}
3952

40-
function _findUsersForCycleVotingResults(dispatch, getState) {
41-
// we'll only load users from IDM that haven't already been loaded, because
53+
export function unsubscribeFromCycleVotingResults(cycleId) {
54+
if (this.socket && cycleId) {
55+
console.log(`unsubscribing from voting results for cycle ${cycleId} ...`)
56+
this.socket.unwatch(`cycleVotingResults-${cycleId}`)
57+
this.socket.unsubscribe(`cycleVotingResults-${cycleId}`)
58+
}
59+
}
60+
61+
function _findMembersForCycleVotingResults(dispatch, getState) {
62+
// we'll only load members that haven't already been loaded, because
4263
// it's unlikely that their names, handles, and avatars have changed since
4364
// the last load, and those are the attributes we use in the voting results
4465
const {
4566
cycleVotingResults: {cycleVotingResults: {CURRENT: cycleVotingResults}},
46-
users: {users},
67+
members: {members},
4768
} = getState()
4869

49-
const memberIds = flatten(cycleVotingResults.pools.map(_ => _.users.map(_ => _.id)))
50-
const userIdsToLoad = memberIds.filter(memberId => !users[memberId])
51-
return userIdsToLoad.length === 0 ? null : dispatch(findUsers(userIdsToLoad))
52-
}
53-
54-
function _receivedCycleVotingResultsWithoutLoadingUsers(cycleVotingResults) {
55-
const response = normalize(cycleVotingResults, schemas.cycleVotingResults)
56-
return {type: types.RECEIVED_CYCLE_VOTING_RESULTS, response}
70+
const memberIds = flatten(cycleVotingResults.pools.map(pool => pool.members.map(m => m.id)))
71+
const memberIdsToLoad = memberIds.filter(memberId => !members[memberId])
72+
return memberIdsToLoad.length === 0 ? null : dispatch(findMembers(memberIdsToLoad))
5773
}

src/common/actions/member.js

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import {normalize} from 'normalizr'
2+
3+
import {getGraphQLFetcher} from 'src/common/util'
4+
import types from './types'
5+
import schemas from './schemas'
6+
import queries from './queries'
7+
8+
export function deactivateMember(memberId) {
9+
return {
10+
types: [
11+
types.DEACTIVATE_MEMBER_REQUEST,
12+
types.DEACTIVATE_MEMBER_SUCCESS,
13+
types.DEACTIVATE_MEMBER_FAILURE,
14+
],
15+
shouldCallAPI: () => true,
16+
callAPI: (dispatch, getState) => {
17+
const query = queries.deactivateMember(memberId)
18+
return getGraphQLFetcher(dispatch, getState().auth)(query)
19+
.then(graphQLResponse => graphQLResponse.data.deactivateMember)
20+
},
21+
redirect: _redirectMember,
22+
payload: {},
23+
}
24+
}
25+
26+
export function findMembers() {
27+
return {
28+
types: [
29+
types.FIND_MEMBERS_REQUEST,
30+
types.FIND_MEMBERS_SUCCESS,
31+
types.FIND_MEMBERS_FAILURE,
32+
],
33+
shouldCallAPI: () => true,
34+
callAPI: (dispatch, getState) => {
35+
const query = queries.findMembers()
36+
return getGraphQLFetcher(dispatch, getState().auth)(query)
37+
.then(graphQLResponse => graphQLResponse.data.findMembers)
38+
.then(members => normalize(members, schemas.members))
39+
},
40+
payload: {},
41+
}
42+
}
43+
44+
export function getMemberSummary(identifier) {
45+
return {
46+
types: [
47+
types.GET_MEMBER_SUMMARY_REQUEST,
48+
types.GET_MEMBER_SUMMARY_SUCCESS,
49+
types.GET_MEMBER_SUMMARY_FAILURE,
50+
],
51+
shouldCallAPI: () => true,
52+
callAPI: (dispatch, getState) => {
53+
const query = queries.getMemberSummary(identifier)
54+
return getGraphQLFetcher(dispatch, getState().auth)(query)
55+
.then(graphQLResponse => graphQLResponse.data.getMemberSummary)
56+
},
57+
payload: {},
58+
}
59+
}
60+
61+
export function reassignMembersToChapter(memberIds, chapterId) {
62+
return {
63+
types: [
64+
types.REASSIGN_MEMBERS_TO_CHAPTER_REQUEST,
65+
types.REASSIGN_MEMBERS_TO_CHAPTER_SUCCESS,
66+
types.REASSIGN_MEMBERS_TO_CHAPTER_FAILURE,
67+
],
68+
shouldCallAPI: () => true,
69+
callAPI: (dispatch, getState) => {
70+
const mutation = queries.reassignMembersToChapter(memberIds, chapterId)
71+
return getGraphQLFetcher(dispatch, getState().auth)(mutation)
72+
.then(graphQLResponse => graphQLResponse.data.reassignMembersToChapter)
73+
.then(members => normalize(members, schemas.members))
74+
},
75+
redirect: '/members',
76+
payload: {memberIds, chapterId},
77+
}
78+
}
79+
80+
export function updateMember(values) {
81+
return {
82+
types: [
83+
types.UPDATE_MEMBER_REQUEST,
84+
types.UPDATE_MEMBER_SUCCESS,
85+
types.UPDATE_MEMBER_FAILURE,
86+
],
87+
shouldCallAPI: () => true,
88+
callAPI: (dispatch, getState) => {
89+
const mutation = queries.updateMember(values)
90+
return getGraphQLFetcher(dispatch, getState().auth)(mutation)
91+
.then(graphQLResponse => graphQLResponse.data.updateMember)
92+
},
93+
redirect: _redirectMember,
94+
payload: {},
95+
}
96+
}
97+
98+
function _redirectMember(member) {
99+
return member && member.handle ? `/members/${member.handle}` : '/members'
100+
}

src/common/actions/project.js

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -103,40 +103,6 @@ export function importProject(values) {
103103
}
104104
}
105105

106-
export function unlockSurvey(memberId, projectId) {
107-
return {
108-
types: [
109-
types.UNLOCK_SURVEY_REQUEST,
110-
types.UNLOCK_SURVEY_SUCCESS,
111-
types.UNLOCK_SURVEY_FAILURE,
112-
],
113-
shouldCallAPI: () => true,
114-
callAPI: (dispatch, getState) => {
115-
const query = queries.unlockSurvey(memberId, projectId)
116-
return getGraphQLFetcher(dispatch, getState().auth)(query)
117-
.then(graphQLResponse => graphQLResponse.data.unlockRetroSurveyForUser)
118-
},
119-
payload: {memberId, projectId},
120-
}
121-
}
122-
123-
export function lockSurvey(memberId, projectId) {
124-
return {
125-
types: [
126-
types.LOCK_SURVEY_REQUEST,
127-
types.LOCK_SURVEY_SUCCESS,
128-
types.LOCK_SURVEY_FAILURE,
129-
],
130-
shouldCallAPI: () => true,
131-
callAPI: (dispatch, getState) => {
132-
const query = queries.lockSurvey(memberId, projectId)
133-
return getGraphQLFetcher(dispatch, getState().auth)(query)
134-
.then(graphQLResponse => graphQLResponse.data.lockRetroSurveyForUser)
135-
},
136-
payload: {memberId, projectId},
137-
}
138-
}
139-
140106
export function deleteProject(identifier) {
141107
return {
142108
types: [
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export default function deactivateMember(memberId) {
2+
return {
3+
variables: {memberId},
4+
query: `
5+
mutation ($memberId: ID!) {
6+
deactivateMember(identifier: $memberId) {
7+
id
8+
active
9+
handle
10+
}
11+
}
12+
`,
13+
}
14+
}

src/common/actions/queries/findMembers.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,31 @@
1-
export default function findMembers() {
1+
export default function findMembers(identifiers) {
22
return {
3-
variables: {},
3+
variables: {identifiers},
44
query: `
5-
query {
6-
findMembers {
5+
query ($identifiers: [String]) {
6+
findMembers(identifiers: $identifiers) {
77
id
8+
chapterId
89
chapter {
910
id
1011
name
1112
channelName
1213
timezone
1314
inviteCodes
1415
}
16+
phone
17+
email
18+
name
19+
handle
20+
avatarUrl
21+
profileUrl
22+
timezone
23+
active
24+
phaseId
25+
phase {
26+
id
27+
number
28+
}
1529
createdAt
1630
updatedAt
1731
}

src/common/actions/queries/findUsers.js

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/common/actions/queries/getCycleVotingResults.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export default function getCycleVotingResults() {
2121
id
2222
name
2323
voterMemberIds
24-
users {
24+
members {
2525
id
2626
}
2727
phase {

src/common/actions/queries/getUserSummary.js renamed to src/common/actions/queries/getMemberSummary.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import {FEEDBACK_TYPE_DESCRIPTORS} from 'src/common/models/feedbackType'
22

3-
export default function getUserSummary(identifier) {
3+
export default function Member(identifier) {
44
return {
55
variables: {identifier},
66
query: `query ($identifier: String!) {
7-
getUserSummary(identifier: $identifier) {
8-
user {
7+
Member(identifier: $identifier) {
8+
member {
99
id
1010
phone
1111
email
@@ -26,7 +26,7 @@ export default function getUserSummary(identifier) {
2626
name
2727
}
2828
}
29-
userProjectSummaries {
29+
memberProjectSummaries {
3030
project {
3131
id
3232
name
@@ -44,7 +44,7 @@ export default function getUserSummary(identifier) {
4444
phase
4545
}
4646
}
47-
userProjectEvaluations {
47+
memberProjectEvaluations {
4848
${FEEDBACK_TYPE_DESCRIPTORS.GENERAL_FEEDBACK}
4949
}
5050
}

src/common/actions/queries/getProjectSummary.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,18 @@ export default function getProjectSummary(identifier) {
3434
number
3535
}
3636
}
37-
projectUserSummaries {
38-
user {
37+
projectMemberSummaries {
38+
member {
3939
id
4040
name
4141
handle
4242
avatarUrl
4343
}
44-
userProjectEvaluations {
44+
memberProjectEvaluations {
4545
${FEEDBACK_TYPE_DESCRIPTORS.GENERAL_FEEDBACK}
4646
}
47-
userRetrospectiveComplete
48-
userRetrospectiveUnlocked
47+
memberRetrospectiveComplete
48+
memberRetrospectiveUnlocked
4949
}
5050
}
5151
}`,
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
export default {
22
createInviteCode: require('./createInviteCode'),
3+
deleteProject: require('./deleteProject'),
34
findChapters: require('./findChapters'),
45
findPhases: require('./findPhases'),
56
findPhaseSummaries: require('./findPhaseSummaries'),
67
findMembers: require('./findMembers'),
78
findProjects: require('./findProjects'),
89
findProjectsForCycle: require('./findProjectsForCycle'),
910
findRetrospectiveSurveys: require('./findRetrospectiveSurveys'),
10-
findUsers: require('./findUsers'),
1111
getChapter: require('./getChapter'),
1212
getCycleVotingResults: require('./getCycleVotingResults'),
1313
getProject: require('./getProject'),
1414
getProjectSummary: require('./getProjectSummary'),
1515
getRetrospectiveSurvey: require('./getRetrospectiveSurvey'),
16-
getUserSummary: require('./getUserSummary'),
16+
getMemberSummary: require('./getMemberSummary'),
1717
importProject: require('./importProject'),
18+
lockSurveyForMember: require('./lockSurveyForMember'),
1819
reassignMembersToChapter: require('./reassignMembersToChapter'),
1920
saveChapter: require('./saveChapter'),
2021
saveRetrospectiveSurveyResponses: require('./saveRetrospectiveSurveyResponses'),
2122
submitSurvey: require('./submitSurvey'),
22-
unlockSurvey: require('./unlockSurvey'),
23-
lockSurvey: require('./lockSurvey'),
24-
deleteProject: require('./deleteProject'),
25-
updateUser: require('./updateUser'),
23+
unlockSurveyForMember: require('./unlockSurveyForMember'),
24+
updateMember: require('./updateMember'),
2625
}

0 commit comments

Comments
 (0)