import { CallHandler, ExecutionContext, Injectable, NestInterceptor, } from '@nestjs/common'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; export function filterDeletedItems(data) { const { isArray } = Array; if (isArray(data)) { const filtered = data.filter( item => !('deletedAt' in item && !!item.deletedAt), ); filtered.forEach(item => { Object.keys(item) .filter(key => isArray(item[key])) .forEach( children => (item[children] = filterDeletedItems(item[children])), ); }); return filtered; } else { const r = filterDeletedItems([data]); return r.length === 1 ? r[0] : undefined; } } @Injectable() export class FilterDeletedItemsInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable { return next.handle().pipe(map(filterDeletedItems)); } }