outline/app/stores/RootStore.ts

143 lines
4.8 KiB
TypeScript

import invariant from "invariant";
import lowerFirst from "lodash/lowerFirst";
import pluralize from "pluralize";
import ApiKeysStore from "./ApiKeysStore";
import AuthStore from "./AuthStore";
import AuthenticationProvidersStore from "./AuthenticationProvidersStore";
import CollectionsStore from "./CollectionsStore";
import CommentsStore from "./CommentsStore";
import DialogsStore from "./DialogsStore";
import DocumentPresenceStore from "./DocumentPresenceStore";
import DocumentsStore from "./DocumentsStore";
import EventsStore from "./EventsStore";
import FileOperationsStore from "./FileOperationsStore";
import GroupMembershipsStore from "./GroupMembershipsStore";
import GroupUsersStore from "./GroupUsersStore";
import GroupsStore from "./GroupsStore";
import IntegrationsStore from "./IntegrationsStore";
import MembershipsStore from "./MembershipsStore";
import NotificationsStore from "./NotificationsStore";
import PinsStore from "./PinsStore";
import PoliciesStore from "./PoliciesStore";
import RevisionsStore from "./RevisionsStore";
import SearchesStore from "./SearchesStore";
import SharesStore from "./SharesStore";
import StarsStore from "./StarsStore";
import SubscriptionsStore from "./SubscriptionsStore";
import UiStore from "./UiStore";
import UserMembershipsStore from "./UserMembershipsStore";
import UsersStore from "./UsersStore";
import ViewsStore from "./ViewsStore";
import WebhookSubscriptionsStore from "./WebhookSubscriptionStore";
import Store from "./base/Store";
export default class RootStore {
apiKeys: ApiKeysStore;
auth: AuthStore;
authenticationProviders: AuthenticationProvidersStore;
collections: CollectionsStore;
groupMemberships: GroupMembershipsStore;
comments: CommentsStore;
dialogs: DialogsStore;
documents: DocumentsStore;
events: EventsStore;
groups: GroupsStore;
groupUsers: GroupUsersStore;
integrations: IntegrationsStore;
memberships: MembershipsStore;
notifications: NotificationsStore;
presence: DocumentPresenceStore;
pins: PinsStore;
policies: PoliciesStore;
revisions: RevisionsStore;
searches: SearchesStore;
shares: SharesStore;
ui: UiStore;
stars: StarsStore;
subscriptions: SubscriptionsStore;
users: UsersStore;
views: ViewsStore;
fileOperations: FileOperationsStore;
webhookSubscriptions: WebhookSubscriptionsStore;
userMemberships: UserMembershipsStore;
constructor() {
// Models
this.registerStore(ApiKeysStore);
this.registerStore(AuthenticationProvidersStore);
this.registerStore(CollectionsStore);
this.registerStore(GroupMembershipsStore);
this.registerStore(CommentsStore);
this.registerStore(DocumentsStore);
this.registerStore(EventsStore);
this.registerStore(GroupsStore);
this.registerStore(GroupUsersStore);
this.registerStore(IntegrationsStore);
this.registerStore(MembershipsStore);
this.registerStore(NotificationsStore);
this.registerStore(PinsStore);
this.registerStore(PoliciesStore);
this.registerStore(RevisionsStore);
this.registerStore(SearchesStore);
this.registerStore(SharesStore);
this.registerStore(StarsStore);
this.registerStore(SubscriptionsStore);
this.registerStore(UsersStore);
this.registerStore(ViewsStore);
this.registerStore(FileOperationsStore);
this.registerStore(WebhookSubscriptionsStore);
this.registerStore(UserMembershipsStore);
// Non-models
this.registerStore(DocumentPresenceStore, "presence");
this.registerStore(DialogsStore, "dialogs");
this.registerStore(UiStore, "ui");
// AuthStore must be initialized last as it makes use of the other stores.
this.registerStore(AuthStore, "auth");
}
/**
* Get a store by model name.
*
* @param modelName
*/
public getStoreForModelName<K extends keyof RootStore>(modelName: string) {
const storeName = this.getStoreNameForModelName(modelName);
const store = this[storeName];
invariant(store, `No store found for model name "${modelName}"`);
return store as RootStore[K];
}
/**
* Clear all data from the stores except for auth and ui.
*/
public clear() {
Object.getOwnPropertyNames(this)
.filter((key) => ["auth", "ui"].includes(key) === false)
.forEach((key: keyof RootStore) => {
// @ts-expect-error clear exists on all stores
"clear" in this[key] && this[key].clear();
});
}
/**
* Register a store with the root store.
*
* @param StoreClass
*/
private registerStore<T = typeof Store>(
StoreClass: T,
name?: keyof RootStore
) {
// @ts-expect-error TS thinks we are instantiating an abstract class.
const store = new StoreClass(this);
const storeName = name ?? this.getStoreNameForModelName(store.modelName);
this[storeName] = store;
}
private getStoreNameForModelName(modelName: string) {
return pluralize(lowerFirst(modelName)) as keyof RootStore;
}
}