Skip to content

Commit

Permalink
Merge pull request #68 from javad-zobeidi/dev
Browse files Browse the repository at this point in the history
Add domain to the router
  • Loading branch information
javad-zobeidi committed May 29, 2024
2 parents 3818861 + 2fc8d86 commit cd649c6
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 8 deletions.
2 changes: 1 addition & 1 deletion lib/src/route/route_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ class RouteData {
final dynamic action;
Map<String, dynamic>? params;
List<Middleware> preMiddleware;
final String? domain;
String? domain;
final bool? corsEnabled;
final String? prefix;

Expand Down
46 changes: 43 additions & 3 deletions lib/src/route/route_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import 'package:vania/src/utils/functions.dart';

Future<RouteData?> httpRouteHandler(HttpRequest req) async {
final route = _getMatchRoute(
req.uri.path.toLowerCase(),
Uri.decodeComponent(req.uri.path.toLowerCase()),
req.method,
req.headers.value(HttpHeaders.hostHeader),
);
Expand All @@ -32,12 +32,46 @@ Future<RouteData?> httpRouteHandler(HttpRequest req) async {
return route;
}

/// Exctract the domain from the url
String _exctractDomain(String domain, String path) {
String firstPart = domain.split('.').first.toLowerCase();
final RegExp domainRegex = RegExp(r'\{[^}]*\}');
bool containsPlaceholder = domainRegex.hasMatch(path);
String domainUri = domain;
if (containsPlaceholder) {
domainUri = path.replaceAll(domainRegex, firstPart).toLowerCase();
}
return domainUri;
}

/// Exctarct username from {username}
/// Or any string between {}
String? _extractDomainPlaceholder(String input) {
final RegExp regex = RegExp(r'\{([^}]*)\}');
final match = regex.firstMatch(input);
if (match != null) {
return match.group(1)!;
} else {
return null;
}
}

RouteData? _getMatchRoute(String inputRoute, String method, String? domain) {
String? domainParameter;
String? domainPlaceholder;
List<RouteData> methodMatchedRoutes =
Router().routes.where((RouteData route) {
if (domain != null && route.domain != null) {
String subDomain = _exctractDomain(
domain,
route.domain!,
);

domainPlaceholder = _extractDomainPlaceholder(route.domain!);
domainParameter = subDomain.split('.').first.toLowerCase();

return route.method.toLowerCase() == method.toLowerCase() &&
route.domain?.toLowerCase() == domain.toLowerCase();
subDomain == domain.toLowerCase();
} else {
return route.method.toLowerCase() == method.toLowerCase();
}
Expand All @@ -55,18 +89,24 @@ RouteData? _getMatchRoute(String inputRoute, String method, String? domain) {

/// When route is the same route exactly same route.
/// route without params, eg. /api/example
if (routePath == inputRoute.trim()) {
if (routePath == inputRoute.trim() && route.domain == null) {
matchRoute = route;
break;
}

/// when route have params
/// eg. /api/admin/{adminId}
Iterable<String> parameterNames = _getParameterNameFromRoute(route);

Iterable<RegExpMatch> matches = _getPatternMatches(inputRoute, routePath);
if (matches.isNotEmpty) {
matchRoute = route;
matchRoute.params = _getParameterAsMap(matches, parameterNames);
if (domainPlaceholder != null && domainParameter != null) {
matchRoute.params?.addAll({
domainPlaceholder!: domainParameter,
});
}
break;
}
}
Expand Down
24 changes: 22 additions & 2 deletions lib/src/route/router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class Router {

String? _prefix;
String? _groupPrefix;
String? _groupDomain;
List<Middleware>? _groupMiddleware;

static basePrefix(String prefix) {
Expand All @@ -27,41 +28,47 @@ class Router {
return Router()
._addRoute(HttpRequestMethod.get, path, action)
.middleware(Router()._groupMiddleware)
.domain(Router()._groupDomain)
.prefix(Router()._groupPrefix);
}

static Router post(String path, dynamic action) {
return Router()
._addRoute(HttpRequestMethod.post, path, action)
.middleware(Router()._groupMiddleware)
.domain(Router()._groupDomain)
.prefix(Router()._groupPrefix);
}

static Router put(String path, dynamic action) {
return Router()
._addRoute(HttpRequestMethod.put, path, action)
.middleware(Router()._groupMiddleware)
.domain(Router()._groupDomain)
.prefix(Router()._groupPrefix);
}

static Router patch(String path, dynamic action) {
return Router()
._addRoute(HttpRequestMethod.patch, path, action)
.middleware(Router()._groupMiddleware)
.domain(Router()._groupDomain)
.prefix(Router()._groupPrefix);
}

static Router delete(String path, dynamic action) {
return Router()
._addRoute(HttpRequestMethod.delete, path, action)
.middleware(Router()._groupMiddleware)
.domain(Router()._groupDomain)
.prefix(Router()._groupPrefix);
}

static Router options(String path, dynamic action) {
return Router()
._addRoute(HttpRequestMethod.options, path, action)
.middleware(Router()._groupMiddleware)
.domain(Router()._groupDomain)
.prefix(Router()._prefix);
}

Expand Down Expand Up @@ -91,6 +98,13 @@ class Router {
return this;
}

Router domain([String? domain]) {
if (domain != null) {
_routes.last.domain = domain;
}
return this;
}

static void websocket(
String path,
Function(WebSocketEvent) eventCallBack, {
Expand All @@ -102,12 +116,18 @@ class Router {
));
}

static void group(Function callBack,
{String? prefix, List<Middleware>? middleware}) {
static void group(
Function callBack, {
String? prefix,
List<Middleware>? middleware,
String? domain,
}) {
Router()._groupPrefix = prefix;
Router()._groupMiddleware = middleware;
Router()._groupDomain = domain;
callBack();
Router()._groupPrefix = null;
Router()._groupMiddleware = null;
Router()._groupDomain = null;
}
}
5 changes: 3 additions & 2 deletions lib/src/route/set_static_path.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import 'package:vania/src/utils/functions.dart';
import 'package:vania/vania.dart';

Future<bool?> setStaticPath(HttpRequest req) {
if (!req.uri.path.endsWith("/")) {
File file = File(sanitizeRoutePath("public/${req.uri.path}"));
String path = Uri.decodeComponent(req.uri.path);
if (!path.endsWith("/")) {
File file = File(sanitizeRoutePath("public/$path"));
if (file.existsSync()) {
Response response = Response.file(file.path);
response.makeResponse(req.response);
Expand Down
7 changes: 7 additions & 0 deletions test/unit/route_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,13 @@ void main() {
expect(data.method, 'options');
});

test('domain route', () {
Router.get('/get-with-domain', () {}).domain('{username}.test.com');
RouteData data = Router().routes.first;
expect(data.domain, '{username}.test.com');
expect(data.method, 'get');
});

test('group route test', () {
Router.group(() {
Router.get('/get', () {});
Expand Down

0 comments on commit cd649c6

Please sign in to comment.