Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
students
eue
Commits
a8483c18
Commit
a8483c18
authored
Jul 30, 2021
by
KangMin An
Browse files
Create & Update: 응답 형식 작성 & 코드 수정.배포용 환경 변수 추가.
parent
146d7798
Changes
7
Hide whitespace changes
Inline
Side-by-side
server/API명세서.md
View file @
a8483c18
...
...
@@ -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.
서버의 응답 형태와 전달 내용 작성
server/config/config_public.js
View file @
a8483c18
...
...
@@ -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
,
},
},
...
...
server/src/controllers/dataController.js
View file @
a8483c18
...
...
@@ -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
}
});
}
};
server/src/controllers/userController.js
View file @
a8483c18
...
...
@@ -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
,
content
s
:
{
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
,
content
s
:
{
user_info
:
result
}
});
};
server/src/middlewares.js
View file @
a8483c18
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
(
err
or
)
{
console
.
log
(
err
or
);
res
.
redirect
(
"
/api/login
"
);
}
catch
(
err
)
{
console
.
log
(
err
);
res
.
json
({
msg
:
resForm
.
msg
.
err
,
contents
:
{
error
:
err
}
}
);
}
};
server/src/
server_status
.js
→
server/src/
resForm
.js
View file @
a8483c18
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
;
server/src/routes.js
View file @
a8483c18
import
envs
from
"
../config/config
"
;
// # Global Routes
const
BASE
=
"
/api
"
;
const
BASE
=
envs
.
production
?
"
/app/eue/api
"
:
"
/api
"
;
// # Data Routes
const
DATA
=
"
/data
"
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment