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

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

parent 146d7798
......@@ -14,20 +14,107 @@
| Auth | GET | /confirm?... | 메일 인증용 토큰의 유효성 확인 요청 |
| User Info | GET | /user-info | 회원 정보 요청 |
| User Info | POST | /edit-profile | 회원 정보 수정 요청 |
| User Info | POST | /set-loccode | 회원 지역 코드 설정 요청 |
<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>
## API 명세 기록
<br>
### 2021.05.03 \_ API 명세 초안 작성
1. Data Collector Routes
......@@ -84,3 +171,12 @@
4. 사용자 인증과 사용자 정보 주소 분류 구분
: 사용자 인증에 관한 주소 "Auth", 사용자 정보에 관한 주소 "User Info" 분류 구분.
<br>
### 2021.07.29 \_ 경로 삭제 및 응답 방식 작성
1. 사용자 지역 코드 수정 주소 삭제
: 사용자 정보를 수정하는 "/edit-profile" 에서 처리
2. 서버의 응답 형태와 전달 내용 작성
......@@ -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
const PROTOCOL = "http";
const HOST = "localhost";
const PORT = 4500;
const SERVER_PROTOCOL = PRODUCTION ? "https" : "http";
const SERVER_HOST = PRODUCTION ? "YOUR_PRODUCTION_HOST" : "localhost";
const SERVER_PORT = PRODUCTION
? "YOUR_PRODUCTION_PORT"
: "YOUR_DEVELOPMENT_PORT";
// # DB Info.
const DB_USER = "postgres";
const DB_PASSWORD = "YOUR_PostgreSQL_PASSWORD";
const DB_USER = PRODUCTION
? "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_PORT = "5432";
const DB_DATABASE = "YOUR_DB_NAME";
const DB_DATABASE = PRODUCTION
? "YOUR_PRODUCTION_DB_NAME"
: "YOUR_DEVELOPMENT_DB_NAME";
// # API.
......@@ -27,7 +45,6 @@ const OPENWEATHERMAP_API_KEY = "YOUR_OpenWeatherMap_API_KEY";
const NODEMAILER_SERVICE = "gmail";
const NODEMAILER_USER = "YOUR_MAIL_ADDRESS";
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";
// # Secret Key.
......@@ -35,10 +52,16 @@ const AUTH_MAIL_SECRETKEY = "YOUR_MAIL_SECRETKEY";
const AUTH_ACCESS_TOKEN_SECRETKEY = "YOUR_ACCESS_TOKEN_SECRETKEY";
const envs = {
production: PRODUCTION,
client: {
protocol: CLIENT_PROTOCOL,
host: CLIENT_HOST,
port: CLIENT_PORT,
},
server: {
protocol: PROTOCOL,
host: HOST,
port: PORT,
protocol: SERVER_PROTOCOL,
host: SERVER_HOST,
port: SERVER_PORT,
},
db: {
user: DB_USER,
......@@ -55,7 +78,7 @@ const envs = {
service: NODEMAILER_SERVICE,
user: NODEMAILER_USER,
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,
},
},
......
......@@ -2,7 +2,7 @@ import db from "../db/index";
import envs from "../../config/config";
import fetch from "node-fetch";
import jwt from "jsonwebtoken";
import server_status from "../server_status";
import resForm from "../resForm";
// 외부 수집기로 부터 들어온 정보 처리
const handleOutData = async (locCode, date, lat, lng) => {
......@@ -63,10 +63,6 @@ export const getDataInput = (req, res) => {
`Outside[${locCode}] Data(date: ${trans_date}/ lat: ${lat}/ lng: ${lng}) Input.`
);
handleOutData(locCode, trans_date, lat, lng);
res.status(server_status.code.ok).send({
msg: server_status.msg.ok,
content: `Outside[${locCode}] data Input.`,
});
} else {
// 내부 데이터 수집기 동작
const {
......@@ -80,11 +76,10 @@ export const getDataInput = (req, res) => {
);
handleInData(email, trans_date, temp, humi, lights);
}
res.status(server_status.code.ok).send(server_status.msg.ok);
} catch (error) {
console.log(error);
res.status(server_status.code.err).send(server_status.msg.err);
res.status(resForm.code.ok);
} catch (err) {
console.log(err);
res.status(resForm.code.err);
}
};
......@@ -94,64 +89,86 @@ export const getUserWeatherData = (req, res) => {
cookies: { acs_token },
} = req;
/* 사용자 email에 따른 사용자 날씨 데이터 가져오기 */
const decoded = jwt.decode(acs_token);
const result = db.Weather_in.findAll({
where: { host: decoded.email },
logging: false,
});
try {
/* 사용자 email에 따른 사용자 날씨 데이터 가져오기 */
const decoded = jwt.decode(acs_token);
const result = db.Weather_in.findAll({
where: { host: decoded.email },
logging: false,
});
res
.status(server_status.code.ok)
.json({ msg: server_status.msg.ok, content: result });
res.json({ msg: resForm.msg.ok, contents: { weather_user: result } });
} catch (err) {
console.log(err);
res.json({ msg: resForm.msg.err, contents: { error: err } });
}
};
// 실외 날씨 데이터 요청 처리
export const getOutWeatherData = (req, res) => {
// 실외 지역 번호를 통해 날씨 데이터 전송.
res
.status(server_status.code.ok)
.json({ msg: server_status.msg.ok, content: "Outside Weather Data" });
const {
body: { loc_code },
} = req;
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) => {
/* 통합 지역 코드 및 이름 json으로 생성 및 전송 */
const does = await db.Doe.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 = [];
does.map((info_doe) => {
let temp = {
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"]
);
doe_sgg.push(temp);
});
sggs.map((info_sgg) => {
let temp = {
code_doe: info_sgg["code_doe"],
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"]
);
sgg_emd.push(temp);
});
res.status(server_status.code.ok).json({
locCodes: {
DOE: does,
SGG: doe_sgg,
EMD: sgg_emd,
},
});
try {
/* 통합 지역 코드 및 이름 json으로 생성 및 전송 */
const does = await db.Doe.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 = [];
does.map((info_doe) => {
let temp = {
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"]
);
doe_sgg.push(temp);
});
sggs.map((info_sgg) => {
let temp = {
code_doe: info_sgg["code_doe"],
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"]
);
sgg_emd.push(temp);
});
res.json({
msg: resForm.msg.ok,
contents: {
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";
import envs from "../../config/config";
import jwt from "jsonwebtoken";
import nodemailer from "nodemailer";
import server_status from "../server_status";
import resForm from "../resForm";
import routes from "../routes";
// 메일 전송 처리
......@@ -70,14 +70,10 @@ export const postSignup = async (req, res) => {
});
if (result.length != 0) {
res.status(server_status.code.err).json({
msg: server_status.msg.err,
content: "You are aleady registered",
});
res.json({ msg: resForm.msg.err, contents: { existing_user: true } });
} else {
db.User.create({ email: email, nick_name: nick_name }, { logging: false });
// 로그인 페이지로 넘겨주기.
res.redirect("/api/login");
res.json({ msg: resForm.msg.ok, contents: { existing_user: false } });
}
};
......@@ -93,29 +89,38 @@ export const postLogin = async (req, res) => {
});
if (result.length != 0) {
// token 발행
const mail_token = jwt.sign(
{
email: email,
},
envs.secretKey.mail,
{
expiresIn: 10 * 60,
issuer: "eue.com",
subject: "auth_checker",
}
);
// 토큰이 포함된 로그인 링크 전송
postMail(email, mail_token);
res
.status(server_status.code.ok)
.json({ msg: server_status.msg.ok, content: "Send Mail Successfully." });
try {
// token 발행
const mail_token = jwt.sign(
{
email: email,
},
envs.secretKey.mail,
{
expiresIn: 10 * 60,
issuer: "eue.com",
subject: "auth_checker",
}
);
// 토큰이 포함된 로그인 링크 전송
postMail(email, mail_token);
res.json({
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 {
res.status(server_status.code.err).json({
msg: server_status.msg.err,
content: "You are not one of our user yet.",
res.json({
msg: resForm.msg.err,
contents: { existing_user: false, mail_sending: false },
});
}
};
......@@ -146,13 +151,10 @@ export const getConfirm = async (req, res) => {
});
res
.status(server_status.code.ok)
.cookie("acs_token", accessT)
.redirect("http://localhost:3000/");
.redirect(`${envs.client.host}:${envs.client.port}`);
} catch (err) {
res
.status(server_status.code.err)
.json({ msg: server_status.msg.err, content: `${err}` });
res.json({ msg: resForm.msg.err, contents: { error: err } });
}
};
......@@ -166,24 +168,24 @@ export const getUserInfo = async (req, res) => {
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) => {
const {
cookies: { acs_token },
body: { nick_name, loc_code },
body: { nick_name, loc_code, using_aircon },
} = req;
const decoded = jwt.decode(acs_token);
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 } }
);
res
.status(server_status.code.ok)
.json({ msg: server_status.msg.ok, content: "Update Successfully" });
const result = await db.User.findAll({ where: { email: decoded.email } });
res.json({ msg: resForm.msg.ok, contents: { user_info: result } });
};
import routes from "./routes";
import jwt from "jsonwebtoken";
import envs from "../config/config";
import resForm from "./resform";
/*
# localmiddleware
......@@ -20,13 +21,11 @@ export const onlyPrivate = (req, res, next) => {
cookies: { acs_token },
} = req;
console.log('@@@@@@@@@@@@@@',req.cookies);
try {
const acs_decode = jwt.verify(acs_token, envs.secretKey.access_token);
next();
} catch (error) {
console.log(error);
res.redirect("/api/login");
} catch (err) {
console.log(err);
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_ERROR = 500;
const server_status = {
msg: {
ok: SERVER_MSG_OK,
err: SERVER_MSG_ERROR,
},
const MSG_OK = "OK!";
const MSG_ERROR = "ERROR!";
const resForm = {
code: {
ok: STATUS_CODE_OK,
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
const BASE = "/api";
const BASE = envs.production ? "/app/eue/api" : "/api";
// # Data Routes
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