authRoutes function

void authRoutes(
  1. Router router
)

Registers Archery's built-in authentication routes onto the provided router.

Routes include:

  • GET /login (guest-only)
  • POST /login
  • GET /register (guest-only)
  • POST /register

These routes assume the bundled auth views exist (e.g. auth.login, auth.register) and that the User model is available for persistence.

Implementation

void authRoutes(Router router) {
  router.group(
    routes: () {
      router.get('/login', middleware: [Guest.middleware], (request) async {
        return request.view("auth.login");
      });

      router.get('/register', middleware: [Guest.middleware], (request) async {
        return request.view("auth.register");
      });

      router.post('/register', (request) async {
        try {
          final validated = await request.validateAll([{
              "email": [
                Rule.required,
                Rule.email,
                Rule.max(255),
                Rule.unique<User>(column: "email")],}, {

              "name": [
                Rule.required,
                Rule.min(3),
                Rule.max(100)],},{

              "password": [
                Rule.required,
                Rule.min(6),
                Rule.max(50)],},]
          );

          if (!validated) {
            return request.redirectBack();
          }

          final form = request.form();
          final name = await form.input('name');
          final email = await form.input('email');
          final password = await form.input('password');

          final userRecord = await Model.firstWhere<User>(field: "email", value: email);
          if (userRecord != null) {
            request.flash(key: "error", message: "User exists");
            return request.redirectToLogin();
          }

          final user = User(name: name, email: email, password: password);
          await user.save();
          request.flash(key: "success", message: "Account created");
          return request.redirectToLogin();
        } catch (e, stack) {
          App().archeryLogger.error("Registration error", {"origin": "authRoutes post /register", "error": e.toString(), "stack": stack.toString()});
          request.flash(key: "error", message: "Something went wrong");
          return request.redirectBack();
        }
      });

      router.post('/login', (request) async {
        try {
          final validated = await request.validateAll([{

              "email": [
                Rule.required,
                Rule.email,
                Rule.max(255)],},{

              "password": [
                Rule.required,
                Rule.max(50)],
            },
          ]);

          if (!validated) {
            return request.redirectBack();
          }

          final form = request.form();
          final email = await form.input('email');
          final password = await form.input('password');

          if (await Auth.login(request: request, email: email, password: password)) {
            return request.redirectToDashboard();
          }

          request.flash(key: "error", message: "Invalid credentials");
          return request.redirectBack();
        } catch (e, stack) {
          App().archeryLogger.error("Login error", {"origin": "authRoutes post /login", "error": e.toString(), "stack": stack.toString()});
          request.flash(key: "error", message: "Invalid credentials");
          return request.redirectBack();
        }
      });

      router.get('/logout', (request) async {
        await Auth.logout(request);
        return request.redirectHome();
      });

      router.group(
        prefix: "/user",
        middleware: [Auth.middleware],
        routes: () {
          // - grouped for profile & dashboard crud
          router.group(
            prefix: "/profile",
            routes: () {
              router.get("/", (request) async {
                return request.view("auth.user.profile");
              });
            },
          );

          router.group(
            prefix: "/dashboard",
            routes: () {
              router.get("/", (request) async {
                return request.view("auth.user.dashboard");
              });
            },
          );
        },
      );
    },
  );
}