[TS-FIX] fix: Fix TypeScript errors in admin and bidding modules
- Add ServiceContext interface to base.service.ts - Fix admin module: audit-log, backup, cost-center, system-setting - Define ServiceContext and PaginatedResult locally - Convert services from extends BaseService to standalone - Change PaginatedResult from meta format to flat format - Fix controllers to use flat pagination format - Fix bidding module: bid, bid-budget, opportunity - Change PaginatedResult from meta format to flat format - Fix controllers to use flat pagination format Modules with remaining errors: finance, payment-terminals, estimates, mcp, reports, progress, budgets, ai, hse (563 errors total) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
f14829d2ce
commit
99064f5f24
@ -15,7 +15,11 @@ import { AuditLog } from '../entities/audit-log.entity';
|
|||||||
import { User } from '../../core/entities/user.entity';
|
import { User } from '../../core/entities/user.entity';
|
||||||
import { Tenant } from '../../core/entities/tenant.entity';
|
import { Tenant } from '../../core/entities/tenant.entity';
|
||||||
import { RefreshToken } from '../../auth/entities/refresh-token.entity';
|
import { RefreshToken } from '../../auth/entities/refresh-token.entity';
|
||||||
import { ServiceContext } from '../../../shared/services/base.service';
|
|
||||||
|
interface ServiceContext {
|
||||||
|
tenantId: string;
|
||||||
|
userId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export function createAuditLogController(dataSource: DataSource): Router {
|
export function createAuditLogController(dataSource: DataSource): Router {
|
||||||
const router = Router();
|
const router = Router();
|
||||||
@ -74,7 +78,7 @@ export function createAuditLogController(dataSource: DataSource): Router {
|
|||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
success: true,
|
success: true,
|
||||||
data: result.data,
|
data: result.data,
|
||||||
pagination: result.meta,
|
pagination: { total: result.total, page: result.page, limit: result.limit, totalPages: result.totalPages },
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
next(error);
|
next(error);
|
||||||
@ -164,7 +168,7 @@ export function createAuditLogController(dataSource: DataSource): Router {
|
|||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
success: true,
|
success: true,
|
||||||
data: result.data,
|
data: result.data,
|
||||||
pagination: result.meta,
|
pagination: { total: result.total, page: result.page, limit: result.limit, totalPages: result.totalPages },
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
next(error);
|
next(error);
|
||||||
@ -194,7 +198,7 @@ export function createAuditLogController(dataSource: DataSource): Router {
|
|||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
success: true,
|
success: true,
|
||||||
data: result.data,
|
data: result.data,
|
||||||
pagination: result.meta,
|
pagination: { total: result.total, page: result.page, limit: result.limit, totalPages: result.totalPages },
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
next(error);
|
next(error);
|
||||||
|
|||||||
@ -15,7 +15,11 @@ import { Backup } from '../entities/backup.entity';
|
|||||||
import { User } from '../../core/entities/user.entity';
|
import { User } from '../../core/entities/user.entity';
|
||||||
import { Tenant } from '../../core/entities/tenant.entity';
|
import { Tenant } from '../../core/entities/tenant.entity';
|
||||||
import { RefreshToken } from '../../auth/entities/refresh-token.entity';
|
import { RefreshToken } from '../../auth/entities/refresh-token.entity';
|
||||||
import { ServiceContext } from '../../../shared/services/base.service';
|
|
||||||
|
interface ServiceContext {
|
||||||
|
tenantId: string;
|
||||||
|
userId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export function createBackupController(dataSource: DataSource): Router {
|
export function createBackupController(dataSource: DataSource): Router {
|
||||||
const router = Router();
|
const router = Router();
|
||||||
@ -69,7 +73,7 @@ export function createBackupController(dataSource: DataSource): Router {
|
|||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
success: true,
|
success: true,
|
||||||
data: result.data,
|
data: result.data,
|
||||||
pagination: result.meta,
|
pagination: { total: result.total, page: result.page, limit: result.limit, totalPages: result.totalPages },
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
next(error);
|
next(error);
|
||||||
|
|||||||
@ -15,7 +15,11 @@ import { CostCenter } from '../entities/cost-center.entity';
|
|||||||
import { User } from '../../core/entities/user.entity';
|
import { User } from '../../core/entities/user.entity';
|
||||||
import { Tenant } from '../../core/entities/tenant.entity';
|
import { Tenant } from '../../core/entities/tenant.entity';
|
||||||
import { RefreshToken } from '../../auth/entities/refresh-token.entity';
|
import { RefreshToken } from '../../auth/entities/refresh-token.entity';
|
||||||
import { ServiceContext } from '../../../shared/services/base.service';
|
|
||||||
|
interface ServiceContext {
|
||||||
|
tenantId: string;
|
||||||
|
userId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export function createCostCenterController(dataSource: DataSource): Router {
|
export function createCostCenterController(dataSource: DataSource): Router {
|
||||||
const router = Router();
|
const router = Router();
|
||||||
@ -69,7 +73,7 @@ export function createCostCenterController(dataSource: DataSource): Router {
|
|||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
success: true,
|
success: true,
|
||||||
data: result.data,
|
data: result.data,
|
||||||
pagination: result.meta,
|
pagination: { total: result.total, page: result.page, limit: result.limit, totalPages: result.totalPages },
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
next(error);
|
next(error);
|
||||||
|
|||||||
@ -15,7 +15,11 @@ import { SystemSetting } from '../entities/system-setting.entity';
|
|||||||
import { User } from '../../core/entities/user.entity';
|
import { User } from '../../core/entities/user.entity';
|
||||||
import { Tenant } from '../../core/entities/tenant.entity';
|
import { Tenant } from '../../core/entities/tenant.entity';
|
||||||
import { RefreshToken } from '../../auth/entities/refresh-token.entity';
|
import { RefreshToken } from '../../auth/entities/refresh-token.entity';
|
||||||
import { ServiceContext } from '../../../shared/services/base.service';
|
|
||||||
|
interface ServiceContext {
|
||||||
|
tenantId: string;
|
||||||
|
userId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export function createSystemSettingController(dataSource: DataSource): Router {
|
export function createSystemSettingController(dataSource: DataSource): Router {
|
||||||
const router = Router();
|
const router = Router();
|
||||||
@ -65,7 +69,7 @@ export function createSystemSettingController(dataSource: DataSource): Router {
|
|||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
success: true,
|
success: true,
|
||||||
data: result.data,
|
data: result.data,
|
||||||
pagination: result.meta,
|
pagination: { total: result.total, page: result.page, limit: result.limit, totalPages: result.totalPages },
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
next(error);
|
next(error);
|
||||||
|
|||||||
@ -7,9 +7,21 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Repository } from 'typeorm';
|
import { Repository } from 'typeorm';
|
||||||
import { ServiceContext, PaginatedResult } from '../../../shared/services/base.service';
|
|
||||||
import { AuditLog, AuditCategory, AuditAction, AuditSeverity } from '../entities/audit-log.entity';
|
import { AuditLog, AuditCategory, AuditAction, AuditSeverity } from '../entities/audit-log.entity';
|
||||||
|
|
||||||
|
interface ServiceContext {
|
||||||
|
tenantId: string;
|
||||||
|
userId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PaginatedResult<T> {
|
||||||
|
data: T[];
|
||||||
|
total: number;
|
||||||
|
page: number;
|
||||||
|
limit: number;
|
||||||
|
totalPages: number;
|
||||||
|
}
|
||||||
|
|
||||||
export interface CreateAuditLogDto {
|
export interface CreateAuditLogDto {
|
||||||
userId?: string;
|
userId?: string;
|
||||||
category: AuditCategory;
|
category: AuditCategory;
|
||||||
@ -138,12 +150,10 @@ export class AuditLogService {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
meta: {
|
total,
|
||||||
total,
|
page,
|
||||||
page,
|
limit,
|
||||||
limit,
|
totalPages: Math.ceil(total / limit),
|
||||||
totalPages: Math.ceil(total / limit),
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,9 +7,21 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Repository } from 'typeorm';
|
import { Repository } from 'typeorm';
|
||||||
import { BaseService, ServiceContext, PaginatedResult } from '../../../shared/services/base.service';
|
|
||||||
import { Backup, BackupType, BackupStatus, BackupStorage } from '../entities/backup.entity';
|
import { Backup, BackupType, BackupStatus, BackupStorage } from '../entities/backup.entity';
|
||||||
|
|
||||||
|
interface ServiceContext {
|
||||||
|
tenantId: string;
|
||||||
|
userId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PaginatedResult<T> {
|
||||||
|
data: T[];
|
||||||
|
total: number;
|
||||||
|
page: number;
|
||||||
|
limit: number;
|
||||||
|
totalPages: number;
|
||||||
|
}
|
||||||
|
|
||||||
export interface CreateBackupDto {
|
export interface CreateBackupDto {
|
||||||
backupType: BackupType;
|
backupType: BackupType;
|
||||||
name: string;
|
name: string;
|
||||||
@ -33,9 +45,38 @@ export interface BackupFilters {
|
|||||||
dateTo?: Date;
|
dateTo?: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class BackupService extends BaseService<Backup> {
|
export class BackupService {
|
||||||
|
private repository: Repository<Backup>;
|
||||||
|
|
||||||
constructor(repository: Repository<Backup>) {
|
constructor(repository: Repository<Backup>) {
|
||||||
super(repository);
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
async create(ctx: ServiceContext, data: Partial<Backup>): Promise<Backup> {
|
||||||
|
const entity = this.repository.create({
|
||||||
|
...data,
|
||||||
|
tenantId: ctx.tenantId,
|
||||||
|
createdById: ctx.userId,
|
||||||
|
});
|
||||||
|
return this.repository.save(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
async findById(ctx: ServiceContext, id: string): Promise<Backup | null> {
|
||||||
|
return this.repository.findOne({
|
||||||
|
where: { id, tenantId: ctx.tenantId } as any,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async update(ctx: ServiceContext, id: string, data: Partial<Backup>): Promise<Backup | null> {
|
||||||
|
const entity = await this.findById(ctx, id);
|
||||||
|
if (!entity) return null;
|
||||||
|
Object.assign(entity, data);
|
||||||
|
return this.repository.save(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
async softDelete(ctx: ServiceContext, id: string): Promise<boolean> {
|
||||||
|
const result = await this.repository.delete({ id, tenantId: ctx.tenantId } as any);
|
||||||
|
return (result.affected || 0) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -81,12 +122,10 @@ export class BackupService extends BaseService<Backup> {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
meta: {
|
total,
|
||||||
total,
|
page,
|
||||||
page,
|
limit,
|
||||||
limit,
|
totalPages: Math.ceil(total / limit),
|
||||||
totalPages: Math.ceil(total / limit),
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,9 +7,21 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Repository } from 'typeorm';
|
import { Repository } from 'typeorm';
|
||||||
import { BaseService, ServiceContext, PaginatedResult } from '../../../shared/services/base.service';
|
|
||||||
import { CostCenter, CostCenterType, CostCenterLevel } from '../entities/cost-center.entity';
|
import { CostCenter, CostCenterType, CostCenterLevel } from '../entities/cost-center.entity';
|
||||||
|
|
||||||
|
interface ServiceContext {
|
||||||
|
tenantId: string;
|
||||||
|
userId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PaginatedResult<T> {
|
||||||
|
data: T[];
|
||||||
|
total: number;
|
||||||
|
page: number;
|
||||||
|
limit: number;
|
||||||
|
totalPages: number;
|
||||||
|
}
|
||||||
|
|
||||||
export interface CreateCostCenterDto {
|
export interface CreateCostCenterDto {
|
||||||
code: string;
|
code: string;
|
||||||
name: string;
|
name: string;
|
||||||
@ -42,9 +54,41 @@ export interface CostCenterFilters {
|
|||||||
search?: string;
|
search?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class CostCenterService extends BaseService<CostCenter> {
|
export class CostCenterService {
|
||||||
|
private repository: Repository<CostCenter>;
|
||||||
|
|
||||||
constructor(repository: Repository<CostCenter>) {
|
constructor(repository: Repository<CostCenter>) {
|
||||||
super(repository);
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
async create(ctx: ServiceContext, data: Partial<CostCenter>): Promise<CostCenter> {
|
||||||
|
const entity = this.repository.create({
|
||||||
|
...data,
|
||||||
|
tenantId: ctx.tenantId,
|
||||||
|
createdById: ctx.userId,
|
||||||
|
});
|
||||||
|
return this.repository.save(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
async findById(ctx: ServiceContext, id: string): Promise<CostCenter | null> {
|
||||||
|
return this.repository.findOne({
|
||||||
|
where: { id, tenantId: ctx.tenantId, deletedAt: null } as any,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async update(ctx: ServiceContext, id: string, data: Partial<CostCenter>): Promise<CostCenter | null> {
|
||||||
|
const entity = await this.findById(ctx, id);
|
||||||
|
if (!entity) return null;
|
||||||
|
Object.assign(entity, data);
|
||||||
|
return this.repository.save(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
async softDelete(ctx: ServiceContext, id: string): Promise<boolean> {
|
||||||
|
const entity = await this.findById(ctx, id);
|
||||||
|
if (!entity) return false;
|
||||||
|
entity.deletedAt = new Date();
|
||||||
|
await this.repository.save(entity);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -100,12 +144,10 @@ export class CostCenterService extends BaseService<CostCenter> {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
meta: {
|
total,
|
||||||
total,
|
page,
|
||||||
page,
|
limit,
|
||||||
limit,
|
totalPages: Math.ceil(total / limit),
|
||||||
totalPages: Math.ceil(total / limit),
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,9 +7,21 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Repository } from 'typeorm';
|
import { Repository } from 'typeorm';
|
||||||
import { BaseService, ServiceContext, PaginatedResult } from '../../../shared/services/base.service';
|
|
||||||
import { SystemSetting, SettingCategory, SettingDataType } from '../entities/system-setting.entity';
|
import { SystemSetting, SettingCategory, SettingDataType } from '../entities/system-setting.entity';
|
||||||
|
|
||||||
|
interface ServiceContext {
|
||||||
|
tenantId: string;
|
||||||
|
userId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PaginatedResult<T> {
|
||||||
|
data: T[];
|
||||||
|
total: number;
|
||||||
|
page: number;
|
||||||
|
limit: number;
|
||||||
|
totalPages: number;
|
||||||
|
}
|
||||||
|
|
||||||
export interface CreateSettingDto {
|
export interface CreateSettingDto {
|
||||||
key: string;
|
key: string;
|
||||||
name: string;
|
name: string;
|
||||||
@ -43,9 +55,37 @@ export interface SettingFilters {
|
|||||||
search?: string;
|
search?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class SystemSettingService extends BaseService<SystemSetting> {
|
export class SystemSettingService {
|
||||||
|
private repository: Repository<SystemSetting>;
|
||||||
|
|
||||||
constructor(repository: Repository<SystemSetting>) {
|
constructor(repository: Repository<SystemSetting>) {
|
||||||
super(repository);
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
async create(ctx: ServiceContext, data: Partial<SystemSetting>): Promise<SystemSetting> {
|
||||||
|
const entity = this.repository.create({
|
||||||
|
...data,
|
||||||
|
tenantId: ctx.tenantId,
|
||||||
|
});
|
||||||
|
return this.repository.save(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
async findById(ctx: ServiceContext, id: string): Promise<SystemSetting | null> {
|
||||||
|
return this.repository.findOne({
|
||||||
|
where: { id, tenantId: ctx.tenantId } as any,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async update(ctx: ServiceContext, id: string, data: Partial<SystemSetting>): Promise<SystemSetting | null> {
|
||||||
|
const entity = await this.findById(ctx, id);
|
||||||
|
if (!entity) return null;
|
||||||
|
Object.assign(entity, data);
|
||||||
|
return this.repository.save(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
async hardDelete(ctx: ServiceContext, id: string): Promise<boolean> {
|
||||||
|
const result = await this.repository.delete({ id, tenantId: ctx.tenantId } as any);
|
||||||
|
return (result.affected || 0) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -117,12 +157,10 @@ export class SystemSettingService extends BaseService<SystemSetting> {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
meta: {
|
total,
|
||||||
total,
|
page,
|
||||||
page,
|
limit,
|
||||||
limit,
|
totalPages: Math.ceil(total / limit),
|
||||||
totalPages: Math.ceil(total / limit),
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -74,7 +74,7 @@ export function createBidBudgetController(dataSource: DataSource): Router {
|
|||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
success: true,
|
success: true,
|
||||||
data: result.data,
|
data: result.data,
|
||||||
pagination: result.meta,
|
pagination: { total: result.total, page: result.page, limit: result.limit, totalPages: result.totalPages },
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
next(error);
|
next(error);
|
||||||
|
|||||||
@ -76,7 +76,7 @@ export function createBidController(dataSource: DataSource): Router {
|
|||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
success: true,
|
success: true,
|
||||||
data: result.data,
|
data: result.data,
|
||||||
pagination: result.meta,
|
pagination: { total: result.total, page: result.page, limit: result.limit, totalPages: result.totalPages },
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
next(error);
|
next(error);
|
||||||
|
|||||||
@ -77,7 +77,7 @@ export function createOpportunityController(dataSource: DataSource): Router {
|
|||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
success: true,
|
success: true,
|
||||||
data: result.data,
|
data: result.data,
|
||||||
pagination: result.meta,
|
pagination: { total: result.total, page: result.page, limit: result.limit, totalPages: result.totalPages },
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
next(error);
|
next(error);
|
||||||
|
|||||||
@ -190,12 +190,10 @@ export class BidBudgetService {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
meta: {
|
total,
|
||||||
total,
|
page,
|
||||||
page,
|
limit,
|
||||||
limit,
|
totalPages: Math.ceil(total / limit),
|
||||||
totalPages: Math.ceil(total / limit),
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -162,12 +162,10 @@ export class BidService {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
meta: {
|
total,
|
||||||
total,
|
page,
|
||||||
page,
|
limit,
|
||||||
limit,
|
totalPages: Math.ceil(total / limit),
|
||||||
totalPages: Math.ceil(total / limit),
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -200,12 +200,10 @@ export class OpportunityService {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
meta: {
|
total,
|
||||||
total,
|
page,
|
||||||
page,
|
limit,
|
||||||
limit,
|
totalPages: Math.ceil(total / limit),
|
||||||
totalPages: Math.ceil(total / limit),
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,14 @@ import { query, queryOne, getClient, PoolClient } from '../../config/database.js
|
|||||||
import { NotFoundError, ValidationError } from '../errors/index.js';
|
import { NotFoundError, ValidationError } from '../errors/index.js';
|
||||||
import { PaginationMeta } from '../types/index.js';
|
import { PaginationMeta } from '../types/index.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contexto de servicio para multi-tenant
|
||||||
|
*/
|
||||||
|
export interface ServiceContext {
|
||||||
|
tenantId: string;
|
||||||
|
userId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resultado paginado genérico
|
* Resultado paginado genérico
|
||||||
*/
|
*/
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user