diff --git a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj index a90e70f..d128542 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj +++ b/Trenser.Zenvy/Trenser.Zenvy/Trenser.Zenvy.vcxproj @@ -146,6 +146,7 @@ + @@ -199,6 +200,7 @@ + diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index aa50123..c1b4287 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -1 +1,15 @@ #include "ZenvyController.h" + +//Authentication +AuthenticationContext ZenvyController::login(const std::string& email, const std::string& password) +{ + return m_authenticationManagementService->login(email, password); +} + +void ZenvyController::logout() +{ +} + +void AuthenticationManagementService::changePassword() +{ +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 956e962..3dc3575 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -11,6 +11,9 @@ #include "TalentAcquisitionManagementService.h" #include "TeamManagementService.h" #include "TicketManagementService.h" +#include "Enums.h" + +using AuthenticationContext = std::tuple; class ZenvyController { @@ -37,5 +40,9 @@ public: m_talentAcquisitionManagementService(std::make_shared()), m_teamManagementService(std::make_shared()), m_ticketManagementService(std::make_shared()) {}; + + //Authentication + AuthenticationContext login(const std::string& email, const std::string& password); + void logout(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp index 80f370f..7fcd993 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.cpp @@ -11,6 +11,11 @@ logMap& DataStore::getLogs() return m_logs; } +void DataStore::setAuthenticatedEmployee(std::shared_ptr authenticatedEmployee) +{ + m_authenticatedEmployee = authenticatedEmployee; +} + employeeMap& DataStore::getEmployees() { return m_employees; diff --git a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h index b89e335..ca2bd63 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h +++ b/Trenser.Zenvy/Trenser.Zenvy/datastores/DataStore.h @@ -37,4 +37,5 @@ public: DataStore& operator=(DataStore&&) = delete; employeeMap& getEmployees(); logMap& getLogs(); + void setAuthenticatedEmployee(std::shared_ptr < Employee>); }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.cpp new file mode 100644 index 0000000..cb68b98 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.cpp @@ -0,0 +1 @@ +#include "ApplicationConfig.h" diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h new file mode 100644 index 0000000..4d7db21 --- /dev/null +++ b/Trenser.Zenvy/Trenser.Zenvy/services/ApplicationConfig.h @@ -0,0 +1,6 @@ +#pragma once + +namespace Config +{ + constexpr const char* DEFAULT_PASSWORD = "password"; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp index 7225c9d..9f60c05 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.cpp @@ -1,2 +1,48 @@ +#include #include "AuthenticationManagementService.h" +#include "ApplicationConfig.h" +std::tuple AuthenticationManagementService::login(const std::string& email, const std::string& password) +{ + employeeMap& employees = m_dataStore.getEmployees(); + Enums::LoginStatus loginStatus = Enums::LoginStatus::USER_NOT_FOUND; + Enums::EmployeeType employeeType = Enums::EmployeeType::INVALID; + Enums::EmployeeDesignation employeeDesignation = Enums::EmployeeDesignation::INVALID; + for (const auto& employee : employees) + { + if (employee.second->getEmployeeEmail() == email) + { + if (employee.second->getEmployeePassword() == password) + { + if (password == Config::DEFAULT_PASSWORD) + { + loginStatus = Enums::LoginStatus::FIRST_LOGIN; + } + else + { + loginStatus = Enums::LoginStatus::SUCCESS; + } + employeeType = employee.second->getEmployeeType(); + if (employeeType == Enums::EmployeeType::GENERAL) + { + std::shared_ptr generalEmployee = std::dynamic_pointer_cast(employee.second); + if (generalEmployee) + { + employeeDesignation = generalEmployee->getDesignation(); + } + else + { + throw std::runtime_error("Invalid Employee Type"); + } + } + m_dataStore.setAuthenticatedEmployee(employee.second); + } + else + { + loginStatus = Enums::LoginStatus::INVALID_PASSWORD; + } + break; + } + } + return std::make_tuple(loginStatus, employeeType, employeeDesignation); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h index b7d6463..5790978 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/AuthenticationManagementService.h @@ -3,6 +3,7 @@ #include #include #include "DataStore.h" +#include "Enums.h" class AuthenticationManagementService { @@ -10,6 +11,7 @@ private: DataStore& m_dataStore; public: AuthenticationManagementService() : m_dataStore(DataStore::getInstance()) {}; + std::tuple login(const std::string& username, const std::string& password); void logout(); void changePassword(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h index 40b8f02..ace8792 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h +++ b/Trenser.Zenvy/Trenser.Zenvy/utilities/Enums.h @@ -66,7 +66,8 @@ namespace Enums { { JUNIOR, SENIOR, - TEAM_LEAD + TEAM_LEAD, + INVALID }; enum class EmployeeType @@ -76,6 +77,7 @@ namespace Enums { FINANCE, TAG, HR, + TEAM, ADMIN, INVALID }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp index 6614f05..c320701 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp @@ -1,4 +1,19 @@ +#include +#include +#include +#include #include "UserInterface.h" +#include "AdminMenu.h" +#include "EmployeeMenu.h" +#include "FinanceExecutiveMenu.h" +#include "HRManagerMenu.h" +#include "ITExecutiveMenu.h" +#include "TalentExecutiveMenu.h" +#include "TeamExecutiveMenu.h" +#include "TeamLeadMenu.h" +#include "ZenvyController.h" +#include "InputHelper.h" +#include "OutputHelper.h" void UserInterface::run() { @@ -42,4 +57,95 @@ bool UserInterface::handleOperation(int choice) void UserInterface::login() { -} + std::string email, password; + util::clear(); + std::cout << "Enter email: "; + util::read(email); + std::cout << "Enter password: "; + util::read(password); + AuthenticationContext authenticationContext = m_controller->login(email, password); + Enums::LoginStatus loginStatus = std::get<0>(authenticationContext); + Enums::EmployeeType employeeType = std::get<1>(authenticationContext); + Enums::EmployeeDesignation employeeDesignation = std::get<2>(authenticationContext); + if (loginStatus == Enums::LoginStatus::USER_NOT_FOUND) + { + std::cout << "Error: User Not Found! Try Again\n"; + util::pressEnter(); + return; + } + if (loginStatus == Enums::LoginStatus::INVALID_PASSWORD) + { + std::cout << "Error: Invalid Password! Try Again\n"; + util::pressEnter(); + return; + } + if (loginStatus == Enums::LoginStatus::FIRST_LOGIN) + { + util::clear(); + std::cout + << "Warning: You're using the default password!\n" + << "Please change it.\n"; + // TODO: Password reset flow (to be implemented) + util::pressEnter(); + } + util::clear(); + // Route to appropriate menu + switch (employeeType) + { + case Enums::EmployeeType::ADMIN: + { + AdminMenu menu; + menu.run(); + break; + } + case Enums::EmployeeType::HR: + { + HRManagerMenu menu; + menu.run(); + break; + } + case Enums::EmployeeType::FINANCE: + { + FinanceExecutiveMenu menu; + menu.run(); + break; + } + case Enums::EmployeeType::IT: + { + ITExecutiveMenu menu; + menu.run(); + break; + } + case Enums::EmployeeType::TEAM: + { + TeamExecutiveMenu menu; + menu.run(); + break; + } + case Enums::EmployeeType::TAG: + { + TalentExecutiveMenu menu; + menu.run(); + break; + } + case Enums::EmployeeType::GENERAL: + { + if (employeeDesignation == Enums::EmployeeDesignation::TEAM_LEAD) + { + TeamLeadMenu menu; + menu.run(); + } + else + { + EmployeeMenu menu; + menu.run(); + } + break; + } + default: + throw std::runtime_error("Error: Unsupported employee type!\n"); + util::pressEnter(); + break; + } + m_controller->logout(); +} \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.h b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.h index 9be7028..9d69aba 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.h +++ b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.h @@ -1,18 +1,4 @@ #pragma once -#include -#include -#include -#include "AdminMenu.h" -#include "EmployeeMenu.h" -#include "FinanceExecutiveMenu.h" -#include "HRManagerMenu.h" -#include "ITExecutiveMenu.h" -#include "TalentExecutiveMenu.h" -#include "TeamExecutiveMenu.h" -#include "TeamLeadMenu.h" -#include "ZenvyController.h" -#include "InputHelper.h" -#include "OutputHelper.h" class UserInterface {