File

src/proposals/proposals.service.ts

Index

Methods

Constructor

constructor(proposalModel: Model<ProposalDocument>, request: Request)
Parameters :
Name Type Optional
proposalModel Model<ProposalDocument> No
request Request No

Methods

Async create
create(createProposalDto: CreateProposalDto)
Parameters :
Name Type Optional
createProposalDto CreateProposalDto No
Async findAll
findAll(filter: IFilters<ProposalDocument | IProposalFields>)
Parameters :
Name Type Optional
filter IFilters<ProposalDocument | IProposalFields> No
Async findOne
findOne(filter: FilterQuery<ProposalDocument>)
Parameters :
Name Type Optional
filter FilterQuery<ProposalDocument> No
Async fullfacet
fullfacet(filters: IFacets)
Parameters :
Name Type Optional
filters IFacets<IProposalFields> No
Returns : Promise<Record[]>
Async fullquery
fullquery(filter: IFilters<ProposalDocument | IProposalFields>)
Parameters :
Name Type Optional
filter IFilters<ProposalDocument | IProposalFields> No
Async remove
remove(filter: FilterQuery<ProposalDocument>)
Parameters :
Name Type Optional
filter FilterQuery<ProposalDocument> No
Returns : Promise<>
Async update
update(filter: FilterQuery<ProposalDocument>, updateProposalDto: UpdateProposalDto)
Parameters :
Name Type Optional
filter FilterQuery<ProposalDocument> No
updateProposalDto UpdateProposalDto No
import { Inject, Injectable, Scope } from "@nestjs/common";
import { REQUEST } from "@nestjs/core";
import { Request } from "express";
import { InjectModel } from "@nestjs/mongoose";
import { FilterQuery, Model, PipelineStage, QueryOptions } from "mongoose";
import { IFacets, IFilters } from "src/common/interfaces/common.interface";
import {
  createFullfacetPipeline,
  createFullqueryFilter,
  parseLimitFilters,
  addCreatedByFields,
  addUpdatedByField,
} from "src/common/utils";
import { CreateProposalDto } from "./dto/create-proposal.dto";
import { UpdateProposalDto } from "./dto/update-proposal.dto";
import { IProposalFields } from "./interfaces/proposal-filters.interface";
import { ProposalClass, ProposalDocument } from "./schemas/proposal.schema";
import { JWTUser } from "src/auth/interfaces/jwt-user.interface";

@Injectable({ scope: Scope.REQUEST })
export class ProposalsService {
  constructor(
    @InjectModel(ProposalClass.name)
    private proposalModel: Model<ProposalDocument>,
    @Inject(REQUEST) private request: Request,
  ) {}

  async create(createProposalDto: CreateProposalDto): Promise<ProposalClass> {
    const username = (this.request.user as JWTUser).username;
    const createdProposal = new this.proposalModel(
      addCreatedByFields<CreateProposalDto>(createProposalDto, username),
    );
    return createdProposal.save();
  }

  async findAll(
    filter: IFilters<ProposalDocument, IProposalFields>,
  ): Promise<ProposalClass[]> {
    const whereFilter: FilterQuery<ProposalDocument> = filter.where ?? {};
    const { limit, skip, sort } = parseLimitFilters(filter.limits);

    return this.proposalModel
      .find(whereFilter)
      .limit(limit)
      .skip(skip)
      .sort(sort)
      .exec();
  }

  async fullquery(
    filter: IFilters<ProposalDocument, IProposalFields>,
  ): Promise<ProposalClass[]> {
    const filterQuery: FilterQuery<ProposalDocument> =
      createFullqueryFilter<ProposalDocument>(
        this.proposalModel,
        "proposalId",
        filter.fields,
      );
    const modifiers: QueryOptions = parseLimitFilters(filter.limits);

    return this.proposalModel.find(filterQuery, null, modifiers).exec();
  }

  async fullfacet(
    filters: IFacets<IProposalFields>,
  ): Promise<Record<string, unknown>[]> {
    const fields = filters.fields ?? {};
    const facets = filters.facets ?? [];

    const pipeline: PipelineStage[] = createFullfacetPipeline<
      ProposalDocument,
      IProposalFields
    >(this.proposalModel, "proposalId", fields, facets);

    return await this.proposalModel.aggregate(pipeline).exec();
  }

  async findOne(
    filter: FilterQuery<ProposalDocument>,
  ): Promise<ProposalClass | null> {
    return this.proposalModel.findOne(filter).exec();
  }

  async update(
    filter: FilterQuery<ProposalDocument>,
    updateProposalDto: UpdateProposalDto,
  ): Promise<ProposalClass | null> {
    const username = (this.request.user as JWTUser).username;

    return this.proposalModel
      .findOneAndUpdate(
        filter,
        addUpdatedByField(updateProposalDto, username),
        {
          new: true,
        },
      )
      .exec();
  }

  async remove(filter: FilterQuery<ProposalDocument>): Promise<unknown> {
    return this.proposalModel.findOneAndRemove(filter).exec();
  }
}

results matching ""

    No results matching ""