dataController.js 4.06 KB
Newer Older
1
import fs from "fs";
2
import fetch from "node-fetch";
3

4
5
6
const OUT = "Out";
const IN = "In";

7
8
9
const OUTSIDE = "Outside";
const USERS = "Users";

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 데이터 수집 기로 부터 받아온 지역 코드 세분화
const locCodeSep = (code = "") => {
  const DO = code.slice(0, 2);
  const SGG = code.slice(0, 5);
  const EMD = code;

  const loc = {
    DO: DO,
    SGG: SGG,
    EMD: EMD,
  };

  return loc;
};

// 데이터가 들어온 시간 데이터 생성
const getTimeInfo = () => {
  const cur = new Date();

  const year = cur.getFullYear();
  const month = cur.getMonth() + 1;
  const date = cur.getDate();
  const hour = cur.getHours();
  const minute = cur.getMinutes();

  const time = {
    year: year,
    month: month,
    date: date,
    hour: hour,
    minute: minute,
  };

  return time;
};

46
47
48
49
50
51
52
53
54
55
56
57
58
59
const getDataDIR = (loc, time, id) => {
  const year = time.year;
  const month = time.month < 10 ? `0${time.month}` : time.month;
  const date = time.date < 10 ? `0${time.date}` : time.date;

  const repoDIR =
    "./data" +
    `/${loc.DO}` +
    `/${loc.SGG}` +
    `/${loc.EMD}` +
    `/${id}` +
    `/${year}` +
    `/${year}${month}` +
    `/${year}${month}${date}`;
60
61
62
63

  return repoDIR;
};

64
65
// 데이터를 파일 형식으로 저장
const storeData = (type, time, loc, fdir, data) => {
66
  const fileName = "weather.csv";
67
68
69
70
71
72
73
74
75
76
77
78

  fs.open(fdir + `/${fileName}`, "a", (err, fd) => {
    if (err) {
      // Directory가 존재하지 않는 경우, 생성
      if (err.code === "ENOENT") {
        console.log("There is no directory.");

        fs.mkdirSync(fdir, { recursive: true }, (err) => {
          if (err) console.log(err);
        });

        console.log("Create directory.");
79
80
81
      }
      // 그 외의 에러는 출력
      else console.log(err);
82
83
84
85
86
87
88
89
    }

    fs.appendFile(fdir + `/${fileName}`, data, (err) => {
      if (err) console.log(err);
      else
        console.log(
          `${time.year}/${time.month}/${time.date} ${time.hour}:${
            time.minute
90
          } - ${loc.EMD} ${type === OUT ? OUTSIDE : USERS} data append.`
91
92
93
94
95
96
97
98
        );
    });
  });
};

// 외부 수집기로 부터 들어온 정보 처리
const handleOutData = (locCode, lat, lng) => {
  // OpenWeatherAPI로 부터 지역의 날씨 정보획득
99
  // 지역의 경도와 위도, API KEy, 단위 기준 metric 전달
100
  fetch(
101
    `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lng}&appid=${process.env.OPENWEATHERMAP_API_KEY}&units=metric`
102
103
104
105
106
107
108
109
110
111
112
  )
    .then((response) => response.json())
    .then((json) => {
      const temp = json.main.temp;
      const humi = json.main.humidity;
      const press = json.main.pressure;
      const wind_speed = json.wind.speed;

      const loc = locCodeSep(locCode);
      const time = getTimeInfo();

113
114
      const fdir = getDataDIR(loc, time, OUTSIDE);
      // 데이터 형식 - [ 월 | 일 | 시 | 분 | 온도 | 습도 | 기압 | 풍속 ]
115
      const data = `${time.month},${time.date},${time.hour},${time.minute},${temp},${humi},${press},${wind_speed}\n`;
116
117
118
119
120
121
122
123
124
125
126

      storeData(OUT, time, loc, fdir, data);
    })
    .catch((err) => console.log(err));
};

// 내부 수집기로 부터 들어온 정보 처리
const handleInData = (id, locCode, temp, humi, lights) => {
  const loc = locCodeSep(locCode);
  const time = getTimeInfo();

127
128
129
  const fdir = getDataDIR(loc, time, `${USERS}/${id}`);
  // 데이터 형식 - [ 월 | 일 | 시 | 분 | 온도 | 습도 | 광도 ]
  const data = `${time.month},${time.date},${time.hour},${time.minute},${temp},${humi},${lights}\n`;
130
131
132
133
134

  storeData(IN, time, loc, fdir, data);
};

// 데이터 수신 처리
135
export const getDataInput = (req, res) => {
136
137
138
139
140
141
142
  console.log(process.cwd());
  try {
    if (req.query.type === OUT) {
      // 외부 데이터 수집기
      const {
        query: { locCode, lat, lng },
      } = req;
143

144
145
146
147
148
149
150
151
152
153
154
155
156
157
      handleOutData(locCode, lat, lng);
    } else {
      // 내부 데이터 수집기 동작
      const {
        query: { id, locCode, temp, humi, lights },
      } = req;

      handleInData(id, locCode, temp, humi, lights);
    }

    res.status(200).send("<p>OK</p>");
  } catch (error) {
    console.log(error);
  }
KangMin An's avatar
KangMin An committed
158
};