각 회사별 데이터 분리

This commit is contained in:
kjs
2025-10-27 16:40:59 +09:00
parent 783ce5594e
commit 29c49d7f07
59 changed files with 8698 additions and 585 deletions

View File

@@ -1,4 +1,5 @@
import { Request, Response } from "express";
import { AuthenticatedRequest } from "../types/auth";
import {
getDataflowDiagrams as getDataflowDiagramsService,
getDataflowDiagramById as getDataflowDiagramByIdService,
@@ -12,15 +13,33 @@ import { logger } from "../utils/logger";
/**
* 관계도 목록 조회 (페이지네이션)
*/
export const getDataflowDiagrams = async (req: Request, res: Response) => {
export const getDataflowDiagrams = async (
req: AuthenticatedRequest,
res: Response
) => {
try {
const page = parseInt(req.query.page as string) || 1;
const size = parseInt(req.query.size as string) || 20;
const searchTerm = req.query.searchTerm as string;
const companyCode =
(req.query.companyCode as string) ||
(req.headers["x-company-code"] as string) ||
"*";
const userCompanyCode = req.user?.companyCode;
// 슈퍼 관리자는 쿼리 파라미터로 회사 지정 가능, 일반/회사 관리자는 자신의 회사만
let companyCode: string;
if (userCompanyCode === "*") {
// 슈퍼 관리자: 쿼리 파라미터 사용 또는 전체
companyCode = (req.query.companyCode as string) || "*";
} else {
// 회사 관리자/일반 사용자: 강제로 자신의 회사 코드 적용
companyCode = userCompanyCode || "*";
}
logger.info("관계도 목록 조회", {
userId: req.user?.userId,
userCompanyCode,
filterCompanyCode: companyCode,
page,
size,
});
const result = await getDataflowDiagramsService(
companyCode,
@@ -46,13 +65,21 @@ export const getDataflowDiagrams = async (req: Request, res: Response) => {
/**
* 특정 관계도 조회
*/
export const getDataflowDiagramById = async (req: Request, res: Response) => {
export const getDataflowDiagramById = async (
req: AuthenticatedRequest,
res: Response
) => {
try {
const diagramId = parseInt(req.params.diagramId);
const companyCode =
(req.query.companyCode as string) ||
(req.headers["x-company-code"] as string) ||
"*";
const userCompanyCode = req.user?.companyCode;
// 슈퍼 관리자는 쿼리 파라미터로 회사 지정 가능, 일반/회사 관리자는 자신의 회사만
let companyCode: string;
if (userCompanyCode === "*") {
companyCode = (req.query.companyCode as string) || "*";
} else {
companyCode = userCompanyCode || "*";
}
if (isNaN(diagramId)) {
return res.status(400).json({
@@ -87,7 +114,10 @@ export const getDataflowDiagramById = async (req: Request, res: Response) => {
/**
* 새로운 관계도 생성
*/
export const createDataflowDiagram = async (req: Request, res: Response) => {
export const createDataflowDiagram = async (
req: AuthenticatedRequest,
res: Response
) => {
try {
const {
diagram_name,
@@ -96,27 +126,31 @@ export const createDataflowDiagram = async (req: Request, res: Response) => {
category,
control,
plan,
company_code,
created_by,
updated_by,
} = req.body;
logger.info(`새 관계도 생성 요청:`, { diagram_name, company_code });
const userCompanyCode = req.user?.companyCode;
const userId = req.user?.userId || "SYSTEM";
// 회사 코드는 로그인한 사용자의 회사 코드 사용 (슈퍼 관리자는 요청 body에서 지정 가능)
let companyCode: string;
if (userCompanyCode === "*" && req.body.company_code) {
// 슈퍼 관리자가 특정 회사로 생성하는 경우
companyCode = req.body.company_code;
} else {
// 일반 사용자/회사 관리자는 자신의 회사로 생성
companyCode = userCompanyCode || "*";
}
logger.info(`새 관계도 생성 요청:`, {
diagram_name,
companyCode,
userId,
userCompanyCode,
});
logger.info(`node_positions:`, node_positions);
logger.info(`category:`, category);
logger.info(`control:`, control);
logger.info(`plan:`, plan);
logger.info(`전체 요청 Body:`, JSON.stringify(req.body, null, 2));
const companyCode =
company_code ||
(req.query.companyCode as string) ||
(req.headers["x-company-code"] as string) ||
"*";
const userId =
created_by ||
updated_by ||
(req.headers["x-user-id"] as string) ||
"SYSTEM";
if (!diagram_name || !relationships) {
return res.status(400).json({
@@ -184,24 +218,31 @@ export const createDataflowDiagram = async (req: Request, res: Response) => {
/**
* 관계도 수정
*/
export const updateDataflowDiagram = async (req: Request, res: Response) => {
export const updateDataflowDiagram = async (
req: AuthenticatedRequest,
res: Response
) => {
try {
const diagramId = parseInt(req.params.diagramId);
const { updated_by } = req.body;
const companyCode =
(req.query.companyCode as string) ||
(req.headers["x-company-code"] as string) ||
"*";
const userId =
updated_by || (req.headers["x-user-id"] as string) || "SYSTEM";
const userCompanyCode = req.user?.companyCode;
const userId = req.user?.userId || "SYSTEM";
logger.info(`관계도 수정 요청 - ID: ${diagramId}, Company: ${companyCode}`);
// 슈퍼 관리자는 쿼리 파라미터로 회사 지정 가능, 일반/회사 관리자는 자신의 회사만
let companyCode: string;
if (userCompanyCode === "*") {
companyCode = (req.query.companyCode as string) || "*";
} else {
companyCode = userCompanyCode || "*";
}
logger.info(`관계도 수정 요청`, {
diagramId,
companyCode,
userId,
userCompanyCode,
});
logger.info(`요청 Body:`, JSON.stringify(req.body, null, 2));
logger.info(`node_positions:`, req.body.node_positions);
logger.info(`요청 Body 키들:`, Object.keys(req.body));
logger.info(`요청 Body 타입:`, typeof req.body);
logger.info(`node_positions 타입:`, typeof req.body.node_positions);
logger.info(`node_positions 값:`, req.body.node_positions);
if (isNaN(diagramId)) {
return res.status(400).json({
@@ -265,13 +306,21 @@ export const updateDataflowDiagram = async (req: Request, res: Response) => {
/**
* 관계도 삭제
*/
export const deleteDataflowDiagram = async (req: Request, res: Response) => {
export const deleteDataflowDiagram = async (
req: AuthenticatedRequest,
res: Response
) => {
try {
const diagramId = parseInt(req.params.diagramId);
const companyCode =
(req.query.companyCode as string) ||
(req.headers["x-company-code"] as string) ||
"*";
const userCompanyCode = req.user?.companyCode;
// 슈퍼 관리자는 쿼리 파라미터로 회사 지정 가능, 일반/회사 관리자는 자신의 회사만
let companyCode: string;
if (userCompanyCode === "*") {
companyCode = (req.query.companyCode as string) || "*";
} else {
companyCode = userCompanyCode || "*";
}
if (isNaN(diagramId)) {
return res.status(400).json({
@@ -306,21 +355,25 @@ export const deleteDataflowDiagram = async (req: Request, res: Response) => {
/**
* 관계도 복제
*/
export const copyDataflowDiagram = async (req: Request, res: Response) => {
export const copyDataflowDiagram = async (
req: AuthenticatedRequest,
res: Response
) => {
try {
const diagramId = parseInt(req.params.diagramId);
const {
new_name,
companyCode: bodyCompanyCode,
userId: bodyUserId,
} = req.body;
const companyCode =
bodyCompanyCode ||
(req.query.companyCode as string) ||
(req.headers["x-company-code"] as string) ||
"*";
const userId =
bodyUserId || (req.headers["x-user-id"] as string) || "SYSTEM";
const { new_name } = req.body;
const userCompanyCode = req.user?.companyCode;
const userId = req.user?.userId || "SYSTEM";
// 회사 코드는 로그인한 사용자의 회사 코드 사용
let companyCode: string;
if (userCompanyCode === "*" && req.body.companyCode) {
// 슈퍼 관리자가 특정 회사로 복제하는 경우
companyCode = req.body.companyCode;
} else {
// 일반 사용자/회사 관리자는 자신의 회사로 복제
companyCode = userCompanyCode || "*";
}
if (isNaN(diagramId)) {
return res.status(400).json({