TaskForge is a desktop task management application built with JavaFX and SQLite. It allows users to manage personal tasks, collaborate within teams on projects, and receive notifications for important events like team invitations and task assignments.
The following diagram illustrates the core classes and their relationships within the TaskForge application.
classDiagram
direction LR
class User {
+int id
+String username
+String email
+String passwordHash
+createUser()
+getUserById()
+getUserByUsername()
+getUserByEmail()
+getAllUsers()
+updateUser()
+deleteUser()
}
class Team {
+int id
+String name
+createTeam()
+getTeamById()
+getTeamByName()
+getAllTeams()
+updateTeam()
+deleteTeam()
}
class Project {
+int id
+String name
+Team team
+createProject()
+getProjectById()
+getProjectsByName()
+getProjectsByTeamId()
+getAllProjects()
+updateProject()
+deleteProject()
}
class Task {
+int id
+String title
+String description
+LocalDateTime dueDate
+Priority priority
+Status status
+User assignedTo
+Project project
+Visibility visibility
+User creator
+createTask()
+getTaskById()
+getAllTasks()
+getTasksByAssignedUserId()
+getTasksByProjectId()
+updateTask()
+deleteTask()
}
class Comment {
+int id
+Task task
+User author
+String commentText
+LocalDateTime createdAt
+createComment()
+getCommentById()
+getCommentsByTaskId()
+getAllComments()
+updateComment()
+deleteComment()
}
class Attachment {
+int id
+Task task
+String fileName
+String filePath
+LocalDateTime uploadedAt
+createAttachment()
+getAttachmentById()
+getAttachmentsByTaskId()
+getAllAttachments()
+updateAttachment()
+deleteAttachment()
}
class Notification {
+int id
+User recipient
+String message
+LocalDateTime sentAt
+boolean isRead
+int relatedEntityId
+NotificationType notificationType
+createNotification()
+getNotificationById()
+getNotificationsByUserId()
+getUnreadNotificationsByUserId()
+getAllNotifications()
+updateNotification()
+markNotificationAsRead()
+deleteNotification()
}
class UserTeamMembership {
+User user
+Team team
+Role role
+InvitationStatus invitationStatus
+createMembership()
+getMembership()
+getMembershipsByUserId()
+getMembershipsByTeamId()
+updateMembership()
+deleteMembership()
}
class AuthService {
-UserDAO userDAO
+registerUser()
+authenticateUser()
}
class UserManagerService {
-UserDAO userDAO
-TeamDAO teamDAO
-UserTeamDAO userTeamDAO
-NotificationDAO notificationDAO
+registerUser()
+authenticateUser()
+updateUser()
+deleteUser()
+getUserById()
+getAllUsers()
+createTeam()
+updateTeam()
+deleteTeam()
+getTeamById()
+getAllTeams()
+getTeamsForUser()
+isTeamOwner()
+areUsersInSameTeam()
+isUserMemberOfTeam()
+getTeamMemberships()
+inviteUserToTeam()
+acceptTeamInvitation()
+rejectTeamInvitation()
+removeUserFromTeam()
+updateTeamMemberRole()
+getMembership()
+getUsersInTeam()
}
class ProjectManagerService {
-ProjectDAO projectDAO
-TeamDAO teamDAO
+createProject()
+getProjectById()
+getAllProjects()
+getProjectsByTeam()
+updateProject()
+deleteProject()
}
class TaskManagerService {
-TaskDAO taskDAO
-UserDAO userDAO
-ProjectDAO projectDAO
-NotificationDAO notificationDAO
-UserTeamDAO userTeamDAO
-UserManagerService userManagerService
+createTask()
+getTaskById()
+getTasksByAssignedUser()
+getAllVisibleTasks()
+updateTask()
+deleteTask()
}
class DatabaseManager {
-URL
+getConnection()
+initializeDatabase()
}
class SecurityUtil {
+hashPassword()
+checkPassword()
}
User "1" -- "*" UserTeamMembership : has
Team "1" -- "*" UserTeamMembership : has
UserTeamMembership "many" -- "1" User : belongs to
UserTeamMembership "many" -- "1" Team : belongs to
Team "1" -- "0..*" Project : has
Project "1" -- "0..*" Task : contains
User "1" -- "0..*" Task : assigns/creates
Task "1" -- "0..*" Comment : has
Task "1" -- "0..*" Attachment : has
User "1" -- "0..*" Notification : receives
AuthService ..> UserDAO
UserManagerService ..> UserDAO
UserManagerService ..> TeamDAO
UserManagerService ..> UserTeamDAO
UserManagerService ..> NotificationDAO
ProjectManagerService ..> ProjectDAO
ProjectManagerService ..> TeamDAO
TaskManagerService ..> TaskDAO
TaskManagerService ..> UserDAO
TaskManagerService ..> ProjectDAO
TaskManagerService ..> NotificationDAO
TaskManagerService ..> UserTeamDAO
TaskManagerService ..> UserManagerService
UserDAO ..> DatabaseManager
TeamDAO ..> DatabaseManager
ProjectDAO ..> DatabaseManager
TaskDAO ..> DatabaseManager
CommentDAO ..> DatabaseManager
AttachmentDAO ..> DatabaseManager
NotificationDAO ..> DatabaseManager
UserTeamDAO ..> DatabaseManager
AuthService ..> SecurityUtil
Main Application Flow
graph TD
A[Start Application] --> B{Database Initialized?};
B -- No --> C[Create Tables];
B -- Yes --> D[Load LoginView.fxml];
C --> D;
D --> E{User Action};
E -- Login --> F[Authenticate User];
E -- Register --> G[Load RegisterView.fxml];
F -- Success --> H[Load DashboardView.fxml];
F -- Failure --> D;
G -- Register User --> I[Create User Record];
I -- Success --> D;
I -- Failure --> G;
H --> J[Dashboard Menu];
J -- Select My Tasks --> K[Load MyTasksView.fxml];
J -- Select All Tasks --> L[Load AllTasksView.fxml];
J -- Select Projects --> M[Load ProjectsView.fxml];
J -- Select Teams --> N[Load TeamsView.fxml];
J -- Select Users --> O[Load UsersView.fxml];
J -- Select Notifications --> P[Load NotificationsView.fxml];
J -- Logout --> D;
K --> K_Refresh[Refresh My Tasks];
L --> L_Refresh[Refresh All Tasks];
M --> M_Refresh[Refresh Projects];
N --> N_Refresh[Refresh Teams];
O --> O_Refresh[Refresh Users];
P --> P_Refresh[Refresh Notifications];
subgraph Task Management
K_Refresh --> K_Display[Display Tasks];
K_Display -- Add Task --> K_Add[Create Task Form];
K_Add --> K_Refresh;
K_Display -- Edit Task --> K_Edit[Open EditTask Dialog];
K_Edit --> K_Refresh;
K_Display -- Back to Dashboard --> J;
L_Refresh --> L_Display[Display All Visible Tasks];
L_Display -- Back to Dashboard --> J;
end
subgraph Project Management
M_Refresh --> M_Display[Display Projects];
M_Display -- Add Project --> M_Add[Create Project Form];
M_Add --> M_Refresh;
M_Display -- Edit Project --> M_Edit[Open EditProject Dialog];
M_Edit --> M_Refresh;
M_Display -- Delete Project --> M_Delete[Confirm & Delete Project];
M_Delete --> M_Refresh;
M_Display -- Back to Dashboard --> J;
end
subgraph Team Management
N_Refresh --> N_Display[Display Teams];
N_Display -- Add Team --> N_Add[Create Team Form];
N_Add --> N_Refresh;
N_Display -- Edit Team --> N_Edit[Open EditTeam Dialog];
N_Edit --> N_Refresh;
N_Display -- Manage Members --> N_Manage[Open ManageTeamMembers Dialog];
N_Manage -- Invite Member --> N_Invite[Send Invitation];
N_Invite --> N_Manage;
N_Manage -- Remove Member --> N_Remove[Confirm & Remove Member];
N_Remove --> N_Manage;
N_Display -- Back to Dashboard --> J;
end
subgraph User Management
O_Refresh --> O_Display[Display Users];
O_Display -- View User Details --> O_Detail[Open UserDetail Dialog];
O_Detail --> O_Display;
O_Display -- Back to Dashboard --> J;
end
subgraph Notification Management
P_Refresh --> P_Display[Display Notifications];
P_Display -- View Notification --> P_Detail[Open NotificationDetail Dialog];
P_Detail -- Accept Team Invite --> P_Accept[Update Membership Status];
P_Accept --> P_Detail;
P_Detail -- Reject Team Invite --> P_Reject[Delete Membership];
P_Reject --> P_Detail;
P_Detail -- Mark as Read --> P_Read[Update Notification Status];
P_Read --> P_Detail;
P_Detail -- Delete Notification --> P_Delete[Delete Notification Record];
P_Delete --> P_Display;
P_Display -- Back to Dashboard --> J;
end
This manual will guide you through the TaskForge application.
To run TaskForge, you need:
- Java Development Kit (JDK) 21 or later
- Apache Maven (for building and running)
Steps to Run:
- Delete the existing database (if any):
(On Linux/macOS:
del taskforge.db
rm taskforge.db) - Build the project and install dependencies:
mvn clean install
- Run the application:
mvn javafx:run
- Create installable for Windows:
mvn clean package org.panteleyev:jpackage-maven-plugin:jpackage -U
- Running unit tests:
mvn test
Registration:
- On the initial screen, click "Go to Register"
- Fill in your desired Username, Email, and Password
- Confirm your password
- Click "Register". If successful, you will see a confirmation message
- Click "Back to Login" to return to the login screen
Login:
- Enter your registered Username and Password
- Click "Login". If successful, you will be directed to the Dashboard
The Dashboard is the main hub of the application:
- Left navigation menu with sections: "My Tasks", "All Tasks", "Projects", "Teams", "Users", and "Notifications"
- Your logged-in username is displayed at the top right
- Click "Logout" to return to the Login screen
This section displays tasks specifically assigned to you.
Create New Task:
- Fill in the "Title", "Description" (optional), "Due Date" (optional), "Priority", and "Visibility" fields
- Click "Add Task". The task will be assigned to you as the creator
Refresh Tasks: Click "Refresh Tasks" to update the list
Edit Task:
- Select a task from the table
- Click the "Edit" button
- Modify task details in the dialog
- Click "Save Changes" or "Cancel"
Delete Task:
- Select a task from the table
- Click the "Delete" button
- The task will be permanently removed (Only the creator can delete)
This section displays all tasks in the system that are visible to you based on their visibility settings (Public, Restricted, Private).
Refresh All Tasks: Click "Refresh All Tasks" to update the list
This section allows you to create and manage projects.
Create New Project:
- Enter a "Project Name"
- Optionally select a "Team"
- Click "Add Project"
Refresh Projects: Click "Refresh Projects" to update the list
Edit Project:
- Select a project from the table
- Click the "Edit" button
- Modify details in the dialog
- Click "Save Changes" or "Cancel"
Delete Project:
- Select a project from the table
- Click the "Delete" button
- The project will be removed
This section allows you to create and manage teams, and invite users.
Create New Team:
- Enter a "Team Name"
- Click "Add Team". Creator becomes owner
Refresh Teams: Click "Refresh Teams" to update the list
Edit Team:
- Select a team from the table
- Click the "Edit" button
- Change the team's name
- Click "Save Changes" or "Cancel"
Delete Team:
- Select a team from the table
- Click the "Delete" button
- The team will be removed
Manage Members:
- Select a team
- Click "Manage Members"
- In the dialog:
- Invite Member: Select user and role, click "Invite Member"
- Remove Selected Member: Select member, click remove
- Click "Close" when done
This section allows you to view all registered users.
Refresh Users: Click "Refresh Users" to update the list
This section displays all notifications sent to your account.
Refresh Notifications: Click "Refresh Notifications" to update
Notification Actions:
- Team Invitation: Click "Accept" or "Reject"
- Mark as Read: Click "Mark as Read"
- Delete: Click "Delete" to remove
Click the "Logout" button in the top right corner to return to the Login screen.
User Management:
- FR1.1: Users shall be able to register with a unique username and email
- FR1.2: Users shall be able to log in with their registered credentials
- FR1.3: Users shall be able to view a list of all registered users
- FR1.4: Users shall be able to update their own profile information
- FR1.5: Users shall be able to change their password
- FR1.6: Users shall be able to delete their own account
Task Management:
- FR2.1: Users shall be able to create new tasks with title, description, due date, priority, and visibility
- FR2.2: Tasks shall have status (Pending, In Progress, Completed, Blocked)
- FR2.3: Tasks can be assigned to specific users
- FR2.4: Tasks can be associated with projects
- FR2.5: Users shall be able to view tasks assigned to them ("My Tasks")
- FR2.6: Users shall be able to view all visible tasks ("All Tasks")
- FR2.6.1: Public tasks visible to all
- FR2.6.2: Restricted tasks visible to creator and team members
- FR2.6.3: Private tasks visible only to creator
[Rest of the functional requirements...]
Performance:
- NFR1.1: The application should respond within 1-2 seconds
- NFR1.2: Database operations should be efficient for up to 1000 records
Usability:
- NFR2.1: UI should be intuitive and easy to navigate
- NFR2.2: Clear feedback messages for user actions
- NFR2.3: Consistent visual design
Reliability:
- NFR3.1: Handle common errors gracefully
- NFR3.2: Ensure reliable data persistence
Security:
- NFR4.1: Store passwords securely using BCrypt
- NFR4.2: Prevent unauthorized access
- NFR4.3: Role-based access control
Maintainability:
- NFR5.1: Well-structured, modular code following MVC
- NFR5.2: Well-commented code with Javadoc
- NFR5.3: Maven dependency management
Scalability (Basic):
- NFR6.1: SQLite sufficient for single-user/small-team
- NFR6.2: Architecture allows for future database migration