fix(lint): resolve all 49 lint warnings and errors across codebase

- Remove unused imports/variables in seed scripts and test files
- Replace console.log with console.warn in seed/utility scripts
- Replace `as any` with proper Prisma types (InputJsonValue, PaymentStatus, Plan, UserWhereInput)
- Fix import-x/no-named-as-default-member warnings in logger, mapbox, eslint config
- Prefix unused callback params with underscore in e2e tests

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Ho Ngoc Hai
2026-04-08 13:22:07 +07:00
parent 36c1e3b39a
commit cc5c81904b
18 changed files with 47 additions and 44 deletions

View File

@@ -1,4 +1,5 @@
import { Injectable } from '@nestjs/common';
import { type Prisma, type UserRole } from '@prisma/client';
import { type PrismaService } from '@modules/shared/infrastructure/prisma.service';
import {
type IAdminQueryRepository,
@@ -163,8 +164,8 @@ export class PrismaAdminQueryRepository implements IAdminQueryRepository {
const { page, limit, role, isActive, search } = params;
const skip = (page - 1) * limit;
const where: any = {};
if (role) where.role = role;
const where: Prisma.UserWhereInput = {};
if (role) where.role = role as UserRole;
if (isActive !== undefined) where.isActive = isActive;
if (search) {
where.OR = [

View File

@@ -1,5 +1,5 @@
import { Injectable } from '@nestjs/common';
import { type Valuation as PrismaValuation } from '@prisma/client';
import { type Prisma, type Valuation as PrismaValuation } from '@prisma/client';
import { type PrismaService } from '@modules/shared/infrastructure/prisma.service';
import { ValuationEntity, type ValuationProps } from '../../domain/entities/valuation.entity';
import { type IValuationRepository } from '../../domain/repositories/valuation.repository';
@@ -38,8 +38,8 @@ export class PrismaValuationRepository implements IValuationRepository {
estimatedPrice: entity.estimatedPrice,
confidence: entity.confidence,
pricePerM2: entity.pricePerM2,
comparables: entity.comparables as any,
features: entity.features as any,
comparables: entity.comparables as Prisma.InputJsonValue,
features: entity.features as Prisma.InputJsonValue,
modelVersion: entity.modelVersion,
},
});

View File

@@ -1,5 +1,5 @@
import { Injectable } from '@nestjs/common';
import { type User as PrismaUser } from '@prisma/client';
import { type Prisma, type User as PrismaUser } from '@prisma/client';
import { type PrismaService } from '@modules/shared/infrastructure/prisma.service';
import { UserEntity, type UserProps } from '../../domain/entities/user.entity';
import { type IUserRepository } from '../../domain/repositories/user.repository';
@@ -37,7 +37,7 @@ export class PrismaUserRepository implements IUserRepository {
avatarUrl: entity.avatarUrl,
role: entity.role,
kycStatus: entity.kycStatus,
kycData: entity.kycData as any,
kycData: entity.kycData as Prisma.InputJsonValue,
isActive: entity.isActive,
},
});
@@ -54,7 +54,7 @@ export class PrismaUserRepository implements IUserRepository {
avatarUrl: entity.avatarUrl,
role: entity.role,
kycStatus: entity.kycStatus,
kycData: entity.kycData as any,
kycData: entity.kycData as Prisma.InputJsonValue,
isActive: entity.isActive,
},
});

View File

@@ -1,4 +1,3 @@
import { ListingEntity } from '@modules/listings/domain/entities/listing.entity';
import { type IListingRepository } from '@modules/listings/domain/repositories/listing.repository';
import { type IPropertyRepository } from '@modules/listings/domain/repositories/property.repository';
import { CreateListingCommand } from '../commands/create-listing/create-listing.command';

View File

@@ -1,5 +1,5 @@
import { Injectable } from '@nestjs/common';
import { type Property as PrismaProperty, type PropertyMedia as PrismaMedia } from '@prisma/client';
import { type Prisma, type Property as PrismaProperty, type PropertyMedia as PrismaMedia } from '@prisma/client';
import { type PrismaService } from '@modules/shared/infrastructure/prisma.service';
import { PropertyMediaEntity, type PropertyMediaProps } from '../../domain/entities/property-media.entity';
import { PropertyEntity, type PropertyProps } from '../../domain/entities/property.entity';
@@ -69,7 +69,7 @@ export class PrismaPropertyRepository implements IPropertyRepository {
type: media.type,
order: media.order,
caption: media.caption,
aiTags: media.aiTags as any,
aiTags: media.aiTags as Prisma.InputJsonValue,
},
});
}

View File

