refactor(nestjs): list resources

This commit is contained in:
Ahmed Bouhuolia
2025-05-04 11:19:34 +02:00
parent 4f6ad2b293
commit c9d752d102
36 changed files with 180 additions and 63 deletions

View File

@@ -143,7 +143,7 @@ export class AccountsController {
status: 200,
description: 'The accounts have been successfully retrieved.',
})
async getAccounts(@Query() filter: IAccountsFilter) {
async getAccounts(@Query() filter: Partial<IAccountsFilter>) {
return this.accountsApplication.getAccounts(filter);
}
}

View File

@@ -115,7 +115,7 @@ export class AccountsApplication {
* @returns {Promise<{ accounts: IAccountResponse[]; filterMeta: IFilterMeta }>}
*/
public getAccounts = (
filterDTO: IAccountsFilter,
filterDTO: Partial<IAccountsFilter>,
): Promise<{ accounts: Account[]; filterMeta: IFilterMeta }> => {
return this.getAccountsService.getAccountsList(filterDTO);
};

View File

@@ -1,6 +1,6 @@
import { Inject, Injectable } from '@nestjs/common';
import * as R from 'ramda';
import { IAccountsFilter } from './Accounts.types';
import { IAccountsFilter, IAccountsStructureType } from './Accounts.types';
import { DynamicListService } from '../DynamicListing/DynamicList.service';
import { AccountTransformer } from './Account.transformer';
import { TransformerInjectable } from '../Transformer/TransformerInjectable.service';
@@ -26,10 +26,17 @@ export class GetAccountsService {
* @returns {Promise<{ accounts: IAccountResponse[]; filterMeta: IFilterMeta }>}
*/
public async getAccountsList(
filterDTO: IAccountsFilter,
filterDto: Partial<IAccountsFilter>,
): Promise<{ accounts: Account[]; filterMeta: IFilterMeta }> {
const parsedFilterDto = {
sortOrder: 'desc',
columnSortBy: 'created_at',
inactiveMode: false,
structure: IAccountsStructureType.Tree,
...filterDto,
};
// Parses the stringified filter roles.
const filter = this.parseListFilterDTO(filterDTO);
const filter = this.parseListFilterDTO(parsedFilterDto);
// Dynamic list service.
const dynamicList = await this.dynamicListService.dynamicList(
@@ -49,7 +56,7 @@ export class GetAccountsService {
const transformedAccounts = await this.transformerService.transform(
accounts,
new AccountTransformer(),
{ accountsGraph, structure: filterDTO.structure },
{ accountsGraph, structure: parsedFilterDto.structure },
);
return {

View File

@@ -56,7 +56,7 @@ export class BillsApplication {
* Retrieve bills data table list.
* @param {IBillsFilter} billsFilter -
*/
public getBills(filterDTO: IBillsFilter) {
public getBills(filterDTO: Partial<IBillsFilter>) {
return this.getBillsService.getBills(filterDTO);
}

View File

@@ -56,7 +56,7 @@ export class BillsController {
type: Number,
description: 'The bill id',
})
getBills(@Query() filterDTO: IBillsFilter) {
getBills(@Query() filterDTO: Partial<IBillsFilter>) {
return this.billsApplication.getBills(filterDTO);
}

View File

@@ -21,13 +21,20 @@ export class GetBillsService {
* Retrieve bills data table list.
* @param {IBillsFilter} billsFilter -
*/
public async getBills(filterDTO: IBillsFilter): Promise<{
public async getBills(filterDTO: Partial<IBillsFilter>): Promise<{
bills: Bill;
pagination: IPaginationMeta;
filterMeta: IFilterMeta;
}> {
const _filterDto = {
page: 1,
pageSize: 12,
sortOrder: 'desc',
columnSortBy: 'created_at',
...filterDTO,
};
// Parses bills list filter DTO.
const filter = this.parseListFilterDTO(filterDTO);
const filter = this.parseListFilterDTO(_filterDto);
// Dynamic list service.
const dynamicFilter = await this.dynamicListService.dynamicList(
@@ -42,7 +49,7 @@ export class GetBillsService {
dynamicFilter.buildQuery()(builder);
// Filter query.
filterDTO?.filterQuery && filterDTO?.filterQuery(builder);
_filterDto?.filterQuery && _filterDto?.filterQuery(builder);
})
.pagination(filter.page - 1, filter.pageSize);

View File

@@ -6,9 +6,13 @@ import {
Param,
Post,
Put,
Query,
} from '@nestjs/common';
import { CustomersApplication } from './CustomersApplication.service';
import { ICustomerOpeningBalanceEditDTO } from './types/Customers.types';
import {
ICustomerOpeningBalanceEditDTO,
ICustomersFilter,
} from './types/Customers.types';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { CreateCustomerDto } from './dtos/CreateCustomer.dto';
import { EditCustomerDto } from './dtos/EditCustomer.dto';
@@ -24,6 +28,12 @@ export class CustomersController {
return this.customersApplication.getCustomer(customerId);
}
@Get()
@ApiOperation({ summary: 'Retrieves the customers paginated list.' })
getCustomers(@Query() filterDTO: Partial<ICustomersFilter>) {
return this.customersApplication.getCustomers(filterDTO);
}
@Post()
@ApiOperation({ summary: 'Create a new customer.' })
createCustomer(@Body() customerDTO: CreateCustomerDto) {

View File

@@ -76,7 +76,7 @@ export class CustomersApplication {
* Retrieve customers paginated list.
* @param {ICustomersFilter} filter - Cusotmers filter.
*/
public getCustomers = (filterDTO: ICustomersFilter) => {
public getCustomers = (filterDTO: Partial<ICustomersFilter>) => {
return this.getCustomersService.getCustomersList(filterDTO);
};
}

View File

@@ -34,10 +34,18 @@ export class GetCustomers {
* @returns {Promise<GetCustomersResponse>}
*/
public async getCustomersList(
filterDTO: ICustomersFilter,
filterDto: Partial<ICustomersFilter>,
): Promise<GetCustomersResponse> {
const _filterDto = {
inactiveMode: false,
sortOrder: 'desc',
columnSortBy: 'created_at',
page: 1,
pageSize: 12,
...filterDto,
};
// Parses customers list filter DTO.
const filter = this.parseCustomersListFilterDTO(filterDTO);
const filter = this.parseCustomersListFilterDTO(_filterDto);
const dynamicList = await this.dynamicListService.dynamicList(
this.customerModel(),

View File

@@ -1,6 +1,9 @@
import { BaseModel } from '@/models/Model';
export type ISortOrder = 'DESC' | 'ASC';
export enum ISortOrder {
DESC = 'DESC',
ASC = 'ASC'
}
export interface IDynamicFilter {
setModel(model: typeof BaseModel): void;
@@ -18,7 +21,7 @@ export interface IFilterRole {
export interface IDynamicListFilter {
customViewId?: number;
filterRoles?: IFilterRole[];
columnSortBy: ISortOrder;
columnSortBy: string;
sortOrder: ISortOrder;
stringifiedFilterRoles?: string;
searchKeyword?: string;

View File

@@ -1,9 +1,9 @@
import { castArray, isEmpty } from 'lodash';
import { Injectable } from '@nestjs/common';
import { IDynamicListFilter } from './DynamicFilter/DynamicFilter.types';
import { DynamicListSortBy } from './DynamicListSortBy.service';
import { DynamicListSearch } from './DynamicListSearch.service';
import { DynamicListCustomView } from './DynamicListCustomView.service';
import { Injectable } from '@nestjs/common';
import { DynamicListFilterRoles } from './DynamicListFilterRoles.service';
import { DynamicFilter } from './DynamicFilter';
import { MetableModel } from './types/DynamicList.types';

View File

@@ -3,7 +3,6 @@ import { ISortOrder } from './DynamicFilter/DynamicFilter.types';
import { ERRORS } from './constants';
import { DynamicFilterSortBy } from './DynamicFilter';
import { ServiceError } from '../Items/ServiceError';
import { BaseModel } from '@/models/Model';
import { DynamicFilterAbstractor } from './DynamicFilter/DynamicFilterAbstractor';
import { MetableModel } from './types/DynamicList.types';

View File

@@ -8,8 +8,8 @@ import {
import { OnEvent } from '@nestjs/event-emitter';
import { Injectable } from '@nestjs/common';
import { EventTrackerService } from '../EventTracker.service';
import { events } from '@/common/events/events';
@Injectable()
export class TransactionsLockingEventsTracker {
constructor(public readonly posthog: EventTrackerService) {}

View File

@@ -69,7 +69,7 @@ export class ExpensesApplication {
* Retrieve expenses paginated list.
* @param {IExpensesFilter} expensesFilter
*/
public getExpenses(filterDTO: IExpensesFilter) {
public getExpenses(filterDTO: Partial<IExpensesFilter>) {
return this.getExpensesService.getExpensesList(filterDTO);
}
}

View File

@@ -23,13 +23,20 @@ export class GetExpensesService {
* @param {IExpensesFilter} expensesFilter
* @return {IExpense[]}
*/
public async getExpensesList(filterDTO: IExpensesFilter): Promise<{
public async getExpensesList(filterDto: Partial<IExpensesFilter>): Promise<{
expenses: Expense[];
pagination: IPaginationMeta;
filterMeta: IFilterMeta;
}> {
const _filterDto = {
sortOrder: 'desc',
columnSortBy: 'created_at',
page: 1,
pageSize: 12,
...filterDto,
};
// Parses list filter DTO.
const filter = this.parseListFilterDTO(filterDTO);
const filter = this.parseListFilterDTO(_filterDto);
// Dynamic list service.
const dynamicList = await this.dynamicListService.dynamicList(
@@ -44,7 +51,7 @@ export class GetExpensesService {
builder.withGraphFetched('categories.expenseAccount');
dynamicList.buildQuery()(builder);
filterDTO?.filterQuery && filterDTO?.filterQuery(builder);
_filterDto?.filterQuery && _filterDto?.filterQuery(builder);
})
.pagination(filter.page - 1, filter.pageSize);

View File

@@ -78,7 +78,7 @@ export class ItemCategoryApplication {
* @param {IItemCategoriesFilter} filterDTO - The item categories filter DTO.
* @returns {Promise<GetItemCategoriesResponse>}
*/
public getItemCategories(filterDTO: IItemCategoriesFilter) {
public getItemCategories(filterDTO: Partial<IItemCategoriesFilter>) {
return this.getItemCategoriesService.getItemCategories(filterDTO);
}
}

View File

@@ -35,7 +35,7 @@ export class ItemCategoryController {
@Get()
@ApiOperation({ summary: 'Retrieves the item categories.' })
async getItemCategories(
@Query() filterDTO: IItemCategoriesFilter,
@Query() filterDTO: Partial<IItemCategoriesFilter>,
): Promise<GetItemCategoriesResponse> {
return this.itemCategoryApplication.getItemCategories(filterDTO);
}

View File

@@ -7,6 +7,7 @@ import {
IItemCategoriesFilter,
} from '../ItemCategory.interfaces';
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
import { ISortOrder } from '@/modules/DynamicListing/DynamicFilter/DynamicFilter.types';
export class GetItemCategoriesService {
constructor(
@@ -34,16 +35,21 @@ export class GetItemCategoriesService {
* @returns {Promise<GetItemCategoriesResponse>}
*/
public async getItemCategories(
filterDTO: IItemCategoriesFilter,
filterDto: Partial<IItemCategoriesFilter>,
): Promise<GetItemCategoriesResponse> {
const _filterDto = {
sortOrder: ISortOrder.ASC,
columnSortBy: 'created_at',
...filterDto,
};
// Parses list filter DTO.
const filter = this.parsesListFilterDTO(filterDTO);
const filter = this.parsesListFilterDTO(_filterDto);
// Dynamic list service.
// const dynamicList = await this.dynamicListService.dynamicList(
// this.itemCategoryModel(),
// filter,
// );
const dynamicList = await this.dynamicListService.dynamicList(
this.itemCategoryModel(),
filter,
);
// Items categories.
const itemCategories = await this.itemCategoryModel()
.query()
@@ -53,8 +59,7 @@ export class GetItemCategoriesService {
'*',
this.itemCategoryModel().relatedQuery('items').count().as('count'),
);
// dynamicList.buildQuery()(query);
dynamicList.buildQuery()(query);
});
return { itemCategories };

View File

@@ -6,12 +6,14 @@ import { Item } from './models/Item';
import { IItemsFilter } from './types/Items.types';
import { ItemTransformer } from './Item.transformer';
import { TenantModelProxy } from '../System/models/TenantBaseModel';
import { ISortOrder } from '../DynamicListing/DynamicFilter/DynamicFilter.types';
@Injectable()
export class GetItemsService {
constructor(
private readonly dynamicListService: DynamicListService,
private readonly transformer: TransformerInjectable,
@Inject(Item.name)
private readonly itemModel: TenantModelProxy<typeof Item>,
) {}
@@ -30,9 +32,17 @@ export class GetItemsService {
* Retrieves items datatable list.
* @param {IItemsFilter} itemsFilter - Items filter.
*/
public async getItems(filterDTO: IItemsFilter) {
public async getItems(filterDto: Partial<IItemsFilter>) {
const _filterDto = {
sortOrder: ISortOrder.DESC,
columnSortBy: 'created_at',
page: 1,
pageSize: 12,
inactiveMode: false,
...filterDto,
};
// Parses items list filter DTO.
const filter = this.parseItemsListFilterDTO(filterDTO);
const filter = this.parseItemsListFilterDTO(_filterDto);
// Dynamic list service.
const dynamicFilter = await this.dynamicListService.dynamicList(

View File

@@ -92,10 +92,10 @@ export class ItemsApplicationService {
/**
* Retrieves the paginated filterable items list.
* @param {IItemsFilter} filterDTO
* @param {Partial<IItemsFilter>} filterDTO
*/
async getItems(filterDTO: IItemsFilter) {
return this.getItemsService.getItems(filterDTO)
async getItems(filterDTO: Partial<IItemsFilter>) {
return this.getItemsService.getItems(filterDTO);
}
/**

View File

@@ -1,3 +1,4 @@
export const ItemMeta = {
importable: true,
exportable: true,

View File

@@ -6,6 +6,7 @@ import {
Param,
Post,
Put,
Query,
} from '@nestjs/common';
import { ManualJournalsApplication } from './ManualJournalsApplication.service';
import { ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger';
@@ -13,6 +14,7 @@ import {
CreateManualJournalDto,
EditManualJournalDto,
} from './dtos/ManualJournal.dto';
import { IManualJournalsFilter } from './types/ManualJournals.types';
@Controller('manual-journals')
@ApiTags('manual-journals')
@@ -98,4 +100,19 @@ export class ManualJournalsController {
public getManualJournal(@Param('id') manualJournalId: number) {
return this.manualJournalsApplication.getManualJournal(manualJournalId);
}
@Get()
@ApiOperation({ summary: 'Retrieves the manual journals paginated list.' })
@ApiResponse({
status: 200,
description: 'The manual journal details have been successfully retrieved.',
})
@ApiResponse({ status: 404, description: 'The manual journal not found.' })
public getManualJournals(
@Query() filterDto: Partial<IManualJournalsFilter>
) {
return this.manualJournalsApplication.getManualJournals(filterDto);
}
}

View File

@@ -79,7 +79,7 @@ export class ManualJournalsApplication {
* Retrieves the paginated manual journals.
* @param {IManualJournalsFilter} filterDTO
*/
public getManualJournals = (filterDTO: IManualJournalsFilter) => {
public getManualJournals = (filterDTO: Partial<IManualJournalsFilter>) => {
return this.getManualJournalsService.getManualJournals(filterDTO);
};
}

View File

@@ -31,14 +31,21 @@ export class GetManualJournals {
* @param {IManualJournalsFilter} filter -
*/
public getManualJournals = async (
filterDTO: IManualJournalsFilter,
filterDTO: Partial<IManualJournalsFilter>,
): Promise<{
manualJournals: ManualJournal[];
pagination: IPaginationMeta;
filterMeta: IFilterMeta;
}> => {
const _filterDto = {
sortOrder: 'desc',
columnSortBy: 'created_at',
page: 1,
pageSize: 12,
...filterDTO,
};
// Parses filter DTO.
const filter = this.parseListFilterDTO(filterDTO);
const filter = this.parseListFilterDTO(_filterDto);
// Dynamic service.
const dynamicService = await this.dynamicListService.dynamicList(

View File

@@ -77,7 +77,7 @@ export class PaymentReceivesApplication {
* @param {IPaymentsReceivedFilter} filterDTO
* @returns
*/
public async getPaymentsReceived(filterDTO: IPaymentsReceivedFilter) {
public async getPaymentsReceived(filterDTO: Partial<IPaymentsReceivedFilter>) {
return this.getPaymentsReceivedService.getPaymentReceives(filterDTO);
}

View File

@@ -1,3 +1,4 @@
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import {
Body,
Controller,
@@ -17,7 +18,6 @@ import {
IPaymentsReceivedFilter,
PaymentReceiveMailOptsDTO,
} from './types/PaymentReceived.types';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
@Controller('payments-received')
@ApiTags('payments-received')
@@ -88,7 +88,7 @@ export class PaymentReceivesController {
@Get()
@ApiOperation({ summary: 'Retrieves the payment received list.' })
public getPaymentsReceived(@Query() filterDTO: IPaymentsReceivedFilter) {
public getPaymentsReceived(@Query() filterDTO: Partial<IPaymentsReceivedFilter>) {
return this.paymentReceivesApplication.getPaymentsReceived(filterDTO);
}

View File

@@ -24,13 +24,22 @@ export class GetPaymentsReceivedService {
* Retrieve payment receives paginated and filterable list.
* @param {IPaymentsReceivedFilter} filterDTO
*/
public async getPaymentReceives(filterDTO: IPaymentsReceivedFilter): Promise<{
public async getPaymentReceives(
filterDTO: Partial<IPaymentsReceivedFilter>,
): Promise<{
paymentReceives: PaymentReceived[];
pagination: IPaginationMeta;
filterMeta: IFilterMeta;
}> {
const _filterDto = {
sortOrder: 'desc',
columnSortBy: 'created_at',
page: 1,
pageSize: 12,
...filterDTO,
};
// Parses filter DTO.
const filter = this.parseListFilterDTO(filterDTO);
const filter = this.parseListFilterDTO(_filterDto);
// Dynamic list service.
const dynamicList = await this.dynamicListService.dynamicList(
@@ -44,7 +53,7 @@ export class GetPaymentsReceivedService {
builder.withGraphFetched('depositAccount');
dynamicList.buildQuery()(builder);
filterDTO?.filterQuery && filterDTO.filterQuery(builder as any);
_filterDto?.filterQuery && _filterDto.filterQuery(builder as any);
})
.pagination(filter.page - 1, filter.pageSize);

View File

@@ -79,7 +79,7 @@ export class SaleEstimatesApplication {
* @param {ISalesEstimatesFilter} filterDTO - Sales estimates filter DTO.
* @returns
*/
public getSaleEstimates(filterDTO: ISalesEstimatesFilter) {
public getSaleEstimates(filterDTO: Partial<ISalesEstimatesFilter>) {
return this.getSaleEstimatesService.getEstimates(filterDTO);
}

View File

@@ -22,13 +22,22 @@ export class GetSaleEstimatesService {
* Retrieves estimates filterable and paginated list.
* @param {IEstimatesFilter} estimatesFilter -
*/
public async getEstimates(filterDTO: ISalesEstimatesFilter): Promise<{
public async getEstimates(
filterDTO: Partial<ISalesEstimatesFilter>,
): Promise<{
salesEstimates: SaleEstimate[];
pagination: IPaginationMeta;
filterMeta: IFilterMeta;
}> {
const _filterDto = {
sortOrder: 'desc',
columnSortBy: 'created_at',
page: 1,
pageSize: 12,
...filterDTO,
};
// Parses filter DTO.
const filter = this.parseListFilterDTO(filterDTO);
const filter = this.parseListFilterDTO(_filterDto);
// Dynamic list service.
const dynamicFilter = await this.dynamicListService.dynamicList(
@@ -43,7 +52,7 @@ export class GetSaleEstimatesService {
builder.withGraphFetched('entries.item');
dynamicFilter.buildQuery()(builder);
filterDTO?.filterQuery && filterDTO?.filterQuery(builder);
_filterDto?.filterQuery && _filterDto?.filterQuery(builder);
})
.pagination(filter.page - 1, filter.pageSize);

View File

@@ -81,7 +81,7 @@ export class SaleInvoiceApplication {
* @param {ISalesInvoicesFilter} filterDTO
* @returns {Promise<{ salesInvoices: SaleInvoice[]; pagination: IPaginationMeta; filterMeta: IFilterMeta; }>}
*/
public getSaleInvoices(filterDTO: ISalesInvoicesFilter) {
public getSaleInvoices(filterDTO: Partial<ISalesInvoicesFilter>) {
return this.getSaleInvoicesService.getSaleInvoices(filterDTO);
}

View File

@@ -117,7 +117,7 @@ export class SaleInvoicesController {
status: 200,
description: 'The sale invoices have been successfully retrieved.',
})
getSaleInvoices(@Query() filterDTO: ISalesInvoicesFilter) {
getSaleInvoices(@Query() filterDTO: Partial<ISalesInvoicesFilter>) {
return this.saleInvoiceApplication.getSaleInvoices(filterDTO);
}

View File

@@ -24,13 +24,22 @@ export class GetSaleInvoicesService {
* @param {ISalesInvoicesFilter} filterDTO -
* @returns {Promise<{ salesInvoices: SaleInvoice[]; pagination: IPaginationMeta; filterMeta: IFilterMeta; }>}
*/
public async getSaleInvoices(filterDTO: ISalesInvoicesFilter): Promise<{
public async getSaleInvoices(
filterDTO: Partial<ISalesInvoicesFilter>,
): Promise<{
salesInvoices: SaleInvoice[];
pagination: IPaginationMeta;
filterMeta: IFilterMeta;
}> {
const _filterDto = {
sortOrder: 'desc',
columnSortBy: 'created_at',
page: 1,
pageSize: 12,
...filterDTO,
};
// Parses stringified filter roles.
const filter = this.parseListFilterDTO(filterDTO);
const filter = this.parseListFilterDTO(_filterDto);
// Dynamic list service.
const dynamicFilter = await this.dynamicListService.dynamicList(
@@ -44,7 +53,7 @@ export class GetSaleInvoicesService {
builder.withGraphFetched('customer');
dynamicFilter.buildQuery()(builder);
filterDTO?.filterQuery?.(builder as any);
_filterDto?.filterQuery?.(builder as any);
})
.pagination(filter.page - 1, filter.pageSize);

View File

@@ -23,9 +23,10 @@ export class SaleReceiptBrandingTemplate {
public async getSaleReceiptBrandingTemplate(templateId: number) {
const template =
await this.getPdfTemplateService.getPdfTemplate(templateId);
// Retrieves the organization branding attributes.
const commonOrgBrandingAttrs =
await this.getOrgBrandingAttributes.getOrganizationBrandingAttributes();
await this.getOrgBrandingAttributes.execute();
// Merges the default branding attributes with organization common branding attrs.
const organizationBrandingAttrs = {

View File

@@ -24,7 +24,7 @@ export class VendorsController {
@Get()
@ApiOperation({ summary: 'Retrieves the vendors.' })
getVendors(@Query() filterDTO: IVendorsFilter) {
getVendors(@Query() filterDTO: Partial<IVendorsFilter>) {
return this.vendorsApplication.getVendors(filterDTO);
}

View File

@@ -79,10 +79,10 @@ export class VendorsApplication {
/**
* Retrieves the vendors paginated list.
* @param {IVendorsFilter} filterDTO
* @param {Partial<IVendorsFilter>} filterDTO
* @returns {Promise<{ vendors: Vendor[], pagination: IPaginationMeta, filterMeta: IFilterMeta }>>}
*/
public getVendors(filterDTO: IVendorsFilter) {
public getVendors(filterDTO: Partial<IVendorsFilter>) {
return this.getVendorsService.getVendorsList(filterDTO);
}
}

View File

@@ -28,10 +28,18 @@ export class GetVendorsService {
* @returns {Promise<GetVendorsResponse>}
*/
public async getVendorsList(
filterDTO: IVendorsFilter,
filterDto: Partial<IVendorsFilter>,
): Promise<GetVendorsResponse> {
const _filterDto = {
inactiveMode: false,
sortOrder: 'desc',
columnSortBy: 'created_at',
page: 1,
pageSize: 12,
...filterDto,
};
// Parses vendors list filter DTO.
const filter = this.parseVendorsListFilterDTO(filterDTO);
const filter = this.parseVendorsListFilterDTO(_filterDto);
// Dynamic list service.
const dynamicList = await this.dynamicListService.dynamicList(