diff --git a/src/controllers/paymentControllers.js b/src/controllers/paymentControllers.js index d4c1cf4..d46e54e 100644 --- a/src/controllers/paymentControllers.js +++ b/src/controllers/paymentControllers.js @@ -1,4 +1,6 @@ import User from "../models/User"; +import { parse } from 'json2csv'; +import fs from 'fs'; // CREATE: 납부자 등록 export const createPayment = async (req, res) => { @@ -7,24 +9,19 @@ export const createPayment = async (req, res) => { try { // Validation if (!name || !user_number) { - return res.status(400).send("모든 필수 입력값을 제공해야 합니다."); + return res.status(400).send("학번 또는 년도와 이름을 필수로 입력해야 합니다."); } - let formattedUserNumber = user_number; - - // 입력된 user_number의 길이를 확인하여 년도 혹은 학번인지 판단 - if (user_number.length === 4) { - // 년도인 경우, 데이터베이스에서 마지막 사용자 번호를 가져와서 +1하여 사용합니다. - const lastUser = await User.findOne().sort({ user_number: -1 }); - const lastUserNumber = lastUser ? parseInt(lastUser.user_number.slice(0, -1)) + 1 : 1; - formattedUserNumber = String(lastUserNumber).padStart(8, '0') + '1'; // 8자리로 만든 뒤에 '1'을 추가 + // 입력된 user_number의 길이를 확인하여 알맞는 학번인지 판단 + if (user_number.length !== 8 || (20000000 > user_number) || (21000000 < user_number) ) { + return res.status(400).send("알맞는 학번 8자리와 이름을 입력해야 합니다."); } // 사용자 등록 await User.create({ - user_number: formattedUserNumber, + user_number: user_number, name : name, - email : formattedUserNumber + email: user_number }); return res.status(200).send("등록 성공"); @@ -37,21 +34,25 @@ export const createPayment = async (req, res) => { // READ: 납부자 조회 (관리자 승인) -export const getAllPayment = async (req, res) => { - const { user_number, name } = req.body; +export const getPayment = async (req, res) => { + const { year, name } = req.body; try { - if (!user_number && !name) { + if (!name) { return res .status(400) - .send("학번 또는 이름 중 반드시 하나 이상 입력해주세요."); + .send("이름을 입력해주세요."); } - let query = {}; - if (user_number) { - query.user_number = user_number; + if (year&&year.length !== 4) { + return res.status(400).send("년도를 바르게 입력해야 합니다."); } + let query = {}; + if (name) { query.name = name; } + if (year) { + query.user_number = new RegExp(`^${year}`); + } const data = await User.find(query); @@ -63,65 +64,36 @@ export const getAllPayment = async (req, res) => { }; -// DELETE: 학생회비 납부자 삭제 -export const deletePayment = async (req, res) => { - const { user_id } = req.params; - - try { - if (!user_id) { - return res - .status(400) - .send("삭제할 유저의 id를 올바르게 입력해주세요"); - } - await User.findByIdAndDelete(user_id); - return res - .status(200) - .send("유저가 성공적으로 삭제되었습니다"); - - } catch (error) { - console.log(error); - return res.status(500).send("내부 서버 오류"); - } -}; - // READ : 납부자 정보 csv 파일받기 -import { MongoClient } from 'mongodb'; -import { parse } from 'json2csv'; -import fs from 'fs'; - export const getPaymentCsv = async (req, res) => { - const uri = process.env.DB_URL; // MongoDB URI - const dbName = 'test'; // Your MongoDB database name - const collectionName = 'users'; // Your MongoDB collection name - const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); - try { - await client.connect(); - - const database = client.db(dbName); - const collection = database.collection(collectionName); - - // Query MongoDB for payment data - const payments = await collection.find({}).toArray(); - - // Convert JSON data to CSV format - const csv = parse(payments); - - // Write CSV data to a file - fs.writeFileSync('payments.csv', csv, 'utf-8'); - - console.log('CSV 파일이 성공적으로 생성되었습니다 : payments.csv'); - - // Send the CSV file as a response - res.status(200).download('payments.csv', 'payments.csv'); + // MongoDB에서 납부자 정보 조회 + const users = await User.find({}).lean(); // lean()을 사용하여 조회 성능을 향상 + + // JSON 데이터를 CSV 형식으로 변환 + const csv = parse(users); + + // 비동기 방식으로 CSV 데이터를 파일에 작성 + fs.writeFile('payments.csv', csv, 'utf-8', (err) => { + if (err) { + console.error('CSV 파일 생성 중 오류 발생:', err); + return res.status(500).send("CSV 파일 생성 중 오류 발생"); + } + + console.log('CSV 파일이 성공적으로 생성되었습니다: payments.csv'); + + // 생성된 CSV 파일을 응답으로 전송 + res.status(200).download('payments.csv', 'payments.csv', (downloadErr) => { + if (downloadErr) { + console.error('CSV 파일 다운로드 중 오류 발생:', downloadErr); + return res.status(500).send("CSV 파일 다운로드 중 오류 발생"); + } + }); + }); } catch (error) { console.error('내부 서버 오류:', error); res.status(500).send("내부 서버 오류"); - } finally { - await client.close(); } -} - - +}; diff --git a/src/routers/paymentRouter.js b/src/routers/paymentRouter.js index a5bae66..0b3ff55 100644 --- a/src/routers/paymentRouter.js +++ b/src/routers/paymentRouter.js @@ -1,8 +1,7 @@ import express from "express"; import { - getAllPayment, + getPayment, createPayment, - deletePayment, getPaymentCsv } from "../controllers/paymentControllers"; import { authManager } from "../controllers/userController"; @@ -12,9 +11,9 @@ const paymentRouter = express.Router(); // 따라서, 이 파일에서 루트 ( = "/") 가 의미하는 경로는 BASEURL/payment가 된다. -paymentRouter.get("/", getAllPayment,authManager); +paymentRouter.get("/", getPayment,authManager); paymentRouter.post("/", createPayment,authManager); -paymentRouter.delete("/:user_id", deletePayment,authManager); +//paymentRouter.delete("/:user_id", deletePayment,authManager); 위험요소로 제거합니다. paymentRouter.get("/csv",getPaymentCsv,authManager); export default paymentRouter; \ No newline at end of file