Commit dc241e1c authored by seotts's avatar seotts

Accept studio "host" from api; use "host" in state

parent 5773c3b6
......@@ -3,7 +3,7 @@ const {selectUserId, selectIsAdmin, selectIsSocial,
selectHasFetchedSession, selectStudioCommentsGloballyEnabled} = require('./session');
// Fine-grain selector helpers - not exported, use the higher level selectors below
const isHost = state => selectUserId(state) === state.studio.owner;
const isHost = state => selectUserId(state) === state.studio.host;
const isCurator = state => state.studio.curator;
const isManager = state => state.studio.manager || isHost(state);
......@@ -51,7 +51,7 @@ const selectCanRemoveCurator = (state, username) => {
return false;
};
const selectCanRemoveManager = (state, managerId) =>
!selectIsMuted(state) && (selectIsAdmin(state) || isManager(state)) && managerId !== state.studio.owner;
!selectIsMuted(state) && (selectIsAdmin(state) || isManager(state)) && managerId !== state.studio.host;
const selectCanPromoteCurators = state => !selectIsMuted(state) && isManager(state);
const selectCanTransfer = (state, managerId) => {
......@@ -61,7 +61,7 @@ const selectCanTransfer = (state, managerId) => {
if (state.studio.classroomId !== null) return false;
if (selectIsMuted(state)) return false; // Muted users cannot transfer studios.
if (state.studio.managers > 1) { // If there is more than one manager,
if (managerId === state.studio.owner) { // and the selected manager is the current owner/host,
if (managerId === state.studio.host) { // and the selected manager is the current owner/host,
if (isHost(state)) return true; // Owner/host can transfer
if (selectIsAdmin(state)) return true; // Admin can transfer
}
......@@ -74,7 +74,7 @@ const selectCanRemoveProject = (state, creatorUsername, actorId) => {
// Admins/managers can remove any projects
if (isManager(state) || selectIsAdmin(state)) return true;
// Project owners can always remove their projects
// Project hosts can always remove their projects
if (selectUsername(state) === creatorUsername) {
return true;
}
......
......@@ -25,7 +25,7 @@ const getInitialState = () => ({
image: '',
followers: 0,
managers: 0,
owner: null,
host: null,
public: null,
// BEWARE: classroomId is only loaded if the user is an educator or admin
......@@ -135,7 +135,7 @@ const getInfo = () => ((dispatch, getState) => {
followers: body.stats.followers,
managers: body.stats.managers,
projectCount: body.stats.projects,
owner: body.owner,
host: body.host,
public: body.public
}));
});
......
......@@ -218,7 +218,7 @@ const transferHost = (password, newHostName, newHostId) =>
}, (err, body, res) => {
const error = normalizeError(err, body, res);
if (error) return reject(error);
dispatch(setInfo({owner: newHostId}));
dispatch(setInfo({host: newHostId}));
return resolve();
});
}));
......
......@@ -202,7 +202,7 @@ TransferHostConfirmation.propTypes = {
const connectedConfirmationStep = connect(
state => ({
hostId: state.studio.owner,
hostId: state.studio.host,
...managers.selector(state)
}), {
handleTransferHost: transferHost,
......
......@@ -107,7 +107,7 @@ TransferHostSelection.propTypes = {
export default connect(
state => ({
hostId: state.studio.owner,
hostId: state.studio.host,
...managers.selector(state)
}),
{
......
......@@ -164,7 +164,7 @@ const ManagerTile = connect(
canPromote: false,
canTransferHost: selectCanTransfer(state, ownProps.id) &&
selectStudioTransferLaunched(state),
isCreator: state.studio.owner === ownProps.id,
isCreator: state.studio.host === ownProps.id,
studioTransferLaunched: selectStudioTransferLaunched(state)
}),
{
......
......@@ -10,7 +10,7 @@
"invited": true
},
"creator1": {
"owner": 1
"host": 1
},
"openToAll": {
"openToAll": true
......
......@@ -415,7 +415,7 @@ describe('transferHost', () => {
studio: {
id: 123123,
managers: 3,
owner: 'oldHost'
host: 'oldHost'
}
});
});
......@@ -427,7 +427,7 @@ describe('transferHost', () => {
await store.dispatch(transferHost('password', 'newHostName', 'newHostId'));
const state = store.getState();
expect(api.mock.calls[0][0].uri).toBe('/studios/123123/transfer/newHostName');
expect(state.studio.owner).toBe('newHostId');
expect(state.studio.host).toBe('newHostId');
});
test('error because of permissions issue', async () => {
......@@ -437,7 +437,7 @@ describe('transferHost', () => {
await expect(store.dispatch(transferHost('password', 'newHostName', 'newHostId')))
.rejects.toBe(Errors.PERMISSION);
const state = store.getState();
expect(state.studio.owner).toBe('oldHost');
expect(state.studio.host).toBe('oldHost');
});
test('error because of authorization issue', async () => {
......@@ -447,7 +447,7 @@ describe('transferHost', () => {
await expect(store.dispatch(transferHost('password', 'newHostName', 'newHostId')))
.rejects.toBe(Errors.PERMISSION);
const state = store.getState();
expect(state.studio.owner).toBe('oldHost');
expect(state.studio.host).toBe('oldHost');
});
test('error because of issue with new host', async () => {
......@@ -457,7 +457,7 @@ describe('transferHost', () => {
await expect(store.dispatch(transferHost('password', 'newHostName', 'newHostId')))
.rejects.toBe(Errors.CANNOT_BE_HOST);
const state = store.getState();
expect(state.studio.owner).toBe('oldHost');
expect(state.studio.host).toBe('oldHost');
});
test('error because of incorrect password', async () => {
......@@ -467,7 +467,7 @@ describe('transferHost', () => {
await expect(store.dispatch(transferHost('password', 'newHostName', 'newHostId')))
.rejects.toBe(Errors.PASSWORD);
const state = store.getState();
expect(state.studio.owner).toBe('oldHost');
expect(state.studio.host).toBe('oldHost');
});
test('error because of too many password attempts', async () => {
......@@ -477,7 +477,7 @@ describe('transferHost', () => {
await expect(store.dispatch(transferHost('password', 'newHostName', 'newHostId')))
.rejects.toBe(Errors.PASSWORD_ATTEMPT_LIMIT);
const state = store.getState();
expect(state.studio.owner).toBe('oldHost');
expect(state.studio.host).toBe('oldHost');
});
test('error because of rate limit', async () => {
......@@ -487,6 +487,6 @@ describe('transferHost', () => {
await expect(store.dispatch(transferHost('password', 'newHostName', 'newHostId')))
.rejects.toBe(Errors.RATE_LIMIT);
const state = store.getState();
expect(state.studio.owner).toBe('oldHost');
expect(state.studio.host).toBe('oldHost');
});
});
......@@ -411,7 +411,7 @@ describe('studio members', () => {
['muted logged in', false]
])('%s: %s', (role, expected) => {
setStateByRole(role);
state.studio = {...state.studio, owner: 'the creator'};
state.studio = {...state.studio, host: 'the creator'};
expect(selectCanRemoveManager(state, 'the creator')).toBe(expected);
});
});
......@@ -449,12 +449,12 @@ describe('studio members', () => {
setStateByRole(role);
state.studio = {...state.studio, managers: 2, classroomId: null};
// Only admin and host see the option to transfer the current host
expect(selectCanTransfer(state, state.studio.owner)).toBe(expected);
expect(selectCanTransfer(state, state.studio.host)).toBe(expected);
// Nobody sees the option to transfer a manager who is not the host
expect(selectCanTransfer(state, 123)).toBe(false);
// Nobody can transfer classroom studios
state.studio = {...state.studio, classroomId: 1};
expect(selectCanTransfer(state, state.studio.owner)).toBe(false);
expect(selectCanTransfer(state, state.studio.host)).toBe(false);
});
});
});
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment