NEST JS - Как отправить объект с массивом и объектом - PullRequest
0 голосов
/ 09 марта 2020

У меня проблемы с гнездом. То, что я хочу, немного сложно, и я не знаю, как это сделать. Во-первых, с помощью идентификатора сайта я извлекаю пользователей с этого сайта и хочу иметь возможность разбивать на страницы, сортировать по порядку (des c или как c мне все равно) и фильтровать результаты по значению (строка). И в выводе я хочу сделать объект с массивом результатов и синтеза. Пример:

{
results : [{audit}],
syhthesis: {pageNumber: number, numberOfResults: number}
}

Честно говоря, я пытался некоторое время, но я просто не могу понять, как это сделать. Вот мой фактический код:

контроллер:


    import { Controller, Get, Query, Param, Post, Body } from '@nestjs/common';

    import { UserAuditService } from './user-audit.service';

    import { UserAudit } from 'src/entities/user-audit.entity';



    @Controller('useraudit')

    export class UserAuditController {

        constructor(private readonly userAuditService : UserAuditService){};


        @Post("/userpersite/{:id}")

        async getUsers(@Body()id: string, @Query('page') page: number): Promise<UserAudit[]>{

            return this.userAuditService.getAuditsForSite(id, page)

        }

    }

служба:


    import { Injectable } from '@nestjs/common';

    import { InjectRepository } from '@nestjs/typeorm';

    import { UserAudit } from '../entities/user-audit.entity';

    import { Repository } from 'typeorm';



    @Injectable()

    export class UserAuditService {



        constructor(

            @InjectRepository(UserAudit)

            private readonly userAuditRepository : Repository<UserAudit>

        ){}



        async getAuditsForSite(_siteId : string, page: number = 1) : Promise<UserAudit[]>{



            return this.userAuditRepository

            .find({

                join : {

                    alias : "user-audit",

                    innerJoinAndSelect: {

                        user : "user-audit.who"

                    }

                },

                where : {

                    site : _siteId

                },

                take: 10,

                skip: 10 * (page -1)

            })

        }

    }

и сущность:


    import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm';

    import { User } from './user.entity';

    import { Site } from './site.entity';



    @Entity('user-audit')

    export class UserAudit {



        @PrimaryGeneratedColumn()

        id : string;



        @ManyToOne(type => User, user => user.id)

        who : User



        @Column({ length : 100 })

        action : string



        @ManyToOne(type => Site, site => site.id)

        site : Site



        @Column({ type : 'date' })

        date : Date



        @Column({ length : 1000 })

        before : string



        @Column({ length : 1000 })

        after : string

    }

I Я пробовал много вещей в моем контроллере, но теперь, я застрял, я знаю, что что-то упустил, возможно, много вещей, поэтому, если кто-то может мне помочь, это будет очень благодарно:)

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

извините, что беспокою вас снова. Итак, я попробовал, и это не работает: / Я был уверен, что это будет решением. Поэтому я подумал о чем-то: работать с моделями, но опять же я застрял. Вот новый код:

служба:

import { Injectable } from '@nestjs/common';

import { InjectRepository } from '@nestjs/typeorm';

import { UserAudit } from '../entities/user-audit.entity';

import { Repository } from 'typeorm';

import { UserAuditRequest } from '../entities/user-audit-request';



@Injectable()

export class UserAuditService {



    constructor(

        @InjectRepository(UserAudit)

        private readonly userAuditRepository : Repository<UserAudit>,

        private readonly userRequest: Repository<UserAuditRequest>

    ){}



    async getAuditsForSite(_siteId : string, page: number = 1, filter: any) : Promise<any>{



        const joinAndSort = this.userAuditRepository

        .findAndCount({

            join : {

                alias : "user-audit",

                innerJoinAndSelect: {

                    user : "user-audit.who"

                }

            },

            where : {

                site : _siteId

            },

            take: 10,

            skip: 10 * (page -1)

        })

        joinAndSort



        const sortElement = this.userRequest.find({

            where: {

                pagination: page

            }

        })

        sortElement



        const filterElement = this.userRequest.findAndCount({

            where: {

                filter: filter

            }

        })

        filterElement

    }



}

контроллер:

import { Controller, Get, Query, Param, Post, Body } from '@nestjs/common';

import { UserAuditService } from './user-audit.service';

import { UserAudit } from 'src/entities/user-audit.entity';

import { UserAuditRequest } from '../entities/user-audit-request';

import { ResultUserAudit } from '../entities/result-user-audit';

import { Any } from 'typeorm';



@Controller('useraudit')

export class UserAuditController {



    constructor(private readonly userAuditService : UserAuditService, private readonly resultUserAudit: ResultUserAudit){};


    @Post("/userpersite/:id")

    async postUserPerSite(@Param()id: string,@Body() request : UserAuditRequest): Promise<ResultUserAudit>{

       return await this.userAuditService.getAuditsForSite(id, request.pagination.pageNumber, request.filter);

модель запроса:

import { Injectable } from "@nestjs/common";



@Injectable()

export class UserAuditRequest {

    constructor(){}



    pagination: {



        resultNumber: number;



        pageNumber: number;

    }



    sort: {

        columnSorted: any;



        orderBy: any;



    }



    filter: {



        columnFilter: any;



        filtervalue: string;

    }

}

и модель результата:

import { Injectable } from "@nestjs/common";

import { UserAudit } from "./user-audit.entity";



@Injectable()

export class ResultUserAudit {

    constructor(private userAudit: UserAudit){}



    result: UserAudit[];



    synthesis: {



        pageNumber: number,



        resultNumber: number;



    }



}

Я пытаюсь получить логику c для своего кода, но я не знаю, я просто не могу добиться успеха :( Я вижу, что я хочу сделать как объяснить в моем первом посте (надеюсь), но я не могу это сделать. Я надеюсь, что кто-то сможет помочь и объяснить. Спасибо:)

0 голосов
/ 09 марта 2020

В UserAuditService вы можете использовать findAndCount вместо find. Он вернет массив с 2 элементами. Первый элемент будет сущностями, а второй - общим количеством. Затем вам нужно сделать соответствующий объект ответа:

async getUsers(@Body()id: string, @Query('page') page: number): Promise<object>{
  const [audits, total] = await this.userAuditService.getAuditsForSite(id, page)
  return {
    results : audits,
    syhthesis: {
      pageNumber: page,
      numberOfResults: total,
  }
}

...