import {
  CallHandler,
  ExecutionContext,
  Injectable,
  NestInterceptor,
} from '@nestjs/common';
import { instanceToPlain } from 'class-transformer';
import { Observable, map } from 'rxjs';
import { API_SUCCESS } from './../constants/api.constant';

/**
 * 정상응답 시 API 응답 포맷을 통일시키는 인터셉터
 */
@Injectable()
export class ApiResponseInterceptor implements NestInterceptor {
  intercept(
    context: ExecutionContext,
    next: CallHandler<any>,
  ): Observable<any> | Promise<Observable<any>> {
    return next.handle().pipe(
      map((data) => {
        // timeout(5000);
        const responseData = {
          ...API_SUCCESS,
          data: instanceToPlain(data) || null,
        };
        return responseData;
      }),
    );
  }
}
