# @gnx-utilities/models

> Generic models is a library that allows you to create models for sequelize, mongoose and typegoose in a generic way, without having to write the same code over and over again.

Latest version **0.2.46** (published 2024-02-01) · MIT license · 0 weekly downloads

## Install

```sh
npm install @gnx-utilities/models
pnpm add @gnx-utilities/models
yarn add @gnx-utilities/models
bun add @gnx-utilities/models
```

## Health

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

Positive: has types; esm support; no vulnerabilities.

Warnings: low downloads; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.2.46 |
| Published | 2024-02-01 |
| First published | 2023-12-08 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >=18.0.0 |
| Dependencies | 3 |
| Unpacked size | 18.8 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 1 |
| Author | ImRLopezAg |
| Maintainers | imrlopez.ag |
| Keywords | typescript, nodejs, sequelize, mongoose, typegoose, generic |

## Links

- npm: https://www.npmjs.com/package/@gnx-utilities/models
- Repository: https://github.com/ImRLopezAG/gnx-core
- Homepage: https://gnx-udocs.vercel.app
- Issues: https://github.com/ImRLopezAG/gnx-core/issues
- npm.io page: https://npm.io/package/@gnx-utilities/models

## Dependencies (3)

- [mongoose](https://npm.io/package/mongoose.md) ^8.0.2
- [sequelize](https://npm.io/package/sequelize.md) ^6.35.1
- [@typegoose/typegoose](https://npm.io/package/@typegoose/typegoose.md) ^12.0.0

## Alternatives

- [angular-pipes](https://npm.io/package/angular-pipes.md) — 5.6K weekly downloads
- [@ng-web-apis/midi](https://npm.io/package/@ng-web-apis/midi.md) — 2.6K weekly downloads
- [happn-3](https://npm.io/package/happn-3.md) — 1.6K weekly downloads
- [@opensip-cli/lang-go](https://npm.io/package/@opensip-cli/lang-go.md) — 1.2K weekly downloads
- [mongoose-typescript](https://npm.io/package/mongoose-typescript.md) — 85 weekly downloads

## Recent versions

- 0.2.46 (latest) — 2024-02-01
- 0.2.45 — 2023-12-24
- 0.2.44 — 2023-12-23
- 0.2.43 — 2023-12-23
- 0.2.42 — 2023-12-23
- 0.2.41 — 2023-12-23
- 0.2.4 — 2023-12-20
- 0.2.3 — 2023-12-20
- 0.2.2 — 2023-12-14
- 0.2.1 — 2023-12-14
- 0.2.0 — 2023-12-13
- 0.1.95 — 2023-12-13
- 0.1.94 — 2023-12-13
- 0.1.93 — 2023-12-13
- 0.1.92 — 2023-12-13
- … 12 more at https://npm.io/package/@gnx-utilities/models/versions

## README

# 📝 GNX Core

Generic  is a library that allows you to create services, models, validations, decorators with a generic repository, this library is based on the [Sequelizer](https://sequelize.org/) library and also in [Typegoose](https://typegoose.github.io/typegoose/).

## 📦 Installation

>[!Note]
>You need to have one of the ORM or ODM to manage the data before. The supported ORMs/ODMs are Sequelize and Typegoose wich needs moongose.

```bash
npm install @gnx-utilities/core
```
```bash
pnpm add @gnx-utilities/core
```
```bash
yarn add @gnx-utilities/core
```
```bash
bun add @gnx-utilities/core
```

## 📖 Usage

### Sequelize

```typescript
import { SequelizeBaseEntity } from '@gnx-utilities/models'
import { DataTypes, Sequelize } from 'sequelize'
import { SequelizeService } from '@gnx-utilities/core'

export const sequelize = new Sequelize('test', 'postgres', 'root', {
  host: 'localhost',
  dialect: 'postgres'
})

export class User extends SequelizeBaseEntity {
  declare firstName: string
  declare lastName: string
}

User.init(
  {
    firstName: { type: DataTypes.STRING },
    lastName: { type: DataTypes.STRING }
  },
  { sequelize, modelName: 'person' } 
)

export class UserService extends SequelizeService<User> {
  constructor () {
    super(User)
  }
}

const userService = new UserService();

const user = await userService.create({ entity: { firstName: 'John', lastName: 'Doe' } });

console.log(user.firstName); // John
```

### Typegoose

>[!Warning]
>Typegoose needs some configuration to work properly, fallow the example below to configure it.

>[!Important]
>On prop decorator you need to add the type of the property, if you don't do this, the library will not work properly.

```typescript
import { TypegooseService } from '@gnx-utilities/core';
import { getModelForClass, prop } from '@typegoose/typegoose'
import { TypegooseBaseEntity } from '@gnx-utilities/models'

export class User extends TypegooseBaseEntity {
  @prop({ type: String })
  declare firstName: string

  @prop({ type: String })
  declare lastName: string
}

export const UserModel = getModelForClass(User)

export class UserService extends TypegooseService<User> {
  constructor () {
    super(UserModel)
  }
}

const userService = new UserService();

const user = await userService.create({ entity: { firstName: 'John', lastName: 'Doe' } });

console.log(user.firstName); // John
```
>[!Note]
>You Can fallow the test configuration to get more information about the configuration.

### Override methods

```typescript
import { SequelizeService } from '@gnx-utilities/core';
import { ServiceParams, ServiceParamsWithEntity, ServiceParamsWithId } from '@gnx-utilities/models';

export class UserService extends SequelizeService {
  constructor() {
    super(User);
  }
  override async create({ entity }: ServiceParamsWithEntity) {
    // your code here
    return super.create({ entity });
  }

  override async update({ id, entity }: ServiceParams) {
    // your code here
    return super.update({ id, entity });
  }

  override async delete({ id }: ServiceParamsWithId) {
    // your code here
    return super.delete({ id });
  }
}
```

```typescript
import { TypegooseService } from '@gnx-utilities/core';
import { ServiceParams, ServiceParamsWithEntity, ServiceParamsWithId } from '@gnx-utilities/models';

export class UserService extends TypegooseService {
  constructor() {
    super(UserModel);
  }
  override async create({ entity }: ServiceParamsWithEntity<User>) {
    // your code here
    return super.create({ entity });
  }

  override async update({ id, entity }: ServiceParams) {
    // your code here
    return super.update({ id, entity });
  }

  override async delete({ id }: ServiceParamsWithId) {
    // your code here
    return super.delete({ id });
  }
}
```


## 📝 Documentation

[![Documentation](https://img.shields.io/badge/Documentation-000000?style=for-the-badge&logo=read-the-docs&logoColor=white)](https://gnx-udocs.vercel.app)


### 🛠️ Tools


[![Typescript](https://img.shields.io/badge/Typescript-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
[![Sequelize](https://img.shields.io/badge/Sequelize-52B0E7?logo=sequelize&logoColor=white)](https://sequelize.org/)
[![Typegoose](https://img.shields.io/badge/Typegoose-3178C6?logo=typescript&logoColor=white)](https://typegoose.github.io/typegoose/)
[![NodeJS](https://img.shields.io/badge/NodeJS-339933?logo=node.js&logoColor=white)](https://nodejs.org/es/)
[![MongoDB](https://img.shields.io/badge/MongoDB-47A248?logo=mongodb&logoColor=white)](https://www.mongodb.com/)



## Authors

[![ImRLopezAG](https://img.shields.io/badge/ImRLopezAG-000000?style=for-the-badge&logo=github&logoColor=white)](https://github.com/ImRLopezAG)

## 🔗 Links

[![portfolio](https://img.shields.io/badge/my_portfolio-000?style=for-the-badge&logo=ko-fi&logoColor=white)](https://imrlopez.vercel.app)
[![linkedin](https://img.shields.io/badge/linkedin-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/angel-gabriel-lopez/)
[![twitter](https://img.shields.io/badge/twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://twitter.com/imr_lopez)

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