dataController.js 5.14 KB
Newer Older
1
import db from "../db/index";
2
import envs from "../../config/config";
KangMin An's avatar
KangMin An committed
3
4
import fetch from "node-fetch";
import jwt from "jsonwebtoken";
5
import resForm from "../resForm";
6

7
// 외부 수집기로 부터 들어온 정보 처리
8
export const handleOutData = async (locCode, date, lat, lng) => {
9
10
11
12
13
14
  try {
    // OpenWeatherAPI로 부터 지역의 날씨 정보획득을 위해 지역의 경도와 위도, API Key, 단위 기준 metric 전달
    const response = await fetch(
      `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lng}&appid=${envs.api.openweathermap.api_key}&units=metric`
    );
    const json = await response.json();
15

16
17
18
19
    const temp = json["main"]["temp"];
    const humi = json["main"]["humidity"];
    const press = json["main"]["pressure"];
    const wind_speed = json["wind"]["speed"];
20

21
22
23
24
25
26
27
28
29
30
31
32
33
    await db.Weather_Out.create(
      {
        loc_code: Number(locCode),
        collected_at: date,
        temp: temp,
        humi: humi,
        press: press,
        wind_speed: wind_speed,
      },
      {
        logging: false,
      }
    );
34
35

    console.log("Outside data successfully stored.");
36
37
38
39
  } catch (err) {
    console.log("Input Weather_Out Data Error.");
    console.log(err);
  }
40
41
42
};

// 내부 수집기로 부터 들어온 정보 처리
KangMin An's avatar
KangMin An committed
43
const handleInData = async (email, date, temp, humi, lights) => {
44
45
46
47
48
49
50
51
52
53
54
55
56
  try {
    await db.Weather_In.create(
      {
        host: email,
        collected_at: date,
        temp: temp,
        humi: humi,
        lights: lights,
      },
      {
        logging: false,
      }
    );
57
58

    console.log("Inside data successfully stored.");
59
60
61
62
  } catch (err) {
    console.log("Input Weather_In Data Error.");
    console.log(err);
  }
63
64
65
};

// 데이터 수신 처리
66
export const getDataInput = (req, res) => {
67
  try {
68
    if (req.query.type === "OUT") {
69
70
      // 외부 데이터 수집기
      const {
71
        query: { locCode, date, lat, lng },
72
      } = req;
73

KangMin An's avatar
KangMin An committed
74
75
76
77
78
79
      const trans_date = new Date(date);

      console.log(
        `Outside[${locCode}] Data(date: ${trans_date}/ lat: ${lat}/ lng: ${lng}) Input.`
      );
      handleOutData(locCode, trans_date, lat, lng);
80
81
82
    } else {
      // 내부 데이터 수집기 동작
      const {
KangMin An's avatar
KangMin An committed
83
        query: { email, date, temp, humi, lights },
84
85
      } = req;

KangMin An's avatar
KangMin An committed
86
87
88
89
90
91
      const trans_date = new Date(date);

      console.log(
        `User[${email}] Data(date: ${trans_date}/ temp: ${temp}/ humi: ${humi}/ lights: ${lights}) Input.`
      );
      handleInData(email, trans_date, temp, humi, lights);
92
    }
93
    res.status(resForm.code.ok).json({ msg: resForm.msg.ok });
94
95
  } catch (err) {
    console.log(err);
96
    res.status(resForm.code.err).json({ msg: resForm.msg.err });
97
  }
KangMin An's avatar
KangMin An committed
98
};
99
100

// 사용자의 데이터 가져오기 및 예측 값 전송
101
export const getUserWeatherData = (req, res) => {
102
  const {
KangMin An's avatar
KangMin An committed
103
    cookies: { acs_token },
104
105
  } = req;

106
107
108
  try {
    /* 사용자 email에 따른 사용자 날씨 데이터 가져오기 */
    const decoded = jwt.decode(acs_token);
109
    const result = db.Weather_In.findAll({
110
111
112
      where: { host: decoded.email },
      logging: false,
    });
113

114
    res.json({ msg: resForm.msg.ok, contents: { weather_in: result } });
115
116
117
118
  } catch (err) {
    console.log(err);
    res.json({ msg: resForm.msg.err, contents: { error: err } });
  }
119
120
};

121
// 실외 날씨 데이터 요청 처리
122
export const getOutWeatherData = async (req, res) => {
123
  const {
124
    query: { loccode },
125
126
127
  } = req;
  try {
    // 실외 지역 번호를 통해 날씨 데이터 전송.
128
    const result = await db.Weather_Out.findAll({
129
      where: { loc_code: loccode },
130
      order: [["collected_at", "DESC"]],
131
132
133
134
135
136
137
138
      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 } });
  }
139
140
};

141
// 지역 코드 요청 처리
142
export const getLocCode = async (req, res) => {
143
144
  try {
    /* 통합 지역 코드 및 이름 json으로 생성 및 전송 */
145
146
147
148
149
150
151
152
153
154
155
156
    const does = await db.Doe.findAll({
      order: [["name_doe", "ASC"]],
      logging: false,
    });
    const sggs = await db.Sgg.findAll({
      order: [["name_sgg", "ASC"]],
      logging: false,
    });
    const emds = await db.Emd.findAll({
      order: [["name_emd", "ASC"]],
      logging: false,
    });
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197

    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 } });
  }
198
};