Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.mdns.eu/nextcloud/passwords-client.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius David Wieschollek <passwords.public@mdns.eu>2020-12-02 02:08:30 +0300
committerMarius David Wieschollek <passwords.public@mdns.eu>2020-12-02 02:08:30 +0300
commit16ac1f3d221b49b09001bda1d5f1194c5a7cafdd (patch)
tree1b649deddff18be74f0bb309573283a7d122b202 /src/ClassLoader
parenta64a98d9bee2db06a270f418692c81b417437baf (diff)
Refactor class loading system
Signed-off-by: Marius David Wieschollek <passwords.public@mdns.eu>
Diffstat (limited to 'src/ClassLoader')
-rw-r--r--src/ClassLoader/BaseClassLoader.js95
-rw-r--r--src/ClassLoader/DefaultClassLoader.js161
-rw-r--r--src/ClassLoader/EnhancedClassLoader.js20
3 files changed, 276 insertions, 0 deletions
diff --git a/src/ClassLoader/BaseClassLoader.js b/src/ClassLoader/BaseClassLoader.js
new file mode 100644
index 0000000..067536c
--- /dev/null
+++ b/src/ClassLoader/BaseClassLoader.js
@@ -0,0 +1,95 @@
+import ObjectMerger from "../Utility/ObjectMerger";
+
+export default class BaseClassLoader {
+
+ constructor(classes = {}) {
+ this._classes = ObjectMerger.merge(this._getDefaultClasses(), classes);
+ this._instances = {};
+ }
+
+
+ /**
+ *
+ * @param {String} name
+ * @param {*} properties
+ * @return {Object}
+ * @api
+ */
+ getInstance(name, ...properties) {
+ if(!this._instances.hasOwnProperty(name) || !this._instances[name]) {
+ this._instances[name] = this.getClass(name, ...properties);
+ }
+
+ return this._instances[name];
+ }
+
+ /**
+ *
+ * @param {String} name
+ * @param {Object} object
+ * @return {BaseClassLoader}
+ * @api
+ */
+ setInstance(name, object) {
+ this._instances[name] = object;
+
+ return this;
+ }
+
+ /**
+ *
+ * @param {String} name
+ * @param {*} properties
+ * @return {Object}
+ */
+ getClass(name, ...properties) {
+ let path = name.split('.');
+
+ if(!this._classes.hasOwnProperty(path[0]) || !this._classes[path[0]].hasOwnProperty(path[1])) {
+ throw new Error(`The class ${name} does not exist`);
+ }
+
+ let creator = this._classes[path[0]][path[1]];
+ if(creator instanceof Function) {
+ if(!creator.prototype || creator.hasOwnProperty('arguments') && creator.hasOwnProperty('caller')) {
+ return creator(...properties);
+ }
+
+ return new creator(...properties);
+ } else {
+ return creator;
+ }
+ }
+
+ /**
+ *
+ * @param {String} name
+ * @param {Object} constructor
+ * @return {BaseClassLoader}
+ * @api
+ */
+ registerClass(name, constructor) {
+ let path = name.split('.');
+
+ if(!this._classes.hasOwnProperty(path[0])) {
+ this._classes[path[0]] = {};
+ }
+
+ if(!this._classes[path[0]].hasOwnProperty(path[1])) {
+ this._classes[path[1]] = {};
+ }
+
+ this._classes[path[0]][path[1]] = constructor;
+
+ return this;
+ }
+
+ /**
+ *
+ * @return {Object}
+ * @protected
+ */
+ _getDefaultClasses() {
+ return {};
+ }
+} \ No newline at end of file
diff --git a/src/ClassLoader/DefaultClassLoader.js b/src/ClassLoader/DefaultClassLoader.js
new file mode 100644
index 0000000..47ff54c
--- /dev/null
+++ b/src/ClassLoader/DefaultClassLoader.js
@@ -0,0 +1,161 @@
+import PasswordRepository from "../Repositories/PasswordRepository";
+import FolderRepository from "../Repositories/FolderRepository";
+import TagRepository from "../Repositories/TagRepository";
+import SettingRepository from "../Repositories/SettingRepository";
+import PasswordCollection from "../Collection/PasswordCollection";
+import FolderCollection from "../Collection/FolderCollection";
+import CustomFieldCollection from "../Collection/CustomFieldCollection";
+import TagCollection from "../Collection/TagCollection";
+import SettingCollection from "../Collection/SettingCollection";
+import PasswordConverter from "../Converter/PasswordConverter";
+import FolderConverter from "../Converter/FolderConverter";
+import CustomFieldConverter from "../Converter/CustomFieldConverter";
+import TagConverter from "../Converter/TagConverter";
+import SettingConverter from "../Converter/SettingConverter";
+import Password from "../Model/Password/Password";
+import Folder from "../Model/Folder/Folder";
+import Tag from "../Model/Tag/Tag";
+import Server from "../Model/Server/Server";
+import Session from "../Model/Session/Session";
+import DataField from "../Model/CustomField/DataField";
+import EmailField from "../Model/CustomField/EmailField";
+import FileField from "../Model/CustomField/FileField";
+import SecretField from "../Model/CustomField/SecretField";
+import TextField from "../Model/CustomField/TextField";
+import UrlField from "../Model/CustomField/UrlField";
+import Setting from "../Model/Setting/Setting";
+import ApiRequest from "../Network/ApiRequest";
+import ApiResponse from "../Network/ApiResponse";
+import SessionAuthorization from "../Authorization/SessionAuthorization";
+import PWDv1Challenge from "../Authorization/Challenge/PWDv1Challenge";
+import UserToken from "../Authorization/Token/UserToken";
+import RequestToken from "../Authorization/Token/RequestToken";
+import NoEncryption from "../Encryption/NoEncryption";
+import CSEv1Encryption from "../Encryption/CSEv1Encryption";
+import ExportV1Encryption from "../Encryption/ExportV1Encryption";
+import CSEv1Keychain from "../Encryption/Keychain/CSEv1Keychain";
+import Cache from "../Cache/Cache";
+import BooleanState from "../State/BooleanState";
+import EventEmitter from "eventemitter3";
+import ConfigurationError from "../Exception/ConfigruationError";
+import ResponseContentTypeError from "../Exception/ResponseContentTypeError";
+import ResponseDecodingError from "../Exception/ResponseDecodingError";
+import UnknownPropertyError from "../Exception/UnknownPropertyError";
+import TokenTypeNotSupported from "../Exception/TokenTypeNotSupported";
+import EncryptionTypeNotSupported from "../Exception/EncryptionTypeNotSupported";
+import NetworkError from "../Exception/NetworkError";
+import HttpError from "../Exception/Http/HttpError";
+import BadRequestError from "../Exception/Http/BadRequestError";
+import UnauthorizedError from "../Exception/Http/UnauthorizedError";
+import ForbiddenError from "../Exception/Http/ForbiddenError";
+import NotFoundError from "../Exception/Http/NotFoundError";
+import MethodNotAllowedError from "../Exception/Http/MethodNotAllowedError";
+import TooManyRequestsError from "../Exception/Http/TooManyRequestsError";
+import InternalServerError from "../Exception/Http/InternalServerError";
+import BadGatewayError from "../Exception/Http/BadGatewayError";
+import ServiceUnavailableError from "../Exception/Http/ServiceUnavailableError";
+import GatewayTimeoutError from "../Exception/Http/GatewayTimeoutError";
+import BaseClassLoader from "./BaseClassLoader";
+import ModelService from "../Services/ModelService";
+
+export default class DefaultClassLoader extends BaseClassLoader {
+
+ /**
+ *
+ * @return {Object}
+ * @protected
+ */
+ _getDefaultClasses() {
+ return {
+ repository : {
+ password: () => { return new PasswordRepository(this.getInstance('api')); },
+ folder : () => { return new FolderRepository(this.getInstance('api')); },
+ tag : () => { return new TagRepository(this.getInstance('api')); },
+ setting : () => { return new SettingRepository(this.getInstance('api')); }
+ },
+ collection : {
+ password: (...e) => { return new PasswordCollection(this.getInstance('converter.password'), ...e); },
+ folder : (...e) => { return new FolderCollection(this.getInstance('converter.folder'), ...e); },
+ field : (...e) => { return new CustomFieldCollection(this.getInstance('converter.field'), ...e); },
+ tag : (...e) => { return new TagCollection(this.getInstance('converter.tag'), ...e); },
+ setting : (...e) => { return new SettingCollection(this.getInstance('converter.setting'), ...e); }
+ },
+ converter : {
+ password: () => { return new PasswordConverter(this.getInstance('api')); },
+ folder : () => { return new FolderConverter(this.getInstance('api')); },
+ field : () => { return new CustomFieldConverter(this.getInstance('api')); },
+ tag : () => { return new TagConverter(this.getInstance('api')); },
+ setting : () => { return new SettingConverter(this.getInstance('api')); }
+ },
+ model : {
+ password : Password,
+ folder : Folder,
+ tag : Tag,
+ server : Server,
+ session : Session,
+ dataField : DataField,
+ emailField : EmailField,
+ fileField : FileField,
+ secretField: SecretField,
+ textField : TextField,
+ urlField : UrlField,
+ setting : Setting
+ },
+ network : {
+ request : ApiRequest,
+ response: ApiResponse
+ },
+ authorization: {
+ session: () => { return new SessionAuthorization(this.getInstance('api')); }
+ },
+ challenge : {
+ pwdv1: PWDv1Challenge
+ },
+ token : {
+ user : UserToken,
+ request: RequestToken
+ },
+ encryption : {
+ none : NoEncryption,
+ csev1: CSEv1Encryption,
+ expv1: ExportV1Encryption
+ },
+ keychain : {
+ csev1: CSEv1Keychain
+ },
+ service : {
+ model: () => { return new ModelService(this); }
+ },
+ cache : {
+ cache: Cache
+ },
+ state : {
+ boolean: BooleanState
+ },
+ event : {
+ event: EventEmitter
+ },
+ exception : {
+ configuration: ConfigurationError,
+ contenttype : ResponseContentTypeError,
+ decoding : ResponseDecodingError,
+ property : UnknownPropertyError,
+ challenge : TokenTypeNotSupported,
+ token : TokenTypeNotSupported,
+ encryption : EncryptionTypeNotSupported,
+ network : NetworkError,
+ http : HttpError,
+ 400 : BadRequestError,
+ 401 : UnauthorizedError,
+ 403 : ForbiddenError,
+ 404 : NotFoundError,
+ 405 : MethodNotAllowedError,
+ 429 : TooManyRequestsError,
+ 500 : InternalServerError,
+ 502 : BadGatewayError,
+ 503 : ServiceUnavailableError,
+ 504 : GatewayTimeoutError
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/src/ClassLoader/EnhancedClassLoader.js b/src/ClassLoader/EnhancedClassLoader.js
new file mode 100644
index 0000000..04dfa2e
--- /dev/null
+++ b/src/ClassLoader/EnhancedClassLoader.js
@@ -0,0 +1,20 @@
+import DefaultClassLoader from "./DefaultClassLoader";
+import EnhancedPassword from "../Model/Password/EnhancedPassword";
+import EnhancedFolder from "../Model/Folder/EnhancedFolder";
+import EnhancedTag from "../Model/Tag/EnhancedTag";
+
+export default class EnhancedClassLoader extends DefaultClassLoader {
+ /**
+ *
+ * @return {Object}
+ * @protected
+ */
+ _getDefaultClasses() {
+ let classes = super._getDefaultClasses();
+ classes.model.password = EnhancedPassword;
+ classes.model.folder = EnhancedFolder;
+ classes.model.tag = EnhancedTag;
+
+ return classes;
+ }
+} \ No newline at end of file