repository.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import {Service} from '../service/index.js';
  2. import {AdapterRegistry} from '../adapter/index.js';
  3. import {InvalidArgumentError} from '../errors/index.js';
  4. import {DefinitionRegistry} from '../definition/index.js';
  5. import {ModelDefinitionUtils} from '../definition/index.js';
  6. /**
  7. * Repository.
  8. */
  9. export class Repository extends Service {
  10. /**
  11. * Model name.
  12. */
  13. _modelName;
  14. /**
  15. * Model name.
  16. *
  17. * @return {string}
  18. */
  19. get modelName() {
  20. return this._modelName;
  21. }
  22. /**
  23. * Datasource name.
  24. */
  25. _datasourceName;
  26. /**
  27. * Datasource name.
  28. *
  29. * @return {string}
  30. */
  31. get datasourceName() {
  32. return this._datasourceName;
  33. }
  34. /**
  35. * Constructor.
  36. *
  37. * @param services
  38. * @param modelName
  39. */
  40. constructor(services, modelName) {
  41. super(services);
  42. this._modelName = modelName;
  43. const modelDef = this.get(DefinitionRegistry).getModel(modelName);
  44. const datasourceName = modelDef.datasource;
  45. if (!datasourceName)
  46. throw new InvalidArgumentError(
  47. 'The model %s does not have a specified datasource.',
  48. modelName,
  49. );
  50. this._datasourceName = datasourceName;
  51. }
  52. /**
  53. * Get adapter.
  54. *
  55. * @return {Promise<Adapter>}
  56. */
  57. async getAdapter() {
  58. return this.get(AdapterRegistry).getAdapter(this.datasourceName);
  59. }
  60. /**
  61. * Create.
  62. *
  63. * @param {object} data
  64. * @param {object|undefined} filter
  65. * @return {Promise<object>}
  66. */
  67. async create(data, filter = undefined) {
  68. const adapter = await this.getAdapter();
  69. return adapter.create(this.modelName, data, filter);
  70. }
  71. /**
  72. * Replace by id.
  73. *
  74. * @param {number|string} id
  75. * @param {object} data
  76. * @param {object|undefined} filter
  77. * @return {Promise<object>}
  78. */
  79. async replaceById(id, data, filter = undefined) {
  80. const adapter = await this.getAdapter();
  81. return adapter.replaceById(this.modelName, id, data, filter);
  82. }
  83. /**
  84. * Replace or create.
  85. *
  86. * @param {object} data
  87. * @param {object|undefined} filter
  88. * @return {Promise<object>}
  89. */
  90. async replaceOrCreate(data, filter = undefined) {
  91. const pkPropName = this.get(
  92. ModelDefinitionUtils,
  93. ).getPrimaryKeyAsPropertyName(this.modelName);
  94. const pkValue = data[pkPropName];
  95. if (pkPropName == null) return this.create(data, filter);
  96. return this.replaceById(pkValue, data, filter);
  97. }
  98. /**
  99. * Patch by id.
  100. *
  101. * @param {number|string} id
  102. * @param {object} data
  103. * @param {object|undefined} filter
  104. * @return {Promise<object>}
  105. */
  106. async patchById(id, data, filter = undefined) {
  107. const adapter = await this.getAdapter();
  108. return adapter.patchById(this.modelName, id, data, filter);
  109. }
  110. /**
  111. * Find.
  112. *
  113. * @param {object|undefined} filter
  114. * @return {Promise<object[]>}
  115. */
  116. async find(filter = undefined) {
  117. const adapter = await this.getAdapter();
  118. return adapter.find(this.modelName, filter);
  119. }
  120. /**
  121. * Find one.
  122. *
  123. * @param {object|undefined} filter
  124. * @return {Promise<object|undefined>}
  125. */
  126. async findOne(filter = undefined) {
  127. const adapter = await this.getAdapter();
  128. filter = filter ?? {};
  129. filter.limit = 1;
  130. const result = await adapter.find(this.modelName, filter);
  131. return result.length ? result[0] : undefined;
  132. }
  133. /**
  134. * Find by id.
  135. *
  136. * @param {number|string} id
  137. * @param {object|undefined} filter
  138. * @return {Promise<object>}
  139. */
  140. async findById(id, filter = undefined) {
  141. const adapter = await this.getAdapter();
  142. return adapter.findById(this.modelName, id, filter);
  143. }
  144. /**
  145. * Delete.
  146. *
  147. * @param {object|undefined} where
  148. * @return {Promise<number>}
  149. */
  150. async delete(where = undefined) {
  151. const adapter = await this.getAdapter();
  152. return adapter.delete(this.modelName, where);
  153. }
  154. /**
  155. * Delete by id.
  156. *
  157. * @param {number|string} id
  158. * @return {Promise<boolean>}
  159. */
  160. async deleteById(id) {
  161. const adapter = await this.getAdapter();
  162. return adapter.deleteById(this.modelName, id);
  163. }
  164. /**
  165. * Exists.
  166. *
  167. * @param {number|string} id
  168. * @return {Promise<boolean>}
  169. */
  170. async exists(id) {
  171. const adapter = await this.getAdapter();
  172. return adapter.exists(this.modelName, id);
  173. }
  174. /**
  175. * Count.
  176. *
  177. * @param {object|undefined} where
  178. * @return {Promise<number>}
  179. */
  180. async count(where = undefined) {
  181. const adapter = await this.getAdapter();
  182. return adapter.count(this.modelName, where);
  183. }
  184. }