|
|
@@ -37,15 +37,15 @@ class UserModel {
|
|
|
}
|
|
|
|
|
|
class UserSource {
|
|
|
- static saveDomainName(domainName: string) {
|
|
|
+ saveDomainName(domainName: string) {
|
|
|
localStorage.setItem('userDomainName', domainName)
|
|
|
}
|
|
|
|
|
|
- static getDomainName(): string {
|
|
|
+ getDomainName(): string {
|
|
|
return localStorage.getItem('userDomainName') || configLoader.config.defaultUserDomain
|
|
|
}
|
|
|
|
|
|
- static login(userData: Credentials): Promise<User> {
|
|
|
+ async login(userData: Credentials): Promise<any> {
|
|
|
let auth = {
|
|
|
auth: {
|
|
|
identity: {
|
|
|
@@ -64,19 +64,18 @@ class UserSource {
|
|
|
|
|
|
Api.setDefaultHeader('X-Auth-Token', null)
|
|
|
|
|
|
- return Api.send({
|
|
|
+ let response = await Api.send({
|
|
|
url: servicesUrl.identity,
|
|
|
method: 'POST',
|
|
|
data: auth,
|
|
|
- }).then(response => {
|
|
|
- let token = response.headers ? response.headers['X-Subject-Token'] || response.headers['x-subject-token'] : ''
|
|
|
- Api.setDefaultHeader('X-Auth-Token', token)
|
|
|
- cookie.set('unscopedToken', token, { expires: 30 })
|
|
|
- return response.data
|
|
|
})
|
|
|
+ let token = response.headers ? response.headers['X-Subject-Token'] || response.headers['x-subject-token'] : ''
|
|
|
+ Api.setDefaultHeader('X-Auth-Token', token)
|
|
|
+ cookie.set('unscopedToken', token, { expires: 30 })
|
|
|
+ return response.data
|
|
|
}
|
|
|
|
|
|
- static loginScoped(projectId: string, skipCookie?: boolean): Promise<User> {
|
|
|
+ async loginScoped(projectId: string, skipCookie?: boolean): Promise<User> {
|
|
|
let useProjectId = skipCookie ? projectId : cookie.get('projectId') || projectId
|
|
|
let token = cookie.get('unscopedToken')
|
|
|
|
|
|
@@ -98,28 +97,30 @@ class UserSource {
|
|
|
|
|
|
Api.setDefaultHeader('X-Auth-Token', null)
|
|
|
|
|
|
- return Api.send({
|
|
|
- url: servicesUrl.identity,
|
|
|
- method: 'POST',
|
|
|
- data: auth,
|
|
|
- }).then(response => {
|
|
|
+ try {
|
|
|
+ let response = await Api.send({
|
|
|
+ url: servicesUrl.identity,
|
|
|
+ method: 'POST',
|
|
|
+ data: auth,
|
|
|
+ })
|
|
|
let token = response.headers ? response.headers['X-Subject-Token'] || response.headers['x-subject-token'] : ''
|
|
|
- let data = UserModel.parseUserData(response.data)
|
|
|
+ let data: User = UserModel.parseUserData(response.data)
|
|
|
data = { ...data, token }
|
|
|
cookie.set('token', data.token, { expires: 30 })
|
|
|
cookie.set('projectId', data.project.id, { expires: 30 })
|
|
|
Api.setDefaultHeader('X-Auth-Token', data.token)
|
|
|
|
|
|
return data
|
|
|
- }).catch(response => {
|
|
|
+ } catch (err) {
|
|
|
if (!skipCookie) {
|
|
|
- return UserSource.loginScoped(projectId, true)
|
|
|
+ let user: User = await this.loginScoped(projectId, true)
|
|
|
+ return user
|
|
|
}
|
|
|
- return Promise.reject(response)
|
|
|
- })
|
|
|
+ throw err
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- static tokenLogin(): Promise<User> {
|
|
|
+ async tokenLogin(): Promise<User> {
|
|
|
let token = cookie.get('token')
|
|
|
let projectId = cookie.get('projectId')
|
|
|
if (token) {
|
|
|
@@ -130,30 +131,31 @@ class UserSource {
|
|
|
return Promise.reject()
|
|
|
}
|
|
|
|
|
|
- return Api.send({
|
|
|
- url: servicesUrl.identity,
|
|
|
- headers: { 'X-Subject-Token': token },
|
|
|
- }).then(response => {
|
|
|
+ try {
|
|
|
+ let response = await Api.send({
|
|
|
+ url: servicesUrl.identity,
|
|
|
+ headers: { 'X-Subject-Token': token },
|
|
|
+ })
|
|
|
let data = UserModel.parseUserData(response.data)
|
|
|
data = { ...data, token }
|
|
|
return data
|
|
|
- }).catch(() => {
|
|
|
+ } catch (err) {
|
|
|
cookie.remove('token')
|
|
|
Api.setDefaultHeader('X-Auth-Token', null)
|
|
|
- return Promise.reject()
|
|
|
- })
|
|
|
+ throw err
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- static switchProject(): Promise<void> {
|
|
|
+ async switchProject(): Promise<void> {
|
|
|
let token = cookie.get('unscopedToken')
|
|
|
if (token) {
|
|
|
cookie.remove('projectId')
|
|
|
- return Promise.resolve()
|
|
|
+ return
|
|
|
}
|
|
|
- return Promise.reject()
|
|
|
+ throw new Error()
|
|
|
}
|
|
|
|
|
|
- static logout(): Promise<void> {
|
|
|
+ async logout(): Promise<void> {
|
|
|
let token = cookie.get('token')
|
|
|
let clear = () => {
|
|
|
cookie.remove('token')
|
|
|
@@ -161,36 +163,34 @@ class UserSource {
|
|
|
Api.setDefaultHeader('X-Auth-Token', null)
|
|
|
}
|
|
|
|
|
|
- return Api.send({
|
|
|
- url: servicesUrl.identity,
|
|
|
- method: 'DELETE',
|
|
|
- headers: { 'X-Subject-Token': token || '' },
|
|
|
- }).then(() => {
|
|
|
- clear()
|
|
|
- }).catch(() => {
|
|
|
+ try {
|
|
|
+ await Api.send({
|
|
|
+ url: servicesUrl.identity,
|
|
|
+ method: 'DELETE',
|
|
|
+ headers: { 'X-Subject-Token': token || '' },
|
|
|
+ })
|
|
|
+ } catch (err) {
|
|
|
+ throw err
|
|
|
+ } finally {
|
|
|
clear()
|
|
|
- return Promise.reject()
|
|
|
- })
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- static getUserInfo(userId: string): Promise<User> {
|
|
|
- return Api.get(`${servicesUrl.users}/${userId}`).then(response => response.data.user)
|
|
|
+ async getUserInfo(userId: string): Promise<User> {
|
|
|
+ let response = await Api.get(`${servicesUrl.users}/${userId}`)
|
|
|
+ return response.data.user
|
|
|
}
|
|
|
|
|
|
- static getAllUsers(skipLog?: boolean): Promise<User[]> {
|
|
|
- let users: User[] = []
|
|
|
- return Api.send({ url: `${servicesUrl.users}`, skipLog })
|
|
|
- .then(response => {
|
|
|
- users = response.data.users
|
|
|
- return utils.waitFor(() => Boolean(configLoader.config))
|
|
|
- }).then(() => {
|
|
|
- users = users.filter(u => !configLoader.config.hiddenUsers.find(hu => hu === u.name))
|
|
|
- .sort((u1, u2) => u1.name.localeCompare(u2.name))
|
|
|
- return users
|
|
|
- })
|
|
|
+ async getAllUsers(skipLog?: boolean): Promise<User[]> {
|
|
|
+ let response = await Api.send({ url: `${servicesUrl.users}`, skipLog })
|
|
|
+ let users: User[] = response.data.users
|
|
|
+ await utils.waitFor(() => Boolean(configLoader.config))
|
|
|
+ users = users.filter(u => !configLoader.config.hiddenUsers.find(hu => hu === u.name))
|
|
|
+ .sort((u1, u2) => u1.name.localeCompare(u2.name))
|
|
|
+ return users
|
|
|
}
|
|
|
|
|
|
- static update(userId: string, user: User, oldUser: ?User): Promise<User> {
|
|
|
+ async update(userId: string, user: User, oldUser: ?User): Promise<User> {
|
|
|
const data = { user: {} }
|
|
|
let oldData = oldUser || {}
|
|
|
|
|
|
@@ -212,40 +212,34 @@ class UserSource {
|
|
|
if (user.project_id || oldData.project_id) {
|
|
|
data.user.project_id = user.project_id
|
|
|
}
|
|
|
- let updatedUser: User
|
|
|
|
|
|
- return Api.send({
|
|
|
+ let response = await Api.send({
|
|
|
url: `${servicesUrl.users}/${userId}`,
|
|
|
method: 'PATCH',
|
|
|
data,
|
|
|
- }).then(response => {
|
|
|
- updatedUser = response.data.user
|
|
|
- if (updatedUser.extra) {
|
|
|
- updatedUser = {
|
|
|
- ...updatedUser,
|
|
|
- ...updatedUser.extra,
|
|
|
- }
|
|
|
+ })
|
|
|
+ let updatedUser: User = response.data.user
|
|
|
+ if (updatedUser.extra) {
|
|
|
+ updatedUser = {
|
|
|
+ ...updatedUser,
|
|
|
+ ...updatedUser.extra,
|
|
|
}
|
|
|
- return updatedUser
|
|
|
- }).then(() => {
|
|
|
- // if project id was updated, assign him to that project, if his not already assigned
|
|
|
- if (data.user.project_id) {
|
|
|
- return this.getProjects(updatedUser.id).then((projects: Project[]) => {
|
|
|
- if (projects.find(p => p.id === data.user.project_id)) {
|
|
|
- return updatedUser
|
|
|
- }
|
|
|
-
|
|
|
- return this.assignUserToProject(updatedUser.id, updatedUser.project_id || 'undefined').then(() => {
|
|
|
- return updatedUser
|
|
|
- })
|
|
|
- })
|
|
|
+ }
|
|
|
+ // if project id was updated, assign him to that project, if his not already assigned
|
|
|
+ if (data.user.project_id) {
|
|
|
+ let projects: Project[] = await this.getProjects(updatedUser.id)
|
|
|
+ if (projects.find(p => p.id === data.user.project_id)) {
|
|
|
+ return updatedUser
|
|
|
}
|
|
|
|
|
|
+ await this.assignUserToProject(updatedUser.id, updatedUser.project_id || 'undefined')
|
|
|
return updatedUser
|
|
|
- })
|
|
|
+ }
|
|
|
+
|
|
|
+ return updatedUser
|
|
|
}
|
|
|
|
|
|
- static add(user: User): Promise<User> {
|
|
|
+ async add(user: User): Promise<User> {
|
|
|
let data = { user: {} }
|
|
|
data.user.name = user.name
|
|
|
data.user.password = user.password || ''
|
|
|
@@ -260,96 +254,86 @@ class UserSource {
|
|
|
if (user.project_id) {
|
|
|
data.user.project_id = user.project_id
|
|
|
}
|
|
|
- let addedUser: User
|
|
|
- return Api.send({
|
|
|
+
|
|
|
+ let response = await Api.send({
|
|
|
url: `${servicesUrl.users}`,
|
|
|
method: 'POST',
|
|
|
data,
|
|
|
- }).then(response => {
|
|
|
- addedUser = response.data.user
|
|
|
- if (addedUser.extra) {
|
|
|
- addedUser = {
|
|
|
- ...addedUser,
|
|
|
- ...addedUser.extra,
|
|
|
- }
|
|
|
- }
|
|
|
- return addedUser
|
|
|
- }).then(() => {
|
|
|
- // If the user has a project id set, assign him to that project with admin role
|
|
|
- if (addedUser.project_id) {
|
|
|
- return this.assignUserToProject(addedUser.id, addedUser.project_id || 'undefined').then(() => {
|
|
|
- return addedUser
|
|
|
- })
|
|
|
+ })
|
|
|
+ let addedUser: User = response.data.user
|
|
|
+ if (addedUser.extra) {
|
|
|
+ addedUser = {
|
|
|
+ ...addedUser,
|
|
|
+ ...addedUser.extra,
|
|
|
}
|
|
|
+ }
|
|
|
+ // If the user has a project id set, assign him to that project with admin role
|
|
|
+ if (addedUser.project_id) {
|
|
|
+ await this.assignUserToProject(addedUser.id, addedUser.project_id || 'undefined')
|
|
|
return addedUser
|
|
|
- })
|
|
|
+ }
|
|
|
+ return addedUser
|
|
|
}
|
|
|
|
|
|
- static delete(userId: string): Promise<void> {
|
|
|
- return Api.send({
|
|
|
+ async delete(userId: string): Promise<void> {
|
|
|
+ await Api.send({
|
|
|
url: `${coriolisUrl}identity/users/${userId}`,
|
|
|
method: 'DELETE',
|
|
|
- }).then(() => { })
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
- static assignUserToProject(userId: string, projectId: string): Promise<void> {
|
|
|
- return this.getMemberRoleId().then((roleId: string) => {
|
|
|
- return this.assignUserToProjectWithRole(userId, projectId, roleId)
|
|
|
- })
|
|
|
+ async assignUserToProject(userId: string, projectId: string): Promise<void> {
|
|
|
+ let roleId: string = await this.getMemberRoleId()
|
|
|
+ await this.assignUserToProjectWithRole(userId, projectId, roleId)
|
|
|
}
|
|
|
|
|
|
- static assignUserToProjectWithRole(userId: string, projectId: string, roleId: string): Promise<void> {
|
|
|
- return Api.send({
|
|
|
+ async assignUserToProjectWithRole(userId: string, projectId: string, roleId: string): Promise<void> {
|
|
|
+ await Api.send({
|
|
|
url: `${coriolisUrl}identity/projects/${projectId}/users/${userId}/roles/${roleId}`,
|
|
|
method: 'PUT',
|
|
|
- }).then(() => { })
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
- static getMemberRoleId(): Promise<string> {
|
|
|
- return this.getRoles().then((roles: { id: string, name: string }[]) => {
|
|
|
- const role = roles.find(r => r.name === '_member_')
|
|
|
- const roleId = role ? role.id : ''
|
|
|
- return roleId
|
|
|
- })
|
|
|
+ async getMemberRoleId(): Promise<string> {
|
|
|
+ let roles: { id: string, name: string }[] = await this.getRoles()
|
|
|
+ const role = roles.find(r => r.name === '_member_')
|
|
|
+ const roleId = role ? role.id : ''
|
|
|
+ return roleId
|
|
|
}
|
|
|
|
|
|
- static getAdminRoleId(): Promise<string> {
|
|
|
- return this.getRoles().then((roles: { id: string, name: string }[]) => {
|
|
|
- const role = roles.find(r => r.name === 'admin')
|
|
|
- const roleId = role ? role.id : ''
|
|
|
- return roleId
|
|
|
- })
|
|
|
+ async getAdminRoleId(): Promise<string> {
|
|
|
+ let roles: { id: string, name: string }[] = await this.getRoles()
|
|
|
+ const role = roles.find(r => r.name === 'admin')
|
|
|
+ const roleId = role ? role.id : ''
|
|
|
+ return roleId
|
|
|
}
|
|
|
|
|
|
- static getRoles(): Promise<Role[]> {
|
|
|
- return Api.get(`${coriolisUrl}identity/roles`).then(response => {
|
|
|
- let roles: Role[] = response.data.roles
|
|
|
- roles.sort((r1, r2) => r1.name.localeCompare(r2.name))
|
|
|
- return roles
|
|
|
- })
|
|
|
+ async getRoles(): Promise<Role[]> {
|
|
|
+ let response = await Api.get(`${coriolisUrl}identity/roles`)
|
|
|
+ let roles: Role[] = response.data.roles
|
|
|
+ roles.sort((r1, r2) => r1.name.localeCompare(r2.name))
|
|
|
+ return roles
|
|
|
}
|
|
|
|
|
|
- static getProjects(userId: string): Promise<Project[]> {
|
|
|
- return Api.get(`${coriolisUrl}identity/role_assignments?include_names`).then(response => {
|
|
|
- let assignments: RoleAssignment[] = response.data.role_assignments
|
|
|
- let projects: $Shape<Project>[] = assignments
|
|
|
- .filter(a => a.user.id === userId)
|
|
|
- .filter((a, i, arr) => arr.findIndex(e => e.scope.project.id === a.scope.project.id) === i)
|
|
|
- .map(a => a.scope.project)
|
|
|
+ async getProjects(userId: string): Promise<Project[]> {
|
|
|
+ let response = await Api.get(`${coriolisUrl}identity/role_assignments?include_names`)
|
|
|
+ let assignments: RoleAssignment[] = response.data.role_assignments
|
|
|
+ let projects: $Shape<Project>[] = assignments
|
|
|
+ .filter(a => a.user.id === userId)
|
|
|
+ .filter((a, i, arr) => arr.findIndex(e => e.scope.project.id === a.scope.project.id) === i)
|
|
|
+ .map(a => a.scope.project)
|
|
|
|
|
|
- return projects
|
|
|
- })
|
|
|
+ return projects
|
|
|
}
|
|
|
|
|
|
- static isAdmin(userId: string): Promise<boolean> {
|
|
|
- return Api.send({
|
|
|
+ async isAdmin(userId: string): Promise<boolean> {
|
|
|
+ let response = await Api.send({
|
|
|
url: `${coriolisUrl}identity/role_assignments?include_names`,
|
|
|
quietError: true,
|
|
|
- }).then(response => {
|
|
|
- let roleAssignments: RoleAssignment[] = response.data.role_assignments
|
|
|
- return roleAssignments.filter(a => a.user.id === userId).filter(a => a.role.name === 'admin').length > 0
|
|
|
})
|
|
|
+ let roleAssignments: RoleAssignment[] = response.data.role_assignments
|
|
|
+ return roleAssignments.filter(a => a.user.id === userId).filter(a => a.role.name === 'admin').length > 0
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-export default UserSource
|
|
|
+export default new UserSource()
|