dataController.js 5.88 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
  try {
107
108
109
110
111
112
113
    /*
        # 사용자 email에 따른 사용자 날씨 데이터 가져오기 

        - 2021.08.07 기준, 데이터 수집기의 동작 오류로 인해 외부날씨 반환으로 대체.
        - 예측 날씨 반환 준비되는대로 업데이트
        
    */
114
    const decoded = jwt.decode(acs_token);
115
116
117
118
119
120
121
122
123
124

    // const result = db.Weather_In.findAll({
    //   where: { host: decoded.email },
    //   logging: false,
    // });

    const result_user = db.User.findAll({
      where: {
        email: decoded.email,
      },
125
126
      logging: false,
    });
127
    user_info = result_user[0];
128

129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
    const result_weather = db.Weather_Out.findAll({
      where: {
        loc_code: user_info.loc_code,
      },
      order: [["date", "ASC"]],
      logging: false,
    });

    const weather_out = result_weather.slice(-9, -3);
    const weather_predict = result_weather.slice(-3);

    res.json({
      msg: resForm.msg.ok,
      contents: { weather_in: weather_out, weather_predict: weather_predict },
    });
144
145
146
147
  } catch (err) {
    console.log(err);
    res.json({ msg: resForm.msg.err, contents: { error: err } });
  }
148
149
};

150
// 실외 날씨 데이터 요청 처리
151
export const getOutWeatherData = async (req, res) => {
152
  const {
153
    query: { loccode },
154
155
156
  } = req;
  try {
    // 실외 지역 번호를 통해 날씨 데이터 전송.
157
    const result = await db.Weather_Out.findAll({
158
      where: { loc_code: loccode },
159
      order: [["collected_at", "ASC"]],
160
161
162
      logging: false,
    });

163
164
165
    const weather_out = result.slice(-9);

    res.json({ msg: resForm.msg.ok, contents: { weather_out: weather_out } });
166
167
168
169
  } catch (err) {
    console.log(err);
    res.json({ msg: resForm.msg.err, contents: { error: err } });
  }
170
171
};

172
// 지역 코드 요청 처리
173
export const getLocCode = async (req, res) => {
174
175
  try {
    /* 통합 지역 코드 및 이름 json으로 생성 및 전송 */
176
177
178
179
180
181
182
183
184
185
186
187
    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,
    });
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228

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