-
Notifications
You must be signed in to change notification settings - Fork 0
/
jsondatabase.cpp
193 lines (183 loc) · 6.59 KB
/
jsondatabase.cpp
1
2
3
4
5
6
7
8
9
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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
#include "jsondatabase.h"
#include <QByteArray>
#include <QFile>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QDir>
#include <QMessageBox>
QJsonArray get_lesson_videos_json_arr(const QPointer<Lesson> &lesson)
{
QJsonArray v_arr;
for (const auto &video: lesson->videos)
{
QJsonObject v_obj;
v_obj["id"] = video->id;
v_obj["name"] = video->name;
v_obj["url"] = video->url;
v_arr.append(v_obj);
}
return v_arr;
}
QJsonArray combine_videos_of_two_lessons(const QPointer<Lesson> &l1, const QPointer<Lesson> &l2)
{
QJsonArray v_arr;
for (const auto &video: l1->videos)
{
auto it = std::find_if(v_arr.begin(), v_arr.end(),
[video](const QJsonValue &val) {
return val.isObject() && val.toObject()["url"].toString() == video->url;
});
if (it != v_arr.end())
{
// already added to array
continue;
}
QJsonObject v_obj;
v_obj["id"] = video->id;
v_obj["name"] = video->name;
v_obj["url"] = video->url;
v_arr.append(v_obj);
}
for (const auto &video: l2->videos)
{
auto it = std::find_if(v_arr.begin(), v_arr.end(),
[video](const QJsonValue &val) {
return val.isObject() && val.toObject()["url"].toString() == video->url;
});
if (it != v_arr.end())
{
// already added to array
continue;
}
QJsonObject v_obj;
v_obj["id"] = video->id;
v_obj["name"] = video->name;
v_obj["url"] = video->url;
v_arr.append(v_obj);
}
return v_arr;
}
void JsonDatabase::save_lessons(const QList<QPointer<Lesson>> &lessons)
{
if (!lessons.isEmpty())
{
QList<QPointer<Lesson>> lessons_in_db = JsonDatabase::retrieve_lessons();
QFile output_file(JsonDatabase::database_name());
if (output_file.open(QIODevice::ReadWrite | QIODevice::Truncate))
{
QJsonArray arr;
for (const auto &lesson: lessons)
{
QPointer<Lesson> _lesson;
QJsonObject obj;
auto it = std::find_if(lessons_in_db.begin(), lessons_in_db.end(),
[lesson](const QPointer<Lesson> &_lesson) {
return _lesson->name == lesson->name && _lesson->teacher == lesson->teacher;
}
);
if (it != lessons_in_db.end())
{
// lesson already in db, merge video lists
_lesson = *it;
obj["id"] = lesson->id;
obj["teacher"] = lesson->teacher;
obj["name"] = lesson->name;
obj["videos"] = combine_videos_of_two_lessons(lesson, _lesson);
arr.append(obj);
continue;
} else _lesson = lesson;
obj["id"] = lesson->id;
obj["teacher"] = lesson->teacher;
obj["name"] = lesson->name;
obj["videos"] = get_lesson_videos_json_arr(lesson);
arr.append(obj);
}
QJsonDocument doc;
doc.setArray(arr);
auto rv = output_file.write(doc.toJson());
output_file.close();
if (rv == -1)
{
qCritical() << "error while saving";
return;
}
qDebug() << "saved file";
} else
{
qDebug() << "couldn't open file";
}
} else
{
qDebug() << "empty lessons";
}
}
QList<QPointer<Lesson> > JsonDatabase::retrieve_lessons()
{
QList<QPointer<Lesson>> lessons;
QDir dir(JsonDatabase::database_dir());
if (!dir.mkpath(dir.absolutePath()))
{
qDebug() << "Unable to create " << dir.absolutePath()
<< ". Create it first then restart application.";
QMessageBox::critical(nullptr, "Hata",
QString("%1 oluşturulamadı. Klasörü oluşturup uygulamayı tekrar başlatın.").arg(
dir.absolutePath()));
return lessons;
}
QByteArray json_byte;
qDebug() << "database location: " << JsonDatabase::database_name();
QFile inputFile(JsonDatabase::database_name());
if (!inputFile.exists())
{
qDebug() << "Writing from: " << JsonDatabase::default_json_name() << " to: " << JsonDatabase::database_name();
QFile defaultFile(JsonDatabase::default_json_name());
defaultFile.open(QIODevice::ReadOnly | QIODevice::Text);
QByteArray defaultArr = defaultFile.readAll();
if (inputFile.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug() << "Wrote to " << JsonDatabase::database_name();
inputFile.write(defaultArr);
} else
{
qDebug() << "Unable to write to: " << JsonDatabase::database_name();
}
defaultFile.close();
inputFile.close();
}
if (inputFile.open(QIODevice::ReadOnly | QIODevice::Text))
{
json_byte = inputFile.readAll();
QJsonDocument doc(QJsonDocument::fromJson(json_byte));
if (!doc.isEmpty() && doc.isArray())
{
QJsonArray arr = doc.array();
for (auto item: arr)
{
QJsonObject element = item.toObject();
QString id = element["id"].toString();
QString teacher = element["teacher"].toString();
QString name = element["name"].toString();
// TODO Add videos to lesson->videos
QPointer<Lesson> l = new Lesson(id, name, teacher);
QJsonArray videos_obj = element["videos"].toArray();
for (auto v_item: videos_obj)
{
QJsonObject v_elem = v_item.toObject();
QString v_id = v_elem["id"].toString();
QString v_name = v_elem["name"].toString();
QString v_url = v_elem["url"].toString();
QPointer<Video> v = new Video(v_id, v_name, l->teacher, v_url);
v->lesson_name = l->name;
l->videos.push_back(v);
}
lessons.push_back(l);
}
}
} else
{
throw std::invalid_argument("lessons.json not found");
}
inputFile.close();
return lessons;
}