@@ -1,6 +1,4 @@
import { type IPaymentRepository } from '../../domain/repositories/payment.repository';
import { Money } from '../../domain/value-objects/money.vo';
import { type IPaymentGatewayFactory } from '../../infrastructure/services/payment-gateway.interface';
import { CreatePaymentCommand } from '../commands/create-payment/create-payment.command';
import { CreatePaymentHandler } from '../commands/create-payment/create-payment.handler';

View File

@@ -1,5 +1,6 @@
import { Inject, Logger } from '@nestjs/common';
import { CommandHandler, type EventBus, type ICommandHandler } from '@nestjs/cqrs';
import { type PaymentStatus } from '@prisma/client';
import { NotFoundException, ValidationException } from '@modules/shared/domain/domain-exception';
import {
PAYMENT_REPOSITORY,
@@ -47,7 +48,7 @@ export class HandleCallbackHandler implements ICommandHandler<HandleCallbackComm
result.orderId,
['PENDING', 'PROCESSING'],
{
status: targetStatus as any,
status: targetStatus as PaymentStatus,
callbackData: result.rawData,
},
);

View File

@@ -64,7 +64,7 @@ export class PrismaPaymentRepository implements IPaymentRepository {
amountVND: entity.amount.value,
status: entity.status,
providerTxId: entity.providerTxId,
callbackData: entity.callbackData as any,
callbackData: entity.callbackData as Prisma.InputJsonValue,
idempotencyKey: entity.idempotencyKey,
},
});
@@ -76,7 +76,7 @@ export class PrismaPaymentRepository implements IPaymentRepository {
data: {
status: entity.status,
providerTxId: entity.providerTxId,
callbackData: entity.callbackData as any,
callbackData: entity.callbackData as Prisma.InputJsonValue,
},
});
}
@@ -95,7 +95,7 @@ export class PrismaPaymentRepository implements IPaymentRepository {
data: {
status: data.status,
...(data.providerTxId !== undefined ? { providerTxId: data.providerTxId } : {}),
...(data.callbackData !== undefined ? { callbackData: data.callbackData as any } : {}),
...(data.callbackData !== undefined ? { callbackData: data.callbackData as Prisma.InputJsonValue } : {}),
},
});
return this.toDomain(updated);

View File

@@ -1,5 +1,5 @@
import { Injectable, type LoggerService as NestLoggerService } from '@nestjs/common';
import pino, { type Logger } from 'pino';
import pinoLogger, { type Logger, stdTimeFunctions } from 'pino';
import { maskPii } from './pii-masker';
@Injectable()
@@ -7,7 +7,7 @@ export class LoggerService implements NestLoggerService {
private readonly logger: Logger;
constructor() {
this.logger = pino({
this.logger = pinoLogger({
level: process.env['LOG_LEVEL'] ?? 'info',
transport:
process.env['NODE_ENV'] !== 'production'
@@ -22,7 +22,7 @@ export class LoggerService implements NestLoggerService {
},
},
base: { service: 'goodgo-api' },
timestamp: pino.stdTimeFunctions.isoTime,
timestamp: stdTimeFunctions.isoTime,
});
}

View File

@@ -1,5 +1,6 @@
import { Inject } from '@nestjs/common';
import { type IQueryHandler, QueryHandler } from '@nestjs/cqrs';
import { type Plan } from '@prisma/client';
import { NotFoundException } from '@modules/shared/domain/domain-exception';
import { type PrismaService } from '@modules/shared/infrastructure/prisma.service';
import {
@@ -16,7 +17,7 @@ export interface QuotaCheckResult {
allowed: boolean;
}
const METRIC_TO_PLAN_FIELD: Record<string, string> = {
const METRIC_TO_PLAN_FIELD: Record<string, keyof Plan> = {
listings_created: 'maxListings',
searches_saved: 'maxSavedSearches',
};
@@ -54,7 +55,7 @@ export class CheckQuotaHandler implements IQueryHandler<CheckQuotaQuery> {
}
private async checkAgainstPlan(
plan: any,
plan: Plan,
metric: string,
subscriptionId: string | null,
_userId: string,

View File

@@ -1,4 +1,5 @@
import { type IQueryHandler, QueryHandler } from '@nestjs/cqrs';
import { type Plan } from '@prisma/client';
import { NotFoundException } from '@modules/shared/domain/domain-exception';
import { type PrismaService } from '@modules/shared/infrastructure/prisma.service';
import { GetPlanQuery } from './get-plan.query';
@@ -41,7 +42,7 @@ export class GetPlanHandler implements IQueryHandler<GetPlanQuery> {
return plans.map((p) => this.toDto(p));
}
private toDto(plan: any): PlanDto {
private toDto(plan: Plan): PlanDto {
return {
id: plan.id,
tier: plan.tier,