# class_orm

> 1. В конфиг (путь по умолчанию в Windows: `C:\Program Files\MongoDB\Server\7.0\bin\mongod.cfg`) добавить строчки: ``` replication: replSetName: имя_replica_set ``` В тестах используется `rs0` имя replica set. 2. Перезапустить службу:

Latest version **1.0.9** (published 2023-10-26) · ISC license · 0 weekly downloads

## Install

```sh
npm install class_orm
pnpm add class_orm
yarn add class_orm
bun add class_orm
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.9 |
| Published | 2023-10-26 |
| First published | 2023-09-11 |
| Weekly downloads | 0 |
| License | ISC |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 4 |
| Unpacked size | 164.9 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Maintainers | classic_dp |

## Links

- npm: https://www.npmjs.com/package/class_orm
- npm.io page: https://npm.io/package/class_orm

## Dependencies (4)

- [mongodb](https://npm.io/package/mongodb.md) ^5.7.0
- [async-mutex](https://npm.io/package/async-mutex.md) ^0.4.0
- [moment-timezone](https://npm.io/package/moment-timezone.md) ^0.5.43
- [reflect-metadata](https://npm.io/package/reflect-metadata.md) ^0.1.13

## Recent versions

- 1.0.9 (latest) — 2023-10-26
- 1.0.7 — 2023-09-28
- 1.0.6 — 2023-09-28
- 1.0.5 — 2023-09-11
- 1.0.4 — 2023-09-11
- 1.0.3 — 2023-09-11
- 1.0.2 — 2023-09-11
- 1.0.1 — 2023-09-11
- 1.0.0 — 2023-09-11

## README

## Подключение replica set в MongoDB для работы транзакций:

1. В конфиг (путь по умолчанию в Windows: `C:\Program Files\MongoDB\Server\7.0\bin\mongod.cfg`) добавить строчки:
    ```
    replication:
        replSetName: имя_replica_set
   ```
   В тестах используется `rs0` имя replica set.
2. Перезапустить службу:
    * Windows: `net stop MongoDB && net start MongoDB`
    * Linux: `sudo systemctl stop mongod && sudo systemctl start mongod`
3. Подключиться к MongoDB серверу используя MongoDB Shell (для Windows скачать по [ссылке на официальном сайте](https://www.mongodb.com/try/download/community)), пример для локальной БД с настройками по умолчанию:
   ```
   mongo --host 127.0.0.1 --port 27017
   ```
4. Инициализировать replica set:
   ```
   rs.initiate()
   ```

После этого для переключения между обычным режимом и replica set будет достаточно 1-2 пунктов.

Тесты, запускаемые через `npm test` автоматически пропускают те из них, которые не подходят для текущей конфигурации.

## Краткое описание классов

`BaseEntity` — базовый класс для работы с базой, остальные классы сущностей наследуют его. Хранит поля: 
   * `static entityConstructors: Map<string, any>` — map конструкторов для восстановления из документа БД
   * `static entityId: WeakEntityCollection` — класс для хранения прокси, используемых для отслеживания изменения полей через get/set 
   * `onChangeCallback?: { remove: (item: BaseEntity) => void; insert: (item: BaseEntity) => void }` — объект с методами вызова при изменении/удалении
   * `_id: ObjectId` — идентификатор экземпляра класса
   * `_changedProperties: Set<string>` — set изменённых полей экземпляра класса с момента создания или последней записи в БД

Методы представляют возможности по записи в базу одного/нескольких экземпляров класса (включая возможность рекурсивного сохранения всех вложенных классов), запросе одного экземпляра из базы, пополнени/очистке списка изменённых полей.

---

`LazyPromise` — класс ленивой загрузки экземпляров классов из БД. Хранит поля:
   * `static promises: WeakEntityCollection` — список promise ленивой загрузки всех экземпляров класса
   * `promise?: Promise<T>` — promise загрузки текущего экземпляра
   * `_id: ObjectId` — идентификатор в базе
   * `collectionName: string` — имя коллекции в базе

---

Тип `export type Lazy<T extends BaseEntity> = T | LazyPromise<T>` предоставляет обёртку для типа лениво загружаемых полей или полноценных экземпляров класса. 

---

`WeakEntityCollection` —  класс для сборки мусора тех экземпляров классов, которые более не нужны:
   * `map: Map<string, WeakRef<any>>` — карте текущих экземпляров классов
   * `registry: FinalizationRegistry<string>` — список более не нужных экземпляров классов

---

`EntitySerializer` — класс для сериализации/десериализации объектов, способен также сериализировать и восстанавливать Array/Map/Set. Поля:
   * `static serializedCollections: Map<string, any[]>` — хранилище уже сериализованных объектов по классам, очищается при вызове `getSerializedCollections()`
   * `static processedEntities: Set<string>` — хранилище ссылок на уже сериализованные объекты, очищается при вызове `getSerializedCollections()`
   * `static serializationHandlers: { [key: string]: (val: any, recursively: boolean) => SerializedValue }` — обработчики сериализации отдельных классов

---

`CacheList` — класс закэшированного списка заданного размера, хранит данные в комбинации Array+Map, при доступе к отдельным элементам повышает их позицию в Array, неиспользуемые автоматически сдвигаются в конец пока не удалятся.
   * `cacheSize: number` — максимальный размер кэша
   * `indexList: WrapEntity[]` — список объектов, обёрнутых во `WrapItem`, хранящий указатель на объект и индекс закэшированном списке
   * `map: MapInterface<WrapEntity>` — обёртка для `Map<string, WrapEntity>` с дополнительными методами для удобства работы внутри закэшированного списка 

---

`SortedList` — класс сортированного списка:
   * доступна сортировка по одному полю (для полей типов, реализующих оператор сравнения) или с помощью произвольной функции
   * доступна фильтрация по `Partial<T>`
   * доступна выборка по интервалу (со строгими или нестрогими границами)

Поля:
   * `items: T[]` — сами объекты
   * `compareFn: (a: T, b: T) => number` — функция сравнения
   * `compareKey?: MaybeBasePropertyKeys<T>` — поля для фильтрации/обрезки по промежутку значений

Замена функции сортировки невозможна, для этого создаётся новый экземпляр с новой сортировкой.

---

`Collections` — класс, комбинирующий в себе произвольное количество `SortedList` с разными сортировками и возможностью задания автоматического удаления значений из `Collections`. Стандартные возможности работы с `SortedList` также доступны (например, обрезание списка по интервалу значений)Ж
   * `indices: { [name: string]: SortedList<T> }` — хранилище всех вариантов сортировки экземпляров `T`
   * `shouldAutoUpdate: boolean` — флаг автоматического вызова обновления/удаления экземпляра `T` из всех `SortedList` при соответствующих действиях над экземпляом `T`

---

`DatabaseCollections` — расширение `Collections` возможностью сохранения/загрузки содержимого из БД.

---

`MongoDBService` — класс работы с MongoDB БД и сериализуемыми коллекциями в формате `Map<string, any[]>` и записью сериализованных данных по кускам:
   * `client: MongoClient` — клиент MongoDB
   * `static db: Db` — конкретная база MongoDB

---
_Source: https://npm.io/package/class_orm · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
