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.max(255), Rule.email, 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 name = await request.form.input('name');
          final email = await request.form.input('email');
          final password = await request.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();
          }

          if (await Auth.login(request)) {
            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 endpoints
          router.group(
            prefix: "/profile",
            routes: () {
              router.get("/", (request) async {
                return await request.view("auth.user.profile");
              });
            },
          );

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