6.0.1 • Published 2 years ago

repository-generic v6.0.1

Weekly downloads
5
License
ISC
Repository
github
Last release
2 years ago

repository-generic

Description

Repository base class for Node.JS. Currently only supports MongoDB.

Installation

Npm

npm install repository-generic

Yarn

yarn add repository-generic

Support

This library is quite fresh, and maybe has bugs. Write me an email to natashkinsash@gmail.com and I will fix the bug in a few working days.

Overview

This library can be use with JavaScript, but better use one with TypeScript.

Defining models

import "reflect-metadata"
import { ObjectId } from "mongodb";
import { IsOptional, IsString, IsDate, IsInt, IsOptional, IsString, ValidateNested, IsBoolean, IsNumber } from 'class-validator';
import { Type, Expose } from "class-transformer";
import { Model } from "repository-generic";

class Purchase {
    @Expose()
    @IsDate()
    @Type(() => Date)
    public createdAt: Date;
}

export default class UserEntity extends Model {
    @Expose()
    public _id: ObjectId;
    @IsString()
    @IsOptional()
    @Expose()
    public name?: string;
    @IsDate()
    @Expose()
    @Type(() => Date)
    public createdAt: Date;
    @IsDate()
    @Type(() => Date)
    @Expose()
    public lastUpdatedAt: Date;
    @IsNumber()
    @Expose()
    public version: number;
    @Type(() => Purchase)
    @ValidateNested({
        each: true
    })
    @Expose()
    public purchase: Purchase[];
    @IsBoolean()
    @IsOptional()
    @Expose()
    public isDeleted?: boolean;
}
import {Expose, Transform, Type} from "class-transformer";
import {Object} from "repository-generic";
import UserEntity from "./UserEntity";
import Purchase from "./Purchase";
import {IsDate, IsNumber, IsString, ValidateNested} from "class-validator";

export default class User implements Object<UserEntity>{
    @Expose()
    @IsString()
    @Transform((value, object)=> object.id || object._id.toHexString())
    public readonly id: string;
    @IsString()
    @Expose()
    public name: string;
    @IsDate()
    @Type(() => Date)
    @Expose()
    public createdAt: Date;
    @IsDate()
    @Type(() => Date)
    @Expose()
    public lastUpdatedAt: Date;
    @IsNumber()
    public version: number;
    @Type(() => Purchase)
    @ValidateNested({
        each: true,
    })
    @Expose()
    public purchase: Purchase[];
}

Create MongoRepository

import { Db, MongoClient } from 'mongodb';
import {plainToClass} from "class-transformer";
import { MongoRepository, ClassType } from "repository-generic";
import User from "./User"
import UserEntity from "./UserEntity"

class UserRepository extends MongoRepository<UserEntity, User>(UserEntity) {
    constructor(client: MongoClient) {
        super(client, {
            version: true,
            createdAt: true,
            lastUpdatedAt: true,
            validateUpdate: true,
            validateReplace: true,
            validateAdd: true,
            validateGet: true,
            classTransformOptions: { excludeExtraneousValues: true },
            customTransform: (entity: UserEntity) => plainToClass<User, UserEntity>(User, entity)
        });
    }

    protected getDbName(): string {
        throw 'test';
    }
}

Create NameUserSpecification

import {FilterQuery, IMongoSpecification, Entity} from "repository-generic"
import UserEntity from "./UserEntity";

export default class NameUserSpecification implements IMongoSpecification<UserEntity>{

    private readonly name: string;

    constructor(name: string){
        this.name = name;
    }

    public specified(): FilterQuery<UserEntity> {
        return {
            name: this.name,
        };
    }

}

Create UserService

import User from "./User";
import UserRepository from "./UserRepository";

class UserService {
    
    constructor(private userRepository: UserRepository){}
    
    public create(): Promise<string>{
        return this.userRepository.add({name: "Test", purchase:[]});
    }
    
    public findById(): Promise<User>{
        return this.userRepository.get(id);
    }
    
    public findByName(name: string): Promise<User | void>{
        return this.userRepository.findOne(new NameUserSpecification(name));
    }   

    
}
6.0.1

2 years ago

6.0.0

2 years ago

5.0.0

2 years ago

4.0.0

3 years ago

2.0.0

3 years ago

1.0.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago

0.11.0

4 years ago

0.10.0

4 years ago

0.9.1

4 years ago

0.9.0

4 years ago

0.8.0

4 years ago

0.7.2

4 years ago

0.7.3

4 years ago

0.7.0

4 years ago

0.5.2

4 years ago

0.5.1

4 years ago

0.5.0

5 years ago

0.4.2

5 years ago

0.4.1

5 years ago

0.4.0

5 years ago

0.3.0

5 years ago

0.2.1

5 years ago

0.2.0

5 years ago

0.1.25

5 years ago

0.0.25

5 years ago

0.0.24

5 years ago

0.0.23

5 years ago

0.0.22

5 years ago

0.0.21

5 years ago

0.0.20

5 years ago

0.0.19

5 years ago

0.0.18

5 years ago

0.0.17

5 years ago

0.0.14

5 years ago

0.0.12

5 years ago

0.0.11

5 years ago

0.0.10

5 years ago

0.0.9

5 years ago

0.0.8

5 years ago

0.0.7

5 years ago

0.0.6

5 years ago

0.0.5

5 years ago

0.0.4

5 years ago

0.0.3

5 years ago

0.0.2

5 years ago

0.0.1

5 years ago