authRoutes function

void authRoutes(
  1. Router router
)

Implementation

void authRoutes(Router router) {

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

      // Todo- form.validate(field as [.email, .phone, .name, .])
      // or use a FormValidator.validate()
      // opt 1 gives easy prototyping option
      // add a method on FormRequest
      // avoid extending Request, use buffered content and _request in FormRequest
      if (name == null || name.toString().isEmpty || email == null || email.toString().isEmpty || password == null || password.toString().isEmpty) {
        return request.redirectBack();
      }

      final userRecord = await Model.firstWhere<User>(field: "email", value: email);
      if (userRecord != null) return request.redirectBack();

      final user = User(name: name, email: email, password: password);
      await user.save();

      return request.redirectToLogin();
    } catch (e) {
      return request.redirectBack();
    }
  });

  router.post('/login', (request) async {
    try {
      final form = request.form();
      final email = await form.input('email');
      final password = await form.input('password');

      if (email == null || email.toString().isEmpty || password == null || password.toString().isEmpty) {
        return request.redirectBack();
      }

      if (await Auth.login(email: email, password: password)) {
        final cookie = Cookie('archery_session', App.generateKey())
          ..httpOnly = true
          ..secure =
              true // only over HTTPS
          ..sameSite = SameSite.lax;

        final sessions = App().container.tryMake<List<AuthSession>>();

        final session = sessions?.firstWhereOrNull((session) => session.email == email);
        if (session != null) {
          session.cookie = cookie;
          request.response.cookies.add(cookie);
        }
        return request.redirectToDashboard();
      }

      return request.redirectBack();
    } catch (e) {
      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");
          });
        },
      );
    },
  );
}