@startuml
class TransactionTag {
    +tagName: string
    +userId: number
    +user: User
    +transactions: Transaction[]
}
class Contact {
    +walletAddress: string
    +userId: number
    +user: User
    +contactName: string
}
class Transaction {
    +id: number
    +transactionAddress: string
    +walletIn: string
    +contactIn: Contact
    +walletOut: string
    +contactOut: Contact
    +amount: string
    +createdAt: Date
    +tags: TransactionTag[]
}
enum CurrencyType {
    ETHEREUM
    BITCOIN
}
class Wallet {
    +address: string
    +userId: number
    +name: string
    +user: User
    +currencyType: CurrencyType
    +transactions: Transaction[]
}
class User {
    +id: number
    +firstName: string
    +lastName: string
    +email: string
    +password: string
    +areNotificationsEnabled: boolean
    +createdAt: Date
    +wallets: Wallet[]
    +tags: TransactionTag[]
    +contacts: Contact[]
}
interface SignUpRequest extends InferType
interface UpdateUserRequest {
    +userId: number
    +firstName?: string
    +lastName?: string
    +email?: string
    +password?: string
    +areNotificationsEnabled?: boolean
}
class UsersService {
    -userRepository: Repository<User>
    +create(signUpReq: SignUpRequest): Promise<User>
    +findOne(email: string): Promise<User>
    +findOneById(id: number): Promise<User>
    +update(updateUserRequest: UpdateUserRequest): Promise<User>
}
interface SignInRequest extends InferType
class AuthenticationService {
    -jwtService: JwtService
    -usersService: UsersService
    +signUp(signUpReq: SignUpRequest): Promise<JwtToken>
    +signIn(signInReq: SignInRequest): Promise<JwtToken>
    -signToken(user: User): JwtToken
}
class AuthenticationController {
    -authService: AuthenticationService
    +signUp(body: SignUpRequest): Promise<JwtToken>
    +signIn(body: SignInRequest): Promise<JwtToken>
}
TransactionTag --> "1" User
TransactionTag --> "*" Transaction
Contact --> "1" User
Transaction --> "1" Contact
Transaction --> "*" TransactionTag
Wallet --> "1" User
Wallet --> "1" CurrencyType
Wallet --> "*" Transaction
User --> "*" Wallet
User --> "*" TransactionTag
User --> "*" Contact
UsersService --> "1" User
UsersService --> "1" SignUpRequest
UsersService --> "1" UpdateUserRequest
AuthenticationService --> "1" UsersService
AuthenticationService --> "1" SignUpRequest
AuthenticationService --> "1" SignInRequest
AuthenticationService --> "1" User
AuthenticationController --> "1" AuthenticationService
AuthenticationController --> "1" SignUpRequest
AuthenticationController --> "1" SignInRequest
@enduml