const pool = require('../db/pool.js'); const env = process.env.NODE_ENV; const tbProject = env === 'production' ? 'tb_project' : '_test_tb_project'; const tbPermission = env === 'production' ? 'tb_permission' : '_test_tb_permission'; const cloudClient = require('../config/cloudClient.js'); const { getSignedUrl } = require('@aws-sdk/s3-request-presigner'); const { ListObjectsV2Command, DeleteObjectCommand, CopyObjectCommand, HeadObjectCommand, PutObjectCommand, GetObjectCommand, ListBucketsCommand } = require('@aws-sdk/client-s3'); // πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”» λ¦¬μŠ€νŠΈκ΄€λ ¨ ν•¨μˆ˜ μ‹œμž‘ πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”» // λΆ„λ₯˜ κ°€μ Έμ˜€κΈ° exports.getListClass = async(req, res, next) =>{ const {steps, search} = req.query; const client = await pool.connect(); let user_id = req.user.user_id; let user_group = req.user.group; try{ let queryString = `select b.class ,b.large_class, b.mid_class from ver4.${tbProject} a, ver4.ref_project_class b where a.class = b.class and a.show_in_index = true `; if(!user_group){ queryString += `and ( a.user_id = '${user_id}' or a.project_id in (select project_id from ver4.${tbPermission} where user_id = '${user_id}')) `; } if(steps){ //μž…λ ₯λ˜λŠ” 필더 쑰건에 따라 λ³€κ²½μ˜ˆμ • queryString += `and a.step in ( `; for(let i =0; i < steps.length; i++){ queryString += ` '${steps[i]}' ${(i < steps.length-1)?',':''}` } queryString += ` ) `; } if(search != '' && search != null && search != undefined){ queryString += ` and UPPER(a.project_nm) like '%${search}%' `; } queryString += ` order by b.class asc`; const {rows} = await client.query(queryString); //μˆœμ„œλ•Œλ¬Έμ— clientμ—μ„œ λ°›μ•„μ„œ 처리 res.status(200).json({data : rows}); }catch(err){ console.error(err); res.status(500).json({message : 'getDepth1 error'}); }finally{ client.release(); } } //depth3 list뢈러였기 exports.getList = async (req,res,next) =>{ const {steps, classNo, search } = req.query; const client = await pool.connect(); let user_id = req.user.user_id; let user_group = req.user.group; try{ // let queryString = `select * from ver4.tb_project where project_id in (select unnest(string_to_array(bookmark, ',')) from ver4.tb_user where user_id = $1)`; let queryString = `select a.project_id, a.category, a.project_nm, a.lon, a.lat, a.height, a.step, a.emp_map, a.flyto, b.user_id, b.user_nm, b.company, b.dept, a.class, b.position from ver4.${tbProject} a, ver4.tb_user b where a.user_id = b.user_id and a.show_in_index = true and a.class = ${classNo} `; if(steps){ //μž…λ ₯λ˜λŠ” 필더 쑰건에 따라 λ³€κ²½μ˜ˆμ • queryString += `and a.step in ( `; for(let i =0; i < steps.length; i++){ queryString += ` '${steps[i]}' ${(i < steps.length-1)?',':''}` } queryString += ` ) `; } if(!user_group){ queryString += `and ( a.user_id = '${user_id}' or a.project_id in (select project_id from ver4.${tbPermission} where user_id = '${user_id}')) `; } if(search != '' && search != null && search != undefined){ queryString += ` and UPPER(a.project_nm) like '%${search}%' `; } queryString += `order by project_id, project_nm asc`; const {rows} = await client.query(queryString); res.status(200).json({message : 'getModelList', data : rows}); }catch(err){ console.error(err); res.status(500).json({message : 'getModelList error'}); }finally{ client.release(); } } // πŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”Ί λ¦¬μŠ€νŠΈκ΄€λ ¨ ν•¨μˆ˜ 끝 πŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”Ί // πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”» λΆλ§ˆν¬κ΄€λ ¨ ν•¨μˆ˜ μ‹œμž‘ πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”» exports.updateBookmark = async(req,res,next)=>{ const {bookmark} = req.query; let user_id = req.user.user_id; const client = await pool.connect(); try { let queryString = `update ver4.tb_user set bookmark = $1 where user_id = $2`; const { rows } = await client.query(queryString, [bookmark,user_id]); res.status(200).json({ message: 'updateBookmark Done'}); }catch(error) { console.error("updateBookmark err:", error); }finally { client.release(); } } // πŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”Ί λΆλ§ˆν¬κ΄€λ ¨ ν•¨μˆ˜ 끝 πŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”Ί exports.projectstatusList = async(req,res,next)=>{ const client = await pool.connect(); try{ let queryString = `select * from ver4.test_tb_projectstatus order by create_date`; const {rows} = await client.query(queryString); res.status(200).json({message : 'projectstatusList', data : rows}); }catch(err){ console.error(err); res.status(500).json({message : 'projectstatusList error'}); }finally{ client.release(); } } exports.getPresignedUrl = async(req, res, next) =>{ const {bucket, objectKey} = req.query; try{ let command = new GetObjectCommand({ Bucket: bucket, Key: objectKey, }); //cloudClient에 κ°•μ œλ‘œ λ˜μ§€κΈ° let url = await getSignedUrl(cloudClient, command, { expiresIn: 60 * 30 }); // 30λΆ„ 유효 res.status(200).json({message : 'getProsignedUrl', data : url}); }catch(err){ console.error(err); res.status(500).json({message : 'getProsignedUrl error'}); } } exports.uploadUrl = async(req, res, next) => { const {filename} = req.query; try{ const command = new PutObjectCommand({ Bucket: 'gsimdev', Key: `projectStatus/${filename}`, ContentType: 'application/pdf' }); //cloudClient에 κ°•μ œλ‘œ λ˜μ§€κΈ° let url = await getSignedUrl(cloudClient, command, { expiresIn: 60 * 30 }); // 30λΆ„ 유효 res.status(200).json({message : 'uploadUrl', data : url}); }catch(err){ console.error(err); res.status(500).json({message : 'uploadUrl error'}); } } exports.insertProjectStatusData = async(req, res, next) => { const {filename} = req.query; const client = await pool.connect(); try{ let queryString = `insert into ver4.test_tb_projectstatus (file_nm, object_key, bucket) values ($1, $2, $3) returning *`; const {rows} = await client.query(queryString, [filename, `projectStatus/${filename}`, 'gsimdev']); res.status(200).json({message : 'insertProjectStatusData', data : rows}); }catch(err){ console.error(err); res.status(500).json({message : 'insertProjectStatusData error'}); }finally{ client.release(); } } //μš°μ„  DB만 μ‚­μ œ exports.deleteFile = async(req, res, next) => { const {objectKey, bucket} = req.query; const client = await pool.connect(); try{ let queryString = `delete from ver4.test_tb_projectstatus where object_key = $1 and bucket = $2 returning *`; const {rows} = await client.query(queryString, [objectKey, bucket]); res.status(200).json({message : 'deleteFile', data : rows}); }catch(err){ console.error(err); res.status(500).json({message : 'deleteFile error'}); }finally{ client.release(); } } // πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”» new! λ¦¬μŠ€νŠΈκ΄€λ ¨ ν•¨μˆ˜ μ‹œμž‘ πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”» // 전체 리슀트 κ°€μ Έμ˜€κΈ° exports.getAllList = async(req, res, next) =>{ const {steps, search, type, category} = req.query; const client = await pool.connect(); let user_id = req.user.user_id; let user_group = req.user.group; try{ let queryString = `select b.class ,b.large_class, b.mid_class, a.*, (select user_nm from ver4.tb_user where user_id = a.user_id) as master from ver4.${tbProject} a, ver4.ref_project_class b where a.class = b.class and a.show_in_index = true and category = '${category}' `; if(!user_group){ queryString += `and ( a.user_id = '${user_id}' or a.project_id in (select project_id from ver4.${tbPermission} where user_id = '${user_id}')) `; } if(steps && steps != 'overseas'){ //μž…λ ₯λ˜λŠ” 필더 쑰건에 따라 λ³€κ²½ queryString += `and a.step in ( `; for(let i =0; i < steps.length; i++){ queryString += ` '${steps[i]}' ${(i < steps.length-1)?',':''}` } queryString += ` ) `; } if(type && type != 'overseas'){ //μž…λ ₯λ˜λŠ” 필더 쑰건에 따라 λ³€κ²½ queryString += `and a.project_type in ( `; for(let i =0; i < type.length; i++){ queryString += ` '${type[i]}' ${(i < type.length-1)?',':''}` } queryString += ` ) `; } if(search != '' && search != null && search != undefined){ queryString += ` and UPPER(a.project_nm) like '%${search}%' `; } if(steps == 'overseas' || type == 'overseas'){ queryString += ` and a.category = 'overseas' `; } queryString += ` order by b.class asc`; const {rows} = await client.query(queryString); //μˆœμ„œλ•Œλ¬Έμ— clientμ—μ„œ λ°›μ•„μ„œ 처리 res.status(200).json({data : rows}); }catch(err){ console.error(err); res.status(500).json({message : 'getDepth1 error'}); }finally{ client.release(); } } // πŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”Ί new! λ¦¬μŠ€νŠΈκ΄€λ ¨ ν•¨μˆ˜ 끝 πŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”Ί exports.setProjectType = async (req,res, next)=>{ const {project_id, type} = req.query; const client = await pool.connect(); try{ let query = `update ver4.tb_project set project_type = $1 where project_id = $2 returning *`; const {rows} = await client.query(query, [type, project_id]); res.status(200).json({message : 'setProjectTypeSuccess', data : rows}); }catch(err){ console.error(err); res.status(500).json({message : 'setProjectType error'}); }finally{ client.release(); } } exports.setProjectStep = async (req,res, next)=>{ const {project_id, step} = req.query; const client = await pool.connect(); try{ let query = `update ver4.tb_project set step = $1 where project_id = $2 returning *`; const {rows} = await client.query(query, [step, project_id]); res.status(200).json({message : 'setProjectStepSuccess', data : rows}); }catch(err){ console.error(err); res.status(500).json({message : 'setProjectStep error'}); }finally{ client.release(); } }