File indexing completed on 2024-05-12 17:24:09

0001 #pragma once
0002 
0003 #include <tuple>
0004 #include <threadeddatabase.h>
0005 #include <QCoroTask>
0006 
0007 namespace DB
0008 {
0009 
0010 struct Plant
0011 {
0012     using Id = int;
0013     using ColumnTypes = std::tuple<int, QString, QString, QString, int, QString, int, int, int, int, int>;
0014 
0015     Plant::Id plant_id;
0016     QString name;
0017     QString species;
0018     QString img_url;
0019     int water_intervall;
0020     QString location;
0021     int date_of_birth;
0022     int parent_id;
0023     int last_watered;
0024     int last_health_date;
0025     int current_health;
0026 };
0027 
0028 struct HealthEvent
0029 {
0030     using ColumnTypes = std::tuple<int, int>;
0031     explicit HealthEvent(int health_date, int health);
0032     int health_date;
0033     int health;
0034 };
0035 
0036 }
0037 
0038 class Database : public QObject
0039 {
0040     Q_OBJECT
0041 public:
0042     Database();
0043 
0044     QCoro::Task<DB::Plant::Id> addPlant(const QString &name, const QString &species, const QString &imgUrl, const int waterIntervall, const QString location, const int dateOfBirth, const int lastWatered, const int healthDate, const int health);
0045     void editPlant(const DB::Plant::Id plantId, const QString &name, const QString &species, const QString &imgUrl, const int waterIntervall, const QString location, const int dateOfBirth);
0046     void deletePlant(const DB::Plant::Id plantId);
0047     QFuture<std::vector<DB::Plant>> plants();
0048     QFuture<std::optional<DB::Plant>> plant(int plant_id);
0049     QFuture<std::vector<SingleValue<int>>> waterEvents(int plantId);
0050     QFuture<std::vector<DB::HealthEvent>> healthEvents(int plantId);
0051     void waterPlant(const int plantId, const int waterDate);
0052     void addHealthEvent(const int plantId, const int healthDate, const int health);
0053     QFuture<std::optional<SingleValue<int>>> getLastHealthDate(const int plantId);
0054 //    void replaceLastHealthEvent(const int plantId, const int waterDate, const int health);
0055     static Database & instance();
0056 
0057 Q_SIGNALS:
0058     void plantChanged(const DB::Plant::Id plantId);
0059 
0060 
0061 private:
0062     std::unique_ptr<ThreadedDatabase> m_database;
0063 
0064 };