Skip to content

Commit

Permalink
Fix paymentControllers.js paymentRouter.js
Browse files Browse the repository at this point in the history
deletePayment 기능을 제거.
getAllPayment 함수명 getPayment로 변경 / 학번,이름 검색기능을 년도,이름으로 변경.
createPayment 유효 학번 확인 추가.
  • Loading branch information
p0tat019 committed Jun 25, 2024
1 parent 5e4e29a commit 5afffff
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 75 deletions.
114 changes: 43 additions & 71 deletions src/controllers/paymentControllers.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import User from "../models/User";
import { parse } from 'json2csv';
import fs from 'fs';

// CREATE: 납부자 등록
export const createPayment = async (req, res) => {
Expand All @@ -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("등록 성공");
Expand All @@ -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);

Expand All @@ -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();
}
}


};

7 changes: 3 additions & 4 deletions src/routers/paymentRouter.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import express from "express";
import {
getAllPayment,
getPayment,
createPayment,
deletePayment,
getPaymentCsv
} from "../controllers/paymentControllers";
import { authManager } from "../controllers/userController";
Expand All @@ -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;

0 comments on commit 5afffff

Please sign in to comment.