diff --git a/ActiveCommand.cpp b/ActiveCommand.cpp index b155d35..021fb42 100644 --- a/ActiveCommand.cpp +++ b/ActiveCommand.cpp @@ -14,15 +14,15 @@ namespace commands void ActiveCommand::run(stringstream& args) { - Manager* mgr = Manager::get_instance(); + Manager& mgr = Manager::get_instance(); int user_id; args >> user_id; if (!user_id) throw Error(102, "Ein Parameter eines Befehls konnte nicht gelesen werden"); - const User* u = mgr->get_user(user_id); + const User* u = mgr.get_user(user_id); if (!u) throw Error(401, "Eine solche BenutzerIn existiert nicht."); - for (const Assignment* a : mgr->get_assignments_for_user(user_id)) + for (const Assignment* a : mgr.get_assignments_for_user(user_id)) cout << a->get_task_id() << "\n"; } } // commands diff --git a/AddCommand.cpp b/AddCommand.cpp index 36ee923..6186ce8 100644 --- a/AddCommand.cpp +++ b/AddCommand.cpp @@ -17,21 +17,21 @@ namespace commands void AddCommand::run(stringstream& args) { const string data_type = Util::read_string(args); - Manager* mgr = Manager::get_instance(); + Manager& mgr = Manager::get_instance(); if (data_type == "user") { AddUser u; args >> u; - mgr->add_user(new User(u)); + mgr.add_user(new User(u)); } else if (data_type == "task") { AddTask t; args >> t; - mgr->add_task(new Task(t)); + mgr.add_task(new Task(t)); } else throw Error(102, "Ein Parameter eines Befehls konnte nicht gelesen werden."); - mgr->save(); + mgr.save(); } } // commands diff --git a/AssignCommand.cpp b/AssignCommand.cpp index 042fb99..8ac62d2 100644 --- a/AssignCommand.cpp +++ b/AssignCommand.cpp @@ -14,21 +14,21 @@ namespace commands void AssignCommand::run(stringstream& args) { - Manager* mgr = Manager::get_instance(); + Manager& mgr = Manager::get_instance(); int user_id, task_id; args >> user_id >> task_id; if (!args) throw Error(102, "Ein Parameter eines Befehls konnte nicht gelesen werden"); - const User* u = mgr->get_user(user_id); + const User* u = mgr.get_user(user_id); if (!u) throw Error(401, "Eine solche BenutzerIn existiert nicht."); - const Task* t = mgr->get_task(task_id); + const Task* t = mgr.get_task(task_id); if (!t) throw Error(402, "Eine solche Aufgabe existiert nicht."); - if (mgr->assignment_exists(user_id, task_id)) + if (mgr.assignment_exists(user_id, task_id)) throw Error(302, "Eine solche Zuordnung existiert bereits."); Assignment* a = new Assignment(user_id, task_id); - mgr->add_assignment(a); - mgr->save(); + mgr.add_assignment(a); + mgr.save(); } } // commands diff --git a/Assignment.cpp b/Assignment.cpp index 79bb100..19b1e82 100644 --- a/Assignment.cpp +++ b/Assignment.cpp @@ -5,7 +5,11 @@ using err::Error; using util::Manager; namespace models { - Assignment::Assignment(const int& user_id, const int& task_id) : user_id(user_id), task_id(task_id) {} + Assignment::Assignment(const int& user_id, const int& task_id) : user_id(user_id), task_id(task_id) { + //validate user exist + //Manager& mgr = Manager::get_instance(); + + } Assignment::Assignment(): user_id(0), task_id(0) {} ostream& Assignment::write(ostream& stream) const @@ -22,12 +26,12 @@ namespace models { return this->user_id; } - ostream& operator<<(ostream& os, const Assignment& assignment) { - os << assignment.get_user_id() << " " << assignment.get_task_id() << "\n"; + ostream& operator<<(ostream& os, const Assignment& t) { + os << t.get_user_id() << " " << t.get_task_id() << "\n"; return os; } - istream& operator>>(istream& is, Assignment& assignment) { + istream& operator>>(istream& is, Assignment& t) { int user_id; is >> user_id; if (!is) @@ -36,7 +40,7 @@ namespace models { is >> task_id; if (!is) throw Error(602, "Datei hat ein unbekanntes Format."); - assignment= {user_id, task_id}; + t = {user_id, task_id}; return is; } } // models diff --git a/DelCommand.cpp b/DelCommand.cpp index 1172250..9e08e87 100644 --- a/DelCommand.cpp +++ b/DelCommand.cpp @@ -14,19 +14,18 @@ namespace commands void DelCommand::run(stringstream& args) { - Manager* mgr = Manager::get_instance(); + Manager& mgr = Manager::get_instance(); const string data_type = Util::read_string(args); int id; args >> id; if (!args) throw Error(102, "Ein Parameter eines Befehls konnte nicht gelesen werden"); if (data_type == "user") - mgr->del_user(id); + mgr.del_user(id); else if (data_type == "task") - // Validate if we can Delete This Task. - mgr->del_task(id); + mgr.del_task(id); else throw Error(102, "Ein Parameter eines Befehls konnte nicht gelesen werden"); - mgr->save(); + mgr.save(); } } // commands diff --git a/ListCommand.cpp b/ListCommand.cpp index 30dec71..d389355 100644 --- a/ListCommand.cpp +++ b/ListCommand.cpp @@ -17,16 +17,16 @@ namespace commands void ListCommand::run(stringstream& args) { - Manager* mgr = Manager::get_instance(); + Manager& mgr = Manager::get_instance(); const string data_type = Util::read_string(args); if (data_type == "users") - for (const User* u : mgr->get_users()) + for (const User* u : mgr.get_users()) cout << *u; else if (data_type == "tasks") - for (const Task* t : mgr->get_tasks()) + for (const Task* t : mgr.get_tasks()) cout << *t; else if (data_type == "assignments") - for (const Assignment* a : mgr->get_assignments()) + for (const Assignment* a : mgr.get_assignments()) cout << *a; else throw Error(101, "Befehl ist unbekannt."); diff --git a/Manager.cpp b/Manager.cpp index 961db75..6dc3f2f 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -103,7 +103,7 @@ namespace util void Manager::update_task_id_index() { int i = 0; - for (const auto& task_pair : this->tasks) + for (const auto& task_pair : this->users) if (task_pair.second && task_pair.second->get_id() >= i) i = task_pair.second->get_id() + 1; this->task_id_index = i; @@ -129,13 +129,13 @@ namespace util return value; } - Manager* Manager::INSTANCE = nullptr; + Manager* Manager::INSTANCE; - Manager* Manager::get_instance() + Manager& Manager::get_instance() { - if (INSTANCE == nullptr) + if (!INSTANCE) INSTANCE = new Manager(); - return INSTANCE; + return *INSTANCE; } vector Manager::get_users() const @@ -161,7 +161,7 @@ namespace util return this->assignments; } - User* Manager::get_user(const int id) + User* Manager::get_user(const int& id) { if (this->users.count(id) == 0) return nullptr; @@ -169,36 +169,26 @@ namespace util } - Task* Manager::get_task(const int id) + Task* Manager::get_task(const int& id) { if (this->tasks.count(id) == 0) return nullptr; return this->tasks[id]; } - Vector Manager::get_assignments_for_user(const int user_id) + Vector Manager::get_assignments_for_user(const int& id) { Vector user_assignments; - if (this->get_user(user_id) == nullptr) + if (this->get_user(id) == nullptr) throw Error(401, "Eine solche BenutzerIn existiert nicht."); for (Assignment* as : this->assignments) - if (as->get_user_id() == user_id) + if (as->get_user_id() == id) user_assignments.push_back(as); return user_assignments; } - Vector Manager::get_assignments_for_task(const int task_id) + + bool Manager::assignment_exists(const int& user_id, const int& task_id) { - Vector task_assignments; - if (this->get_task(task_id) == nullptr) - throw Error(401, "Eine solche BenutzerIn existiert nicht."); - for (Assignment* as : this->assignments) - if (as->get_task_id() == task_id) - task_assignments.push_back(as); - return task_assignments; - } - - bool Manager::assignment_exists(int user_id, int task_id) { - for ( Assignment* as : this->assignments) if (as->get_user_id() == user_id && as->get_task_id() == task_id) return true; @@ -231,24 +221,19 @@ namespace util this->assignments.push_back(as); } - void Manager::del_user(const int id) + void Manager::del_user(const int& id) { if (this->users.count(id) == 0) throw Error(401, "Eine solche BenutzerIn existiert nicht."); - //Assigment - if (!this->get_assignments_for_user(id).empty()) { - throw Error(201, "Benutzer kann nicht gelöscht werden."); - } + this->users.erase(id); } - void Manager::del_task(const int id) + void Manager::del_task(const int& id) { if (this->tasks.count(id) == 0) throw Error(402, "Eine solche Aufgabe existiert nicht."); - if (!this->get_assignments_for_task(id).empty()) { - throw Error(201, "Aufgabe kann nicht gelöscht werden."); - } + this->tasks.erase(id); } diff --git a/Manager.h b/Manager.h index 8df0f5e..6fc23be 100644 --- a/Manager.h +++ b/Manager.h @@ -30,9 +30,7 @@ namespace util void update_task_id_index(); public: - Manager(const Manager&) = delete; - Manager& operator=(const Manager&) = delete; - static Manager* get_instance(); + static Manager& get_instance(); void save(); void update_indexes(); @@ -43,18 +41,17 @@ namespace util vector get_tasks() const; vector get_assignments(); - User* get_user(int id); - Task* get_task(int id); - vector get_assignments_for_user(int user_id); - vector get_assignments_for_task(int task_id); - bool assignment_exists(int user_id, int task_id); + User* get_user(const int& id); + Task* get_task(const int& id); + vector get_assignments_for_user(const int& id); + bool assignment_exists(const int& user_id, const int& task_id); void add_user(User* user); void add_task(Task* task); void add_assignment(Assignment* as); - void del_user(int id); - void del_task(int id); + void del_user(const int& id); + void del_task(const int& id); void del_assignment(Assignment& as); }; } // util diff --git a/ShowCommand.cpp b/ShowCommand.cpp index 05c44ac..2d6e944 100644 --- a/ShowCommand.cpp +++ b/ShowCommand.cpp @@ -18,15 +18,15 @@ namespace commands void ShowCommand::run(stringstream& args) { - Manager* mgr = Manager::get_instance(); + Manager& mgr = Manager::get_instance(); const string data_type = Util::read_string(args); if (data_type == "user") - for (User* u : mgr->get_users()) { + for (User* u : mgr.get_users()) { AddUser au = {*u}; cout << au; } else if (data_type == "task") - for (Task* t : mgr->get_tasks()) { + for (Task* t : mgr.get_tasks()) { AddTask at = {*t}; cout << at; } diff --git a/Task.cpp b/Task.cpp index 9966e45..fbbc498 100644 --- a/Task.cpp +++ b/Task.cpp @@ -20,8 +20,8 @@ namespace models Task::Task(const AddTask& t): id(0), name(t.get_name()), description(t.get_description()), children(t.get_children()) { - Manager* mgr = Manager::get_instance(); - this->id = mgr->get_task_id(); + Manager& mgr = Manager::get_instance(); + this->id = mgr.get_task_id(); } @@ -46,8 +46,10 @@ namespace models return this->description; } - vector Task::get_children() const { return this->children; } - + vector Task::get_children() const + { + return this->children; + } AddTask::AddTask(): Task() {} @@ -87,7 +89,7 @@ namespace models if (name.empty()) throw Error(102, "Ein Parameter eines Befehls konnte nicht gelesen werden"); string description = Util::read_string_between_percent(is); - vector children = Task::read_children(is); + vector children = Util::read_numbers(is); t = {id, name, description, children}; return is; } @@ -113,7 +115,7 @@ namespace models if (name.empty()) throw Error(102, "Ein Parameter eines Befehls konnte nicht gelesen werden"); const string description = Util::read_string_between_percent(is); - const vector children = Task::read_children(is); + const vector children = Util::read_numbers(is); Task at = {0, name, description, children}; t = at; return is; @@ -125,21 +127,4 @@ namespace models throw Error(102, "Ein Parameter eines Befehls konnte nicht gelesen werden"); } } - - vector Task::read_children(istream &is) { - vector nums; - int num; - - // Read integers directly from the stream until we hit an error (non-integer or EOF) - while (is >> num) { - nums.push_back(num); - } - // Stream wurde bad durch was anderes als EOF? - if (!is.eof()) { - is.clear(); - throw Error(703, "Could not convert input to integer."); - } - - return nums; - } } // models diff --git a/Task.h b/Task.h index 24cb492..3637262 100644 --- a/Task.h +++ b/Task.h @@ -31,7 +31,6 @@ namespace models string get_name() const; string get_description() const; vector get_children() const; - static Vector read_children(istream &is); friend ostream& operator<<(ostream& os, const Task& t); diff --git a/UnassignCommand.cpp b/UnassignCommand.cpp index 08c82a0..dc445f0 100644 --- a/UnassignCommand.cpp +++ b/UnassignCommand.cpp @@ -13,21 +13,21 @@ namespace commands void UnassignCommand::run(stringstream& args) { - Manager* mgr = Manager::get_instance(); + Manager& mgr = Manager::get_instance(); int user_id, task_id; args >> user_id >> task_id; if (!args) throw Error(102, "Ein Parameter eines Befehls konnte nicht gelesen werden"); - const User* u = mgr->get_user(user_id); + const User* u = mgr.get_user(user_id); if (!u) throw Error(401, "Eine solche BenutzerIn existiert nicht."); - const Task* t = mgr->get_task(task_id); + const Task* t = mgr.get_task(task_id); if (!t) throw Error(401, "Eine solche Zuordnung existiert nicht."); - if (!mgr->assignment_exists(user_id, task_id)) + if (!mgr.assignment_exists(user_id, task_id)) throw Error(302, "Eine solche Zuordnung existiert bereits."); Assignment as = {user_id, task_id}; - mgr->del_assignment(as); - mgr->save(); + mgr.del_assignment(as); + mgr.save(); } } // commands diff --git a/User.cpp b/User.cpp index 15ab721..0f6c812 100644 --- a/User.cpp +++ b/User.cpp @@ -62,8 +62,8 @@ namespace models { istream& operator>>(istream& is, AddUser& u) { - Manager* mgr = Manager::get_instance(); - int id = mgr->get_user_id(); + Manager& mgr = Manager::get_instance(); + int id = mgr.get_user_id(); string name, surname; is >> name >> surname; diff --git a/tasks b/tasks new file mode 100644 index 0000000..2427c11 --- /dev/null +++ b/tasks @@ -0,0 +1,13 @@ +[tasks] +0 %Eine Aufgabe% %Mit einer längeren Beschreibung% +1 %Noch eine Aufgabe% %Kurze Beschreibung% 0 + +[users] +0 Fleissiger Mitarbeiter +1 NochEin Mitarbeiter + +[assignments] +0 0 +0 1 +1 1 +