ERP-node/backend-node/src/services/flowDefinitionService.ts

189 lines
4.4 KiB
TypeScript
Raw Normal View History

2025-10-20 10:55:33 +09:00
/**
*
*/
import db from "../database/db";
import {
FlowDefinition,
CreateFlowDefinitionRequest,
UpdateFlowDefinitionRequest,
} from "../types/flow";
export class FlowDefinitionService {
/**
*
*/
async create(
request: CreateFlowDefinitionRequest,
userId: string
): Promise<FlowDefinition> {
2025-10-21 13:19:18 +09:00
console.log("🔥 flowDefinitionService.create called with:", {
name: request.name,
description: request.description,
tableName: request.tableName,
dbSourceType: request.dbSourceType,
dbConnectionId: request.dbConnectionId,
userId,
});
2025-10-20 10:55:33 +09:00
const query = `
2025-10-21 13:19:18 +09:00
INSERT INTO flow_definition (name, description, table_name, db_source_type, db_connection_id, created_by)
VALUES ($1, $2, $3, $4, $5, $6)
2025-10-20 10:55:33 +09:00
RETURNING *
`;
2025-10-21 13:19:18 +09:00
const values = [
2025-10-20 10:55:33 +09:00
request.name,
request.description || null,
2025-10-21 13:19:18 +09:00
request.tableName || null,
request.dbSourceType || "internal",
request.dbConnectionId || null,
2025-10-20 10:55:33 +09:00
userId,
2025-10-21 13:19:18 +09:00
];
console.log("💾 Executing INSERT with values:", values);
const result = await db.query(query, values);
2025-10-20 10:55:33 +09:00
return this.mapToFlowDefinition(result[0]);
}
/**
*
*/
async findAll(
tableName?: string,
isActive?: boolean
): Promise<FlowDefinition[]> {
let query = "SELECT * FROM flow_definition WHERE 1=1";
const params: any[] = [];
let paramIndex = 1;
if (tableName) {
query += ` AND table_name = $${paramIndex}`;
params.push(tableName);
paramIndex++;
}
if (isActive !== undefined) {
query += ` AND is_active = $${paramIndex}`;
params.push(isActive);
paramIndex++;
}
query += " ORDER BY created_at DESC";
const result = await db.query(query, params);
return result.map(this.mapToFlowDefinition);
}
/**
*
*/
async findById(id: number): Promise<FlowDefinition | null> {
const query = "SELECT * FROM flow_definition WHERE id = $1";
const result = await db.query(query, [id]);
if (result.length === 0) {
return null;
}
return this.mapToFlowDefinition(result[0]);
}
/**
*
*/
async update(
id: number,
request: UpdateFlowDefinitionRequest
): Promise<FlowDefinition | null> {
const fields: string[] = [];
const params: any[] = [];
let paramIndex = 1;
if (request.name !== undefined) {
fields.push(`name = $${paramIndex}`);
params.push(request.name);
paramIndex++;
}
if (request.description !== undefined) {
fields.push(`description = $${paramIndex}`);
params.push(request.description);
paramIndex++;
}
if (request.isActive !== undefined) {
fields.push(`is_active = $${paramIndex}`);
params.push(request.isActive);
paramIndex++;
}
if (fields.length === 0) {
return this.findById(id);
}
fields.push(`updated_at = NOW()`);
const query = `
UPDATE flow_definition
SET ${fields.join(", ")}
WHERE id = $${paramIndex}
RETURNING *
`;
params.push(id);
const result = await db.query(query, params);
if (result.length === 0) {
return null;
}
return this.mapToFlowDefinition(result[0]);
}
/**
*
*/
async delete(id: number): Promise<boolean> {
const query = "DELETE FROM flow_definition WHERE id = $1 RETURNING id";
const result = await db.query(query, [id]);
return result.length > 0;
}
/**
*
*/
async checkTableExists(tableName: string): Promise<boolean> {
const query = `
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = $1
) as exists
`;
const result = await db.query(query, [tableName]);
return result[0].exists;
}
/**
* DB FlowDefinition
*/
private mapToFlowDefinition(row: any): FlowDefinition {
return {
id: row.id,
name: row.name,
description: row.description,
tableName: row.table_name,
2025-10-21 13:19:18 +09:00
dbSourceType: row.db_source_type || "internal",
dbConnectionId: row.db_connection_id,
2025-10-20 10:55:33 +09:00
isActive: row.is_active,
createdBy: row.created_by,
createdAt: row.created_at,
updatedAt: row.updated_at,
};
}
}