feat: finished implementing stubs in Manager

fix: fixed initial problems with impl
This commit is contained in:
moonleay 2025-02-09 21:14:26 +01:00
parent f735aac94d
commit 9749953ed7
Signed by: moonleay
GPG key ID: 82667543CCD715FB
22 changed files with 159 additions and 64 deletions

View file

@ -12,7 +12,7 @@ namespace commands
{ {
} }
void ActiveCommand::run(int argc, stringstream& args) void ActiveCommand::run(stringstream& args)
{ {
Manager& mgr = Manager::get_instance(); Manager& mgr = Manager::get_instance();
int user_id; int user_id;

View file

@ -8,7 +8,7 @@ namespace commands {
class ActiveCommand : public SubCommand { class ActiveCommand : public SubCommand {
public: public:
ActiveCommand(); ActiveCommand();
void run(int argc, stringstream& args) override; void run(stringstream& args) override;
}; };
} // commands } // commands

View file

@ -14,7 +14,7 @@ namespace commands
{ {
} }
void AddCommand::run(int argc, stringstream& args) void AddCommand::run(stringstream& args)
{ {
const string data_type = Util::read_string(args); const string data_type = Util::read_string(args);
Manager& mgr = Manager::get_instance(); Manager& mgr = Manager::get_instance();

View file

@ -8,7 +8,7 @@ namespace commands {
class AddCommand: public SubCommand { class AddCommand: public SubCommand {
public: public:
AddCommand(); AddCommand();
void run(int argc, stringstream& args) override; void run(stringstream& args) override;
}; };
} }
#endif // ADDCOMMAND_H #endif // ADDCOMMAND_H

View file

@ -12,7 +12,7 @@ namespace commands
{ {
} }
void AssignCommand::run(int argc, stringstream& args) void AssignCommand::run(stringstream& args)
{ {
Manager& mgr = Manager::get_instance(); Manager& mgr = Manager::get_instance();
int user_id, task_id; int user_id, task_id;

View file

@ -8,7 +8,7 @@ namespace commands {
class AssignCommand : public SubCommand { class AssignCommand : public SubCommand {
public: public:
AssignCommand(); AssignCommand();
void run(int argc, stringstream& args) override; void run(stringstream& args) override;
}; };
} // commands } // commands

View file

@ -8,7 +8,7 @@ namespace util {
INIT, INIT,
USER, USER,
TASK, TASK,
USERTASKINDEX ASSIGNMENT
}; };
} // util } // util

View file

@ -12,7 +12,7 @@ namespace commands
{ {
} }
void DelCommand::run(int argc, stringstream& args) void DelCommand::run(stringstream& args)
{ {
Manager& mgr = Manager::get_instance(); Manager& mgr = Manager::get_instance();
const string data_type = Util::read_string(args); const string data_type = Util::read_string(args);

View file

@ -8,7 +8,7 @@ namespace commands {
class DelCommand : public SubCommand { class DelCommand : public SubCommand {
public: public:
DelCommand(); DelCommand();
void run(int argc, stringstream& args) override; void run(stringstream& args) override;
}; };
} // commands } // commands

View file

@ -3,7 +3,7 @@
namespace commands { namespace commands {
HelpCommand::HelpCommand(): SubCommand("help", 100, false) {} HelpCommand::HelpCommand(): SubCommand("help", 100, false) {}
void HelpCommand::run(int argc, stringstream& args) { void HelpCommand::run(stringstream& args) {
cout << "Projekt 5\n"; cout << "Projekt 5\n";
cout << "epr24pr5-ojanssen2 <add/delete/list/show/assign/unassign/active/help>\n"; cout << "epr24pr5-ojanssen2 <add/delete/list/show/assign/unassign/active/help>\n";
} }

View file

@ -8,7 +8,7 @@ namespace commands {
class HelpCommand: public SubCommand { class HelpCommand: public SubCommand {
public: public:
HelpCommand(); HelpCommand();
void run(int argc, stringstream& args) override; void run(stringstream& args) override;
}; };
} // commands } // commands
#endif // HELPCOMMAND_H #endif // HELPCOMMAND_H

View file

@ -15,18 +15,18 @@ namespace commands
{ {
} }
void ListCommand::run(int argc, stringstream& args) void ListCommand::run(stringstream& args)
{ {
Manager& mgr = Manager::get_instance(); Manager& mgr = Manager::get_instance();
const string data_type = Util::read_string(args); const string data_type = Util::read_string(args);
if (data_type == "user") if (data_type == "user")
for (User* u : mgr.get_users()) for (const User* u : mgr.get_users())
cout << *u; cout << *u;
else if (data_type == "task") else if (data_type == "task")
for (Task* t : mgr.get_tasks()) for (const Task* t : mgr.get_tasks())
cout << *t; cout << *t;
else if (data_type == "assignment") else if (data_type == "assignment")
for (Assignment* a : mgr.get_assignments()) for (const Assignment* a : mgr.get_assignments())
cout << *a; cout << *a;
else else
throw Error(101, "Befehl ist unbekannt."); throw Error(101, "Befehl ist unbekannt.");

View file

@ -8,7 +8,7 @@ namespace commands {
class ListCommand : public SubCommand{ class ListCommand : public SubCommand{
public: public:
ListCommand(); ListCommand();
void run(int argc, stringstream& args) override; void run(stringstream& args) override;
}; };
} // commands } // commands

View file

@ -36,7 +36,7 @@ namespace util
else if (line == "[users]") else if (line == "[users]")
current_type = DataType::USER; current_type = DataType::USER;
else if (line == "[assignments]") else if (line == "[assignments]")
current_type = DataType::USERTASKINDEX; current_type = DataType::ASSIGNMENT;
else else
throw Error(602, "Datei hat ein unbekanntes Format."); throw Error(602, "Datei hat ein unbekanntes Format.");
continue; continue;
@ -50,35 +50,37 @@ namespace util
in.close(); in.close();
// Reihenfolge der Verabeitung // Reihenfolge der Verabeitung
vector<DataType> sections = {DataType::USER, DataType::TASK, DataType::USERTASKINDEX}; vector<DataType> sections = { DataType::USER, DataType::TASK, DataType::ASSIGNMENT };
for (DataType type : sections) for (DataType type : sections)
{ {
// Keine Data -> Continue // Keine Data -> Continue
if (buffer.find(type) == buffer.end()) continue; if (buffer.find(type) == buffer.end())
continue;
const vector<string>& lines = buffer[type]; const vector<string>& lines = buffer[type];
//Iteriere über die Gebufferten Strings. //Iteriere über die Gebufferten Strings.
for (const string& bufferd_line : lines) for (const string& buffered_line : lines)
{ {
stringstream string_stream(buffered_line);
switch (type) switch (type)
{ {
case DataType::TASK: case DataType::TASK:
{ {
Task task; Task task;
in >> task; string_stream >> task;
this->tasks[task.get_id()] = new Task(task); this->tasks[task.get_id()] = new Task(task);
} }
break; break;
case DataType::USER: case DataType::USER:
{ {
User user; User user;
in >> user; string_stream >> user;
this->users[user.get_id()] = new User(user); this->users[user.get_id()] = new User(user);
} }
break; break;
case DataType::USERTASKINDEX: case DataType::ASSIGNMENT:
{ {
Assignment assignment; Assignment assignment;
in >> assignment; string_stream >> assignment;
this->assignments.push_back(new Assignment(assignment)); this->assignments.push_back(new Assignment(assignment));
} }
break; break;
@ -136,52 +138,141 @@ namespace util
INSTANCE = new Manager(); INSTANCE = new Manager();
return *INSTANCE; return *INSTANCE;
} }
vector<User*> const Manager::get_users() {
vector<User*> user_vector;
for (const auto& pair : this->users) {
if (pair.second) { // Ensure it's not a nullptr
user_vector.push_back(pair.second);
}
}
return user_vector;
vector<User*> Manager::get_users() const
{
vector<User*> user_vector;
for (const auto& pair : this->users)
if (pair.second) // Ensure it's not a nullptr
user_vector.push_back(pair.second);
return user_vector;
}
vector<Task*> Manager::get_tasks() const
{
vector<Task*> task_vector;
for (const auto& pair : this->tasks)
if (pair.second) // Ensure it's not a nullptr
task_vector.push_back(pair.second);
return task_vector;
}
vector<Assignment*> Manager::get_assignments()
{
return this->assignments;
}
User* Manager::get_user(const int& id)
{
if (this->users.count(id) == 0)
return nullptr;
return this->users[id];
}
Task* Manager::get_task(const int& id)
{
if (this->tasks.count(id) == 0)
return nullptr;
return this->tasks[id];
}
Vector<Assignment*> Manager::get_assignments_for_user(const int& id)
{
Vector<Assignment*> user_assignments;
if (this->get_user(id) == nullptr)
throw Error(401, "Eine solche BenutzerIn existiert nicht.");
for (Assignment* as : this->assignments)
if (as->get_user_id() == id)
user_assignments.push_back(as);
return user_assignments;
}
bool Manager::assignment_exists(const int& user_id, const int& task_id)
{
for ( Assignment* as : this->assignments)
if (as->get_user_id() == user_id && as->get_task_id() == task_id)
return true;
return false;
}
void Manager::add_user(User* user)
{
if (this->users.count(user->get_id()) == 1)
return;
this->users[user->get_id()] = user;
}
void Manager::add_task(Task* task)
{
if (this->tasks.count(task->get_id()) == 1)
return;
this->tasks[task->get_id()] = task;
}
void Manager::add_assignment(Assignment* as)
{
if (this->get_user(as->get_user_id()) == nullptr)
throw Error(401, "Eine solche BenutzerIn existiert nicht.");
if (this->get_task(as->get_task_id()) == nullptr)
throw Error(402, "Eine solche Aufgabe existiert nicht.");
this->assignments.push_back(as);
}
void Manager::del_user(const int& id)
{
if (this->users.count(id) == 0)
throw Error(401, "Eine solche BenutzerIn existiert nicht.");
this->users.erase(id);
}
void Manager::del_task(const int& id)
{
if (this->tasks.count(id) == 0)
throw Error(402, "Eine solche Aufgabe existiert nicht.");
this->tasks.erase(id);
}
void Manager::del_assignment(Assignment& as)
{
if (!this->assignment_exists(as.get_user_id(), as.get_task_id()))
throw Error(301, "Eine solche Zuordnung existiert nicht.");
int assignment_nr = 0;
for (int i = 0; i < this->assignments.size() - 1; ++i) {
if (this->assignments[i]->get_user_id() == as.get_user_id() && this->assignments[i]->get_task_id() == as.get_task_id()) {
assignment_nr = i;
break;
}
}
this->assignments.erase(this->assignments.begin() + assignment_nr);
}; };
vector<Task*> get_tasks();
vector<Assignment*> get_assignments();
void Manager::save() void Manager::save()
{ {
ofstream out = ofstream(this->filename, ios_base::trunc); ofstream out = ofstream(this->filename, ios_base::trunc);
if (!out) if (!out)
throw Error(603, "Datei kann nicht geschrieben werden."); throw Error(603, "Datei kann nicht geschrieben werden.");
out << "[tasks]\n"; out << "[tasks]\n";
for (const auto& task_pair : this->users) for (const auto& task_pair : this->tasks)
{
//Nullpointer Check
if (task_pair.second) if (task_pair.second)
{
task_pair.second->write(out); task_pair.second->write(out);
}
}
out << "\n[users]\n"; out << "\n[users]\n";
for (const auto& user_pair : this->users) for (const auto& user_pair : this->users)
{
//Nullpointer Check
if (user_pair.second) if (user_pair.second)
{
user_pair.second->write(out); user_pair.second->write(out);
}
}
out << "\n[assignments]\n"; out << "\n[assignments]\n";
for (Assignment* assignment : this->assignments) for (Assignment* assignment : this->assignments)
{
//Nullpointer Check
if (assignment) if (assignment)
{
assignment->write(out); assignment->write(out);
}
}
out.close(); out.close();
} }
} // util } // util

View file

@ -37,8 +37,8 @@ namespace util
int get_user_id(); int get_user_id();
int get_task_id(); int get_task_id();
vector<User*> get_users(); vector<User*> get_users() const;
vector<Task*> get_tasks(); vector<Task*> get_tasks() const;
vector<Assignment*> get_assignments(); vector<Assignment*> get_assignments();
User* get_user(const int& id); User* get_user(const int& id);
@ -46,13 +46,13 @@ namespace util
vector<Assignment*> get_assignments_for_user(const int& id); vector<Assignment*> get_assignments_for_user(const int& id);
bool assignment_exists(const int& user_id, const int& task_id); bool assignment_exists(const int& user_id, const int& task_id);
void add_user(const User* user); void add_user(User* user);
void add_task(const Task* task); void add_task(Task* task);
void add_assignment(const Assignment* as); void add_assignment(Assignment* as);
void del_user(const int& id); void del_user(const int& id);
void del_task(const int& id); void del_task(const int& id);
void del_assignment(const Assignment& as); void del_assignment(Assignment& as);
}; };
} // util } // util
#endif // ENVIRONMENT_H #endif // ENVIRONMENT_H

View file

@ -16,7 +16,7 @@ namespace commands
{ {
} }
void ShowCommand::run(int argc, stringstream& args) void ShowCommand::run(stringstream& args)
{ {
Manager& mgr = Manager::get_instance(); Manager& mgr = Manager::get_instance();
const string data_type = Util::read_string(args); const string data_type = Util::read_string(args);

View file

@ -8,7 +8,7 @@ namespace commands {
class ShowCommand : public SubCommand { class ShowCommand : public SubCommand {
public: public:
ShowCommand(); ShowCommand();
void run(int argc, stringstream& args) override; void run(stringstream& args) override;
}; };
} // commands } // commands

View file

@ -4,7 +4,7 @@
namespace commands { namespace commands {
SubCommand::SubCommand(const string& name, const int& return_value, const bool show_result): name(name), return_value(return_value), show_result(show_result) {} SubCommand::SubCommand(const string& name, const int& return_value, const bool show_result): name(name), return_value(return_value), show_result(show_result) {}
void SubCommand::run(int argc, stringstream& args) { void SubCommand::run(stringstream& args) {
cout << "Not impl!\n"; cout << "Not impl!\n";
} }

View file

@ -19,7 +19,7 @@ namespace commands
string get_name(); string get_name();
int get_value() const; int get_value() const;
bool should_display_result() const; bool should_display_result() const;
virtual void run(int argc, stringstream& args); virtual void run(stringstream& args);
}; };
} // commands } // commands

View file

@ -11,7 +11,7 @@ namespace commands
{ {
} }
void UnassignCommand::run(int argc, stringstream& args) void UnassignCommand::run(stringstream& args)
{ {
Manager& mgr = Manager::get_instance(); Manager& mgr = Manager::get_instance();
int user_id, task_id; int user_id, task_id;
@ -26,7 +26,8 @@ namespace commands
throw Error(401, "Eine solche Zuordnung existiert nicht."); 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."); throw Error(302, "Eine solche Zuordnung existiert bereits.");
mgr.del_assignment({user_id, task_id}); Assignment as = {user_id, task_id};
mgr.del_assignment(as);
mgr.save(); mgr.save();
} }
} // commands } // commands

View file

@ -8,7 +8,7 @@ namespace commands {
class UnassignCommand : public SubCommand { class UnassignCommand : public SubCommand {
public: public:
UnassignCommand(); UnassignCommand();
void run(int argc, stringstream& args) override; void run(stringstream& args) override;
}; };
} // commands } // commands

View file

@ -48,15 +48,18 @@ int main(int argc, char** argv)
{ {
if (sc->get_name() == command) if (sc->get_name() == command)
{ {
sc->run(argc, parameter); sc->run(parameter);
return 0; if (sc->should_display_result())
cout << "100: Alles erfolgreich\n";
return sc->get_value();
} }
} }
} }
catch (Error& e) catch (Error& e)
{ {
cout << e.get_nr() << ": " << e.what() << "\n"; cout << e.get_nr() << ": " << e.what() << "\n";
return e.get_nr();
} }
cout << "101: Befehl ist unbekannt.\n"; cout << "101: Befehl ist unbekannt.\n";
return 0; return 101;
} }