Commit a8483c18 authored by KangMin An's avatar KangMin An
Browse files

Create & Update: 응답 형식 작성 & 코드 수정.배포용 환경 변수 추가.

parent 146d7798
...@@ -14,20 +14,107 @@ ...@@ -14,20 +14,107 @@
| Auth | GET | /confirm?... | 메일 인증용 토큰의 유효성 확인 요청 | | Auth | GET | /confirm?... | 메일 인증용 토큰의 유효성 확인 요청 |
| User Info | GET | /user-info | 회원 정보 요청 | | User Info | GET | /user-info | 회원 정보 요청 |
| User Info | POST | /edit-profile | 회원 정보 수정 요청 | | User Info | POST | /edit-profile | 회원 정보 수정 요청 |
| User Info | POST | /set-loccode | 회원 지역 코드 설정 요청 |
<br><br> <br><br>
## 주소 접근 방법 ## 주소 접근 방법
[ "http://localhost:[your_port]" or "your_domain"]/api/---[URI]-- [ "http://localhost:[your_port]" or "your_domain"]/api/--[URI]--
먼저 도메인을 입력 후, api서버의 기초 주소인 /api를 입력하고 위의 표 중 필요한 경로로 접근합니다. 먼저 도메인을 입력 후, api서버의 기초 주소인 **/api**를 입력하고 위의 표 중 필요한 경로로 접근합니다.
<br><br>
## 응답(Response)
1. **Status Code** : 주로 데이터 수집기에게 보내는 응답입니다.
2. **Redirecttion** : 특정 요청에 대해 데이터 전송이 아닌 다른 주소로의 이동이 필요한 경우의 응답입니다.
3. **JSON** : 데이터 요청에 대한 응답입니다.
```js
/*
## 서버의 응답 json 형태
*/
{
msg : ( "OK!" / "ERROR!" ) ,
contents:{
응답 요청 데이터 첨부
existing_user : true / false,
mail_sending: true / false,
loc_code : /시군구/읍면동 이름과 코드 ,
user_info : 사용자 정보 ,
weather_out : 실외 날씨 데이터 ,
weather_user : 실내 날씨 데이터 ,
error: 에러 ,
}
}
```
각 url로 접근 시 서버는 위의 형태와 같이 **"msg"****"contents"**, 두 가지 영역으로 구성된 json 응답을 전송합니다.
<br>
### msg
서버에서 해당 요청을 정상적으로 처리했다면 "OK!"를, 요청을 처리하는 중 오류가 발생했다면 "ERROR!"를 전달합니다.
<br>
### contents
#### 1. existing_user
- 회원가입
- 이미 가입된 사용자인지 여부를 전달합니다
- true : 가입된 사용자 / false : 미등록 사용자(신규 사용자)
- 로그인
- DB에 등록된 사용자인지 여부를 전달합니다.
- true : 가입된 사용자 / false : 미등록 사용자
#### 2. mail_sending
- 로그인
- 메일 발송의 성공 여부를 전달합니다.
- true : 메일 발송 성공 / false : 메일 발송 실패
#### 3. loc_code
- 도 / 시군구 / 읍면동의 지역 이름과 코드를 전달합니다.
#### 4. user_info
- 로그인 후
- 화면에 표시될 사항들을 위해 사용자 정보를 전송합니다.
- 프로필 수정
- 수정 요청 전 : 현재 사용자의 정보를 전송합니다.
- 수정 요청 후 : 수정된 사용자의 정보를 전송합니다.
#### 4. weather_out
- 실외 날씨데이터를 전달합니다.
#### 5. weather_user
- 사용자의 날씨 데이터를 전달합니다.
#### 6, error
- 에러 발생시 에러의 내용을 전송합니다.
<br><br> <br><br>
## API 명세 기록 ## API 명세 기록
<br>
### 2021.05.03 \_ API 명세 초안 작성 ### 2021.05.03 \_ API 명세 초안 작성
1. Data Collector Routes 1. Data Collector Routes
...@@ -84,3 +171,12 @@ ...@@ -84,3 +171,12 @@
4. 사용자 인증과 사용자 정보 주소 분류 구분 4. 사용자 인증과 사용자 정보 주소 분류 구분
: 사용자 인증에 관한 주소 "Auth", 사용자 정보에 관한 주소 "User Info" 분류 구분. : 사용자 인증에 관한 주소 "Auth", 사용자 정보에 관한 주소 "User Info" 분류 구분.
<br>
### 2021.07.29 \_ 경로 삭제 및 응답 방식 작성
1. 사용자 지역 코드 수정 주소 삭제
: 사용자 정보를 수정하는 "/edit-profile" 에서 처리
2. 서버의 응답 형태와 전달 내용 작성
...@@ -6,17 +6,35 @@ ...@@ -6,17 +6,35 @@
- 개발 환경에 맞게 값들을 변경하여 사용합니다. - 개발 환경에 맞게 값들을 변경하여 사용합니다.
*/ */
// State Production or Development.
const PRODUCTION = false;
// # Client Envs
const CLIENT_PROTOCOL = PRODUCTION ? "https" : "http";
const CLIENT_HOST = PRODUCTION ? "YOUR_PRODUCTION_HOST" : "localhost";
const CLIENT_PORT = PRODUCTION
? "YOUR_PRODUCTION_PORT"
: "YOUR_DEVELOPMENT_PORT";
// # Server Envs // # Server Envs
const PROTOCOL = "http"; const SERVER_PROTOCOL = PRODUCTION ? "https" : "http";
const HOST = "localhost"; const SERVER_HOST = PRODUCTION ? "YOUR_PRODUCTION_HOST" : "localhost";
const PORT = 4500; const SERVER_PORT = PRODUCTION
? "YOUR_PRODUCTION_PORT"
: "YOUR_DEVELOPMENT_PORT";
// # DB Info. // # DB Info.
const DB_USER = "postgres"; const DB_USER = PRODUCTION
const DB_PASSWORD = "YOUR_PostgreSQL_PASSWORD"; ? "YOUR_PRODUCTION_DB_USER"
: "YOUR_DEVELOPMENT_DB_USER";
const DB_PASSWORD = PRODUCTION
? "YOUR_PRODUCTION_DB_PASSWORD"
: "YOUR_DEVELOPMENT_DB_PASSWORD";
const DB_HOST = "localhost"; const DB_HOST = "localhost";
const DB_PORT = "5432"; const DB_PORT = "5432";
const DB_DATABASE = "YOUR_DB_NAME"; const DB_DATABASE = PRODUCTION
? "YOUR_PRODUCTION_DB_NAME"
: "YOUR_DEVELOPMENT_DB_NAME";
// # API. // # API.
...@@ -27,7 +45,6 @@ const OPENWEATHERMAP_API_KEY = "YOUR_OpenWeatherMap_API_KEY"; ...@@ -27,7 +45,6 @@ const OPENWEATHERMAP_API_KEY = "YOUR_OpenWeatherMap_API_KEY";
const NODEMAILER_SERVICE = "gmail"; const NODEMAILER_SERVICE = "gmail";
const NODEMAILER_USER = "YOUR_MAIL_ADDRESS"; const NODEMAILER_USER = "YOUR_MAIL_ADDRESS";
const NODEMAILER_GAMIL_CLIENT_ID = "YOUR_API_CLIENT_ID"; const NODEMAILER_GAMIL_CLIENT_ID = "YOUR_API_CLIENT_ID";
const NODEMAILER_GMAIL_CLIENT_PASSWORD = "YOUR_API_CLIENT_PASSWORD";
const NODEMAILER_GMAIL_REFRESH_TOKEN = "YOUR_GMAIL_REFRESH_TOKEN"; const NODEMAILER_GMAIL_REFRESH_TOKEN = "YOUR_GMAIL_REFRESH_TOKEN";
// # Secret Key. // # Secret Key.
...@@ -35,10 +52,16 @@ const AUTH_MAIL_SECRETKEY = "YOUR_MAIL_SECRETKEY"; ...@@ -35,10 +52,16 @@ const AUTH_MAIL_SECRETKEY = "YOUR_MAIL_SECRETKEY";
const AUTH_ACCESS_TOKEN_SECRETKEY = "YOUR_ACCESS_TOKEN_SECRETKEY"; const AUTH_ACCESS_TOKEN_SECRETKEY = "YOUR_ACCESS_TOKEN_SECRETKEY";
const envs = { const envs = {
production: PRODUCTION,
client: {
protocol: CLIENT_PROTOCOL,
host: CLIENT_HOST,
port: CLIENT_PORT,
},
server: { server: {
protocol: PROTOCOL, protocol: SERVER_PROTOCOL,
host: HOST, host: SERVER_HOST,
port: PORT, port: SERVER_PORT,
}, },
db: { db: {
user: DB_USER, user: DB_USER,
...@@ -55,7 +78,7 @@ const envs = { ...@@ -55,7 +78,7 @@ const envs = {
service: NODEMAILER_SERVICE, service: NODEMAILER_SERVICE,
user: NODEMAILER_USER, user: NODEMAILER_USER,
gmail_client_id: NODEMAILER_GAMIL_CLIENT_ID, gmail_client_id: NODEMAILER_GAMIL_CLIENT_ID,
gmail_client_passowrd: NODEMAILER_GMAIL_CLIENT_PASSWORD, gmail_client_secret: NODEMAILER_GMAIL_CLIENT_SECRET,
gmail_refresh_token: NODEMAILER_GMAIL_REFRESH_TOKEN, gmail_refresh_token: NODEMAILER_GMAIL_REFRESH_TOKEN,
}, },
}, },
......
...@@ -2,7 +2,7 @@ import db from "../db/index"; ...@@ -2,7 +2,7 @@ import db from "../db/index";
import envs from "../../config/config"; import envs from "../../config/config";
import fetch from "node-fetch"; import fetch from "node-fetch";
import jwt from "jsonwebtoken"; import jwt from "jsonwebtoken";
import server_status from "../server_status"; import resForm from "../resForm";
// 외부 수집기로 부터 들어온 정보 처리 // 외부 수집기로 부터 들어온 정보 처리
const handleOutData = async (locCode, date, lat, lng) => { const handleOutData = async (locCode, date, lat, lng) => {
...@@ -63,10 +63,6 @@ export const getDataInput = (req, res) => { ...@@ -63,10 +63,6 @@ export const getDataInput = (req, res) => {
`Outside[${locCode}] Data(date: ${trans_date}/ lat: ${lat}/ lng: ${lng}) Input.` `Outside[${locCode}] Data(date: ${trans_date}/ lat: ${lat}/ lng: ${lng}) Input.`
); );
handleOutData(locCode, trans_date, lat, lng); handleOutData(locCode, trans_date, lat, lng);
res.status(server_status.code.ok).send({
msg: server_status.msg.ok,
content: `Outside[${locCode}] data Input.`,
});
} else { } else {
// 내부 데이터 수집기 동작 // 내부 데이터 수집기 동작
const { const {
...@@ -80,11 +76,10 @@ export const getDataInput = (req, res) => { ...@@ -80,11 +76,10 @@ export const getDataInput = (req, res) => {
); );
handleInData(email, trans_date, temp, humi, lights); handleInData(email, trans_date, temp, humi, lights);
} }
res.status(resForm.code.ok);
res.status(server_status.code.ok).send(server_status.msg.ok); } catch (err) {
} catch (error) { console.log(err);
console.log(error); res.status(resForm.code.err);
res.status(server_status.code.err).send(server_status.msg.err);
} }
}; };
...@@ -94,64 +89,86 @@ export const getUserWeatherData = (req, res) => { ...@@ -94,64 +89,86 @@ export const getUserWeatherData = (req, res) => {
cookies: { acs_token }, cookies: { acs_token },
} = req; } = req;
/* 사용자 email에 따른 사용자 날씨 데이터 가져오기 */ try {
const decoded = jwt.decode(acs_token); /* 사용자 email에 따른 사용자 날씨 데이터 가져오기 */
const result = db.Weather_in.findAll({ const decoded = jwt.decode(acs_token);
where: { host: decoded.email }, const result = db.Weather_in.findAll({
logging: false, where: { host: decoded.email },
}); logging: false,
});
res res.json({ msg: resForm.msg.ok, contents: { weather_user: result } });
.status(server_status.code.ok) } catch (err) {
.json({ msg: server_status.msg.ok, content: result }); console.log(err);
res.json({ msg: resForm.msg.err, contents: { error: err } });
}
}; };
// 실외 날씨 데이터 요청 처리 // 실외 날씨 데이터 요청 처리
export const getOutWeatherData = (req, res) => { export const getOutWeatherData = (req, res) => {
// 실외 지역 번호를 통해 날씨 데이터 전송. const {
res body: { loc_code },
.status(server_status.code.ok) } = req;
.json({ msg: server_status.msg.ok, content: "Outside Weather Data" }); try {
// 실외 지역 번호를 통해 날씨 데이터 전송.
const result = db.Weather_out.findAll({
where: { loc_code: loc_code },
logging: false,
});
res.json({ msg: resForm.msg.ok, contents: { weather_out: result } });
} catch (err) {
console.log(err);
res.json({ msg: resForm.msg.err, contents: { error: err } });
}
}; };
// 지역 코드 요청 처리 // 지역 코드 요청 처리
export const getLocCode = async (req, res) => { export const getLocCode = async (req, res) => {
/* 통합 지역 코드 및 이름 json으로 생성 및 전송 */ try {
const does = await db.Doe.findAll({ logging: false }); /* 통합 지역 코드 및 이름 json으로 생성 및 전송 */
const sggs = await db.Sgg.findAll({ logging: false }); const does = await db.Doe.findAll({ logging: false });
const emds = await db.Emd.findAll({ logging: false }); const sggs = await db.Sgg.findAll({ logging: false });
const emds = await db.Emd.findAll({ logging: false });
let doe_sgg = [];
let sgg_emd = []; let doe_sgg = [];
let sgg_emd = [];
does.map((info_doe) => {
let temp = { does.map((info_doe) => {
name_doe: info_doe["name_doe"], let temp = {
code_doe: info_doe["code_doe"], name_doe: info_doe["name_doe"],
}; code_doe: info_doe["code_doe"],
temp.sgg = sggs.filter( };
(info_sgg) => info_sgg["code_doe"] === info_doe["code_doe"] temp.sgg = sggs.filter(
); (info_sgg) => info_sgg["code_doe"] === info_doe["code_doe"]
doe_sgg.push(temp); );
}); doe_sgg.push(temp);
});
sggs.map((info_sgg) => {
let temp = { sggs.map((info_sgg) => {
code_doe: info_sgg["code_doe"], let temp = {
name_sgg: info_sgg["name_sgg"], code_doe: info_sgg["code_doe"],
code_sgg: info_sgg["code_sgg"], name_sgg: info_sgg["name_sgg"],
}; code_sgg: info_sgg["code_sgg"],
temp.emd = emds.filter( };
(info_emd) => info_emd["code_sgg"] === info_sgg["code_sgg"] temp.emd = emds.filter(
); (info_emd) => info_emd["code_sgg"] === info_sgg["code_sgg"]
sgg_emd.push(temp); );
}); sgg_emd.push(temp);
});
res.status(server_status.code.ok).json({
locCodes: { res.json({
DOE: does, msg: resForm.msg.ok,
SGG: doe_sgg, contents: {
EMD: sgg_emd, loc_code: {
}, DOE: does,
}); SGG: doe_sgg,
EMD: sgg_emd,
},
},
});
} catch (err) {
console.log(err);
res.json({ msg: resForm.msg.err, contents: { error: err } });
}
}; };
...@@ -2,7 +2,7 @@ import db from "../db/index"; ...@@ -2,7 +2,7 @@ import db from "../db/index";
import envs from "../../config/config"; import envs from "../../config/config";
import jwt from "jsonwebtoken"; import jwt from "jsonwebtoken";
import nodemailer from "nodemailer"; import nodemailer from "nodemailer";
import server_status from "../server_status"; import resForm from "../resForm";
import routes from "../routes"; import routes from "../routes";
// 메일 전송 처리 // 메일 전송 처리
...@@ -70,14 +70,10 @@ export const postSignup = async (req, res) => { ...@@ -70,14 +70,10 @@ export const postSignup = async (req, res) => {
}); });
if (result.length != 0) { if (result.length != 0) {
res.status(server_status.code.err).json({ res.json({ msg: resForm.msg.err, contents: { existing_user: true } });
msg: server_status.msg.err,
content: "You are aleady registered",
});
} else { } else {
db.User.create({ email: email, nick_name: nick_name }, { logging: false }); db.User.create({ email: email, nick_name: nick_name }, { logging: false });
// 로그인 페이지로 넘겨주기. res.json({ msg: resForm.msg.ok, contents: { existing_user: false } });
res.redirect("/api/login");
} }
}; };
...@@ -93,29 +89,38 @@ export const postLogin = async (req, res) => { ...@@ -93,29 +89,38 @@ export const postLogin = async (req, res) => {
}); });
if (result.length != 0) { if (result.length != 0) {
// token 발행 try {
const mail_token = jwt.sign( // token 발행
{ const mail_token = jwt.sign(
email: email, {
}, email: email,
envs.secretKey.mail, },
{ envs.secretKey.mail,
expiresIn: 10 * 60, {
issuer: "eue.com", expiresIn: 10 * 60,
subject: "auth_checker", issuer: "eue.com",
} subject: "auth_checker",
); }
);
// 토큰이 포함된 로그인 링크 전송
postMail(email, mail_token); // 토큰이 포함된 로그인 링크 전송
postMail(email, mail_token);
res
.status(server_status.code.ok) res.json({
.json({ msg: server_status.msg.ok, content: "Send Mail Successfully." }); msg: resForm.msg.ok,
contents: { existing_user: true, mail_sending: true },
});
} catch (err) {
console.log(err);
res.json({
msg: resForm.msg.err,
contents: { existing_user: true, mail_sending: false, error: err },
});
}
} else { } else {
res.status(server_status.code.err).json({ res.json({
msg: server_status.msg.err, msg: resForm.msg.err,
content: "You are not one of our user yet.", contents: { existing_user: false, mail_sending: false },
}); });
} }
}; };
...@@ -146,13 +151,10 @@ export const getConfirm = async (req, res) => { ...@@ -146,13 +151,10 @@ export const getConfirm = async (req, res) => {
}); });
res res
.status(server_status.code.ok)
.cookie("acs_token", accessT) .cookie("acs_token", accessT)
.redirect("http://localhost:3000/"); .redirect(`${envs.client.host}:${envs.client.port}`);
} catch (err) { } catch (err) {
res res.json({ msg: resForm.msg.err, contents: { error: err } });
.status(server_status.code.err)
.json({ msg: server_status.msg.err, content: `${err}` });
} }
}; };
...@@ -166,24 +168,24 @@ export const getUserInfo = async (req, res) => { ...@@ -166,24 +168,24 @@ export const getUserInfo = async (req, res) => {
const result = await db.User.findAll({ where: { email: decoded.email } }); const result = await db.User.findAll({ where: { email: decoded.email } });
res.status(server_status.code.ok).json({ user_info: result }); res.status(resForm.code.ok).json({ user_info: result });
}; };
// 사용자 정보 수정 요청 처리 // 사용자 정보 수정 요청 처리
export const postEditProfile = async (req, res) => { export const postEditProfile = async (req, res) => {
const { const {
cookies: { acs_token }, cookies: { acs_token },
body: { nick_name, loc_code }, body: { nick_name, loc_code, using_aircon },
} = req; } = req;
const decoded = jwt.decode(acs_token); const decoded = jwt.decode(acs_token);
await db.User.update( await db.User.update(
{ nick_name: nick_name, loc_code: loc_code }, { nick_name: nick_name, loc_code: loc_code, using_aircon },
{ where: { email: decoded.email } } { where: { email: decoded.email } }
); );
res const result = await db.User.findAll({ where: { email: decoded.email } });
.status(server_status.code.ok)
.json({ msg: server_status.msg.ok, content: "Update Successfully" }); res.json({ msg: resForm.msg.ok, contents: { user_info: result } });
}; };
import routes from "./routes"; import routes from "./routes";
import jwt from "jsonwebtoken"; import jwt from "jsonwebtoken";
import envs from "../config/config"; import envs from "../config/config";
import resForm from "./resform";
/* /*
# localmiddleware # localmiddleware
...@@ -20,13 +21,11 @@ export const onlyPrivate = (req, res, next) => { ...@@ -20,13 +21,11 @@ export const onlyPrivate = (req, res, next) => {
cookies: { acs_token }, cookies: { acs_token },
} = req; } = req;
console.log('@@@@@@@@@@@@@@',req.cookies);
try { try {
const acs_decode = jwt.verify(acs_token, envs.secretKey.access_token); const acs_decode = jwt.verify(acs_token, envs.secretKey.access_token);
next(); next();
} catch (error) { } catch (err) {
console.log(error); console.log(err);
res.redirect("/api/login"); res.json({ msg: resForm.msg.err, contents: { error: err } });
} }
}; };
const SERVER_MSG_OK = "Server OK.";
const SERVER_MSG_ERROR = "The server encountered an error.";
const STATUS_CODE_OK = 200; const STATUS_CODE_OK = 200;
const STATUS_CODE_ERROR = 500; const STATUS_CODE_ERROR = 500;
const server_status = { const MSG_OK = "OK!";
msg: { const MSG_ERROR = "ERROR!";
ok: SERVER_MSG_OK,
err: SERVER_MSG_ERROR, const resForm = {
},
code: { code: {
ok: STATUS_CODE_OK, ok: STATUS_CODE_OK,
err: STATUS_CODE_ERROR, err: STATUS_CODE_ERROR,
}, },
msg: {
ok: MSG_OK,
err: MSG_ERROR,
},
}; };
export default server_status; export default resForm;
import envs from "../config/config";
// # Global Routes // # Global Routes
const BASE = "/api"; const BASE = envs.production ? "/app/eue/api" : "/api";
// # Data Routes // # Data Routes
const DATA = "/data"; const DATA = "/data";
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment