Skip to content
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
168 changes: 158 additions & 10 deletions AbstractUser.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,170 @@
#include <algorithm>
#include <string>
#include <vector>
#include <map>

#define lower(str) transform(str.begin(), str.end(), str.begin(), ::tolower)
#define questionTagsSize 20
#define questionAnswersSize 20
#define usersSeenQuestionSize 20
#define questionEditorsSize 20

using namespace std;

class AbstractUser;
class Answer;
class Edit;
class EditRequest;

enum UserType {
ADMIN,
MEMBER
ADMIN,
MEMBER
};

class Duplicate {
public:
string author;
string title;
};

class Answer {
public:
string author;
string content;
string creationDate;
vector<Edit> editors;
int numReputation;

Answer(string au, string co, string cd, int nr)
:author(au), content(co), creationDate(cd), numReputation(nr) {
editors.reserve(questionEditorsSize);
}
};

class Edit {
public:
string editorName;
string editDate;
string description;

Edit(string en, string ed, string dc) :editorName(en), editDate(ed), description(dc) {}
};

class questionEditRequest {
public:
string questionAuthor;
string questionTitle;
string editorName;
string editedTitle;
string editedContent;
vector<string> editedTags;
string editDate;
string description;

questionEditRequest(string qa, string qt, string en, string et, string ec, vector<string> ta, string ed, string ds)
:questionAuthor(qa), questionTitle(qt), editorName(en), editedTitle(et), editedContent(ec), editDate(ed), description(ds) {
editedTags.reserve(questionTagsSize);
editedTags.insert(editedTags.end(), ta.begin(), ta.end());
}
};

class answerEditRequest {
public:
string questionAuthor;
string questionTitle;
string answerAuthor;
string editorName;
string editedContent;
string editDate;
string description;

answerEditRequest(string qa, string qt, string aa, string en, string ec, string ed, string ds)
:questionAuthor(qa), questionTitle(qt), answerAuthor(aa), editorName(en), editedContent(ec), editDate(ed), description(ds) {}
};

class AbstractUser {
public:
hash<string> pass_hash;
virtual bool authenticate(string username, string password) = 0;
virtual void deleteAccount() = 0;
string username;
// Login related
hash<string> pass_hash;
string username;

// Login related
virtual bool authenticate(string username, string password) = 0;
virtual void deleteAccount() = 0;

// Question related
virtual void createQuestion(string title, string content, vector<string> tags) = 0;
virtual void editQuestion(string title, string author,
string newTitle, string newContent, vector<string> newTags, string description) = 0;
virtual void handleQuestionEditRequests() = 0; // for admin
virtual void deleteQuestion(string title, string author) = 0;
virtual void upvoteQuestion(string title, string author) = 0;
virtual void downvoteQuestion(string title, string author) = 0;
virtual void addQuestionToFavs(string title, string author) = 0;
virtual void deleteQuestionFromFavs(string title, string author) = 0;
virtual void viewFavQuestions() = 0;
virtual void viewQuestions(string title, string author) = 0;
virtual void changeStatus(string copyTitle, string copyAuthor, string originalTitle, string originalAuthor) = 0; // for admin

// Answer related
virtual void addAnswer(string questionTitle, string questionAuthor, string answerContent) = 0;
virtual void editAnswer(string questionTitle, string questionAuthor,
string answerAuthor, string answerNewContent, string description) = 0;
virtual void handleAnswerEditRequest() = 0; // for admin
virtual void deleteAnswer(string questionTitle, string questionAuthor, string answerAuthor) = 0;
virtual void upvoteAnswer(string questionTitle, string questionAuthor, string answerAuthor) = 0;
virtual void downvoteAnswer(string questionTitle, string questionAuthor, string answerAuthor) = 0;

protected:
string password;
string email;
UserType type;
};
class Question {
public:
string author;
string title;
string content;
vector<string> tags;
string creationDate;
Duplicate duplicateTo;
vector<string> seenUsers;
vector<Edit> editors;
vector<Answer> answers;
int numReputation;
int numFavorite;
int numViews;
bool duplicate;

Question(string au, string ti, string co, string cd, vector<string> tg, int re, int nv, int nf, int du)
:author(au), title(ti), content(co), creationDate(cd), numReputation(re),
numViews(nv), numFavorite(nf), duplicate(du) {
seenUsers.reserve(usersSeenQuestionSize);
editors.reserve(questionEditorsSize);
tags.reserve(questionTagsSize);
answers.reserve(questionAnswersSize);
tags.insert(tags.end(), tg.begin(), tg.end());
}

Question() {}
bool operator ==(Question q) {
return this->title == q.title;
}
};

