diff --git a/client/src/store/authentication/authentication.reducer.js b/client/src/store/authentication/authentication.reducer.js
index 4cd2f0adc..12db81283 100644
--- a/client/src/store/authentication/authentication.reducer.js
+++ b/client/src/store/authentication/authentication.reducer.js
@@ -4,6 +4,7 @@ import t from 'store/types';
const initialState = {
token: '',
organization: '',
+ organizationId: null,
user: '',
tenant: {},
locale: '',
@@ -16,6 +17,7 @@ export default createReducer(initialState, {
state.token = token;
state.user = user;
state.organization = tenant.organization_id;
+ state.organizationId = tenant.id;
state.tenant = tenant;
},
diff --git a/client/src/store/organizations/organizations.actions.js b/client/src/store/organizations/organizations.actions.js
index 8f6b84934..3cbb39f22 100644
--- a/client/src/store/organizations/organizations.actions.js
+++ b/client/src/store/organizations/organizations.actions.js
@@ -13,18 +13,38 @@ export const fetchOrganizations = () => (dispatch) => new Promise((resolve, reje
}).catch(error => { reject(error); });
});
-export const buildTenant = () => (dispatch) => new Promise((resolve, reject) => {
+export const buildTenant = () => (dispatch, getState) => new Promise((resolve, reject) => {
+ const organizationId = getState().authentication.organizationId;
+
+ dispatch({
+ type: t.SET_ORGANIZATION_INITIALIZING,
+ payload: { organizationId }
+ });
ApiService.post(`organization/build`).then((response) => {
resolve(response);
+ dispatch({
+ type: t.SET_ORGANIZATION_INITIALIZED,
+ payload: { organizationId }
+ });
})
.catch((error) => {
reject(error.response.data.errors || []);
});
});
-export const seedTenant = () => (dispatch) => new Promise((resolve, reject) => {
+export const seedTenant = () => (dispatch, getState) => new Promise((resolve, reject) => {
+ const organizationId = getState().authentication.organizationId;
+
+ dispatch({
+ type: t.SET_ORGANIZATION_INITIALIZING,
+ payload: { organizationId }
+ });
ApiService.post(`organization/seed/`).then((response) => {
resolve(response);
+ dispatch({
+ type: t.SET_ORGANIZATION_INITIALIZED,
+ payload: { organizationId }
+ });
})
.catch((error) => {
reject(error.response.data.errors || []);
diff --git a/client/src/store/organizations/organizations.reducers.js b/client/src/store/organizations/organizations.reducers.js
index b8407108d..5f1d1f848 100644
--- a/client/src/store/organizations/organizations.reducers.js
+++ b/client/src/store/organizations/organizations.reducers.js
@@ -20,6 +20,44 @@ const reducer = createReducer(initialState, {
state.data = _data;
state.byOrganizationId = _dataByOrganizationId;
},
+
+ [t.SET_ORGANIZATION_SEEDING]: (state, action) => {
+ const { organizationId } = action.payload;
+
+ state.data[organizationId] = {
+ ...(state.data[organizationId] || {}),
+ is_seeding: true,
+ };
+ },
+
+ [t.SET_ORGANIZATION_SEEDED]: (state, action) => {
+ const { organizationId } = action.payload;
+
+ state.data[organizationId] = {
+ ...(state.data[organizationId] || {}),
+ is_seeding: false,
+ seeded_at: new Date().toISOString(),
+ };
+ },
+
+ [t.SET_ORGANIZATION_INITIALIZING]: (state, action) => {
+ const { organizationId } = action.payload;
+
+ state.data[organizationId] = {
+ ...(state.data[organizationId] || {}),
+ is_initializing: true,
+ };
+ },
+
+ [t.SET_ORGANIZATION_INITIALIZED]: (state, action) => {
+ const { organizationId } = action.payload;
+
+ state.data[organizationId] = {
+ ...(state.data[organizationId] || {}),
+ is_initializing: false,
+ initialized_at: new Date().toISOString(),
+ };
+ },
})
export default reducer;
\ No newline at end of file
diff --git a/client/src/store/organizations/organizations.selectors.js b/client/src/store/organizations/organizations.selectors.js
index e4a2ba6da..a8b751a8e 100644
--- a/client/src/store/organizations/organizations.selectors.js
+++ b/client/src/store/organizations/organizations.selectors.js
@@ -1,18 +1,50 @@
import { createSelector } from '@reduxjs/toolkit';
-const oragnizationByTenantIdSelector = (state, props) => state.organizations[props.tenantId];
-const organizationByIdSelector = (state, props) => state.organizations.byOrganizationId[props.organizationId];
-const organizationsDataSelector = (state, props) => state.organizations.data;
+const organizationSelector = (state, props) => state.organizations.data[props.organizationId];
-export const getOrganizationByOrgIdFactory = () => createSelector(
- organizationByIdSelector,
- organizationsDataSelector,
- (organizationId, organizationsData) => {
- return organizationsData[organizationId];
- }
+export const getOrganizationByIdFactory = () => createSelector(
+ organizationSelector,
+ (organization) => organization
);
-export const getOrganizationByTenantIdFactory = () => createSelector(
- oragnizationByTenantIdSelector,
- (organization) => organization,
-);
\ No newline at end of file
+export const isOrganizationSeededFactory = () => createSelector(
+ organizationSelector,
+ (organization) => {
+ return !!organization?.seeded_at;
+ },
+);
+
+export const isOrganizationBuiltFactory = () => createSelector(
+ organizationSelector,
+ (organization) => {
+ return !!organization?.initialized_at;
+ },
+);
+
+export const isOrganizationInitializingFactory = () => createSelector(
+ organizationSelector,
+ (organization) => {
+ return organization?.is_initializing;
+ },
+);
+
+export const isOrganizationSeedingFactory = () => createSelector(
+ organizationSelector,
+ (organization) => {
+ return organization?.is_seeding;
+ },
+);
+
+export const isOrganizationReadyFactory = () => createSelector(
+ organizationSelector,
+ (organization) => {
+ return organization?.is_ready;
+ },
+);
+
+export const isOrganizationSubscribedFactory = () => createSelector(
+ organizationSelector,
+ (organization) => {
+ return organization?.subscriptions?.length > 0;
+ }
+)
\ No newline at end of file
diff --git a/client/src/store/organizations/organizations.types.js b/client/src/store/organizations/organizations.types.js
index 1b9d47692..924ea7238 100644
--- a/client/src/store/organizations/organizations.types.js
+++ b/client/src/store/organizations/organizations.types.js
@@ -1,5 +1,10 @@
-
export default {
ORGANIZATIONS_LIST_SET: 'ORGANIZATIONS_LIST_SET',
+
+ SET_ORGANIZATION_SEEDING: 'SET_ORGANIZATION_SEEDING',
+ SET_ORGANIZATION_SEEDED: 'SET_ORGANIZATION_SEEDED',
+
+ SET_ORGANIZATION_INITIALIZED: 'SET_ORGANIZATION_INITIALIZED',
+ SET_ORGANIZATION_INITIALIZING: 'SET_ORGANIZATION_INITIALIZING',
};
\ No newline at end of file
diff --git a/server/src/database/seeds/core/20200810121807_seed_views.js b/server/src/database/seeds/core/20200810121807_seed_views.js
index 5e945978c..19da37d7b 100644
--- a/server/src/database/seeds/core/20200810121807_seed_views.js
+++ b/server/src/database/seeds/core/20200810121807_seed_views.js
@@ -1,3 +1,5 @@
+import Container from 'typedi';
+import TenancyService from 'services/Tenancy/TenancyService'
exports.up = (knex) => {
const tenancyService = Container.get(TenancyService);
diff --git a/server/src/services/Authentication/index.ts b/server/src/services/Authentication/index.ts
index 12ccab4ec..5a97bc254 100644
--- a/server/src/services/Authentication/index.ts
+++ b/server/src/services/Authentication/index.ts
@@ -87,9 +87,6 @@ export default class AuthenticationService implements IAuthenticationService {
// Remove password property from user object.
Reflect.deleteProperty(user, 'password');
- // Remove id property from tenant object.
- Reflect.deleteProperty(tenant, 'id');
-
return { user, token, tenant };
}