gitextract_jae30_9x/ ├── .github/ │ └── workflows/ │ ├── codepreview.yml │ └── pull_request.yml ├── .gitignore ├── .nvmrc ├── .sbtopts ├── .scalafmt.conf ├── .sdkmanrc ├── LICENSE ├── README.md ├── build.sbt ├── custom.webpack.config.js ├── docs/ │ ├── README.md │ ├── architecture.md │ ├── design-decisions.md │ ├── diagram-sources/ │ │ ├── architecture-infra.puml │ │ ├── architecture-modules.puml │ │ ├── architecture-server-actions.puml │ │ ├── architecture-server-controllers.puml │ │ ├── architecture-server-daos.puml │ │ ├── architecture-server-external-apis.puml │ │ ├── architecture-server-repositories.puml │ │ ├── architecture-server-services.puml │ │ └── architecture-server.puml │ ├── learning-material.md │ ├── setup-dev-environment.md │ └── swagger-integration.md ├── infra/ │ ├── .gitignore │ ├── README.md │ ├── admin.yml │ ├── config/ │ │ ├── nginx/ │ │ │ ├── admin-app-htpasswd │ │ │ ├── admin_app_site.j2 │ │ │ ├── mime.types │ │ │ ├── nginx.conf │ │ │ ├── preview_admin_app_site.j2 │ │ │ ├── preview_web_app_site.j2 │ │ │ └── web_app_site.j2 │ │ └── server/ │ │ ├── dev.env.j2 │ │ └── server.service.j2 │ ├── demo-hosts.ini │ ├── nginx.yml │ ├── nginx_site_admin.yml │ ├── nginx_site_web.yml │ ├── preview_nginx_site_admin.yml │ ├── preview_nginx_site_web.yml │ ├── scripts/ │ │ ├── build-admin.sh │ │ ├── build-server.sh │ │ └── build-web.sh │ ├── server.yml │ ├── setup-postgres.md │ ├── test-hosts.ini │ └── web.yml ├── lib/ │ ├── api/ │ │ └── shared/ │ │ └── src/ │ │ └── main/ │ │ └── scala/ │ │ └── net/ │ │ └── wiringbits/ │ │ └── api/ │ │ ├── ApiClient.scala │ │ ├── endpoints/ │ │ │ ├── AdminEndpoints.scala │ │ │ ├── AuthEndpoints.scala │ │ │ ├── EnvironmentConfigEndpoints.scala │ │ │ ├── HealthEndpoints.scala │ │ │ ├── UsersEndpoints.scala │ │ │ └── package.scala │ │ ├── models/ │ │ │ ├── PlayErrorResponse.scala │ │ │ ├── admin/ │ │ │ │ ├── AdminGetUserLogs.scala │ │ │ │ └── AdminGetUsers.scala │ │ │ ├── auth/ │ │ │ │ ├── GetCurrentUser.scala │ │ │ │ ├── Login.scala │ │ │ │ └── Logout.scala │ │ │ ├── environmentconfig/ │ │ │ │ └── GetEnvironmentConfig.scala │ │ │ ├── package.scala │ │ │ └── users/ │ │ │ ├── CreateUser.scala │ │ │ ├── ForgotPassword.scala │ │ │ ├── GetUserLogs.scala │ │ │ ├── ResetPassword.scala │ │ │ ├── SendEmailVerificationToken.scala │ │ │ ├── UpdatePassword.scala │ │ │ ├── UpdateUser.scala │ │ │ └── VerifyEmail.scala │ │ └── utils/ │ │ └── Formatter.scala │ ├── common/ │ │ ├── js/ │ │ │ └── src/ │ │ │ └── test/ │ │ │ └── scala/ │ │ │ └── java/ │ │ │ └── security/ │ │ │ └── SecureRandom.scala │ │ └── shared/ │ │ └── src/ │ │ ├── main/ │ │ │ └── scala/ │ │ │ └── net/ │ │ │ └── wiringbits/ │ │ │ └── common/ │ │ │ ├── ErrorMessages.scala │ │ │ └── models/ │ │ │ ├── Captcha.scala │ │ │ ├── Email.scala │ │ │ ├── Name.scala │ │ │ ├── Password.scala │ │ │ └── UserToken.scala │ │ └── test/ │ │ └── scala/ │ │ └── net/ │ │ └── wiringbits/ │ │ └── common/ │ │ └── models/ │ │ ├── EmailSpec.scala │ │ ├── NameSpec.scala │ │ ├── PasswordSpec.scala │ │ └── UserTokenSpec.scala │ └── ui/ │ └── src/ │ └── main/ │ └── scala/ │ └── net/ │ └── wiringbits/ │ └── ui/ │ └── components/ │ ├── core/ │ │ └── widgets/ │ │ └── ValidatedTextInput.scala │ └── inputs/ │ └── inputs.scala ├── project/ │ ├── build.properties │ └── plugins.sbt ├── server/ │ └── src/ │ ├── main/ │ │ ├── resources/ │ │ │ ├── application.conf │ │ │ ├── evolutions/ │ │ │ │ └── default/ │ │ │ │ ├── 1.sql │ │ │ │ └── 2.sql │ │ │ ├── logback.xml │ │ │ ├── messages │ │ │ └── routes │ │ └── scala/ │ │ ├── PekkoStream.scala │ │ ├── controllers/ │ │ │ ├── AdminController.scala │ │ │ ├── ApiRouter.scala │ │ │ ├── AuthController.scala │ │ │ ├── EnvironmentConfigController.scala │ │ │ ├── HealthController.scala │ │ │ ├── UsersController.scala │ │ │ └── package.scala │ │ └── net/ │ │ └── wiringbits/ │ │ ├── actions/ │ │ │ ├── auth/ │ │ │ │ ├── GetUserAction.scala │ │ │ │ └── LoginAction.scala │ │ │ ├── environmentconfig/ │ │ │ │ └── GetEnvironmentConfigAction.scala │ │ │ ├── internal/ │ │ │ │ └── StreamPendingBackgroundJobsForeverAction.scala │ │ │ └── users/ │ │ │ ├── CreateUserAction.scala │ │ │ ├── ForgotPasswordAction.scala │ │ │ ├── GetUserLogsAction.scala │ │ │ ├── ResetPasswordAction.scala │ │ │ ├── SendEmailVerificationTokenAction.scala │ │ │ ├── UpdatePasswordAction.scala │ │ │ ├── UpdateUserAction.scala │ │ │ └── VerifyUserEmailAction.scala │ │ ├── apis/ │ │ │ ├── EmailApi.scala │ │ │ ├── EmailApiAWSImpl.scala │ │ │ ├── ReCaptchaApi.scala │ │ │ └── models/ │ │ │ └── EmailRequest.scala │ │ ├── config/ │ │ │ ├── AWSConfig.scala │ │ │ ├── BackgroundJobsExecutorConfig.scala │ │ │ ├── EmailConfig.scala │ │ │ ├── ReCaptchaConfig.scala │ │ │ ├── SwaggerConfig.scala │ │ │ ├── UserTokensConfig.scala │ │ │ └── WebAppConfig.scala │ │ ├── executors/ │ │ │ └── DatabaseExecutionContext.scala │ │ ├── models/ │ │ │ ├── AWSAccessKeyId.scala │ │ │ ├── AWSSecretAccessKey.scala │ │ │ ├── ReCaptchaSecret.scala │ │ │ ├── ReCaptchaSiteKey.scala │ │ │ ├── SecretValue.scala │ │ │ └── jobs/ │ │ │ ├── BackgroundJobPayload.scala │ │ │ ├── BackgroundJobStatus.scala │ │ │ └── BackgroundJobType.scala │ │ ├── modules/ │ │ │ ├── ApisModule.scala │ │ │ ├── ClockModule.scala │ │ │ ├── ConfigModule.scala │ │ │ ├── ExecutorsModule.scala │ │ │ └── TasksModule.scala │ │ ├── repositories/ │ │ │ ├── BackgroundJobsRepository.scala │ │ │ ├── UserLogsRepository.scala │ │ │ ├── UserTokensRepository.scala │ │ │ ├── UsersRepository.scala │ │ │ ├── daos/ │ │ │ │ ├── BackgroundJobDAO.scala │ │ │ │ ├── UserLogsDAO.scala │ │ │ │ ├── UserTokensDAO.scala │ │ │ │ ├── UsersDAO.scala │ │ │ │ └── package.scala │ │ │ └── models/ │ │ │ ├── BackgroundJobData.scala │ │ │ ├── User.scala │ │ │ ├── UserLog.scala │ │ │ ├── UserToken.scala │ │ │ └── UserTokenType.scala │ │ ├── services/ │ │ │ └── AdminService.scala │ │ ├── tasks/ │ │ │ └── BackgroundJobsExecutorTask.scala │ │ ├── util/ │ │ │ ├── DelayGenerator.scala │ │ │ ├── EmailMessage.scala │ │ │ ├── EmailsHelper.scala │ │ │ ├── StringUtils.scala │ │ │ ├── TokenGenerator.scala │ │ │ └── TokensHelper.scala │ │ └── validations/ │ │ ├── ValidateCaptcha.scala │ │ ├── ValidateEmailIsAvailable.scala │ │ ├── ValidateEmailIsRegistered.scala │ │ ├── ValidatePasswordMatches.scala │ │ ├── ValidateUserIsNotVerified.scala │ │ ├── ValidateUserToken.scala │ │ └── ValidateVerifiedUser.scala │ └── test/ │ └── scala/ │ ├── controllers/ │ │ ├── AdminControllerSpec.scala │ │ ├── AuthControllerSpec.scala │ │ ├── EnvironmentConfigControllerSpec.scala │ │ ├── UsersControllerSpec.scala │ │ └── common/ │ │ ├── PlayAPISpec.scala │ │ └── PlayPostgresSpec.scala │ ├── net/ │ │ └── wiringbits/ │ │ ├── apis/ │ │ │ └── ReCaptchaApiSpec.scala │ │ ├── core/ │ │ │ ├── PostgresSpec.scala │ │ │ ├── RepositoryComponents.scala │ │ │ └── RepositorySpec.scala │ │ ├── repositories/ │ │ │ ├── BackgroundJobsRepositorySpec.scala │ │ │ ├── UserLogsRepositorySpec.scala │ │ │ ├── UserTokensRepositorySpec.scala │ │ │ └── UsersRepositorySpec.scala │ │ └── util/ │ │ ├── DelayGeneratorSpec.scala │ │ └── TokensHelperSpec.scala │ └── utils/ │ ├── Executors.scala │ ├── LoginUtils.scala │ └── RepositoryUtils.scala └── web/ └── src/ ├── main/ │ ├── js/ │ │ ├── index.css │ │ └── index.html │ └── scala/ │ └── net/ │ └── wiringbits/ │ ├── API.scala │ ├── App.scala │ ├── AppContext.scala │ ├── AppRouter.scala │ ├── AppTheme.scala │ ├── I18nMessages.scala │ ├── Main.scala │ ├── components/ │ │ ├── AppSplash.scala │ │ ├── pages/ │ │ │ ├── AboutPage.scala │ │ │ ├── DashboardPage.scala │ │ │ ├── ForgotPasswordPage.scala │ │ │ ├── HomePage.scala │ │ │ ├── ResendVerifyEmailPage.scala │ │ │ ├── ResetPasswordPage.scala │ │ │ ├── SignInPage.scala │ │ │ ├── SignUpPage.scala │ │ │ ├── UserEditPage.scala │ │ │ ├── VerifyEmailPage.scala │ │ │ └── VerifyEmailWithTokenPage.scala │ │ └── widgets/ │ │ ├── AppBar.scala │ │ ├── AppCard.scala │ │ ├── EditPasswordForm.scala │ │ ├── EditUserForm.scala │ │ ├── Footer.scala │ │ ├── ForgotPasswordForm.scala │ │ ├── Loader.scala │ │ ├── LogList.scala │ │ ├── Logs.scala │ │ ├── ReCaptcha.scala │ │ ├── ResendVerifyEmailForm.scala │ │ ├── ResetPasswordForm.scala │ │ ├── SignInForm.scala │ │ ├── SignUpForm.scala │ │ └── UserInfo.scala │ ├── core/ │ │ ├── I18nHooks.scala │ │ ├── I18nLang.scala │ │ └── ReactiveHooks.scala │ ├── forms/ │ │ ├── ForgotPasswordFormData.scala │ │ ├── ResendVerifyEmailFormData.scala │ │ ├── ResetPasswordFormData.scala │ │ ├── SignInFormData.scala │ │ ├── SignUpFormData.scala │ │ ├── UpdateInfoFormData.scala │ │ └── UpdatePasswordFormData.scala │ ├── models/ │ │ ├── AuthState.scala │ │ ├── User.scala │ │ └── UserMenuOption.scala │ └── services/ │ └── StorageService.scala └── test/ └── scala/ ├── java/ │ └── security/ │ └── SecureRandom.scala └── net/ └── wiringbits/ └── forms/ ├── ForgotPasswordFormDataSpec.scala ├── ResendVerifyEmailFormDataSpec.scala ├── ResetPasswordFormDataSpec.scala ├── SignInFormDataSpec.scala ├── SignUpFormDataSpec.scala ├── UpdateInfoFormDataSpec.scala └── UpdatePasswordFormDataSpec.scala