Skip to content

Commit 85fee21

Browse files
committed
Feat: 마지막 조회했던 위치 저장 기능
1 parent 68baef1 commit 85fee21

18 files changed

+4055
-2503
lines changed

.github/workflows/add_data.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ jobs:
3333
- name: Add data to Firestore
3434
run: |
3535
python ./rpas/add_data_to_firestore.py
36-
python ./rpas/add_data_to_firestore_v2.py
3736
env:
3837
END_POINT: ${{ secrets.END_POINT }}
3938
SERVICE_KEY: ${{ secrets.SERVICE_KEY }}

lib/data/repository_firebase.dart

+8-62
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,27 @@
11
import 'package:cloud_firestore/cloud_firestore.dart';
2-
import 'package:intl/intl.dart';
32
import 'package:nakdong_river/domain/measurement.dart';
43
import 'package:nakdong_river/domain/position.dart';
5-
import 'package:nakdong_river/domain/repository.dart';
4+
import 'package:nakdong_river/domain/measurement_repository.dart';
65

7-
class RepositoryFirebaseImpl extends Repository {
6+
class RepositoryFirebaseImpl extends MeasurementRepository {
87
static FirebaseFirestore instance = FirebaseFirestore.instance;
98

109
@override
11-
Future<List<String>> getDepths(Position position) async {
12-
var response = await instance.collection(position.code).get();
13-
return response.docs.map((e) => e.id).toList();
14-
}
15-
16-
@override
17-
Future<List<Measurement>> getRecentData(
18-
Position position, String depth) async {
19-
final today = DateTime.now();
20-
String formattedDate = DateFormat('yyyy-MM-dd').format(today);
10+
Future<List<Measurement>> getRecentData(Position position) async {
2111
List<Measurement> dateList = [];
2212

2313
var response = await instance
24-
.collection(position.code)
25-
.doc(depth)
26-
.collection(formattedDate)
27-
.orderBy('msmtTm', descending: true)
14+
.collectionGroup("data")
15+
.where("mesure_location_code", isEqualTo: position.code)
16+
.where("mesure_salinity", isNotEqualTo: 0)
17+
.orderBy("mesure_date", descending: true)
2818
.limit(10)
2919
.get();
3020

3121
for (final doc in response.docs) {
32-
dateList.add(Measurement.fromFireStore(doc.data(), position, depth));
22+
dateList.add(Measurement.fromMap(doc.data()));
3323
}
3424

35-
if (response.docs.length < 10) {
36-
formattedDate = DateFormat('yyyy-MM-dd')
37-
.format(today.subtract(const Duration(days: 1)));
38-
response = await instance
39-
.collection(position.code)
40-
.doc(depth)
41-
.collection(formattedDate)
42-
.orderBy('msmtTm', descending: true)
43-
.limit(10 - response.docs.length)
44-
.get();
45-
46-
for (final doc in response.docs) {
47-
dateList.add(Measurement.fromFireStore(doc.data(), position, depth));
48-
}
49-
}
5025
return dateList;
5126
}
52-
53-
@override
54-
Future<Measurement> getRecentDataOne(Position position, String depth) async {
55-
final today = DateTime.now();
56-
String formattedDate = DateFormat('yyyy-MM-dd').format(today);
57-
58-
var response = await instance
59-
.collection(position.code)
60-
.doc(depth)
61-
.collection(formattedDate)
62-
.orderBy('msmtTm', descending: true)
63-
.limit(1)
64-
.get();
65-
66-
if (response.docs.isEmpty) {
67-
formattedDate = DateFormat('yyyy-MM-dd')
68-
.format(today.subtract(const Duration(days: 1)));
69-
response = await instance
70-
.collection(position.code)
71-
.doc(depth)
72-
.collection(formattedDate)
73-
.orderBy('msmtTm', descending: true)
74-
.limit(1)
75-
.get();
76-
}
77-
78-
return Measurement.fromFireStore(
79-
response.docs.first.data(), position, depth);
80-
}
8127
}

lib/domain/measurement.dart

+29-18
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,47 @@
11
import 'package:cloud_firestore/cloud_firestore.dart';
2-
import 'package:nakdong_river/domain/position.dart';
32

43
/// 측정 데이터 모델
54
class Measurement {
6-
final Position position;
7-
final String depth;
8-
final Timestamp time;
9-
final num salinity;
10-
final num temperature;
5+
final Timestamp date;
6+
final num depth;
7+
final String location;
8+
final String locationCode;
9+
final double salinity;
10+
final double temperature;
1111

12-
const Measurement({
12+
Measurement({
13+
required this.date,
1314
required this.depth,
14-
required this.time,
15-
required this.position,
15+
required this.location,
16+
required this.locationCode,
1617
required this.salinity,
1718
required this.temperature,
1819
});
1920

20-
/// FireStore에서 받아온 데이터를 Measurement로 변환한다.
21-
static Measurement fromFireStore(
22-
Map<String, dynamic> json, Position position, String depth) {
21+
factory Measurement.fromMap(Map<String, dynamic> map) {
2322
return Measurement(
24-
depth: depth,
25-
position: position,
26-
time: json['msmtTm'],
27-
salinity: json['saln'],
28-
temperature: json['wtep'],
23+
date: map['mesure_date'],
24+
depth: map['mesure_depths'],
25+
location: map['mesure_location'],
26+
locationCode: map['mesure_location_code'],
27+
salinity: map['mesure_salinity'],
28+
temperature: map['mesure_temperature'],
2929
);
3030
}
3131

32+
Map<String, dynamic> toMap() {
33+
return {
34+
'mesure_date': date,
35+
'mesure_depths': depth,
36+
'mesure_location': location,
37+
'mesure_location_code': locationCode,
38+
'mesure_salinity': salinity,
39+
'mesure_temperature': temperature,
40+
};
41+
}
42+
3243
@override
3344
String toString() {
34-
return 'Measurement{position: ${position.name}, depth: $depth, time: ${time.toDate().toString()}, salinity: $salinity, temperature: $temperature}';
45+
return 'Measurement{date: $date, depth: $depth, location: $location, locationCode: $locationCode, salinity: $salinity, temperature: $temperature}';
3546
}
3647
}
+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import 'package:nakdong_river/domain/measurement.dart';
2+
import 'package:nakdong_river/domain/position.dart';
3+
4+
abstract class MeasurementRepository {
5+
/// 저장되어 있는 데이터 중 가장 최근의 10개의 데이터를 반환한다.
6+
Future<List<Measurement>> getRecentData(Position position);
7+
}

lib/domain/repository.dart

-13
This file was deleted.

lib/main.dart

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:firebase_core/firebase_core.dart';
22
import 'package:flutter/material.dart';
3+
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
34
import 'package:google_mobile_ads/google_mobile_ads.dart';
4-
import 'package:nakdong_river/domain/position.dart';
55
import 'package:nakdong_river/firebase_options.dart';
66
import 'package:nakdong_river/presentation/providers/admob_provider.dart';
77
import 'package:nakdong_river/presentation/providers/package_info_provider.dart';
@@ -16,11 +16,12 @@ void main() async {
1616
options: DefaultFirebaseOptions.currentPlatform,
1717
);
1818
await MobileAds.instance.initialize();
19+
var storge = const FlutterSecureStorage();
20+
var code = await storge.read(key: 'position');
1921
runApp(
2022
MultiProvider(
2123
providers: [
22-
ChangeNotifierProvider(
23-
create: (_) => PositionProvider(Position.point5)),
24+
ChangeNotifierProvider(create: (_) => PositionProvider(code)),
2425
ChangeNotifierProvider(create: (_) => AdMobProvider()),
2526
ChangeNotifierProvider(create: (_) => PackageInfoProvider()),
2627
],

0 commit comments

Comments
 (0)