Files
SCM-Manager/scm-ui/src/users/modules/users.js

302 lines
6.2 KiB
JavaScript
Raw Normal View History

2018-07-09 11:38:13 +02:00
// @flow
2018-07-17 15:10:37 +02:00
import {
apiClient,
NOT_FOUND_ERROR
} from "../../apiclient";
import type {
User
} from "../types/User";
import type {
UserEntry
} from "../types/UserEntry";
import {
Dispatch
} from "redux";
2018-07-09 11:38:13 +02:00
2018-07-12 16:02:37 +02:00
export const FETCH_USERS = "scm/users/FETCH";
export const FETCH_USERS_SUCCESS = "scm/users/FETCH_SUCCESS";
export const FETCH_USERS_FAILURE = "scm/users/FETCH_FAILURE";
export const FETCH_USERS_NOTFOUND = "scm/users/FETCH_NOTFOUND";
2018-07-02 16:05:58 +02:00
2018-07-12 16:02:37 +02:00
export const ADD_USER = "scm/users/ADD";
export const ADD_USER_SUCCESS = "scm/users/ADD_SUCCESS";
export const ADD_USER_FAILURE = "scm/users/ADD_FAILURE";
2018-07-11 17:02:38 +02:00
2018-07-12 16:02:37 +02:00
export const EDIT_USER = "scm/users/EDIT";
2018-07-17 08:39:51 +02:00
export const UPDATE_USER = "scm/users/UPDATE";
export const UPDATE_USER_SUCCESS = "scm/users/UPDATE_SUCCESS";
export const UPDATE_USER_FAILURE = "scm/users/UPDATE_FAILURE";
2018-07-11 17:02:38 +02:00
2018-07-12 16:02:37 +02:00
export const DELETE_USER = "scm/users/DELETE";
export const DELETE_USER_SUCCESS = "scm/users/DELETE_SUCCESS";
export const DELETE_USER_FAILURE = "scm/users/DELETE_FAILURE";
2018-07-10 15:18:37 +02:00
const USERS_URL = "users";
2018-07-10 08:38:38 +02:00
2018-07-11 17:02:38 +02:00
const CONTENT_TYPE_USER = "application/vnd.scmm-user+json;v=2";
2018-07-17 15:10:37 +02:00
2018-07-04 09:55:02 +02:00
function requestUsers() {
2018-07-02 16:05:58 +02:00
return {
2018-07-04 09:55:02 +02:00
type: FETCH_USERS
2018-07-02 16:05:58 +02:00
};
}
2018-07-10 15:18:37 +02:00
function failedToFetchUsers(url: string, err: Error) {
return {
type: FETCH_USERS_FAILURE,
payload: err,
url
};
}
function usersNotFound(url: string) {
return {
type: FETCH_USERS_NOTFOUND,
url
};
}
2018-07-10 08:38:38 +02:00
export function fetchUsers() {
2018-07-17 15:10:37 +02:00
return function (dispatch: any) {
2018-07-10 15:18:37 +02:00
dispatch(requestUsers());
2018-07-10 16:52:23 +02:00
return apiClient
.get(USERS_URL)
2018-07-10 15:18:37 +02:00
.then(response => {
return response;
})
2018-07-10 08:38:38 +02:00
.then(response => {
if (response.ok) {
return response.json();
}
})
.then(data => {
dispatch(fetchUsersSuccess(data));
2018-07-10 15:18:37 +02:00
})
2018-07-10 16:52:23 +02:00
.catch(err => {
2018-07-13 10:57:11 +02:00
if (err === NOT_FOUND_ERROR) {
2018-07-10 15:18:37 +02:00
dispatch(usersNotFound(USERS_URL));
} else {
dispatch(failedToFetchUsers(USERS_URL, err));
}
2018-07-10 08:38:38 +02:00
});
2018-07-10 16:52:23 +02:00
};
2018-07-10 08:38:38 +02:00
}
function fetchUsersSuccess(users: any) {
return {
type: FETCH_USERS_SUCCESS,
payload: users
2018-07-09 11:38:13 +02:00
};
2018-07-02 16:05:58 +02:00
}
2018-07-11 17:02:38 +02:00
function requestAddUser(user: User) {
return {
type: ADD_USER,
user
};
}
export function addUser(user: User) {
2018-07-17 15:10:37 +02:00
return function (dispatch: Dispatch) {
2018-07-11 17:02:38 +02:00
dispatch(requestAddUser(user));
return apiClient
.postWithContentType(USERS_URL, user, CONTENT_TYPE_USER)
.then(() => {
dispatch(addUserSuccess());
dispatch(fetchUsers());
})
.catch(err => dispatch(addUserFailure(user, err)));
};
}
function addUserSuccess() {
return {
type: ADD_USER_SUCCESS
};
}
function addUserFailure(user: User, err: Error) {
return {
type: ADD_USER_FAILURE,
payload: err,
user
};
}
2018-07-17 08:39:51 +02:00
function requestUpdateUser(user: User) {
2018-07-11 17:02:38 +02:00
return {
2018-07-17 08:39:51 +02:00
type: UPDATE_USER,
2018-07-11 17:02:38 +02:00
user
};
}
2018-07-17 08:39:51 +02:00
export function updateUser(user: User) {
2018-07-17 15:10:37 +02:00
return function (dispatch: Dispatch) {
2018-07-17 08:39:51 +02:00
dispatch(requestUpdateUser(user));
2018-07-11 17:02:38 +02:00
return apiClient
2018-07-17 08:39:51 +02:00
.putWithContentType(user._links.update.href, user, CONTENT_TYPE_USER)
2018-07-11 17:02:38 +02:00
.then(() => {
2018-07-17 08:39:51 +02:00
dispatch(updateUserSuccess());
2018-07-11 17:02:38 +02:00
dispatch(fetchUsers());
})
2018-07-17 08:39:51 +02:00
.catch(err => dispatch(updateUserFailure(user, err)));
2018-07-11 17:02:38 +02:00
};
}
2018-07-17 08:39:51 +02:00
function updateUserSuccess() {
2018-07-11 17:02:38 +02:00
return {
2018-07-17 08:39:51 +02:00
type: UPDATE_USER_SUCCESS
2018-07-11 17:02:38 +02:00
};
}
2018-07-17 08:39:51 +02:00
function updateUserFailure(user: User, error: Error) {
2018-07-11 17:02:38 +02:00
return {
2018-07-17 08:39:51 +02:00
type: UPDATE_USER_FAILURE,
payload: error,
2018-07-11 17:02:38 +02:00
user
};
}
export function requestDeleteUser(user: User) {
2018-07-10 15:18:37 +02:00
return {
type: DELETE_USER,
payload: user
2018-07-10 15:18:37 +02:00
};
}
function deleteUserSuccess(user: User) {
2018-07-10 15:18:37 +02:00
return {
type: DELETE_USER_SUCCESS,
payload: user
2018-07-10 15:18:37 +02:00
};
}
export function deleteUserFailure(user: User, error: Error) {
2018-07-10 15:18:37 +02:00
return {
type: DELETE_USER_FAILURE,
2018-07-17 16:35:01 +02:00
payload: {
error,
user
}
2018-07-10 15:18:37 +02:00
};
}
2018-07-17 16:35:01 +02:00
export function deleteUser(user: User) {
return function (dispatch: any) {
dispatch(requestDeleteUser(user));
2018-07-10 16:52:23 +02:00
return apiClient
.delete(user._links.delete.href)
2018-07-10 15:18:37 +02:00
.then(() => {
dispatch(deleteUserSuccess(user));
dispatch(fetchUsers());
2018-07-10 15:18:37 +02:00
})
.catch(err => dispatch(deleteUserFailure(user, err)));
2018-07-10 16:52:23 +02:00
};
2018-07-10 15:18:37 +02:00
}
2018-07-12 16:02:37 +02:00
export function getUsersFromState(state) {
if (!state.users.users) {
return null;
}
const userNames = state.users.users.entries;
if (!userNames) {
return null;
}
2018-07-17 15:10:37 +02:00
var userEntries: Array < UserEntry > = [];
2018-07-12 16:02:37 +02:00
for (let userName of userNames) {
userEntries.push(state.users.usersByNames[userName]);
}
return userEntries;
}
2018-07-12 16:51:32 +02:00
function extractUsersByNames(
2018-07-17 15:10:37 +02:00
users: Array < User > ,
userNames: Array < string > ,
2018-07-12 16:51:32 +02:00
oldUsersByNames: {}
) {
2018-07-12 16:02:37 +02:00
var usersByNames = {};
for (let user of users) {
usersByNames[user.name] = {
entry: user
};
}
2018-07-12 16:51:32 +02:00
for (var userName in oldUsersByNames) {
usersByNames[userName] = oldUsersByNames[userName];
}
2018-07-12 16:02:37 +02:00
return usersByNames;
}
2018-07-17 11:29:58 +02:00
export function editUser(user: User) {
2018-07-17 08:39:51 +02:00
return {
type: EDIT_USER,
user
};
}
const reduceUsersByNames = (state: any, username: string, newUserState: any) => {
const newUsersByNames = {
...state.usersByNames,
2018-07-17 16:35:01 +02:00
[username]: newUserState
};
return {
...state,
usersByNames: newUsersByNames
};
};
2018-07-09 11:38:13 +02:00
export default function reducer(state: any = {}, action: any = {}) {
2018-07-02 16:05:58 +02:00
switch (action.type) {
2018-07-04 09:55:02 +02:00
case FETCH_USERS:
2018-07-12 16:02:37 +02:00
return {
loading: true,
error: null
};
case DELETE_USER:
return reduceUsersByNames(state, action.payload.name, {
loading: true,
error: null,
entry: action.payload
});
2018-07-04 09:55:02 +02:00
case FETCH_USERS_SUCCESS:
2018-07-12 16:02:37 +02:00
const users = action.payload._embedded.users;
const userNames = users.map(user => user.name);
2018-07-12 16:51:32 +02:00
const usersByNames = extractUsersByNames(
users,
userNames,
state.usersByNames
);
2018-07-02 16:05:58 +02:00
return {
...state,
2018-07-12 16:02:37 +02:00
users: {
error: null,
entries: userNames,
loading: false
},
usersByNames
2018-07-02 16:05:58 +02:00
};
2018-07-04 09:55:02 +02:00
case FETCH_USERS_FAILURE:
case DELETE_USER_FAILURE:
2018-07-17 16:35:01 +02:00
return reduceUsersByNames(state, action.payload.user.name, {
loading: false,
error: action.payload.error,
entry: action.payload.user
});
2018-07-17 08:39:51 +02:00
case EDIT_USER:
return {
...state,
editUser: action.user
};
2018-07-02 16:05:58 +02:00
default:
2018-07-09 11:38:13 +02:00
return state;
2018-07-02 16:05:58 +02:00
}
}