import { Type } from '@zetapush/core'; import { AccountStatus, AccountStatusProvider } from '../../standard-user-workflow/api'; import { UuidGenerator, Uuid, Variables, Location, Token, TokenGenerator, TokenRepository } from '../api'; import { AxiosInstance } from 'axios'; import { UserRepository } from '../api/User'; import { ConfirmationUrlProvider, AccountConfirmationContext } from '../../standard-user-workflow/api/Confirmation'; import { Provider } from '@zetapush/core'; import { ResetPasswordUrlProvider, ResetPasswordContext } from '../../standard-user-workflow/api/LostPassword'; export interface And

{ /** * Continue chaining to go back to parent configurer. * * @returns the parent configurer */ and(): P; } export interface Alternative { enable(enable: boolean): S; enable(enable: () => boolean | Promise): S; } export interface StandardUserWorkflowConfigurer { /** * Configure registration process of the end users in your application. * * By default the registration process is configured like this: * 1. End user registers himself to your application and provides account details * 2. An email with a link to confirm its account is sent to the end user * 3. The end user clicks on the link to confirm its account * 4. The account is confirmed and the user can now login into your application. * * This configurer lets you configure many aspects of this default process. * * Configure end users account fields used for registration * ======================================================== * * Configure fields used for creating end user accounts using class * ---------------------------------------------------------------- * * You can indicate which fields are used for account creation by * simply provide a class definition: * @example * ``` * class MyEndUsersAccountCreationDetails { * public username: string; * public password: string; * public confirmPassword: string; * public email: string; * } * * .registration() * .account() * .fields() * .scan(MyEndUsersAccountDetails) * ``` * * Besides, you can benefit of TypeScript decorators to annotate * each field with validation constraints: * @example * ``` * class MyEndUsersAccountCreationDetails { * @Required() * @Length(10, 20) * public username: string; * @Required() * @Length(6, 20) * public password: string; * @Required() * @SameAs('password') * public confirmPassword: string; * @IsEmail() * @Required() * public email: string; * } * * .registration() * .account() * .fields() * .scan(MyEndUsersAccountDetails) * ``` * * * Configure fields used for creating end user accounts manually * ------------------------------------------------------------- * * TODO * * Configure initial account status * -------------------------------- * * As said above, when account is created, the user must confirm it. * So by default, the account status is initially set to "WAITING_FOR_CONFIRMATION" * (`StandardAccountStatus.WaitingConfirmation`, {@link StandardAccountStatus}). * * For example, if you don't need confirmation, you can set initial status to "ACTIVE" * (`StandardAccountStatus.Active`, {@link StandardAccountStatus}): * @example * ``` * .registration() * .account() * .initialStatus() * .value(StandardAccountStatus.Active) * ``` * * Configure account uuid generation * --------------------------------- * * When a end user account is created a unique technical identifier is generated. * * By default, a 20 characters uuid is generated. You can choose another uuid generator: * @example * ``` * .registration() * .account() * .uuid() * .generator(() => Math.random()) * ``` * * Configure OAuth accounts * ======================== * * TODO * * Configure Google * ---------------- * * TODO * * Configure Facebook * ------------------ * * TODO * * Configure Github * ---------------- * * TODO * * Configure any other OAuth provider * ---------------------------------- * * TODO * * Configure account confirmation * ============================== * * TODO * * Configure welcome message * ========================= * * TODO * */ registration(): RegistrationConfigurer; login(): AuthenticationConfigurer; lostPassword(): LostPasswordConfigurer; } export interface UuidConfigurer

extends And

{ generator(func: () => Promise): UuidConfigurer

; generator(provider: Provider): UuidConfigurer

; generator(instance: UuidGenerator): UuidConfigurer

; generator(generatorClass: Type): UuidConfigurer

; } export interface EmailConfigurer

extends And

{ from(email: string): EmailConfigurer

; subject(subject: string): EmailConfigurer

; smtp(): SmtpEmailConfigurer>; ovh(): OvhEmailConfigurer>; mailjet(): MailjetEmailConfigurer>; htmlTemplate(): EmailTemplateConfigurer>; textTemplate(): TextTemplateConfigurer>; } export interface SmtpEmailConfigurer

extends And

, Alternative> { host(smtpHost: string): SmtpEmailConfigurer

; port(smtpPort: number): SmtpEmailConfigurer

; username(smtpUsername: string): SmtpEmailConfigurer

; password(smtpPassword: string): SmtpEmailConfigurer

; ssl(enableSsl: boolean): SmtpEmailConfigurer

; starttls(enableTls: boolean): SmtpEmailConfigurer

; } export interface OvhEmailConfigurer

