repository-registry.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import {Service} from '@e22m4u/js-service';
  2. import {Repository} from './repository.js';
  3. import {modelNameToModelKey} from '../utils/index.js';
  4. import {InvalidArgumentError} from '../errors/index.js';
  5. /**
  6. * Repository registry.
  7. */
  8. export class RepositoryRegistry extends Service {
  9. /**
  10. * Repositories.
  11. *
  12. * @type {object}
  13. */
  14. _repositories = {};
  15. /**
  16. * Repository ctor.
  17. *
  18. * @type {typeof Repository}
  19. * @private
  20. */
  21. _repositoryCtor = Repository;
  22. /**
  23. * Set repository ctor.
  24. *
  25. * @param {typeof Repository} ctor
  26. */
  27. setRepositoryCtor(ctor) {
  28. if (
  29. !ctor ||
  30. typeof ctor !== 'function' ||
  31. !(ctor.prototype instanceof Repository)
  32. ) {
  33. throw new InvalidArgumentError(
  34. 'The first argument of RepositoryRegistry.setRepositoryCtor ' +
  35. 'must inherit from Repository class, but %v was given.',
  36. ctor,
  37. );
  38. }
  39. this._repositoryCtor = ctor;
  40. }
  41. /**
  42. * Get repository.
  43. *
  44. * @param {string} modelName
  45. * @returns {Repository}
  46. */
  47. getRepository(modelName) {
  48. const modelKey = modelNameToModelKey(modelName);
  49. let repository = this._repositories[modelKey];
  50. if (repository) return repository;
  51. repository = new this._repositoryCtor(this.container, modelName);
  52. this._repositories[modelKey] = repository;
  53. return repository;
  54. }
  55. }