Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
244 changes: 149 additions & 95 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,164 +11,218 @@ using namespace std;
* Good luck!
**/

enum UserType{
enum UserType
{
ADMIN,
MEMBER
};

class UserNotFoundException : public exception {
public:
const char * what() {
return "couldn't login with given credentials.";
}
};

class UserAlreadyExistsException : public exception {
public:
const char * what() {
return "Error: username already exists";
}

class UserAlreadyExistsException{}; //TODO: Give exceptions a better structure. search google (optional)
}; //TODO: Give exceptions a better structure. search google (optional)

class AbstractUser{ // User structure
public:
class AbstractUser
{ // User structure
public:
virtual bool authenticate(string username, string password) = 0;
virtual bool deleteAccount(vector<AbstractUser*> *users) = 0; //TODO: 1. implement this in User class. (You can't compile code and create instance of User until then). DON'T TOUCH ABSTRACT USER!
virtual bool deleteAccount(vector<AbstractUser *> *users) = 0; //TODO: 1. implement this in User class. (You can't compile code and create instance of User until then). DON'T TOUCH ABSTRACT USER!
string username;
protected:

protected:
string password;
UserType type;
};


class User : public AbstractUser{
public:

User(string username, string password, UserType type){
class User : public AbstractUser
{
public:
User(string username, string password, UserType type)
{
this->username = username;
this->password = password;
this->type = type;
}

bool authenticate(string username, string password){
bool authenticate(string username, string password)
{
return this->username == username && this->password == password;
}

static User* login(vector<AbstractUser*> *users, string username, string password){ //TODO: 2. handle user login errors with exceptions
for(auto user = users->begin(); user != users->end(); user++){
if((*user)->authenticate(username, password)){
return (User*) *user;
static User *login(vector<AbstractUser *> *users, string username, string password)
{ //TODO: 2. handle user login errors with exceptions
for (auto user = users->begin(); user != users->end(); user++)
{
if ((*user)->authenticate(username, password))
{
return (User *)*user;
}
}
UserNotFoundException ex;
throw ex;
return nullptr;
}

static void signup(vector<AbstractUser*> *users, string username, string password){
static void signup(vector<AbstractUser *> *users, string username, string password)
{

//Check if user with that username exists and throw UserAlreadyExistsException in that case
for(auto user = users->begin(); user != users->end(); user++) { //TODO: 3. this doesn't work. fix it!!
if ((*user)->username == username) {
for (auto user = users->begin(); user != users->end(); user++)
{ //TODO: 3. this doesn't work. fix it!!
if ((*user)->username == username)
{
UserAlreadyExistsException ex;
throw ex;
}
}

//Create user and add it to vector
users->push_back(new User(username, password, UserType::MEMBER));
}

string username;
virtual bool deleteAccount(vector<AbstractUser *> *users){
for (auto user = users->begin(); user != users->end(); user++)
{
if (this->username == (*user)->username)
{
users->erase(user);
return true;
}
}

return false;

}
// string username;
};

enum MenuState{
enum MenuState
{
START,
LOGGED_IN,
END
};

class AppDatabase { //Just holds runtime data. doesn't save anything
public:
class AppDatabase
{ //Just holds runtime data. doesn't save anything
public:
vector<AbstractUser *> appUsers;

AppDatabase() { //Load initial data
AppDatabase()
{ //Load initial data
appUsers.push_back(new User("admin",
"admin" /* password is unsafe! for test only */,
UserType::ADMIN)
);
UserType::ADMIN));
}
};

int main(){
User * loggedInUser = nullptr;
int main()
{
User *loggedInUser = nullptr;
AppDatabase appDatabase;
MenuState menuState = MenuState::START;

char choice;
cout << "Welcome!" << endl;

while(menuState != MenuState::END){
switch (menuState){
case MenuState::START: {

cout << "1. login\n2. signup\ne. exit\n";
cin >> choice;
switch(choice) {
case '1': {
string username, password;
cout << "Enter Username" << endl;
cin >> username;
cout << "Enter Password" << endl;
cin >> password;
loggedInUser = User::login(&appDatabase.appUsers, username, password);
if (loggedInUser == nullptr) {
cout << "couldn't login with given credentials.";
} else {
menuState = MenuState::LOGGED_IN;
}
break;
}
case '2': {
string username, password;
cout << "Enter Username" << endl;
cin >> username;
cout << "Enter Password" << endl;
cin >> password;
try{
User::signup(&appDatabase.appUsers, username, password);
} catch (UserAlreadyExistsException e) {
cout << "Error: username already exists";
}
break;
}
case 'e': {
menuState = MenuState::END;
break;
}
default: {
cout << "Unknown Input" << endl;
}
while (menuState != MenuState::END)
{
switch (menuState)
{
case MenuState::START:
{

cout << "1. login\n2. signup\ne. exit\n";
cin >> choice;
switch (choice)
{
case '1':
{
string username, password;
cout << "Enter Username" << endl;
cin >> username;
cout << "Enter Password" << endl;
cin >> password;
try {
loggedInUser = User::login(&appDatabase.appUsers, username, password);
menuState = MenuState::LOGGED_IN;
} catch (UserNotFoundException e) {
cout << e.what() << endl;
}
break;
}
case MenuState::LOGGED_IN: {
cout << "d.delete account\nl. logout\ne. exit\n";
cin >> choice;
switch(choice) {
case 'd': {
loggedInUser->deleteAccount(&appDatabase.appUsers);
cout << "Account successfully deleted";
loggedInUser = nullptr;
menuState = MenuState::START;
break;
}
case 'l': {
loggedInUser = nullptr;
menuState = MenuState::START;
break;
}
case 'e': {
menuState = MenuState::END;
break;
}
default: {
cout << "Unknown Input" << endl;
}
case '2':
{
string username, password;
cout << "Enter Username" << endl;
cin >> username;
cout << "Enter Password" << endl;
cin >> password;
try
{
User::signup(&appDatabase.appUsers, username, password);
}
catch (UserAlreadyExistsException e)
{
cout << e.what() << endl;
}
break;
}
case 'e':
{
menuState = MenuState::END;
break;
}
default:
{
cout << "Unknown Input" << endl;
}
}
break;
}
case MenuState::LOGGED_IN:
{
cout << "d.delete account\nl. logout\ne. exit\n";
cin >> choice;
switch (choice)
{
case 'd':
{
loggedInUser->deleteAccount(&appDatabase.appUsers);
cout << "Account successfully deleted";
loggedInUser = nullptr;
menuState = MenuState::START;
break;
}
case 'l':
{
loggedInUser = nullptr;
menuState = MenuState::START;
break;
}
case 'e':
{
menuState = MenuState::END;
break;
}
default:
{
cout << "Unknown Input" << endl;
}
}
break;
}
}
}

return 0;

}