extends And

, Alternative> { url(ovhUrl: string): OvhEmailConfigurer

; username(ovhUsername: string): OvhEmailConfigurer

; password(ovhPassword: string): OvhEmailConfigurer

; } export interface MailjetEmailConfigurer

extends And

, Alternative> { url(mailjetUrl: string): MailjetEmailConfigurer

; apiKeyPublic(mailjetApiKeyPublic: string): MailjetEmailConfigurer

; apiKeyPrivate(mailjetApiKeyPrivate: string): MailjetEmailConfigurer

; httpClient(axios: AxiosInstance): MailjetEmailConfigurer

; } export interface TemplateConfigurer> extends And

{ template(location: Location): S; template(func: (variables: Variables) => string): S; } export interface TextTemplateConfigurer

extends TemplateConfigurer> { } export interface EmailTemplateConfigurer

extends TemplateConfigurer> { inlineCss(): EmailTemplateConfigurer

; inlineImages(): EmailTemplateConfigurer

; } export interface SmsConfigurer

extends And

{ template(): SmsConfigurer

; } export interface SuccessFailureRedirectionConfigurer

extends And

{ successUrl(url: string): SuccessFailureRedirectionConfigurer

; failureUrl(url: string): SuccessFailureRedirectionConfigurer

; } export interface FieldsConfigurer

extends And

{ field(name: string): void; scan(model: Type): ScanConfigurer>; } export interface ScanConfigurer

extends And

{ annotations(): AnnotationsConfigurer>; } export interface AnnotationsConfigurer

extends And

{ validation(): ValidationConfigurer>; } export interface ValidationConfigurer

extends And

{ } export interface FieldConfigurer

extends And

{ } export interface TokenManagerConfigurer

extends And

{ validity(duration: number): TokenManagerConfigurer

; generator(func: () => Promise): TokenManagerConfigurer

; generator(instance: TokenGenerator): TokenManagerConfigurer

; generator(generatorClass: Type): TokenManagerConfigurer

; storage(tokenStorageClass: Type): TokenManagerConfigurer

; storage(tokenStorageInstance: TokenRepository): TokenManagerConfigurer

; } export interface RegistrationConfigurer extends And { account(): AccountConfigurer; welcome(): RegistrationWelcomeConfigurer; confirmation(): RegistrationConfirmationConfigurer; } export interface AccountConfigurer extends And { uuid(): UuidConfigurer; initialStatus(): AccountStatusConfigurer; fields(): RegistrationFieldsConfigurer; storage(userStorageClass: Type): AccountConfigurer; storage(userStorageInstance: UserRepository): AccountConfigurer; } export interface RegistrationFieldsConfigurer extends FieldsConfigurer { } export interface AccountStatusConfigurer extends And { value(accountStatus: AccountStatus): AccountStatusConfigurer; provider(accountStatusProvider: AccountStatusProvider): AccountStatusConfigurer; } export interface RegistrationWelcomeConfigurer extends And { email(): EmailConfigurer; sms(): SmsConfigurer; } export interface RegistrationConfirmationConfigurer extends And { url(urlProvider: ConfirmationUrlProvider): RegistrationConfirmationConfigurer; url(func: (context: AccountConfirmationContext) => Promise): RegistrationConfirmationConfigurer; url(confirmationUrl: string): RegistrationConfirmationConfigurer; email(): EmailConfigurer; sms(): SmsConfigurer; redirection(): SuccessFailureRedirectionConfigurer; token(): TokenManagerConfigurer; } export interface LostPasswordConfigurer extends And { reset(): ResetPasswordConfigurer; } export interface ResetPasswordConfigurer extends And { ask(): AskResetPasswordConfigurer; confirm(): ConfirmResetPasswordConfigurer; token(): TokenManagerConfigurer; } export interface AskResetPasswordConfigurer extends And { email(): EmailConfigurer; url(urlProvider: ResetPasswordUrlProvider): AskResetPasswordConfigurer; url(func: (context: ResetPasswordContext) => Promise): AskResetPasswordConfigurer; url(askResetPasswordUrl: string): AskResetPasswordConfigurer; } export interface ConfirmResetPasswordConfigurer extends And { } export interface AuthenticationConfigurer extends And { } export interface LoginPasswordAuthenticationConfigurer { }