From 351b8dcc1245146563b5ee9512d678aabaa75c8c Mon Sep 17 00:00:00 2001 From: McMatts Date: Mon, 20 Aug 2018 17:17:25 +0100 Subject: [PATCH] Set user admin max results and Keycloak sync option --- domain/auth/keycloak/endpoint.go | 2 +- domain/storer.go | 2 +- domain/user/endpoint.go | 7 +++- domain/user/mysql/store.go | 4 +- gui/app/authenticators/keycloak.js | 15 ++++--- gui/app/components/customize/user-list.js | 11 ++++- gui/app/pods/auth/keycloak/route.js | 6 ++- gui/app/pods/customize/users/controller.js | 15 ++++++- gui/app/pods/customize/users/route.js | 17 ++------ gui/app/pods/customize/users/template.hbs | 3 ++ gui/app/services/user.js | 5 ++- gui/app/styles/view/customize.scss | 4 ++ .../components/customize/user-list.hbs | 40 +++++++++++++++++++ 13 files changed, 100 insertions(+), 31 deletions(-) diff --git a/domain/auth/keycloak/endpoint.go b/domain/auth/keycloak/endpoint.go index a25b6788..691f7658 100644 --- a/domain/auth/keycloak/endpoint.go +++ b/domain/auth/keycloak/endpoint.go @@ -94,7 +94,7 @@ func (h *Handler) Sync(w http.ResponseWriter, r *http.Request) { } // User list from Documize - dmzUsers, err := h.Store.User.GetUsersForOrganization(ctx, "") + dmzUsers, err := h.Store.User.GetUsersForOrganization(ctx, "", 99999) if err != nil { result.Message = "Error: unable to fetch Documize users" result.IsError = true diff --git a/domain/storer.go b/domain/storer.go index 7970267c..1faaeb9c 100644 --- a/domain/storer.go +++ b/domain/storer.go @@ -115,7 +115,7 @@ type UserStorer interface { GetByToken(ctx RequestContext, token string) (u user.User, err error) GetBySerial(ctx RequestContext, serial string) (u user.User, err error) GetActiveUsersForOrganization(ctx RequestContext) (u []user.User, err error) - GetUsersForOrganization(ctx RequestContext, filter string) (u []user.User, err error) + GetUsersForOrganization(ctx RequestContext, filter string, limit int) (u []user.User, err error) GetSpaceUsers(ctx RequestContext, spaceID string) (u []user.User, err error) GetUsersForSpaces(ctx RequestContext, spaces []string) (u []user.User, err error) UpdateUser(ctx RequestContext, u user.User) (err error) diff --git a/domain/user/endpoint.go b/domain/user/endpoint.go index 4983942d..c945d61b 100644 --- a/domain/user/endpoint.go +++ b/domain/user/endpoint.go @@ -248,6 +248,11 @@ func (h *Handler) GetOrganizationUsers(w http.ResponseWriter, r *http.Request) { active = false } + limit, _ := strconv.Atoi(request.Query(r, "limit")) + if limit == 0 { + limit = 100 + } + u := []user.User{} if active { @@ -258,7 +263,7 @@ func (h *Handler) GetOrganizationUsers(w http.ResponseWriter, r *http.Request) { return } } else { - u, err = h.Store.User.GetUsersForOrganization(ctx, filter) + u, err = h.Store.User.GetUsersForOrganization(ctx, filter, limit) if err != nil && err != sql.ErrNoRows { response.WriteServerError(w, method, err) h.Runtime.Log.Error(method, err) diff --git a/domain/user/mysql/store.go b/domain/user/mysql/store.go index 7236f0b9..41046f4d 100644 --- a/domain/user/mysql/store.go +++ b/domain/user/mysql/store.go @@ -132,7 +132,7 @@ func (s Scope) GetActiveUsersForOrganization(ctx domain.RequestContext) (u []use // GetUsersForOrganization returns a slice containing all of the user records for the organizaiton // identified in the Persister. -func (s Scope) GetUsersForOrganization(ctx domain.RequestContext, filter string) (u []user.User, err error) { +func (s Scope) GetUsersForOrganization(ctx domain.RequestContext, filter string, limit int) (u []user.User, err error) { u = []user.User{} filter = strings.TrimSpace(strings.ToLower(filter)) @@ -146,7 +146,7 @@ func (s Scope) GetUsersForOrganization(ctx domain.RequestContext, filter string) u.global, a.active, a.editor, a.admin, a.users AS viewusers, a.analytics FROM user u, account a WHERE u.refid=a.userid AND a.orgid=? `+likeQuery+ - `ORDER BY u.firstname, u.lastname LIMIT 100`, ctx.OrgID) + `ORDER BY u.firstname, u.lastname LIMIT `+strconv.Itoa(limit), ctx.OrgID) if err == sql.ErrNoRows { err = nil diff --git a/gui/app/authenticators/keycloak.js b/gui/app/authenticators/keycloak.js index 846fe05f..67121e4e 100644 --- a/gui/app/authenticators/keycloak.js +++ b/gui/app/authenticators/keycloak.js @@ -1,11 +1,11 @@ // Copyright 2016 Documize Inc. . All rights reserved. // -// This software (Documize Community Edition) is licensed under +// This software (Documize Community Edition) is licensed under // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html // // You can operate outside the AGPL restrictions by purchasing // Documize Enterprise Edition and obtaining a commercial license -// by contacting . +// by contacting . // // https://documize.com @@ -34,8 +34,11 @@ export default Base.extend({ authenticate(data) { data.domain = netUtil.getSubdomain(); - if (!isPresent(data.token) || !isPresent(data.email)) { - return reject("invalid"); + if (!isPresent(data.token)) { + return reject("data.token is empty"); + } + if (!isPresent(data.email)) { + return reject("data.email is empty"); } return this.get('ajax').post('public/authenticate/keycloak', { @@ -45,7 +48,7 @@ export default Base.extend({ }, invalidate() { - this.get('localStorage').clearAll(); + this.get('localStorage').clearAll(); return this.get('kcAuth').logout(); } -}); \ No newline at end of file +}); diff --git a/gui/app/components/customize/user-list.js b/gui/app/components/customize/user-list.js index 94b336cd..4f8af1c5 100644 --- a/gui/app/components/customize/user-list.js +++ b/gui/app/components/customize/user-list.js @@ -12,9 +12,9 @@ import $ from 'jquery'; import { inject as service } from '@ember/service'; import { schedule, debounce } from '@ember/runloop'; -import Component from '@ember/component'; import AuthProvider from '../../mixins/auth'; import ModalMixin from '../../mixins/modal'; +import Component from '@ember/component'; export default Component.extend(AuthProvider, ModalMixin, { groupSvc: service('group'), @@ -230,6 +230,15 @@ export default Component.extend(AuthProvider, ModalMixin, { this.get('groupSvc').join(groupId, userId).then(() => { this.filterUsers(); }); + }, + + onSync() { + this.get('onSync')(); + }, + + onLimit(limit) { + this.set('userLimit', limit); + this.filterUsers(); } } }); diff --git a/gui/app/pods/auth/keycloak/route.js b/gui/app/pods/auth/keycloak/route.js index ebd6cd43..a056b572 100644 --- a/gui/app/pods/auth/keycloak/route.js +++ b/gui/app/pods/auth/keycloak/route.js @@ -41,7 +41,11 @@ export default Route.extend({ this.get("session").authenticate('authenticator:keycloak', data).then(() => { this.transitionTo('folders'); }, (reject) => { - this.set('message', reject.Error); + if (is.not.undefined(reject.Error)) { + this.set('message', reject.Error); + } else { + this.set('message', reject); + } this.set('mode', 'reject'); resolve(); }); diff --git a/gui/app/pods/customize/users/controller.js b/gui/app/pods/customize/users/controller.js index da5fac75..0da631af 100644 --- a/gui/app/pods/customize/users/controller.js +++ b/gui/app/pods/customize/users/controller.js @@ -14,9 +14,12 @@ import Controller from '@ember/controller'; export default Controller.extend({ userService: service('user'), + globalSvc: service('global'), + syncInProgress: false, + userLimit: 100, loadUsers(filter) { - this.get('userService').getComplete(filter).then((users) => { + this.get('userService').getComplete(filter, this.get('userLimit')).then((users) => { this.set('model', users); }); }, @@ -27,7 +30,7 @@ export default Controller.extend({ this.get('model').pushObject(user); }); }, - + onAddUsers(list) { return this.get('userService').addBulk(list).then(() => { this.loadUsers(''); @@ -52,6 +55,14 @@ export default Controller.extend({ onFilter(filter) { this.loadUsers(filter); + }, + + onSync() { + this.set('syncInProgress', true); + this.get('globalSvc').syncExternalUsers().then(() => { + this.set('syncInProgress', false); + this.loadUsers(''); + }); } } }); diff --git a/gui/app/pods/customize/users/route.js b/gui/app/pods/customize/users/route.js index abea379e..a03b4ec7 100644 --- a/gui/app/pods/customize/users/route.js +++ b/gui/app/pods/customize/users/route.js @@ -16,7 +16,6 @@ import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-rout export default Route.extend(AuthenticatedRouteMixin, { userService: service('user'), - global: service('global'), appMeta: service(), beforeModel () { @@ -27,19 +26,9 @@ export default Route.extend(AuthenticatedRouteMixin, { model() { return new EmberPromise((resolve) => { - let constants = this.get('constants'); - - if (this.get('appMeta.authProvider') == constants.AuthProvider.Keycloak) { - this.get('global').syncExternalUsers().then(() => { - this.get('userService').getComplete('').then((users) =>{ - resolve(users); - }); - }); - } else { - this.get('userService').getComplete('').then((users) => { - resolve(users); - }); - } + this.get('userService').getComplete('', 100).then((users) => { + resolve(users); + }); }); }, diff --git a/gui/app/pods/customize/users/template.hbs b/gui/app/pods/customize/users/template.hbs index 87f5571c..b2a2302e 100644 --- a/gui/app/pods/customize/users/template.hbs +++ b/gui/app/pods/customize/users/template.hbs @@ -3,6 +3,9 @@ onAddUsers=(action 'onAddUsers')}} {{customize/user-list users=model + syncInProgress=syncInProgress + userLimit=userLimit + onSync=(action "onSync") onFilter=(action "onFilter") onDelete=(action "onDelete") onSave=(action "onSave") diff --git a/gui/app/services/user.js b/gui/app/services/user.js index 1ad19bd0..731ffb67 100644 --- a/gui/app/services/user.js +++ b/gui/app/services/user.js @@ -68,11 +68,12 @@ export default Service.extend({ // Returns all active and inactive users for organization. // Only available for admins and limits results to max. 100 users. // Takes filter for user search criteria. - getComplete(filter) { + getComplete(filter, limit) { filter = filter.trim(); if (filter.length > 0) filter = encodeURIComponent(filter); + if (is.null(limit) || is.undefined(limit)) limit = 100; - return this.get('ajax').request(`users?active=0&filter=${filter}`).then((response) => { + return this.get('ajax').request(`users?active=0&filter=${filter}&limit=${limit}`).then((response) => { if (is.not.array(response)) response = []; return response.map((obj) => { diff --git a/gui/app/styles/view/customize.scss b/gui/app/styles/view/customize.scss index 653cd821..e0120201 100644 --- a/gui/app/styles/view/customize.scss +++ b/gui/app/styles/view/customize.scss @@ -157,4 +157,8 @@ } } } + + > .max-results { + float: right; + } } diff --git a/gui/app/templates/components/customize/user-list.hbs b/gui/app/templates/components/customize/user-list.hbs index 9d9b65d6..a6786920 100644 --- a/gui/app/templates/components/customize/user-list.hbs +++ b/gui/app/templates/components/customize/user-list.hbs @@ -1,4 +1,11 @@
+ {{#if isAuthProviderKeycloak}} + {{#if syncInProgress}} +
Keycloak user sync running...
+ {{else}} +
Sync with Keycloak
+ {{/if}} + {{/if}}
Spaces @@ -26,6 +33,39 @@ search firstname, lastname, email
+ +
+
+ + + + + + + + + +
+
+