Skip to content
This repository was archived by the owner on May 18, 2022. It is now read-only.
Open
Show file tree
Hide file tree
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
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,17 @@ Welcome to the 3rd Mock Machine Coding Round by [workat.tech](http://workat.tech

Please visit [this link](https://workat.tech/machine-coding/practice/trello-problem-t0nwwqt61buz) to participate.

NOTE:
1. Currently the unique id isn't based on hash, but a counter that gets appended to type of element being creaated.
2. The output is just printing stuff line after line, instead of in a dict. I'll try to change that later.
3. I've added some of my own methods, like SHOW USER, CREATE USER, etc.
4. Sample input is present in sample_input.txt

TO RUN:

$> g++ user.cpp card.cpp list.cpp board.cpp appManager.cpp driver.cpp -o trello

$> ./trello

TODO:
Cmake command
198 changes: 198 additions & 0 deletions appManager.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
#include <bits/stdc++.h>
#include "appManager.h"
#include "board.h"
#include "list.h"
#include "card.h"
#include "user.h"

using namespace std;

AppManager::AppManager(){
board = 0;
card = 0;
list = 0;
user = 0;
}

void AppManager::show(){
if(boards.size()==0){
cout << "No Board" << endl;
return;
}
for(map<string,Board*>::iterator it=boards.begin(); it!=boards.end(); it++)
(it->second)->printBoard();
}

void AppManager::showBoard(string boardId){
if(boards.find(boardId)==boards.end())
cout << "Board " << boardId << " doesn't exist!" << endl;
else
boards[boardId]->printBoard();

}

void AppManager::showList(string listId){
if(lists.find(listId)==lists.end())
cout << "List " << listId << " doesn't exist!" << endl;
else
lists[listId]->printList();
}

void AppManager::showCard(string cardId){
if(cards.find(cardId)==cards.end())
cout << "Card " << cardId << " doesn't exist!" << endl;
else
cards[cardId]->printCard();
}

void AppManager::showUserCards(string userId){
if(users.find(userId)==users.end())
cout << "User " << userId << " doesn't exist!" << endl;
else
users[userId]->myCards();
}

void AppManager::createBoard(string name){
board++;
string id = "Board" + to_string(board);
Board* b = new Board(name, id);
boards[id] = b;
return;
}
void AppManager::removeBoard(string id){
if(boards.find(id)==boards.end())
cout << "Board " << id << " doesn't exist!" << endl;
else {
cout << "Deleting Board" << endl;
Board* b = boards[id];
set<List*> listSet = b->getLists();
while(begin(listSet) != end(listSet)){
set<List*>::iterator it_list = listSet.begin();
set<Card*> cardSet = (*it_list)->getCards();
while(begin(cardSet)!=end(cardSet)){
set<Card*>::iterator it_card = cardSet.begin();
cards.erase((*it_card)->getId());
delete *it_card;
}
lists.erase((*it_list)->getId());
delete *it_list;
}
boards.erase(id);
delete(b);
}
return;
}

void AppManager::addMemberToBoard(string boardId, string memberId){
if(boards.find(boardId)==boards.end())
cout << "Board " << boardId << " doesn't exist!" << endl;
else if(users.find(memberId)==users.end())
cout << "User " << memberId << " doesn't exist!" << endl;
else
(boards[boardId])->addMember(users[memberId]);
return;
}

void AppManager::removeMemberFromBoard(string boardId, string memberId){
if(boards.find(boardId)==boards.end())
cout << "Board " << boardId << " doesn't exist!" << endl;
else if(users.find(memberId)==users.end())
cout << "User " << memberId << " doesn't exist!" << endl;
else
(boards[boardId])->removeMember(users[memberId]);
return;
}

void AppManager::updateBoardName(string boardId, string newName){
if(boards.find(boardId)==boards.end())
cout << "Board " << boardId << " doesn't exist!" << endl;
else
(boards[boardId])->setName(newName);
}
void AppManager::updateBoardPrivacy(string boardId, string newPrivacy){
if(boards.find(boardId)==boards.end())
cout << "Board " << boardId << " doesn't exist!" << endl;
else
(boards[boardId])->setPrivacy(newPrivacy);
}

void AppManager::createList(string boardId, string listName){
if(boards.find(boardId)==boards.end())
cout << "Board " << boardId << " doesn't exist!" << endl;
else {
list++;
string id = "List" + to_string(list);
List* list = new List(listName, id, boards[boardId]);
lists[id] = list;
}
}

void AppManager::removeList(string listId){
if(lists.find(listId) == lists.end())
cout << "List " << listId << " doesn't exist!" << endl;
else {
cout << "Deleting list" << endl;
List* l = lists[listId];
set<Card*> cardSet = l->getCards();
while(begin(cardSet)!=end(cardSet)){
set<Card*>::iterator it_card = cardSet.begin();
cards.erase((*it_card)->getId());
delete *it_card;
}
l->deleteFromParentBoard();
lists.erase(listId);
delete(l);
}
}

void AppManager::createCard(string listId, string cardName){
if(lists.find(listId) == lists.end())
cout << "List " << listId << " doesn't exist!" << endl;
else {
card++;
string id = "Card" + to_string(card);
Card* c = new Card(cardName, id, lists[listId]);
cards[id] = c;
}
}

void AppManager::removeCard(string cardId){
if(cards.find(cardId)==cards.end())
cout << "Card " << cardId << " doesn't exist!" << endl;
else {
Card* c = cards[cardId];
c->deleteThisCard();
cards.erase(cardId);
delete(c);
}
}

void AppManager::assignCard(string cardId, string memberId){
if(cards.find(cardId)==cards.end())
cout << "Card " << cardId << " doesn't exist!" << endl;
else if(users.find(memberId)==users.end())
cout << "User " << memberId << " doesn't exist!" << endl;
else
cards[cardId]->assignTo(users[memberId]);
}

void AppManager::updateCardName(string cardId, string newName){
if(cards.find(cardId)==cards.end())
cout << "Card " << cardId << " doesn't exist!" << endl;
else
cards[cardId]->setName(newName);
}

void AppManager::updateDescription(string cardId, string description){
if(cards.find(cardId)==cards.end())
cout << "Card " << cardId << " doesn't exist!" << endl;
else
cards[cardId]->setDescription(description);
}

void AppManager::createMember(string name, string email){
user++;
string id = "User" + to_string(user);
User* user = new User(name, email, id);
users[id] = user;
}
45 changes: 45 additions & 0 deletions appManager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#ifndef APPMANAGER_H
#define APPMANAGER_H
#include <bits/stdc++.h>

using namespace std;

class Board;
class List;
class Card;
class User;

class AppManager {
map<string, Board*> boards;
map<string, List*> lists;
map<string, Card*> cards;
map<string, User*> users;
int board, list, card, user;
public:
AppManager();
void show();
void showBoard(string id);
void showList(string id);
void showCard(string id);
void showUserCards(string id);

void createBoard(string name);
void removeBoard(string id);
void addMemberToBoard(string boardId, string memberId);
void removeMemberFromBoard(string boardId, string memberId);
void updateBoardName(string boardId, string newName);
void updateBoardPrivacy(string boardId, string newPrivacy);

void createList(string boardId, string listName);
void removeList(string id);

void createCard(string listId, string cardName);
void removeCard(string id);
void assignCard(string cardId, string memberId);
void updateCardName(string cardId, string newName);
void updateDescription(string cardId, string description);

void createMember(string name, string email);
};

#endif
65 changes: 65 additions & 0 deletions board.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#include <bits/stdc++.h>
#include "board.h"
#include "list.h"
#include "user.h"

using namespace std;

Board::Board(string name, string id){
this->name = name;
this->id = id;
this->privacy = "PUBLIC";
cout << "Board created with name:" << name << " id:" << id << " and privacy:" << privacy << endl;
}

void Board::printBoard(){
cout << "BOARD name:" << name << " id:" << id << " privacy:" << privacy << endl;
cout << "*** Members ***" << endl;
for(set<User*>::iterator it=members.begin(); it!=members.end(); it++)
(*it)->printUser();
for(set<List*>::iterator it=lists.begin(); it!=lists.end(); it++){
cout << "*** Lists ***" << endl;
(*it)->printList();
}
cout << endl;
}

void Board::setName(string newName){
name = newName;
}

void Board::setPrivacy(string newPrivacy){
privacy = newPrivacy;
}

void Board::addMember(User* member){
members.insert(member);
cout << "Added member " << member->getName() << " to Board " << name << endl;
}

void Board::removeMember(User* member){
if (members.find(member)==members.end())
cout << "User " << member->getName() << " isn't a part of Board " << name << endl;
else
members.erase(member);
}

void Board::addList(List* list){
lists.insert(list);
cout << "Added list " << list->getName() << " to Board " << name << endl;
}

void Board::removeList(List* list){
if (lists.find(list)==lists.end())
cout << "List " << list->getName() << " isn't a part of Board " << name << endl;
else
lists.erase(list);
}

set<List*> Board::getLists(){
return lists;
}

string Board::getName(){
return name;
}
26 changes: 26 additions & 0 deletions board.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#ifndef BOARD_H
#define BOARD_H
#include <bits/stdc++.h>

using namespace std;

class List;
class User;

class Board {
string id, name, privacy;
set<User*> members;
set<List*> lists;
public:
Board(string name, string id);
void printBoard();
void setName(string name);
void setPrivacy(string privacy);
void addMember(User* member);
void removeMember(User* member);
void addList(List* list);
void removeList(List* list);
set<List*> getLists();
string getName();
};
#endif
Loading