const swaggerUi = require('swagger-ui-express');
const swaggerFile = require('./swagger_output.json');
//스웨거 자동생성을 위한 코드
//스웨거 아웃풋파일 저장 위치
app.use('/swagger', swaggerUi.serve, swaggerUi.setup(swaggerFile));
//주소창 localhost:port/swagger 로 스웨거 편집기 실행
const cors = require('cors');//cors!! 프론트에서 접근 할때 허용하기 위한 설정
//cors!! 프론트에서 접근 할때 허용하기 위한 설정
const outputFile = './swagger_output.json';
const endpointsFiles = ['./app.js'];
swaggerAutogen(outputFile, endpointsFiles, doc)
//swaggerAutogen으로 outputfile 파일을 app.js 루트로 api 들을 생성한다.
이때 명령어는 터미널에서 node swagger.js
const multer = require('multer');
const multerS3 = require('multer-s3');
const AWS = require('aws-sdk');
//form data 처리를 할수 있는 라이브러리 multer
// aws s3에 파일을 처리 할수 있는 라이브러리 multer-s3
//javascript 용 aws 서비스 사용 라이브러리
AWS.config.update({
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: 'ap-northeast-2', // 한국
});
//보안자격증명 액세스 키 설정해야 s3 bucket 접근이 가능하다.
const upload = multer({
storage: multerS3({
//multer의 storage옵션을 multers3로 교체
s3: new AWS.S3(),
bucket: 'stravinestbucket', //bucket 이름
key(req, file, cb) {
cb(null, `original/${Date.now()}${path.basename(file.originalname)}`);
}, //저장할 파일명 설정 버킷 내부에서 oroginal 폴더 아래에 생성됨
acl: 'public-read-write', //읽기 쓰기 접근가능
}),
limits: { fileSize: 5 * 1024 * 1024 }, //최대 사이즈 5mb
});
//게시글 등록 formdata 방식으로 받아오는 api
router.post(
'/post',
// authMiddleware,
upload.single('image'), //upload(multer) api요청 주소로 formdata 형식으로 name 이 이미지로 1개 온것을 받는다.
//formdata 안에 파일 말고 다른 정보는 body로 들어온다.
async (req, res) => {
try {
//const { userId } = res.locals.user; //로그인 정보에서 가져온다.
const userId = 'stravinest';
const { title, content } = req.body; //formdata로 같이 넘어옴
if (req.file) {
//파일이 있으면 즉 image가 넘어오면
const originalUrl = req.file.location; //s3 bucket이미지 주소가 들어있다. //프론트에서 쓸수 있음
//람다 리사이징 과정
//새로운 폴더를 만들어서 sharp 라이브러리를 이용해서 리사이징하는 코드를 짠다.
//sharp 는 윈도우용 맥용 리눅스 용이 있는데 자동적으로 개발환경에 따라 깔린다.
//우리가 사용할 람다는 리눅스용 이므로 배포환경 EC2 or lightsail에서 배포 해야 한다.
//따라서 나의경우 EC2 ssh 에 접속해서 리사이징 코드를 받아온다 (받아오는 방법은 github를 이용)
//git 에서 클론을 받고 npm i 까지 한후 압축 해서 aws-cli 를 이용해 업로드 한다.
//업로드 후에 aws 사이트에서 람다메뉴에서 함수 생성을 하면 됨
const resizeUrl = originalUrl.replace(/\/original\//, '/thumb/');
//리사이즈 된 파일 주소 설정
await Posts.create({ userId, title, content, image: originalUrl });
// res.status(200).send({ result: '게시글 작성에 성공하였습니다.' });
res.json({ resizeUrl, originalUrl });
} else {
console.log('이미지 파일이 없습니다.');
res.status(400).send({ errorMessage: '이미지파일이 없습니다.' });
}
} catch (error) {
console.log(`${req.method} ${req.originalUrl} : ${error.message}`);
res.status(401).send({ errorMessage: '게시글 작성에 실패하였습니다.' });
}
}
);