mirror of
https://github.com/hanskokx/arcane_framework.git
synced 2026-05-14 10:29:06 +02:00
v1.2.0
- Removed flutter_secure_storage dependency as it was unused - BREAKING: several methods were moved from the ArcaneAuthInterface base class into their own mixins Signed-off-by: Hans Kokx <hans.kokx@hackberry.se>
This commit is contained in:
@@ -2,36 +2,40 @@ part of "authentication_service.dart";
|
||||
|
||||
/// An abstract class that defines the authentication interface.
|
||||
///
|
||||
/// This interface provides methods for various authentication operations, including
|
||||
/// signing in, signing up, resetting passwords, and managing tokens.
|
||||
/// This interface provides methods for various authentication operations,
|
||||
/// including signing in, signing up, resetting passwords, and managing tokens.
|
||||
abstract class ArcaneAuthInterface {
|
||||
/// Returns `true` if the user is currently signed in.
|
||||
///
|
||||
/// This is a getter that asynchronously checks if the user has an active session.
|
||||
/// This is a getter that asynchronously checks if the user has an active
|
||||
/// session.
|
||||
Future<bool> get isSignedIn;
|
||||
|
||||
/// Returns the access token if available.
|
||||
///
|
||||
/// This is used to retrieve the current session's access token for authenticated
|
||||
/// API requests. Returns `null` if the user is not signed in or the token is unavailable.
|
||||
/// This is used to retrieve the current session's access token for
|
||||
/// authenticated API requests. Returns `null` if the user is not signed in or
|
||||
/// the token is unavailable.
|
||||
Future<String?>? get accessToken;
|
||||
|
||||
/// Returns the refresh token if available.
|
||||
///
|
||||
/// The refresh token is used to renew access tokens when they expire. Returns `null` if
|
||||
/// the user is not signed in or the token is unavailable.
|
||||
/// The refresh token is used to renew access tokens when they expire. Returns
|
||||
/// `null` if the user is not signed in or the token is unavailable.
|
||||
Future<String?>? get refreshToken;
|
||||
|
||||
/// Initializes the authentication interface.
|
||||
///
|
||||
/// This method sets up any necessary configurations or initializations required for
|
||||
/// the authentication process. It must be called before any other methods in the interface.
|
||||
Future<void> init();
|
||||
/// This method sets up any necessary configurations or initializations
|
||||
/// required for the authentication process. It must be called before any
|
||||
/// other methods in the interface.
|
||||
Future<void> init() => Future.value(null);
|
||||
|
||||
/// Logs the user out of the session.
|
||||
///
|
||||
/// This method terminates the current session and removes any stored tokens.
|
||||
/// Returns a `Result` that either contains a `void` on success or an error message.
|
||||
/// Returns a `Result` that either contains a `void` on success or an error
|
||||
/// message.
|
||||
Future<Result<void, String>> logout();
|
||||
|
||||
/// Logs the user in using an optional, generic `T` type of input.
|
||||
@@ -54,47 +58,107 @@ abstract class ArcaneAuthInterface {
|
||||
T? input,
|
||||
Future<void> Function()? onLoggedIn,
|
||||
});
|
||||
}
|
||||
|
||||
/// Provides methods related to account registration and verification.
|
||||
///
|
||||
/// This mixin is intended to be used as part of an authentication system
|
||||
/// where account registration and email verification are required.
|
||||
mixin ArcaneAuthAccountRegistration {
|
||||
/// Re-sends a verification code to the user's email address.
|
||||
///
|
||||
/// This method is typically used when the user hasn't received or has lost their initial
|
||||
/// verification code. Returns a `Result` that contains the verification code on success
|
||||
/// or an error message.
|
||||
/// This method is typically used when the user hasn't received or has lost
|
||||
/// their initial verification code. Returns a [Result] containing the
|
||||
/// verification code on success or an error message.
|
||||
///
|
||||
/// - [T]: The type of input passed to the method. This can be used for custom
|
||||
/// input structures.
|
||||
///
|
||||
/// Example:
|
||||
/// ```dart
|
||||
/// final result = await auth.resendVerificationCode(input: {"email": "user@example.com"});
|
||||
/// ```
|
||||
Future<Result<String, String>>? resendVerificationCode<T>({T? input});
|
||||
|
||||
/// Registers a new account using user-supplied input.
|
||||
///
|
||||
/// This method registers a new user in the system. Returns a `Result` that contains
|
||||
/// the next [SignUpStep] in the process on success or an error message.
|
||||
/// This method adds a new user to the system. Returns a [Result] containing
|
||||
/// the next [SignUpStep] in the registration process on success or an error
|
||||
/// message.
|
||||
///
|
||||
/// - [T]: The type of input passed to the method. This can be used for custom
|
||||
/// input structures.
|
||||
///
|
||||
/// Example:
|
||||
/// ```dart
|
||||
/// await authInterface.register(
|
||||
/// email: "user@example.com",
|
||||
/// password: "password123",
|
||||
/// );
|
||||
/// final result = await auth.register(input: {
|
||||
/// "email": "user@example.com",
|
||||
/// "password": "password123"
|
||||
/// });
|
||||
/// ```
|
||||
Future<Result<SignUpStep, String>>? register<T>({T? input});
|
||||
|
||||
/// Confirms a user's signup using a username and a confirmation code.
|
||||
///
|
||||
/// This method completes the sign-up process by verifying the user's confirmation code.
|
||||
/// Returns a `Result` that contains `true` on success or an error message.
|
||||
/// This method finalizes the account registration process by validating the
|
||||
/// confirmation code sent to the user. Returns a [Result] containing `true`
|
||||
/// on success or an error message.
|
||||
///
|
||||
/// Parameters:
|
||||
/// - [username]: The username of the account being confirmed.
|
||||
/// - [confirmationCode]: The code sent to the user's email address for
|
||||
/// verification.
|
||||
///
|
||||
/// Example:
|
||||
/// ```dart
|
||||
/// final result = await auth.confirmSignup(
|
||||
/// username: "user@example.com",
|
||||
/// confirmationCode: "123456"
|
||||
/// );
|
||||
/// ```
|
||||
Future<Result<bool, String>>? confirmSignup({
|
||||
String? username,
|
||||
String? confirmationCode,
|
||||
});
|
||||
}
|
||||
|
||||
/// Provides methods for managing user passwords.
|
||||
///
|
||||
/// This mixin includes functionality for resetting passwords and handling
|
||||
/// password reset codes or pins as part of an authentication system.
|
||||
mixin ArcaneAuthPasswordManagement {
|
||||
/// Resets a user's password using an email address and a code.
|
||||
///
|
||||
/// This method is used when a user requests to reset their password. The reset code
|
||||
/// they receive via email is used to verify the request. Optionally, a new password can
|
||||
/// be provided. Returns a `Result` that contains `true` on success or an error message.
|
||||
/// This method is used when a user requests to reset their password. The
|
||||
/// reset code they receive via email is used to verify the request.
|
||||
/// Optionally, a new password can be provided. Returns a [Result] containing
|
||||
/// `true` on success or an error message.
|
||||
///
|
||||
/// This method may be called twice. In the first instance, the `email` is provided, which
|
||||
/// triggers a password reset confirmation email to be sent, containing a password reset
|
||||
/// code or pin. The second call should include the `email`, the user's new password
|
||||
/// (`newPassword`), and the `code` they received in their email.
|
||||
/// This method may be called in two steps:
|
||||
/// 1. Provide the `email` to trigger a password reset email. This email will
|
||||
/// contain a reset code or pin for verification.
|
||||
/// 2. Provide the `email`, the `newPassword`, and the `code` received in the
|
||||
/// email to finalize the password reset process.
|
||||
///
|
||||
/// Parameters:
|
||||
/// - [email]: The email address associated with the user account.
|
||||
/// - [newPassword]: The new password to set for the user. Required in the
|
||||
/// second step.
|
||||
/// - [code]: The password reset code sent to the user's email. Required in
|
||||
/// the second step.
|
||||
///
|
||||
/// Example:
|
||||
/// ```dart
|
||||
/// // Step 1: Trigger reset email
|
||||
/// final step1 = await auth.resetPassword(email: "user@example.com");
|
||||
///
|
||||
/// // Step 2: Complete reset
|
||||
/// final step2 = await auth.resetPassword(
|
||||
/// email: "user@example.com",
|
||||
/// newPassword: "newPassword123",
|
||||
/// code: "123456"
|
||||
/// );
|
||||
/// ```
|
||||
Future<Result<bool, String>>? resetPassword({
|
||||
String? email,
|
||||
String? newPassword,
|
||||
|
||||
@@ -199,7 +199,15 @@ class ArcaneAuthenticationService extends ArcaneService {
|
||||
return Result.error("No ArcaneAuthInterface has been registered");
|
||||
}
|
||||
|
||||
final Result<SignUpStep, String>? result = await authInterface!.register(
|
||||
if (authInterface is! ArcaneAuthAccountRegistration) {
|
||||
return Result.error(
|
||||
"The provided ArcaneAuthInterface does not support account registration.",
|
||||
);
|
||||
}
|
||||
|
||||
final auth = authInterface as ArcaneAuthAccountRegistration;
|
||||
|
||||
final Result<SignUpStep, String>? result = await auth.register(
|
||||
input: input,
|
||||
);
|
||||
|
||||
@@ -222,7 +230,15 @@ class ArcaneAuthenticationService extends ArcaneService {
|
||||
return Result.error("No ArcaneAuthInterface has been registered");
|
||||
}
|
||||
|
||||
final Result<bool, String>? result = await authInterface!.confirmSignup(
|
||||
if (authInterface is! ArcaneAuthAccountRegistration) {
|
||||
return Result.error(
|
||||
"The provided ArcaneAuthInterface does not support account registration.",
|
||||
);
|
||||
}
|
||||
|
||||
final auth = authInterface as ArcaneAuthAccountRegistration;
|
||||
|
||||
final Result<bool, String>? result = await auth.confirmSignup(
|
||||
username: email,
|
||||
confirmationCode: confirmationCode,
|
||||
);
|
||||
@@ -243,8 +259,16 @@ class ArcaneAuthenticationService extends ArcaneService {
|
||||
return Result.error("No ArcaneAuthInterface has been registered");
|
||||
}
|
||||
|
||||
if (authInterface is! ArcaneAuthAccountRegistration) {
|
||||
return Result.error(
|
||||
"The provided ArcaneAuthInterface does not support account registration.",
|
||||
);
|
||||
}
|
||||
|
||||
final auth = authInterface as ArcaneAuthAccountRegistration;
|
||||
|
||||
final Future<Result<String, String>>? result =
|
||||
authInterface!.resendVerificationCode(input: email);
|
||||
auth.resendVerificationCode(input: email);
|
||||
|
||||
if (result == null) {
|
||||
return Result.error(
|
||||
@@ -270,7 +294,15 @@ class ArcaneAuthenticationService extends ArcaneService {
|
||||
return Result.error("No ArcaneAuthInterface has been registered");
|
||||
}
|
||||
|
||||
final Result<bool, String>? result = await authInterface!.resetPassword(
|
||||
if (authInterface is! ArcaneAuthPasswordManagement) {
|
||||
return Result.error(
|
||||
"The provided ArcaneAuthInterface does not support password management.",
|
||||
);
|
||||
}
|
||||
|
||||
final auth = authInterface as ArcaneAuthPasswordManagement;
|
||||
|
||||
final Result<bool, String>? result = await auth.resetPassword(
|
||||
email: email,
|
||||
newPassword: newPassword,
|
||||
code: confirmationCode,
|
||||
|
||||
@@ -12,7 +12,7 @@ abstract class LoggingInterface {
|
||||
/// ensures that the logging interface, once configured, remains so.
|
||||
static LoggingInterface get I => _instance;
|
||||
|
||||
final bool _initialized = false;
|
||||
bool _initialized = false;
|
||||
|
||||
/// Whether the logging interface has been initialized.
|
||||
bool get initialized => I._initialized;
|
||||
@@ -22,7 +22,10 @@ abstract class LoggingInterface {
|
||||
/// If any configuration needs to be performed on the logging interface prior
|
||||
/// to use, this is where it should be done.
|
||||
/// This method should, at a minimum, set `I._initialized = true`.
|
||||
Future<LoggingInterface?> init();
|
||||
Future<LoggingInterface?> init() async {
|
||||
I._initialized = true;
|
||||
return I;
|
||||
}
|
||||
|
||||
/// This method is called by the `ArcaneLogger` when a log message is
|
||||
/// received. See `ArcaneLogger.log` for further details on how logging
|
||||
|
||||
Reference in New Issue
Block a user