Skip to content

Commit 5ebf3f8

Browse files
author
MartinTCode
committed
feat: Add UML diagrams for User Login and Library Domain models
1 parent 8b4d6e9 commit 5ebf3f8

File tree

4 files changed

+240
-0
lines changed

4 files changed

+240
-0
lines changed
378 KB
Loading
File renamed without changes.
Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
@startuml UserLoginClassDiagram
2+
3+
!define CONTROLLER_COLOR #E8F4FD
4+
!define SERVICE_COLOR #E8F8E8
5+
!define DAO_COLOR #FFF2E8
6+
!define MODEL_COLOR #F8E8F8
7+
!define UTIL_COLOR #F0F0F0
8+
!define EXCEPTION_COLOR #FFE8E8
9+
10+
package "Frontend Layer (JavaFX Controllers)" CONTROLLER_COLOR {
11+
class SignInUserController {
12+
-mainPane: Pane
13+
-ssnField: TextField
14+
-passwordField: TextField
15+
+initialize(): void
16+
+clickedSignInButton(): void
17+
-prefillTestData(): void
18+
-handleValidationException(ValidationException): void
19+
-highlightField(TextField): void
20+
-navigateToUserHome(String): void
21+
-isValidSSNFormat(String): boolean
22+
-showErrorAlert(String, String): void
23+
-clearFields(): void
24+
}
25+
26+
class StartViewGuestController {
27+
-mainPane: Pane
28+
+clickedSearchMenuGuest(): void
29+
+clickedSignInMenuGuest(): void
30+
}
31+
32+
class StartViewBorrowerController {
33+
+initialize(): void
34+
}
35+
36+
class StartViewLibrarianController {
37+
+initialize(): void
38+
}
39+
}
40+
41+
package "Service Layer" SERVICE_COLOR {
42+
class AuthenticationService {
43+
-emf: EntityManagerFactory
44+
-em: EntityManager
45+
-userDAO: LibraryUserDAO
46+
+authenticate(String, String): AuthenticationResult
47+
+initializeTestDataHash(): int
48+
+countUsersWithPlaceholderPasswords(): long
49+
+validateLoginInput(String): void
50+
+validatePassword(String): void
51+
+logout(): void
52+
+isUserLoggedIn(): boolean
53+
+getCurrentUser(): LibraryUser
54+
-normalizeLoginInput(String): String
55+
+close(): void
56+
}
57+
58+
class AuthenticationResult {
59+
-success: boolean
60+
-message: String
61+
-user: LibraryUser
62+
+success(LibraryUser, String): AuthenticationResult
63+
+failure(String): AuthenticationResult
64+
+isSuccess(): boolean
65+
+getMessage(): String
66+
+getUser(): LibraryUser
67+
+getUserRole(): String
68+
}
69+
70+
class ValidationResult<T> {
71+
-success: boolean
72+
-data: T
73+
-message: String
74+
-fieldErrors: Map<String, String>
75+
+success(T): ValidationResult<T>
76+
+failure(String): ValidationResult<T>
77+
+failure(Map<String, String>, String): ValidationResult<T>
78+
+isSuccess(): boolean
79+
+getData(): T
80+
+getMessage(): String
81+
+getFieldErrors(): Map<String, String>
82+
+hasFieldErrors(): boolean
83+
}
84+
}
85+
86+
package "Data Access Layer" DAO_COLOR {
87+
class LibraryUserDAO {
88+
-entityManager: EntityManager
89+
+save(LibraryUser): LibraryUser
90+
+findById(Integer): Optional<LibraryUser>
91+
+findByUsername(String): Optional<LibraryUser>
92+
+findByEmail(String): Optional<LibraryUser>
93+
+findBySsn(String): Optional<LibraryUser>
94+
+findByUserRole(String): List<LibraryUser>
95+
+authenticate(String, String): Optional<LibraryUser>
96+
+authenticateAlternative(String, String): Optional<LibraryUser>
97+
+initializeAllPasswords(): int
98+
+countUsersWithPlaceholderPasswords(): long
99+
+existsByUsername(String): boolean
100+
+existsByEmail(String): boolean
101+
+existsBySsn(String): boolean
102+
}
103+
}
104+
105+
package "Model Layer" MODEL_COLOR {
106+
class LibraryUser {
107+
-id: Integer
108+
-ssn: String
109+
-username: String
110+
-passwordHash: String
111+
-email: String
112+
-userRole: String
113+
-borrowerProfile: BorrowerProfile
114+
-loans: List<Loan>
115+
+hashPassword(String): String
116+
+verifyPassword(String): boolean
117+
+setRawPassword(String): void
118+
+getId(): Integer
119+
+getSsn(): String
120+
+getUsername(): String
121+
+getUserRole(): String
122+
+getPasswordHash(): String
123+
+getEmail(): String
124+
}
125+
126+
class BorrowerProfile {
127+
-id: Integer
128+
-firstName: String
129+
-lastName: String
130+
-phoneNumber: String
131+
-address: String
132+
}
133+
134+
class Loan {
135+
-id: Integer
136+
-loanDate: LocalDate
137+
-returnDate: LocalDate
138+
-returnedDate: LocalDate
139+
}
140+
}
141+
142+
package "Utility Layer" UTIL_COLOR {
143+
class MenuNavigationHelper {
144+
-currentControllerName: String
145+
+menuClickGuest(Pane, String): void
146+
+menuClickBorrower(Pane, String): void
147+
+menuClickLibrarian(Pane, String): void
148+
+buttonClickBorrower(Pane, String): void
149+
+buttonClickLibrarian(Pane, String): void
150+
+getCurrentControllerName(): String
151+
-navigateToView(Pane, String, String, Object): void
152+
}
153+
154+
class UserSession {
155+
-currentUser: LibraryUser {static}
156+
+setCurrentUser(LibraryUser): void {static}
157+
+getCurrentUser(): LibraryUser {static}
158+
+isLoggedIn(): boolean {static}
159+
+logout(): void {static}
160+
+getCurrentUserRole(): String {static}
161+
+getCurrentUserId(): Integer {static}
162+
+getCurrentUsername(): String {static}
163+
}
164+
165+
class ViewLoader {
166+
+loadToStage(Pane, String, String, Object): void {static}
167+
}
168+
}
169+
170+
package "Exception Layer" EXCEPTION_COLOR {
171+
class ValidationException {
172+
-fieldErrors: Map<String, String>
173+
+ValidationException(String)
174+
+ValidationException(String, String)
175+
+ValidationException(String, Map<String, String>)
176+
+hasFieldErrors(): boolean
177+
+getFieldErrors(): Map<String, String>
178+
+addFieldError(String, String): void
179+
}
180+
}
181+
182+
package "JPA/Persistence" {
183+
interface EntityManager {
184+
+find(Class<T>, Object): T
185+
+createQuery(String, Class<T>): TypedQuery<T>
186+
+getTransaction(): EntityTransaction
187+
+persist(Object): void
188+
+merge(T): T
189+
+close(): void
190+
}
191+
192+
interface EntityManagerFactory {
193+
+createEntityManager(): EntityManager
194+
+close(): void
195+
}
196+
197+
class Persistence {
198+
+createEntityManagerFactory(String): EntityManagerFactory {static}
199+
}
200+
}
201+
202+
' Relationships
203+
SignInUserController --> AuthenticationService : uses
204+
SignInUserController --> MenuNavigationHelper : uses
205+
SignInUserController --> ValidationException : catches
206+
207+
AuthenticationService --> LibraryUserDAO : uses
208+
AuthenticationService --> LibraryUser : returns
209+
AuthenticationService --> AuthenticationResult : creates
210+
AuthenticationService --> ValidationException : throws
211+
AuthenticationService --> UserSession : sets
212+
AuthenticationService --> EntityManager : uses
213+
AuthenticationService --> EntityManagerFactory : uses
214+
AuthenticationService --> Persistence : uses
215+
216+
LibraryUserDAO --> EntityManager : uses
217+
LibraryUserDAO --> LibraryUser : queries/returns
218+
219+
AuthenticationResult --> LibraryUser : contains
220+
221+
LibraryUser --> BorrowerProfile : has
222+
LibraryUser --> Loan : has many
223+
224+
UserSession --> LibraryUser : stores
225+
226+
MenuNavigationHelper --> ViewLoader : uses
227+
MenuNavigationHelper --> StartViewBorrowerController : navigates to
228+
MenuNavigationHelper --> StartViewLibrarianController : navigates to
229+
MenuNavigationHelper --> StartViewGuestController : navigates to
230+
231+
ValidationException --> ValidationResult : related to
232+
233+
note top of SignInUserController : "Entry point for user login\nHandles UI interactions"
234+
note top of AuthenticationService : "Core business logic\nPassword validation\nSession management"
235+
note top of LibraryUserDAO : "Data access abstraction\nDatabase queries\nUser authentication"
236+
note top of LibraryUser : "Domain model\nPassword hashing\nUser data"
237+
note top of UserSession : "Session management\nStatic singleton pattern"
238+
239+
@enduml
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
plantuml -tpng -DPLANTUML_LIMIT_SIZE=32768 OUTPUT FILE NAME

0 commit comments

Comments
 (0)