// Login related
string password;
string email;
UserType type;

// Question related
vector<Question> upvoted;
vector<Question> downvoted;
vector<Question> thumbedUp;
vector<Question> thumbedDown;
vector<questionEditRequest> questionEditRequests;

// Answer related
vector<Answer> upvotedAnswers;
vector<Answer> downvotedAnswers;
vector<answerEditRequest> answerEditRequests;

// common between Answer and Question
map< string, vector<Question> > contents;
};
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12)
cmake_minimum_required(VERSION 3.8)
project(stackoverflow_in_cpp)

set(CMAKE_CXX_STANDARD 14)
Expand All @@ -10,4 +10,4 @@ add_executable(stackoverflow_in_cpp
Exceptions.h
main.cpp
User.cpp
User.h)
User.h Logger.cpp Logger.h)
75 changes: 59 additions & 16 deletions Exceptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,42 +5,85 @@

class UsernameAlreadyExistsException : public std::exception {
public:
const char *what() const throw() {
return message.c_str();
}
const char *what() const throw() {
return message.c_str();
}

private:
const std::string message = "Error: username already exists";
const std::string message = "Error: username already exists";

};

class EmailAlreadyExistsException : public std::exception {
public:
const char *what() const throw() {
return message.c_str();
}
const char *what() const throw() {
return message.c_str();
}

private:
const std::string message = "Error: email already exists";
const std::string message = "Error: email already exists";

};

class WrongUsernameOrPasswordException : public std::exception {
private:
const std::string message = "Error: wrong username or password!";
const std::string message = "Error: wrong username or password!";
public:
const char *what() const throw() {
return message.c_str();
}
const char *what() const throw() {
return message.c_str();
}
};

class DeleteAdminException : public std::exception {
public:
const char *what() throw() {
return message.c_str();
}
const char *what() throw() {
return message.c_str();
}

private:
const std::string message = "Error: can't delete admin account!";
const std::string message = "Error: can't delete admin account!";

};

class RepetitiveQuestionException : public std::exception {
public:
const char *what() const throw() {
return message.c_str();
}

private:
const std::string message = "Error: there is a question with same title";

};

class NoSuchQuestionException : public std::exception {
public:
const char *what() const throw() {
return message.c_str();
}

private:
const std::string message = "Error: there isn't question with specified title";

};

class NoSuchAnswerException : public std::exception {
public:
const char *what() const throw() {
return message.c_str();
}

private:
const std::string message = "Error: there isn't answer with specified author in this question";

};

class NotUserPropertyException : public std::exception {
public:
const char *what() const throw() {
return message.c_str();
}

private:
const std::string message = "Error: only admin can use this property";
};
31 changes: 31 additions & 0 deletions Logger.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// Created by SARM on 20/01/2019.
//

#include <sstream>
#include "Logger.h"

Logger *Logger::getInstance() {
if (!instance)
instance = new Logger();
return instance;
}

Logger *Logger::instance = nullptr;

Logger Logger::operator<<(std::string s) const {
char buf[100];
std::stringstream ss(buf);
ss << "log." << logCount << ".txt";
std::string k = ss.str();
std::fstream file(ss.str().c_str(), std::fstream::app | std::fstream::in | std::fstream::out);
file << s << " ";
file.close();
return *this;
}

void Logger::inc() {
logCount++;
}


25 changes: 25 additions & 0 deletions Logger.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// Created by SARM on 20/01/2019.
//

#ifndef STACKOVERFLOW_IN_CPP_LOGGER_H
#define STACKOVERFLOW_IN_CPP_LOGGER_H


#include <fstream>

class Logger {
int logCount = 0;
static Logger *instance;

Logger() = default;

public:
static Logger *getInstance();

Logger operator<<(std::string s) const;
void inc();
};


#endif //STACKOVERFLOW_IN_CPP_LOGGER_H
Loading