{"id":24987605,"url":"https://github.com/sh13y/oop-mini-project","last_synced_at":"2026-06-30T21:31:15.611Z","repository":{"id":257865323,"uuid":"873779220","full_name":"sh13y/OOP-Mini-Project","owner":"sh13y","description":"A Qt/C++ desktop application that helps students manage their finances and academic schedules. Features secure local data storage using QSettings, financial tracking with visual reports, and academic deadline management.","archived":false,"fork":false,"pushed_at":"2025-04-06T22:50:22.000Z","size":13796,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"v1.0","last_synced_at":"2025-10-26T08:39:01.736Z","etag":null,"topics":["cpp","desktop-application","oop","qt","qtcreator"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sh13y.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-10-16T17:48:39.000Z","updated_at":"2025-04-06T22:47:40.000Z","dependencies_parsed_at":"2025-10-26T08:39:10.173Z","dependency_job_id":null,"html_url":"https://github.com/sh13y/OOP-Mini-Project","commit_stats":null,"previous_names":["sh13y/oop-mini-project","sh13y/c-mini_project-individual-assignment-"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/sh13y/OOP-Mini-Project","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sh13y%2FOOP-Mini-Project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sh13y%2FOOP-Mini-Project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sh13y%2FOOP-Mini-Project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sh13y%2FOOP-Mini-Project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sh13y","download_url":"https://codeload.github.com/sh13y/OOP-Mini-Project/tar.gz/refs/heads/v1.0","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sh13y%2FOOP-Mini-Project/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34984784,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-30T02:00:05.919Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","desktop-application","oop","qt","qtcreator"],"created_at":"2025-02-04T11:48:19.774Z","updated_at":"2026-06-30T21:31:15.605Z","avatar_url":"https://github.com/sh13y.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Personal Organizer - Detailed Code Implementation Guide\n\nA comprehensive guide to understanding the codebase of our Personal Organizer application, with special focus on the QSettings-based database implementation.\n\n## Core Database Implementation 🔐\n\n### QSettings Database System (`database.h`, `database.cpp`)\n\nThe application uses Qt's QSettings for data persistence, providing a simple yet powerful way to store application data. Here's a detailed breakdown:\n\n```cpp\nclass Database : public QObject {\n    Q_OBJECT\npublic:\n    explicit Database(QObject *parent = nullptr);\n    bool addUser(const QString \u0026username, const QString \u0026password);\n    bool validateUser(const QString \u0026username, const QString \u0026password);\n    void saveUsers();\n    void loadUsers();\n\nprivate:\n    QSettings* settings;\n    QMap\u003cQString, QByteArray\u003e users; // username -\u003e hashed password\n};\n```\n\n#### Key Implementation Details:\n\n1. **QSettings Initialization**:\n```cpp\nDatabase::Database(QObject *parent)\n    : QObject(parent)\n    , settings(new QSettings(\"PersonalOrganizerDB\", \"PersonalOrganizer\", this))\n{\n    loadUsers();\n}\n```\n- Uses organization name \"PersonalOrganizerDB\" and application name \"PersonalOrganizer\"\n- Automatically handles data storage location based on OS\n- Windows: Registry or INI files in AppData\n- Linux: INI files in ~/.config\n- macOS: Property list files in ~/Library/Preferences\n\n2. **Secure Password Storage**:\n```cpp\nbool Database::addUser(const QString \u0026username, const QString \u0026password) {\n    // Hash password using SHA-256\n    QByteArray hashedPassword = QCryptographicHash::hash(\n        password.toUtf8(),\n        QCryptographicHash::Sha256\n    );\n    users[username] = hashedPassword;\n    saveUsers();\n    return true;\n}\n```\n- Uses SHA-256 for password hashing\n- Stores only hashed passwords, never plain text\n- Automatically handles data persistence\n\n3. **Data Persistence Implementation**:\n```cpp\nvoid Database::saveUsers() {\n    settings-\u003ebeginGroup(\"Users\");\n    settings-\u003eremove(\"\"); // Clear existing users\n    \n    // Save each user with hex-encoded password hash\n    for (auto it = users.constBegin(); it != users.constEnd(); ++it) {\n        settings-\u003esetValue(it.key(), it.value().toHex());\n    }\n    \n    settings-\u003eendGroup();\n    settings-\u003esync(); // Ensure data is written to disk\n}\n```\n- Uses hierarchical data storage with groups\n- Converts binary data to hex for storage\n- Ensures immediate disk write with sync()\n\n4. **Data Loading Implementation**:\n```cpp\nvoid Database::loadUsers() {\n    settings-\u003ebeginGroup(\"Users\");\n    QStringList usernames = settings-\u003echildKeys();\n    \n    for (const QString \u0026username : usernames) {\n        QByteArray hashedPassword = QByteArray::fromHex(\n            settings-\u003evalue(username).toByteArray()\n        );\n        users[username] = hashedPassword;\n    }\n    \n    settings-\u003eendGroup();\n}\n```\n- Automatically loads data on startup\n- Handles hex-to-binary conversion\n- Maintains in-memory user map\n\n## Financial Management System 💰\n\n### Transaction Management (`transaction.h`, `transaction.cpp`)\n\n```cpp\nclass Transaction {\npublic:\n    enum class Type { Income, Expense };\n    QString description;\n    double amount;\n    QDate date;\n    QString category;\n    Type type;\n};\n```\n\n#### Implementation Details:\n\n1. **Transaction Storage**:\n```cpp\nvoid MainWindow::saveTransactions() {\n    settings-\u003ebeginGroup(\"Transactions\");\n    settings-\u003eremove(\"\");\n    \n    for (int i = 0; i \u003c transactions.size(); ++i) {\n        settings-\u003ebeginGroup(QString(\"Transaction_%1\").arg(i));\n        settings-\u003esetValue(\"description\", transactions[i].description);\n        settings-\u003esetValue(\"amount\", transactions[i].amount);\n        settings-\u003esetValue(\"date\", transactions[i].date);\n        settings-\u003esetValue(\"category\", transactions[i].category);\n        settings-\u003esetValue(\"type\", static_cast\u003cint\u003e(transactions[i].type));\n        settings-\u003eendGroup();\n    }\n    \n    settings-\u003eendGroup();\n    settings-\u003esync();\n}\n```\n\n2. **Budget Management**:\n```cpp\nvoid MainWindow::saveBudgets() {\n    settings-\u003ebeginGroup(\"Budgets\");\n    for (auto it = budgets.constBegin(); it != budgets.constEnd(); ++it) {\n        settings-\u003esetValue(it.key(), it.value());\n    }\n    settings-\u003eendGroup();\n    settings-\u003esync();\n}\n```\n\n## Academic Management System 📚\n\n### Academic Item Management (`academicitem.h`, `academicitem.cpp`)\n\n```cpp\nclass AcademicItem {\npublic:\n    enum class Type { Lecture, Deadline };\n    QString title;\n    QDateTime dateTime;\n    QString description;\n    Type type;\n    int duration; // in minutes\n};\n```\n\n#### Implementation Details:\n\n1. **Academic Schedule Storage**:\n```cpp\nvoid MainWindow::saveAcademicItems() {\n    settings-\u003ebeginGroup(\"AcademicItems\");\n    settings-\u003eremove(\"\");\n    \n    for (int i = 0; i \u003c academicItems.size(); ++i) {\n        settings-\u003ebeginGroup(QString(\"Item_%1\").arg(i));\n        settings-\u003esetValue(\"title\", academicItems[i].title);\n        settings-\u003esetValue(\"dateTime\", academicItems[i].dateTime);\n        settings-\u003esetValue(\"description\", academicItems[i].description);\n        settings-\u003esetValue(\"type\", static_cast\u003cint\u003e(academicItems[i].type));\n        settings-\u003esetValue(\"duration\", academicItems[i].duration);\n        settings-\u003eendGroup();\n    }\n    \n    settings-\u003eendGroup();\n    settings-\u003esync();\n}\n```\n\n## Data Organization Structure 📁\n\nThe application organizes data hierarchically in QSettings:\n\n```\nPersonalOrganizerDB/\n├── Users/\n│   ├── username1 -\u003e hashed_password1\n│   ├── username2 -\u003e hashed_password2\n│   └── ...\n├── Transactions/\n│   ├── Transaction_0/\n│   │   ├── description\n│   │   ├── amount\n│   │   ├── date\n│   │   ├── category\n│   │   └── type\n│   └── ...\n├── Budgets/\n│   ├── category1 -\u003e amount1\n│   ├── category2 -\u003e amount2\n│   └── ...\n└── AcademicItems/\n    ├── Item_0/\n    │   ├── title\n    │   ├── dateTime\n    │   ├── description\n    │   ├── type\n    │   └── duration\n    └── ...\n```\n\n## Key Features of QSettings Implementation 🔑\n\n1. **Automatic Data Persistence**:\n   - No need for explicit file handling\n   - Data automatically saved to appropriate OS location\n   - Handles data type conversion automatically\n\n2. **Thread Safety**:\n   - QSettings is thread-safe\n   - Multiple instances can access same data\n   - Automatic synchronization between instances\n\n3. **Platform Independence**:\n   - Works across Windows, Linux, and macOS\n   - Handles platform-specific storage locations\n   - Maintains consistent data format\n\n4. **Data Security**:\n   - Passwords stored as hashes\n   - Data stored in user-specific locations\n   - Automatic data backup by OS\n\n## Best Practices Implemented 🏆\n\n1. **Data Organization**:\n   - Clear hierarchical structure\n   - Logical grouping of related data\n   - Consistent naming conventions\n\n2. **Error Handling**:\n   - Graceful handling of missing data\n   - Validation of input data\n   - Backup of critical data\n\n3. **Performance Optimization**:\n   - In-memory caching of frequently accessed data\n   - Batch operations for multiple items\n   - Efficient data structure usage\n\n## Future Improvements 🚀\n\n1. **Database Enhancements**:\n   - Implement data encryption\n   - Add data compression\n   - Implement data versioning\n\n2. **Performance Optimizations**:\n   - Implement data caching\n   - Add batch operations\n   - Optimize data loading\n\n## License 📄\n\nMIT License - Feel free to use and modify the code!\n\n---\n\nThis implementation guide provides a detailed overview of the QSettings-based database system and other core components. For specific implementation details, refer to the respective source files.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsh13y%2Foop-mini-project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsh13y%2Foop-mini-project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsh13y%2Foop-mini-project/lists"}