@startuml shopclassdiagram

User "*" -right-> "*" Authority
User "1" <-down- "1" AccountActivation
User "1" <-down- "1" ResetPassword

abstract class Audit {
    - createdBy: String
    - createdDate: Instant
    - lastModifiedBy: String
    - lastModifiedDate: Instant
}

interface UserDetails {
    + getAuthorities(): Collection <? extends GrantedAuthority>
    + getPassword(): String
    + getUsername(): String
    + isAccountNonExpired(): boolean
    + isAccountNonLocked(): boolean
    + isCredentialsNonExpired(): boolean
    + isEnabled(): boolean
}

class User extends Audit
class User implements UserDetails
class User {
    - userId: Long
    - password: String
    - username: String
    - email: String
    - activated: boolean
    - authorities: Set<Authority>

    + createAccount(UserDTO userDTO): void
    + activateAccount(Map<String, String> activation): void
    + requestNewActivationKey(String username): void
    + removeNotActivatedAccounts(): void

    + loadUserByUsername(String username): User
    + authenticate(UserAuthenticationDTO userAuthenticationDTO): Map<String, String>
    + doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain): void

    + forgotPassword(String email): void
    + resetPassword(String passwordResetKey, UserPasswordResetDTO userPasswordResetDTO): void
    + updatePassword(UserPasswordUpdateDTO userPasswordUpdateDTO): void
    + updateUserDetails(UserDetailsUpdateDTO userDetailsUpdateDTO): void

    + findAll(): List<UserDTO>
}

class Authority {
    - authorityLabel: String
}

class AccountActivation {
    - accountActivationId: Long
    - activationKey: String
    - expirationDate: Instant
    - user: User
}

class ResetPassword {
    - resetPasswordId: Long
    - resetKey: String
    - expirationDate: Instant
    - user: User
}

@enduml