Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9173d6c authored by Jonathan Klee's avatar Jonathan Klee
Browse files

add docs/login-class-diagram.md

parent 0fea964f
Loading
Loading
Loading
Loading
Loading
+237 −0
Original line number Diff line number Diff line
# Login Feature Class Diagram

This diagram covers the main classes involved in sign-in, login state initialization, and store authentication orchestration.

Included scope:
- setup UI fragments
- shared `LoginViewModel`
- domain login use cases
- repository and authenticator abstractions
- Play Store, Google, anonymous, and microG login managers

Intentionally omitted:
- exception classes
- event bus / retry helpers
- value objects with no orchestration role

Layering:
- `UI / App layer` contains UI entrypoints and app-facing coordinator interfaces used by the view model
- `Domain layer` contains use cases plus the `LoginRepository` contract
- `Data layer` contains concrete repository implementations, store authenticators, login managers, and persistence-facing collaborators

Hilt bindings connect:
- `AppLoginRepository` -> `LoginRepository`
- `AuthenticatorRepository` -> `StoreAuthCoordinator`
- `AuthenticatorRepository` -> `PlayStoreAuthManager`
- `MicrogLoginManager` -> `MicrogAccountFetcher`

```mermaid
classDiagram
direction LR

class UI_App_Layer {
  <<Layer>>
}

class Domain_Layer {
  <<Layer>>
}

class Data_Layer {
  <<Layer>>
}

class SignInFragment
class GoogleSignInFragment

class LoginViewModel {
  +startLoginFlow(clearList)
  +hasMicrogAccount()
  +initialMicrogLogin(accountName, onUserSaved, onError, onIntentRequired)
  +initialAnonymousLogin(onUserSaved)
  +initialGoogleLogin(email, oauthToken, onUserSaved)
  +initialNoGoogleLogin(onUserSaved)
  +markInvalidAuthObject(authObjectName)
  +logout()
}

class StoreAuthCoordinator {
  <<interface>>
  +fetchAuthObjects(authTypes)
}

class PlayStoreAuthManager {
  <<interface>>
  +getGPlayAuthOrThrow()
  +setGPlayAuth(auth)
  +getValidatedAuthData()
}

class MicrogAccountFetcher {
  <<interface>>
  +hasMicrogAccount()
  +fetchAccount(accountName)
}

class LoginRepository {
  <<interface>>
  +initializeAnonymousLogin()
  +initializeGoogleLogin(email, oauthToken, authSource)
  +initializeNoGoogleLogin()
  +logout()
}

class AnonymousLoginUseCase {
  +invoke()
}
class GoogleLoginUseCase {
  +invoke(email, oauthToken)
}
class MicrogLoginUseCase {
  +invoke(email, oauthToken)
}
class NoGoogleLoginUseCase {
  +invoke()
}
class LogoutUseCase {
  +invoke()
}

class AppLoginRepository
class AuthenticatorRepository

class StoreAuthenticator {
  <<interface>>
  +login()
  +logout()
  +isStoreActive()
}

class PlayStoreAuthenticator
class CleanApkAuthenticator

class PlayStoreSession {
  +login()
}

class LoginManager {
  <<interface>>
  +login()
}

class GoogleLoginManager
class MicrogLoginManager
class AnonymousLoginManager

class SessionRepository {
  <<interface>>
}
class PlayStoreAuthStore {
  <<interface>>
}
class AppPreferencesRepository {
  <<interface>>
}
class Stores
class AuthDataCache
class OauthToAasTokenConverter
class UserProfileFetcher

class StoreAuthResult
class AuthObject
class GPlayAuth
class CleanApk

UI_App_Layer <.. SignInFragment : belongs to
UI_App_Layer <.. GoogleSignInFragment : belongs to
UI_App_Layer <.. LoginViewModel : belongs to
UI_App_Layer <.. StoreAuthCoordinator : belongs to
UI_App_Layer <.. PlayStoreAuthManager : belongs to
UI_App_Layer <.. MicrogAccountFetcher : belongs to

Domain_Layer <.. LoginRepository : belongs to
Domain_Layer <.. AnonymousLoginUseCase : belongs to
Domain_Layer <.. GoogleLoginUseCase : belongs to
Domain_Layer <.. MicrogLoginUseCase : belongs to
Domain_Layer <.. NoGoogleLoginUseCase : belongs to
Domain_Layer <.. LogoutUseCase : belongs to

Data_Layer <.. AppLoginRepository : belongs to
Data_Layer <.. AuthenticatorRepository : belongs to
Data_Layer <.. StoreAuthenticator : belongs to
Data_Layer <.. PlayStoreAuthenticator : belongs to
Data_Layer <.. CleanApkAuthenticator : belongs to
Data_Layer <.. PlayStoreSession : belongs to
Data_Layer <.. LoginManager : belongs to
Data_Layer <.. GoogleLoginManager : belongs to
Data_Layer <.. MicrogLoginManager : belongs to
Data_Layer <.. AnonymousLoginManager : belongs to
Data_Layer <.. SessionRepository : belongs to
Data_Layer <.. PlayStoreAuthStore : belongs to
Data_Layer <.. AppPreferencesRepository : belongs to
Data_Layer <.. Stores : belongs to
Data_Layer <.. AuthDataCache : belongs to
Data_Layer <.. OauthToAasTokenConverter : belongs to
Data_Layer <.. UserProfileFetcher : belongs to
Data_Layer <.. StoreAuthResult : belongs to
Data_Layer <.. AuthObject : belongs to
Data_Layer <.. GPlayAuth : belongs to
Data_Layer <.. CleanApk : belongs to

SignInFragment --> LoginViewModel
GoogleSignInFragment --> LoginViewModel

LoginViewModel --> StoreAuthCoordinator
LoginViewModel --> MicrogAccountFetcher
LoginViewModel --> AnonymousLoginUseCase
LoginViewModel --> GoogleLoginUseCase
LoginViewModel --> MicrogLoginUseCase
LoginViewModel --> NoGoogleLoginUseCase
LoginViewModel --> LogoutUseCase

AnonymousLoginUseCase --> LoginRepository
GoogleLoginUseCase --> LoginRepository
MicrogLoginUseCase --> LoginRepository
NoGoogleLoginUseCase --> LoginRepository
LogoutUseCase --> LoginRepository
AppLoginRepository ..|> LoginRepository

AppLoginRepository --> Stores
AppLoginRepository --> SessionRepository
AppLoginRepository --> PlayStoreAuthStore

AuthenticatorRepository ..|> StoreAuthCoordinator
AuthenticatorRepository ..|> PlayStoreAuthManager
AuthenticatorRepository --> StoreAuthenticator : authenticators
AuthenticatorRepository --> SessionRepository
AuthenticatorRepository --> PlayStoreAuthStore

PlayStoreAuthenticator ..|> StoreAuthenticator
CleanApkAuthenticator ..|> StoreAuthenticator

PlayStoreAuthenticator --> SessionRepository
PlayStoreAuthenticator --> PlayStoreAuthStore
PlayStoreAuthenticator --> AppPreferencesRepository
PlayStoreAuthenticator --> AuthDataCache
PlayStoreAuthenticator --> GoogleLoginManager
PlayStoreAuthenticator --> MicrogLoginManager
PlayStoreAuthenticator --> AnonymousLoginManager
PlayStoreAuthenticator --> OauthToAasTokenConverter
PlayStoreAuthenticator --> UserProfileFetcher
PlayStoreAuthenticator ..> PlayStoreSession : creates

CleanApkAuthenticator --> SessionRepository
CleanApkAuthenticator --> AppPreferencesRepository

PlayStoreSession --> LoginManager

GoogleLoginManager ..|> LoginManager
MicrogLoginManager ..|> LoginManager
AnonymousLoginManager ..|> LoginManager
MicrogLoginManager ..|> MicrogAccountFetcher
MicrogLoginManager --> PlayStoreAuthStore

StoreAuthResult --> AuthObject
AuthObject <|-- GPlayAuth
AuthObject <|-- CleanApk
```