const pool = require('../db/pool.js'); const env = process.env.NODE_ENV; const { getIo } = require('../socket.js'); const tbProject = env == 'production'? 'tb_project':'_test_tb_project'; const tbPermission = env == 'production'? 'tb_permission':'_test_tb_permission'; function snakeToCamel(snakeStr) { return snakeStr.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase()); } exports.getEnvData = async (req,res,next)=>{ const deploymentType = process.env.DEPLOYMENT_TYPE; const cloudType = process.env.CLOUD_TYPE; const serviceName = process.env.SERVICE_NAME; res.status(200).json({ message : 'getEnvData', deploymentType: deploymentType, cloudType: cloudType, serviceName: serviceName, }); } exports.getProject = async (req,res,next)=>{ let {project_id} = req.query; const client = await pool.connect(); //////// 원본코드 // let user_id = req.user.user_id; // let user_group = req.user.group; //////// pm-bcmf 연결용 테스트 코드 - pm-bcmf url로 접속하면 정상적으로 로그인이 되지 않아 req.user가 없기 때문에 user_id, user_group 강제 설정 let user_id = (req.user) ? req.user.user_id : undefined; let user_group = (req.user) ? req.user.group : undefined; const authController = require('../controllers/authController'); let bcmfId = await authController.getBcmfId(); if (bcmfId && bcmfId.includes('bcmf-')) { user_id = bcmfId; user_group = 'bcmf'; } try { // 테스트 let queryString = ` select p.*, u.*, (SELECT notice_text FROM ver4.tb_banner_notice b WHERE (b.project_id = p.project_id OR b.project_id IS NULL) AND b.status_code = 'NOTICE_STATUS_active' AND CURRENT_DATE BETWEEN b.start_date AND b.end_date ORDER BY b.banner_id DESC LIMIT 1) as banner_notice from ver4.${tbProject} p inner join ver4.tb_user u on p.user_id = u.user_id where show_in_index = true `; // let queryString = ` // select p.*, u.* // from ver4.${tbProject} p // inner join ver4.tb_user u // on p.user_id = u.user_id // where show_in_index = true // `; if(!user_group){ queryString += `and ( p.user_id = '${user_id}' or p.project_id in (select project_id from ver4.${tbPermission} where user_id = '${user_id}')) `; } // 251223 dev계정도 총괄 제한 if(user_group != 'super'){ queryString += ` and ( (p.project_type != 'secret' or p.project_type is null ) or exists (select 1 from ver4.${tbPermission} tp where tp.project_id = p.project_id and tp.user_id = '${user_id}') ) `; } if(project_id && project_id != '') queryString += `and project_id = '${project_id}' `; queryString += `order by p.create_date`; console.log(queryString); const {rows} = await client.query(queryString); res.status(200).json({message : 'getProject', data: rows}); } catch(err) { console.error(err); res.status(500).json({message : 'getProject error'}); } finally { client.release(); } } exports.mgmtFunc_updateProject = async (req,res)=>{ let { params } = req.body; let { projectIdList, targetColumn, state, text } = params; let value; if (targetColumn == 'is_active') value = state; if (targetColumn == 'banner_notice') value = text; let projectArr = JSON.parse(projectIdList); const client = await pool.connect(); try { await client.query('BEGIN'); let updateQueryString = ` UPDATE ver4.${tbProject} SET ${targetColumn} = $1 WHERE project_id = ANY($2) `; let selectQueryString = ` SELECT p.*, u.* FROM ver4.${tbProject} p INNER JOIN ver4.tb_user u ON p.user_id = u.user_id WHERE show_in_index = true; `; await client.query(updateQueryString, [value, projectArr]); let { rows } = await client.query(selectQueryString); await client.query('COMMIT'); params.allProject = rows; let successMessage = `updateProject_${snakeToCamel(targetColumn)}_success`; let io = getIo(); io.emit(successMessage, params); res.status(200).json({ message: successMessage, }); } catch(err) { console.error("updateProject err:", err); } finally { client.release(); } } exports.getVersion = async(req,res,next)=>{ res.status(200).json({ message : 'getVersion success', version : process.env.PROJECT_VERSION }); } // 🔻🔻🔻🔻🔻🔻🔻🔻 LIST화면용 함수 시작 🔻🔻🔻🔻🔻🔻🔻🔻 //프로젝트 (권한 있는) 목록들 가져오기 exports.getProjects = async (req,res,next) => { let user_id = req.user.user_id; const client = await pool.connect(); try{ let queryString = `select project_id, user_id, category, project_nm, create_date, lon, lat, height, step, emp_map, flyto from ver4.${tbProject} where project_id in (select project_id from ver4.${tbPermission} where user_id = $1)`; const {rows} = await client.query(queryString, [user_id]); res.status(200).json({message : 'getProjects', data : rows}); }catch(err){ console.error(err); res.status(500).json({message : 'getProjects error'}); }finally{ client.release(); } } //북마크 프로젝트들 가져오기 exports.getBookmark = async (req,res,next) =>{ let user_id = req.user.user_id; const client = await pool.connect(); try{ let queryString = `select project_id, user_id, category, project_nm, create_date, lon, lat, height, step, emp_map, flyto from ver4.tb_project where project_id in (select unnest(string_to_array(bookmark, ',')) from ver4.tb_user where user_id = $1)`; const {rows} = await client.query(queryString, [user_id]); res.status(200).json({message : 'getBookmark', data : rows}); }catch(err){ console.error(err); res.status(500).json({message : 'getBookmark error'}); }finally{ client.release(); } } //북마크 update (JS의 array.toString() 형태로 넣기.) exports.updateBookmark = async (req, res, next) =>{ let user_id = req.user.user_id; const {bookmark} = req.query; const client = await pool.connect(); try { let queryString = `update ver4.tb_user set bookmark = $1 where user_id = $2`; await client.query(queryString, [bookmark, user_id]); res.status(200).json({message : `updateBookmark`}); }catch(err){ console.error(err); res.status(500).json({message : `updateBookmark error`}); }finally{ client.release(); } } // 🔺🔺🔺🔺🔺🔺🔺🔺 LIST화면용 함수 끝 🔺🔺🔺🔺🔺🔺🔺🔺 // 프로젝트 정보 업데이트 exports.updateProjectInfo = async (req, res) => { let { params } = req.body; let result = await updateProjectInfoAction(params); res.status(200).json(result); } async function updateProjectInfoAction(params) { const client = await pool.connect(); try { const { projectId, category, project_nm, project_type, step, } = params // let queryString; // if(category !== 'overseas' && category !== 'bimproject') { // queryString = ` // UPDATE ver4.${tbProject} // SET // project_type = $1, // step = $2, // project_nm = $3 // WHERE project_id = $4 // AND category = $5 // `; // } else { let queryString = ` UPDATE ver4.${tbProject} SET project_type = $1, step = $2, short_nm = $3 WHERE project_id = $4 AND category = $5 `; // } let values = [project_type, step, project_nm, projectId, category]; let { rows } = await client.query(queryString, values); return { message: 'updateProjectInfo_success'}; } catch(err) { console.error('updateProjectInfoAction err : ', err); } finally { client.release(); } } // 프로젝트 위치 업데이트 exports.updateLocationInfo = async (req, res) => { let { params } = req.body; let result = await updateLocationInfoAction(params); res.status(200).json(result); } async function updateLocationInfoAction(params) { const client = await pool.connect(); try { const { projectId, category, project_nm, lon, lat, } = params let queryString = ` UPDATE ver4.${tbProject} SET lon = $1, lat = $2 WHERE project_id = $3 AND category = $4 AND project_nm = $5 RETURNING lon, lat; `; let values = [lon, lat, projectId, category, project_nm]; let { rows } = await client.query(queryString, values); return { message: 'updateLocationInfo_success', data: rows[0] }; } catch(err) { console.error('updateLocationInfoAction err : ', err); } finally { client.release(); } } // 일반 사용자용 보존/삭제 정책 조회 API exports.getSystemPolicyPublic = async (req, res, next) => { const client = await pool.connect(); try { const result = await client.query("SELECT limit_file_count, limit_days, is_active FROM ver4.tb_system_policy WHERE policy_key = 'GLOBAL_DELETE_POLICY'"); if (result.rows.length === 0) { return res.status(200).json({ limit_file_count: 100, limit_days: 30, is_active: false }); } res.status(200).json(result.rows[0]); } catch (err) { console.error("getSystemPolicyPublic error:", err); res.status(500).json({ message: "정책 조회 중 오류가 발생했습니다." }); } finally { client.release(); } };