From 688361b97f8aaa8ee030fe0ae567849812849b8b Mon Sep 17 00:00:00 2001 From: Javier Brea Date: Sat, 16 Feb 2019 11:12:01 +0100 Subject: [PATCH] Reorganize data-layer --- src/data-layer/helpers.js | 2 +- src/data-layer/login.js | 2 +- .../index.js => service/about/origins.js} | 2 +- src/data-layer/service/config/origins.js | 12 ++ .../index.js => service/config/selectors.js} | 20 +--- src/data-layer/service/index.js | 3 + .../abilities/origins.js} | 23 ++-- src/data-layer/services/index.js | 109 +----------------- src/data-layer/services/logs/origins.js | 12 ++ .../index.js => services/logs/selectors.js} | 22 ++-- src/data-layer/services/service/origins.js | 20 ++++ src/data-layer/services/services/filters.js | 9 ++ src/data-layer/services/services/origins.js | 20 ++++ src/data-layer/services/services/selectors.js | 62 ++++++++++ .../authentication/origins.js} | 2 +- src/data-layer/users/avatar.js | 34 ------ src/data-layer/users/avatar/filters.js | 10 ++ src/data-layer/users/avatar/origins.js | 10 ++ src/data-layer/users/avatar/selectors.js | 19 +++ src/data-layer/users/collection.js | 87 -------------- src/data-layer/users/index.js | 58 +++------- src/data-layer/users/listeners.js | 14 +++ src/data-layer/users/me/origins.js | 12 ++ .../users/{me.js => me/selectors.js} | 20 +--- .../index.js => users/roles/origins.js} | 8 +- src/data-layer/users/roles/selectors.js | 9 ++ src/data-layer/users/user/origins.js | 20 ++++ .../users/{model.js => user/selectors.js} | 35 ++---- src/data-layer/users/users/origins.js | 14 +++ src/data-layer/users/users/selectors.js | 78 +++++++++++++ .../{validations.js => users/validators.js} | 2 +- src/modules/about/views/About.js | 2 +- src/modules/account/views/UpdateUser.js | 8 +- src/modules/activity/views/Activity.js | 2 +- src/modules/config/views/BaseConfig.js | 2 +- src/modules/config/views/Config.js | 2 +- src/modules/config/views/CustomConfig.js | 2 +- src/modules/login/views/Login.js | 2 +- src/modules/modules/views/Module.js | 6 +- src/modules/plugins/views/Plugin.js | 4 +- src/modules/users/views/CreateOrUpdateUser.js | 4 +- src/modules/users/views/CreateUser.js | 2 +- src/modules/users/views/UpdateUser.js | 8 +- 43 files changed, 412 insertions(+), 382 deletions(-) rename src/data-layer/{about/index.js => service/about/origins.js} (78%) create mode 100644 src/data-layer/service/config/origins.js rename src/data-layer/{config/index.js => service/config/selectors.js} (74%) create mode 100644 src/data-layer/service/index.js rename src/data-layer/{abilities/index.js => services/abilities/origins.js} (55%) create mode 100644 src/data-layer/services/logs/origins.js rename src/data-layer/{logs/index.js => services/logs/selectors.js} (65%) create mode 100644 src/data-layer/services/service/origins.js create mode 100644 src/data-layer/services/services/filters.js create mode 100644 src/data-layer/services/services/origins.js create mode 100644 src/data-layer/services/services/selectors.js rename src/data-layer/{authentication/index.js => users/authentication/origins.js} (90%) delete mode 100644 src/data-layer/users/avatar.js create mode 100644 src/data-layer/users/avatar/filters.js create mode 100644 src/data-layer/users/avatar/origins.js create mode 100644 src/data-layer/users/avatar/selectors.js delete mode 100644 src/data-layer/users/collection.js create mode 100644 src/data-layer/users/listeners.js create mode 100644 src/data-layer/users/me/origins.js rename src/data-layer/users/{me.js => me/selectors.js} (56%) rename src/data-layer/{roles/index.js => users/roles/origins.js} (64%) create mode 100644 src/data-layer/users/roles/selectors.js create mode 100644 src/data-layer/users/user/origins.js rename src/data-layer/users/{model.js => user/selectors.js} (53%) create mode 100644 src/data-layer/users/users/origins.js create mode 100644 src/data-layer/users/users/selectors.js rename src/data-layer/users/{validations.js => users/validators.js} (90%) diff --git a/src/data-layer/helpers.js b/src/data-layer/helpers.js index 220423b..32d7c62 100644 --- a/src/data-layer/helpers.js +++ b/src/data-layer/helpers.js @@ -4,7 +4,7 @@ export const formatDate = dateString => { return moment(dateString).format("YY-MM-DD, hh:mm:ss"); }; -export const display = value => { +export const displayValue = value => { if (["string", "number"].indexOf(typeof value) < 0) { return JSON.stringify(value); } diff --git a/src/data-layer/login.js b/src/data-layer/login.js index 7f7e936..6f821e0 100644 --- a/src/data-layer/login.js +++ b/src/data-layer/login.js @@ -2,7 +2,7 @@ import queryString from "query-string"; -import { authSession, authJwt } from "./authentication"; +import { authSession, authJwt } from "./users"; import { config, removeAuth, setJwtAuth, setApiKeyAuth, cleanAll } from "./setup"; class Login { diff --git a/src/data-layer/about/index.js b/src/data-layer/service/about/origins.js similarity index 78% rename from src/data-layer/about/index.js rename to src/data-layer/service/about/origins.js index 19a0799..0f94210 100644 --- a/src/data-layer/about/index.js +++ b/src/data-layer/service/about/origins.js @@ -1,6 +1,6 @@ import { origins } from "reactive-data-source"; -import { baseConfig } from "../setup"; +import { baseConfig } from "../../setup"; export const about = new origins.Api( "/about", diff --git a/src/data-layer/service/config/origins.js b/src/data-layer/service/config/origins.js new file mode 100644 index 0000000..ac3993e --- /dev/null +++ b/src/data-layer/service/config/origins.js @@ -0,0 +1,12 @@ +import { origins } from "reactive-data-source"; + +import { authConfig } from "../../setup"; + +export const config = new origins.Api( + "/config", + {}, + { + ...authConfig, + defaultValue: {} + } +); diff --git a/src/data-layer/config/index.js b/src/data-layer/service/config/selectors.js similarity index 74% rename from src/data-layer/config/index.js rename to src/data-layer/service/config/selectors.js index 3dc0df2..fd4dbd5 100644 --- a/src/data-layer/config/index.js +++ b/src/data-layer/service/config/selectors.js @@ -1,8 +1,7 @@ -import { origins, Selector } from "reactive-data-source"; +import { Selector } from "reactive-data-source"; -import { authConfig } from "../setup"; - -import { display } from "../helpers"; +import { displayValue } from "../../helpers"; +import { config } from "./origins"; const BASE_KEYS = { logLevel: "Log Level", @@ -16,15 +15,6 @@ const BASE_KEYS = { auth: "Authentication enabled" }; -export const config = new origins.Api( - "/config", - {}, - { - ...authConfig, - defaultValue: {} - } -); - export const baseConfig = new Selector( config, configuration => { @@ -34,7 +24,7 @@ export const baseConfig = new Selector( base.push({ key: key, label: BASE_KEYS[key], - value: display(configuration[key]), + value: displayValue(configuration[key]), originalValue: configuration[key] }); } @@ -53,7 +43,7 @@ export const customConfig = new Selector( custom.push({ key: key, label: key, - value: display(configuration[key]), + value: displayValue(configuration[key]), originalValue: configuration[key] }); } diff --git a/src/data-layer/service/index.js b/src/data-layer/service/index.js new file mode 100644 index 0000000..d2ff271 --- /dev/null +++ b/src/data-layer/service/index.js @@ -0,0 +1,3 @@ +export * from "./about/origins"; +export * from "./config/origins"; +export * from "./config/selectors"; diff --git a/src/data-layer/abilities/index.js b/src/data-layer/services/abilities/origins.js similarity index 55% rename from src/data-layer/abilities/index.js rename to src/data-layer/services/abilities/origins.js index f72950f..fb75d7d 100644 --- a/src/data-layer/abilities/index.js +++ b/src/data-layer/services/abilities/origins.js @@ -1,17 +1,8 @@ import { origins } from "reactive-data-source"; -import { authConfig } from "../setup"; -// ABILITIES COLLECTION +import { authConfig } from "../../setup"; -const ofServiceFilter = serviceId => { - if (serviceId) { - return { - query: { - service: serviceId - } - }; - } -}; +// ABILITIES COLLECTION export const abilitiesCollection = new origins.Api( "/abilities", @@ -23,5 +14,13 @@ export const abilitiesCollection = new origins.Api( ); abilitiesCollection.addCustomFilter({ - ofService: ofServiceFilter + ofService: serviceId => { + if (serviceId) { + return { + query: { + service: serviceId + } + }; + } + } }); diff --git a/src/data-layer/services/index.js b/src/data-layer/services/index.js index 35975c8..551fe2b 100644 --- a/src/data-layer/services/index.js +++ b/src/data-layer/services/index.js @@ -1,103 +1,6 @@ -import { origins, Selector } from "reactive-data-source"; -import sortBy from "lodash.sortby"; - -import { authConfig } from "../setup"; -import { byIdFilter } from "../helpers"; - -// SERVICES COLLECTION - -const typeFilter = serviceType => { - if (serviceType && serviceType.length) { - return { - query: { - type: serviceType - } - }; - } -}; - -export const servicesCollection = new origins.Api( - "/services", - {}, - { - ...authConfig, - defaultValue: [] - } -); - -servicesCollection.addCustomFilter({ - type: typeFilter -}); - -// SELECTORS - -export const modulesCollection = new Selector( - { - source: servicesCollection, - filter: () => typeFilter("module") - }, - servicesResults => servicesResults, - [] -); - -export const pluginsCollection = new Selector( - { - source: servicesCollection, - filter: () => typeFilter("plugin") - }, - servicesResults => servicesResults, - [] -); - -const searchByNameAndDesc = (servicesResults, search) => { - if (!search) { - return servicesResults; - } - return servicesResults.filter( - service => service.name.indexOf(search) > -1 || service.description.indexOf(search) > -1 - ); -}; - -export const modulesCollectionFiltered = new Selector(modulesCollection, searchByNameAndDesc, []); -export const pluginsCollectionFiltered = new Selector(pluginsCollection, searchByNameAndDesc, []); - -const sortAndOrderBy = (servicesResults, filter) => { - const results = sortBy(servicesResults, (filter && filter.sortBy) || "name"); - if (filter.reverse) { - return results.reverse(); - } - return results; -}; - -export const modulesCollectionFilteredAndSorted = new Selector( - { - source: modulesCollectionFiltered, - filter: ({ search }) => search - }, - sortAndOrderBy, - [] -); - -export const pluginsCollectionFilteredAndSorted = new Selector( - { - source: pluginsCollectionFiltered, - filter: ({ search }) => search - }, - sortAndOrderBy, - [] -); - -// SERVICE MODEL - -export const servicesModel = new origins.Api( - "/services/:id", - {}, - { - ...authConfig, - defaultValue: {} - } -); - -servicesModel.addCustomFilter({ - byId: byIdFilter -}); +export * from "./abilities/origins"; +export * from "./logs/origins"; +export * from "./logs/selectors"; +export * from "./service/origins"; +export * from "./services/origins"; +export * from "./services/selectors"; diff --git a/src/data-layer/services/logs/origins.js b/src/data-layer/services/logs/origins.js new file mode 100644 index 0000000..4b45c8a --- /dev/null +++ b/src/data-layer/services/logs/origins.js @@ -0,0 +1,12 @@ +import { origins } from "reactive-data-source"; + +import { authConfig } from "../../setup"; + +export const logs = new origins.Api( + "/logs", + {}, + { + ...authConfig, + defaultValue: [] + } +); diff --git a/src/data-layer/logs/index.js b/src/data-layer/services/logs/selectors.js similarity index 65% rename from src/data-layer/logs/index.js rename to src/data-layer/services/logs/selectors.js index 38f85fb..90fbcce 100644 --- a/src/data-layer/logs/index.js +++ b/src/data-layer/services/logs/selectors.js @@ -1,20 +1,12 @@ -import { origins, Selector } from "reactive-data-source"; +import { Selector } from "reactive-data-source"; -import { authConfig } from "../setup"; -import { display, formatDate } from "../helpers"; -import { abilitiesCollection } from "../abilities"; -import { servicesCollection } from "../services"; +import { displayValue, formatDate } from "../../helpers"; -const NUMBER_OF_LOGS = 100; +import { abilitiesCollection } from "../abilities/origins"; +import { servicesCollection } from "../services/origins"; +import { logs } from "./origins"; -export const logs = new origins.Api( - "/logs", - {}, - { - ...authConfig, - defaultValue: [] - } -); +const NUMBER_OF_LOGS = 100; export const lastLogs = new Selector( logs, @@ -35,7 +27,7 @@ export const lastLogsDetails = new Selector( dateTime: formatDate(log.createdAt), module: (service && service.name) || "-", ability: (ability && ability.name) || "-", - data: display(log.data) + data: displayValue(log.data) }; }); }, diff --git a/src/data-layer/services/service/origins.js b/src/data-layer/services/service/origins.js new file mode 100644 index 0000000..6918dce --- /dev/null +++ b/src/data-layer/services/service/origins.js @@ -0,0 +1,20 @@ +import { origins } from "reactive-data-source"; + +import { authConfig } from "../../setup"; + +import { byIdFilter } from "../../helpers"; + +// SERVICE MODELS + +export const serviceModels = new origins.Api( + "/services/:id", + {}, + { + ...authConfig, + defaultValue: {} + } +); + +serviceModels.addCustomFilter({ + byId: byIdFilter +}); diff --git a/src/data-layer/services/services/filters.js b/src/data-layer/services/services/filters.js new file mode 100644 index 0000000..0083734 --- /dev/null +++ b/src/data-layer/services/services/filters.js @@ -0,0 +1,9 @@ +export const typeFilter = serviceType => { + if (serviceType && serviceType.length) { + return { + query: { + type: serviceType + } + }; + } +}; diff --git a/src/data-layer/services/services/origins.js b/src/data-layer/services/services/origins.js new file mode 100644 index 0000000..7f6b8b8 --- /dev/null +++ b/src/data-layer/services/services/origins.js @@ -0,0 +1,20 @@ +import { origins } from "reactive-data-source"; + +import { authConfig } from "../../setup"; + +import { typeFilter } from "./filters"; + +// SERVICES COLLECTION + +export const servicesCollection = new origins.Api( + "/services", + {}, + { + ...authConfig, + defaultValue: [] + } +); + +servicesCollection.addCustomFilter({ + type: typeFilter +}); diff --git a/src/data-layer/services/services/selectors.js b/src/data-layer/services/services/selectors.js new file mode 100644 index 0000000..d6bb088 --- /dev/null +++ b/src/data-layer/services/services/selectors.js @@ -0,0 +1,62 @@ +import { Selector } from "reactive-data-source"; +import sortBy from "lodash.sortby"; + +import { servicesCollection } from "./origins"; + +import { typeFilter } from "./filters"; + +export const modulesCollection = new Selector( + { + source: servicesCollection, + filter: () => typeFilter("module") + }, + servicesResults => servicesResults, + [] +); + +export const pluginsCollection = new Selector( + { + source: servicesCollection, + filter: () => typeFilter("plugin") + }, + servicesResults => servicesResults, + [] +); + +const searchByNameAndDesc = (servicesResults, search) => { + if (!search) { + return servicesResults; + } + return servicesResults.filter( + service => service.name.indexOf(search) > -1 || service.description.indexOf(search) > -1 + ); +}; + +export const modulesCollectionFiltered = new Selector(modulesCollection, searchByNameAndDesc, []); +export const pluginsCollectionFiltered = new Selector(pluginsCollection, searchByNameAndDesc, []); + +const sortAndOrderBy = (servicesResults, filter) => { + const results = sortBy(servicesResults, (filter && filter.sortBy) || "name"); + if (filter.reverse) { + return results.reverse(); + } + return results; +}; + +export const modulesCollectionFilteredAndSorted = new Selector( + { + source: modulesCollectionFiltered, + filter: ({ search }) => search + }, + sortAndOrderBy, + [] +); + +export const pluginsCollectionFilteredAndSorted = new Selector( + { + source: pluginsCollectionFiltered, + filter: ({ search }) => search + }, + sortAndOrderBy, + [] +); diff --git a/src/data-layer/authentication/index.js b/src/data-layer/users/authentication/origins.js similarity index 90% rename from src/data-layer/authentication/index.js rename to src/data-layer/users/authentication/origins.js index 11b7470..f964435 100644 --- a/src/data-layer/authentication/index.js +++ b/src/data-layer/users/authentication/origins.js @@ -1,6 +1,6 @@ import { origins } from "reactive-data-source"; -import { baseConfig } from "../setup"; +import { baseConfig } from "../../setup"; // AUTHENTICATION SESSION diff --git a/src/data-layer/users/avatar.js b/src/data-layer/users/avatar.js deleted file mode 100644 index c0c7a15..0000000 --- a/src/data-layer/users/avatar.js +++ /dev/null @@ -1,34 +0,0 @@ -import md5 from "md5"; -import { origins, Selector } from "reactive-data-source"; - -export const gravatar = new origins.Api( - "https://www.gravatar.com/avatar/:hash", - {}, - { - fullResponse: true, - validateStatus: () => true - } -); - -export const byEmailFilter = (email = "") => ({ - params: { - hash: md5(email.toLowerCase()) - }, - query: { - d: 404 - } -}); - -export const userAvatar = new Selector( - { - source: gravatar, - filter: filter => filter - }, - gravatarResponse => ({ - avatar: gravatarResponse.status === 200 ? gravatarResponse.request.responseURL : null - }) -); - -userAvatar.addCustomFilter({ - byEmail: byEmailFilter -}); diff --git a/src/data-layer/users/avatar/filters.js b/src/data-layer/users/avatar/filters.js new file mode 100644 index 0000000..56c09b2 --- /dev/null +++ b/src/data-layer/users/avatar/filters.js @@ -0,0 +1,10 @@ +import md5 from "md5"; + +export const byEmailFilter = (email = "") => ({ + params: { + hash: md5(email.toLowerCase()) + }, + query: { + d: 404 + } +}); diff --git a/src/data-layer/users/avatar/origins.js b/src/data-layer/users/avatar/origins.js new file mode 100644 index 0000000..01db4d6 --- /dev/null +++ b/src/data-layer/users/avatar/origins.js @@ -0,0 +1,10 @@ +import { origins } from "reactive-data-source"; + +export const gravatar = new origins.Api( + "https://www.gravatar.com/avatar/:hash", + {}, + { + fullResponse: true, + validateStatus: () => true + } +); diff --git a/src/data-layer/users/avatar/selectors.js b/src/data-layer/users/avatar/selectors.js new file mode 100644 index 0000000..d787db8 --- /dev/null +++ b/src/data-layer/users/avatar/selectors.js @@ -0,0 +1,19 @@ +import { Selector } from "reactive-data-source"; + +import { byEmailFilter } from "./filters"; + +import { gravatar } from "./origins"; + +export const userAvatar = new Selector( + { + source: gravatar, + filter: filter => filter + }, + gravatarResponse => ({ + avatar: gravatarResponse.status === 200 ? gravatarResponse.request.responseURL : null + }) +); + +userAvatar.addCustomFilter({ + byEmail: byEmailFilter +}); diff --git a/src/data-layer/users/collection.js b/src/data-layer/users/collection.js deleted file mode 100644 index 0c74714..0000000 --- a/src/data-layer/users/collection.js +++ /dev/null @@ -1,87 +0,0 @@ -import { origins, Selector } from "reactive-data-source"; -import sortBy from "lodash.sortby"; - -import { authConfig } from "../setup"; -import { roles } from "../roles"; - -import { isSystemRole } from "./helpers"; - -export const usersCollection = new origins.Api( - "/users", - { - create: true - }, - { - ...authConfig, - defaultValue: [] - } -); - -export const usersCollectionWithExtraData = new Selector( - usersCollection, - roles, - (usersResults, rolesResults) => { - return usersResults.map(user => ({ - ...user, - isSystemRole: isSystemRole(user, rolesResults) - })); - }, - [] -); - -const exactSearchBy = (usersResults, { email, name }) => { - return usersResults.filter(user => { - let matchKeys = 0; - let matches = 0; - if (email) { - matchKeys++; - if (user.email === email) { - matches++; - } - } - if (name) { - matchKeys++; - if (user.name === name) { - matches++; - } - } - return matchKeys === matches; - }); -}; - -export const usersCollectionExactFiltered = new Selector(usersCollection, exactSearchBy, []); - -const searchBy = (usersResults, { search, showSystem }) => { - return usersResults.filter(user => { - if (!showSystem && user.isSystemRole) { - return false; - } - if (!search) { - return true; - } - return ( - user.name.indexOf(search) > -1 || - (user.email && user.email.indexOf(search) > -1) || - user.role.indexOf(search) > -1 - ); - }); -}; - -export const usersCollectionFiltered = new Selector(usersCollectionWithExtraData, searchBy, []); - -const sortAndOrderBy = (usersResults, filter) => { - const results = sortBy(usersResults, (filter && filter.sortBy) || "name"); - if (filter.reverse) { - return results.reverse(); - } - return results; -}; - -export const usersCollectionFilteredAndSorted = new Selector( - { - source: usersCollectionFiltered, - filter: ({ search, showSystem }) => ({ search, showSystem }) - }, - sortAndOrderBy, - [] -); diff --git a/src/data-layer/users/index.js b/src/data-layer/users/index.js index 782c4bf..f7f83bf 100644 --- a/src/data-layer/users/index.js +++ b/src/data-layer/users/index.js @@ -1,44 +1,14 @@ -import { userMe, userMeWithExtraData, userMeIsAdmin } from "./me"; -import { - usersCollection, - usersCollectionExactFiltered, - usersCollectionFilteredAndSorted -} from "./collection"; -import { usersModels, usersModelsWithExtraData, userAllowedRoles } from "./model"; - -import { - isValidUserName, - isValidUserEmail, - isUserNameRepeated, - isUserEmailRepeated -} from "./validations"; - -import { userAvatar } from "./avatar"; - -usersModels.onChangeAny(changeDetails => { - if ( - [usersModels.actions.delete.success, usersModels.actions.update.success].includes( - changeDetails.action - ) - ) { - usersCollection.clean(); - userMe.clean(); - } -}); - -export { - userMe, - userMeWithExtraData, - userMeIsAdmin, - userAvatar, - usersCollection, - usersCollectionExactFiltered, - usersCollectionFilteredAndSorted, - usersModels, - usersModelsWithExtraData, - userAllowedRoles, - isValidUserName, - isValidUserEmail, - isUserNameRepeated, - isUserEmailRepeated -}; +import "./listeners"; + +export * from "./authentication/origins"; +export * from "./avatar/origins"; +export * from "./avatar/selectors"; +export * from "./me/origins"; +export * from "./me/selectors"; +export * from "./roles/origins"; +export * from "./roles/selectors"; +export * from "./user/origins"; +export * from "./user/selectors"; +export * from "./users/origins"; +export * from "./users/selectors"; +export * from "./users/validators"; diff --git a/src/data-layer/users/listeners.js b/src/data-layer/users/listeners.js new file mode 100644 index 0000000..143fc0d --- /dev/null +++ b/src/data-layer/users/listeners.js @@ -0,0 +1,14 @@ +import { userModels } from "./user/origins"; +import { usersCollection } from "./users/origins"; +import { userMe } from "./me/origins"; + +userModels.onChangeAny(changeDetails => { + if ( + [userModels.actions.delete.success, userModels.actions.update.success].includes( + changeDetails.action + ) + ) { + usersCollection.clean(); + userMe.clean(); + } +}); diff --git a/src/data-layer/users/me/origins.js b/src/data-layer/users/me/origins.js new file mode 100644 index 0000000..46eb81e --- /dev/null +++ b/src/data-layer/users/me/origins.js @@ -0,0 +1,12 @@ +import { origins } from "reactive-data-source"; + +import { authConfig } from "../../setup"; + +export const userMe = new origins.Api( + "/users/me", + {}, + { + ...authConfig, + defaultValue: {} + } +); diff --git a/src/data-layer/users/me.js b/src/data-layer/users/me/selectors.js similarity index 56% rename from src/data-layer/users/me.js rename to src/data-layer/users/me/selectors.js index 2bcb1c3..a6ced4c 100644 --- a/src/data-layer/users/me.js +++ b/src/data-layer/users/me/selectors.js @@ -1,19 +1,11 @@ -import { origins, Selector } from "reactive-data-source"; +import { Selector } from "reactive-data-source"; -import { authConfig } from "../setup"; -import { roles } from "../roles"; +import { isSystemRole } from "../helpers"; +import { userAvatar } from "../avatar/selectors"; +import { byEmailFilter } from "../avatar/filters"; +import { roles } from "../roles/origins"; -import { userAvatar, byEmailFilter } from "./avatar"; -import { isSystemRole } from "./helpers"; - -export const userMe = new origins.Api( - "/users/me", - {}, - { - ...authConfig, - defaultValue: {} - } -); +import { userMe } from "./origins"; export const userMeWithExtraData = new Selector( userMe, diff --git a/src/data-layer/roles/index.js b/src/data-layer/users/roles/origins.js similarity index 64% rename from src/data-layer/roles/index.js rename to src/data-layer/users/roles/origins.js index 2a330cb..405950d 100644 --- a/src/data-layer/roles/index.js +++ b/src/data-layer/users/roles/origins.js @@ -1,4 +1,4 @@ -import { origins, Selector } from "reactive-data-source"; +import { origins } from "reactive-data-source"; const ROLES = [ { @@ -24,9 +24,3 @@ const ROLES = [ ]; export const roles = new origins.MemoryStorage("roles", ROLES); - -export const nonSystemRoles = new Selector( - roles, - rolesResults => rolesResults.filter(role => !role.isSystem), - [] -); diff --git a/src/data-layer/users/roles/selectors.js b/src/data-layer/users/roles/selectors.js new file mode 100644 index 0000000..b1012ba --- /dev/null +++ b/src/data-layer/users/roles/selectors.js @@ -0,0 +1,9 @@ +import { Selector } from "reactive-data-source"; + +import { roles } from "./origins"; + +export const nonSystemRoles = new Selector( + roles, + rolesResults => rolesResults.filter(role => !role.isSystem), + [] +); diff --git a/src/data-layer/users/user/origins.js b/src/data-layer/users/user/origins.js new file mode 100644 index 0000000..710aafd --- /dev/null +++ b/src/data-layer/users/user/origins.js @@ -0,0 +1,20 @@ +import { origins } from "reactive-data-source"; + +import { authConfig } from "../../setup"; +import { byIdFilter } from "../../helpers"; + +export const userModels = new origins.Api( + "/users/:id", + { + update: true, + delete: true + }, + { + ...authConfig, + defaultValue: {} + } +); + +userModels.addCustomFilter({ + byId: byIdFilter +}); diff --git a/src/data-layer/users/model.js b/src/data-layer/users/user/selectors.js similarity index 53% rename from src/data-layer/users/model.js rename to src/data-layer/users/user/selectors.js index b0f4a51..e6c62e8 100644 --- a/src/data-layer/users/model.js +++ b/src/data-layer/users/user/selectors.js @@ -1,31 +1,18 @@ -import { origins, Selector } from "reactive-data-source"; +import { Selector } from "reactive-data-source"; -import { authConfig } from "../setup"; -import { roles } from "../roles"; +import { byIdFilter } from "../../helpers"; -import { byIdFilter } from "../helpers"; -import { isSystemRole } from "./helpers"; -import { userAvatar, byEmailFilter } from "./avatar"; +import { isSystemRole } from "../helpers"; +import { roles } from "../roles/origins"; -export const usersModels = new origins.Api( - "/users/:id", - { - update: true, - delete: true - }, - { - ...authConfig, - defaultValue: {} - } -); +import { userAvatar } from "../avatar/selectors"; +import { byEmailFilter } from "../avatar/filters"; -usersModels.addCustomFilter({ - byId: byIdFilter -}); +import { userModels } from "./origins"; -export const usersModelsWithExtraData = new Selector( +export const userModelsWithExtraData = new Selector( { - source: usersModels, + source: userModels, filter: id => byIdFilter(id) }, { @@ -43,14 +30,14 @@ export const usersModelsWithExtraData = new Selector( {} ); -usersModelsWithExtraData.addCustomFilter({ +userModelsWithExtraData.addCustomFilter({ byId: id => id }); export const userAllowedRoles = new Selector( roles, { - source: usersModelsWithExtraData, + source: userModelsWithExtraData, filter: id => id }, (rolesResults, userResults) => { diff --git a/src/data-layer/users/users/origins.js b/src/data-layer/users/users/origins.js new file mode 100644 index 0000000..c6964db --- /dev/null +++ b/src/data-layer/users/users/origins.js @@ -0,0 +1,14 @@ +import { origins } from "reactive-data-source"; + +import { authConfig } from "../../setup"; + +export const usersCollection = new origins.Api( + "/users", + { + create: true + }, + { + ...authConfig, + defaultValue: [] + } +); diff --git a/src/data-layer/users/users/selectors.js b/src/data-layer/users/users/selectors.js new file mode 100644 index 0000000..56a1bbd --- /dev/null +++ b/src/data-layer/users/users/selectors.js @@ -0,0 +1,78 @@ +import { sortBy } from "lodash"; +import { Selector } from "reactive-data-source"; + +import { roles } from "../roles/origins"; + +import { isSystemRole } from "../helpers"; +import { usersCollection } from "./origins"; + +export const usersCollectionWithExtraData = new Selector( + usersCollection, + roles, + (usersResults, rolesResults) => { + return usersResults.map(user => ({ + ...user, + isSystemRole: isSystemRole(user, rolesResults) + })); + }, + [] +); + +export const usersCollectionExactFiltered = new Selector( + usersCollection, + (usersResults, { email, name }) => { + return usersResults.filter(user => { + let matchKeys = 0; + let matches = 0; + if (email) { + matchKeys++; + if (user.email === email) { + matches++; + } + } + if (name) { + matchKeys++; + if (user.name === name) { + matches++; + } + } + return matchKeys === matches; + }); + }, + [] +); + +export const usersCollectionFiltered = new Selector( + usersCollectionWithExtraData, + (usersResults, { search, showSystem }) => { + return usersResults.filter(user => { + if (!showSystem && user.isSystemRole) { + return false; + } + if (!search) { + return true; + } + return ( + user.name.indexOf(search) > -1 || + (user.email && user.email.indexOf(search) > -1) || + user.role.indexOf(search) > -1 + ); + }); + }, + [] +); + +export const usersCollectionFilteredAndSorted = new Selector( + { + source: usersCollectionFiltered, + filter: ({ search, showSystem }) => ({ search, showSystem }) + }, + (usersResults, filter) => { + const results = sortBy(usersResults, (filter && filter.sortBy) || "name"); + if (filter.reverse) { + return results.reverse(); + } + return results; + }, + [] +); diff --git a/src/data-layer/users/validations.js b/src/data-layer/users/users/validators.js similarity index 90% rename from src/data-layer/users/validations.js rename to src/data-layer/users/users/validators.js index d353be6..628d471 100644 --- a/src/data-layer/users/validations.js +++ b/src/data-layer/users/users/validators.js @@ -1,4 +1,4 @@ -import { usersCollectionExactFiltered } from "./collection"; +import { usersCollectionExactFiltered } from "./selectors"; const NAME_REGEX = /^[a-z0-9_.-]*$/; diff --git a/src/modules/about/views/About.js b/src/modules/about/views/About.js index 2802b56..1f780d0 100644 --- a/src/modules/about/views/About.js +++ b/src/modules/about/views/About.js @@ -2,7 +2,7 @@ import { plugins } from "reactive-data-source"; import { Component as AboutComponent } from "../components/about"; -import { about } from "src/data-layer/about"; +import { about } from "src/data-layer/service"; export const mapDataSourceToProps = () => { return { diff --git a/src/modules/account/views/UpdateUser.js b/src/modules/account/views/UpdateUser.js index 5408bec..f67fafa 100644 --- a/src/modules/account/views/UpdateUser.js +++ b/src/modules/account/views/UpdateUser.js @@ -5,8 +5,8 @@ import { plugins } from "reactive-data-source"; import { Component as UserComponent } from "src/components/user"; import { - usersModels, - usersModelsWithExtraData, + userModels, + userModelsWithExtraData, userAllowedRoles, userMeIsAdmin, isValidUserName, @@ -16,8 +16,8 @@ import { } from "src/data-layer/users"; export const mapDataSourceToProps = ({ id }) => { - const readUser = usersModelsWithExtraData.byId(id).read; - const user = usersModels.byId(id); + const readUser = userModelsWithExtraData.byId(id).read; + const user = userModels.byId(id); const updateUser = user.update; const deleteUser = user.delete; diff --git a/src/modules/activity/views/Activity.js b/src/modules/activity/views/Activity.js index c82740a..f5b1cbc 100644 --- a/src/modules/activity/views/Activity.js +++ b/src/modules/activity/views/Activity.js @@ -2,7 +2,7 @@ import { plugins } from "reactive-data-source"; import { Component as ActivityComponent } from "../components/activity"; -import { lastLogsDetails } from "src/data-layer/logs"; +import { lastLogsDetails } from "src/data-layer/services"; export const mapDataSourceToProps = () => { return { diff --git a/src/modules/config/views/BaseConfig.js b/src/modules/config/views/BaseConfig.js index 67eb069..12ba2cf 100644 --- a/src/modules/config/views/BaseConfig.js +++ b/src/modules/config/views/BaseConfig.js @@ -2,7 +2,7 @@ import { plugins } from "reactive-data-source"; import { Component as ConfigComponent } from "../components/config"; -import { baseConfig } from "src/data-layer/config"; +import { baseConfig } from "src/data-layer/service"; export const mapDataSourceToProps = () => { return { diff --git a/src/modules/config/views/Config.js b/src/modules/config/views/Config.js index 832de39..6bfdd3a 100644 --- a/src/modules/config/views/Config.js +++ b/src/modules/config/views/Config.js @@ -5,7 +5,7 @@ import { plugins } from "reactive-data-source"; import { BaseConfig } from "./BaseConfig"; import { CustomConfig } from "./CustomConfig"; -import { customConfig } from "src/data-layer/config"; +import { customConfig } from "src/data-layer/service"; export const ConfigView = ({ customConfig }) => { const custom = customConfig.length ? ( diff --git a/src/modules/config/views/CustomConfig.js b/src/modules/config/views/CustomConfig.js index ab5afd8..6f5cf2c 100644 --- a/src/modules/config/views/CustomConfig.js +++ b/src/modules/config/views/CustomConfig.js @@ -2,7 +2,7 @@ import { plugins } from "reactive-data-source"; import { Component as ConfigComponent } from "../components/config"; -import { customConfig } from "src/data-layer/config"; +import { customConfig } from "src/data-layer/service"; export const mapDataSourceToProps = () => { return { diff --git a/src/modules/login/views/Login.js b/src/modules/login/views/Login.js index 245bac5..a6f439f 100644 --- a/src/modules/login/views/Login.js +++ b/src/modules/login/views/Login.js @@ -2,7 +2,7 @@ import { plugins } from "reactive-data-source"; import { Component as LoginComponent } from "../components/login"; -import { authSession, authJwt } from "src/data-layer/authentication"; +import { authSession, authJwt } from "src/data-layer/users"; import { setApiKeyAuth, setJwtAuth } from "src/data-layer/setup"; let config; diff --git a/src/modules/modules/views/Module.js b/src/modules/modules/views/Module.js index abb9b88..9dc110f 100644 --- a/src/modules/modules/views/Module.js +++ b/src/modules/modules/views/Module.js @@ -2,11 +2,11 @@ import { plugins } from "reactive-data-source"; import { Component as ModuleComponent } from "../components/module"; -import { servicesModel } from "src/data-layer/services"; -import { abilitiesCollection } from "src/data-layer/abilities"; +import { serviceModels } from "src/data-layer/services"; +import { abilitiesCollection } from "src/data-layer/services"; export const mapDataSourceToProps = ({ id }) => { - const module = servicesModel.byId(id).read; + const module = serviceModels.byId(id).read; const abilities = abilitiesCollection.ofService(id).read; return { abilities: abilities.getters.value, diff --git a/src/modules/plugins/views/Plugin.js b/src/modules/plugins/views/Plugin.js index 8e4af0e..114f371 100644 --- a/src/modules/plugins/views/Plugin.js +++ b/src/modules/plugins/views/Plugin.js @@ -2,10 +2,10 @@ import { plugins } from "reactive-data-source"; import { Component as PluginComponent } from "../components/plugin"; -import { servicesModel } from "src/data-layer/services"; +import { serviceModels } from "src/data-layer/services"; export const mapDataSourceToProps = ({ id }) => { - const source = servicesModel.byId(id).read; + const source = serviceModels.byId(id).read; return { plugin: source.getters.value, pluginLoading: source.getters.loading, diff --git a/src/modules/users/views/CreateOrUpdateUser.js b/src/modules/users/views/CreateOrUpdateUser.js index 9e8fa0c..6eccb3f 100644 --- a/src/modules/users/views/CreateOrUpdateUser.js +++ b/src/modules/users/views/CreateOrUpdateUser.js @@ -4,7 +4,7 @@ import { pickBy, identity } from "lodash"; import { UpdateUser } from "./UpdateUser"; import { CreateUser } from "./CreateUser"; -import { usersCollection, usersModels, usersCollectionExactFiltered } from "src/data-layer/users"; +import { usersCollection, userModels, usersCollectionExactFiltered } from "src/data-layer/users"; export class CreateOrUpdateUser extends Component { constructor(props) { @@ -42,7 +42,7 @@ export class CreateOrUpdateUser extends Component { ...state, deleting: true })); - usersModels + userModels .byId(this.userId()) .delete() .then(() => { diff --git a/src/modules/users/views/CreateUser.js b/src/modules/users/views/CreateUser.js index 44c0601..99db747 100644 --- a/src/modules/users/views/CreateUser.js +++ b/src/modules/users/views/CreateUser.js @@ -10,7 +10,7 @@ import { isUserNameRepeated, isUserEmailRepeated } from "src/data-layer/users"; -import { nonSystemRoles } from "src/data-layer/roles"; +import { nonSystemRoles } from "src/data-layer/users"; export const mapDataSourceToProps = () => { return { diff --git a/src/modules/users/views/UpdateUser.js b/src/modules/users/views/UpdateUser.js index 2c9f006..4a081e6 100644 --- a/src/modules/users/views/UpdateUser.js +++ b/src/modules/users/views/UpdateUser.js @@ -5,8 +5,8 @@ import { plugins } from "reactive-data-source"; import { Component as UserComponent } from "src/components/user"; import { - usersModels, - usersModelsWithExtraData, + userModels, + userModelsWithExtraData, userAllowedRoles, userMeIsAdmin, isValidUserName, @@ -16,8 +16,8 @@ import { } from "src/data-layer/users"; export const mapDataSourceToProps = ({ id, deleting }) => { - const readUser = usersModelsWithExtraData.byId(id).read; - const user = usersModels.byId(id); + const readUser = userModelsWithExtraData.byId(id).read; + const user = userModels.byId(id); const updateUser = user.update; const deleteUser = user.delete;