Skip to content

Instantly share code, notes, and snippets.

@ratulSharker
Last active February 27, 2020 05:39
Show Gist options
  • Save ratulSharker/1418588f27c08785acfd286061ffef86 to your computer and use it in GitHub Desktop.
Save ratulSharker/1418588f27c08785acfd286061ffef86 to your computer and use it in GitHub Desktop.
Express route tree
const endpoints = ["/businesses/:businessId/banks/:bankInfoId" ,"/businesses/mine/banks/:bankInfoId"] //,"/businesses/sales/:businessId/banks/:bankInfoId","/publicnotifications/:publicNotificationId","/publicnotifications/:userPublicNotificationId","/pushtokens","/users/me/phones/:userPhoneId","/accounting/businesses/:businessId/summary","/accounting/migrate/payables","/accounting/migrate/paymentmetainfo","/accounting/orders/:orderId","/accounting/orders/:orderRefId","/accounting/paid","/accounting/paid/summary","/accounting/payables","/accounting/payables/summary","/accounting/receivables","/accounting/receivables/:accountReceivableId/refundbreakdown","/accounting/receivables/summary","/accounting/received","/accounting/received/summary","/accounting/withdraws","/accounting/withdraws/:withdrawRequestId","/accounting/withdraws/summary","/acl/register","/acl/routes","/activitylogs","/activitylogs/:activityLogId","/addons/:addonId","/analytics","/analytics/businesses/mine","/analytics/businesses/mine/custom/order","/analytics/businesses/mine/custom/order/status","/analytics/businesses/mine/custom/revenue","/analytics/businesses/mine/metabase","/appversioning","/appversioning/statuses","/banks/:bankId","/businesses","/businesses/:businessId","/businesses/:businessId/banks","/businesses/:businessId/banks/:bankInfoId","/businesses/:businessId/banks/:bankInfoId/unlink","/businesses/:businessId/floorplans","/businesses/:businessId/floorplans/:floorPlanId","/businesses/:businessId/floorplans/:floorPlanId/tables/:tableId/orders","/businesses/:businessId/floorplans/:floorPlanId/tables/booked","/businesses/:businessId/floorplans/:floorPlanId/tables/maxsvgid","/businesses/:businessId/foods","/businesses/:businessId/foods/:foodId/addons","/businesses/:businessId/foods/:foodId/addons/:addonId","/businesses/:businessId/foods/:foodId/addons/active","/businesses/:businessId/foods/:foodMenuId","/businesses/:businessId/foods/grouped","/businesses/:businessId/hours","/businesses/:businessId/orders","/businesses/:businessId/orders/:orderId","/businesses/:businessId/orders/:orderRefId","/businesses/:businessId/ratings","/businesses/:businessId/sales","/businesses/:businessId/users","/businesses/:businessId/users/:userId","/businesses/accounting/mine/paid","/businesses/accounting/mine/payables","/businesses/accounting/mine/receivables","/businesses/accounting/mine/summary","/businesses/accounting/mine/withdrawrequests","/businesses/floorplanstatuses","/businesses/mine","/businesses/mine/banks","/businesses/mine/banks/:bankInfoId","/businesses/mine/banks/:bankInfoId/unlink","/businesses/mine/floorplans","/businesses/mine/floorplans/:floorPlanId","/businesses/mine/floorplans/:floorPlanId/tables/:tableId/orders","/businesses/mine/floorplans/:floorPlanId/tables/booked","/businesses/mine/floorplans/:floorPlanId/tables/maxsvgid","/businesses/mine/foods","/businesses/mine/foods/:foodId/addons","/businesses/mine/foods/:foodId/addons/:addonId","/businesses/mine/foods/:foodId/addons/active","/businesses/mine/foods/:foodMenuId","/businesses/mine/foods/grouped","/businesses/mine/hours","/businesses/mine/orders","/businesses/mine/orders/:orderId","/businesses/mine/orders/:orderRefId","/businesses/mine/ratings","/businesses/mine/users","/businesses/mine/users/:userId","/businesses/rules","/businesses/sales","/businesses/sales/:businessId/banks","/businesses/sales/:businessId/banks/:bankInfoId","/businesses/sales/:businessId/banks/:bankInfoId/unlink","/businesses/sales/:businessId/floorplans","/businesses/sales/:businessId/floorplans/:floorPlanId","/businesses/sales/:businessId/floorplans/:floorPlanId/tables/:tableId/orders","/businesses/sales/:businessId/floorplans/:floorPlanId/tables/booked","/businesses/sales/:businessId/floorplans/:floorPlanId/tables/maxsvgid","/businesses/sales/:businessId/hours","/businesses/sales/:businessId/users","/businesses/sales/:businessId/users/:userId","/businesses/statuses","/businesses/types","/classifications/statuses","/emails/templates","/emails/templates/:emailTemplateId","/emails/templates/types","/emails/templates/variables","/facilities","/facilities/:facilityId","/facilities/active","/facilities/groups","/facilities/groups/:facilityGroupId","/facilities/groups/filtered","/facilities/groups/statuses","/facilities/statuses","/floorplans/:floorPlanId","/foods/:foodMenuId","/foods/addons/statuses","/foods/addons/types","/foods/statuses","/foods/types","/marketing/pushnotifications","/marketing/pushnotifications/:notificationId","/marketing/pushnotifications/:notificationId/recipients","/marketing/pushnotifications/:notificationId/userIds","/marketing/pushnotifications/statuses","/orderpromotions/orders/:orderId","/orderpromotions/orders/:orderRefId","/orderpromotions/statuses","/orders","/orders/:orderId","/orders/:orderId/approve","/orders/:orderId/confirm","/orders/:orderId/confirm/check","/orders/:orderId/rating/b2c","/orders/:orderId/tickets/create","/orders/:orderRefId","/orders/:orderRefId/approve","/orders/:orderRefId/confirm","/orders/:orderRefId/confirm/check","/orders/:orderRefId/rating/b2c","/orders/:orderRefId/tickets/create","/orders/migrateOrderRef","/orders/statuses","/payments/statuses","/ping","/promotions","/promotions/:promotionId","/promotions/:promotionId/users","/promotions/b2c","/promotions/b2c/:promotionId","/promotions/statuses","/publicnotifications","/publicnotifications/:userPublicNotificationId","/ratings/mine/latests/pending","/refundpolicies","/refundpolicies/:refundPolicyId","/refundpolicies/active","/refundpolicies/minpolicyapplyfromdate","/smsgatewaybalance","/tags","/tags/:tagId","/tags/:tagId/businesses","/tags/active","/tags/statuses","/tickets/:ticketId","/tickets/:ticketId/activities","/tickets/:ticketId/assignto/:userId","/tickets/:ticketId/assignto/me","/tickets/:ticketId/b2c","/tickets/:ticketId/pick","/tickets/statuses","/tickets/supportconversation/:ticketId","/tickets/supportconversation/:ticketId/after/:conversationEntryId","/tickets/supportconversation/b2c","/tickets/types","/tickets/_statistics","/users/badgecount","/users/business/:userId","/users/customers","/users/customers/:userId","/users/internals","/users/internals/:userId","/users/me","/users/me/email/sendverification","/users/me/email/verify","/users/me/orders","/users/me/orders/:orderId","/users/me/orders/:orderId/statuses","/users/me/orders/:orderRefId","/users/me/orders/:orderRefId/statuses","/users/me/phones","/users/me/phones/:userPhoneId/otp/resend","/users/statuses","/userTypes","/userTypes/internals","/vatStatuses","/accounting/paid/b2c","/accounting/payables/search","/accounting/receivables/search","/accounting/received","/accounting/received/refund","/accounting/received/search","/accounting/withdraws/:withdrawRequestId/approve","/analytics/businesses/mine/custom/order","/appversioning","/businesses","/businesses/:businessId/banks","/businesses/:businessId/checkopenfororder","/businesses/:businessId/floorplans","/businesses/:businessId/foods","/businesses/:businessId/foods/:foodId/addons","/businesses/:businessId/foods/search","/businesses/:businessId/orders/search","/businesses/:businessId/orders/specified","/businesses/:businessId/users","/businesses/accounting/mine/payables/search","/businesses/accounting/mine/receivables/search","/businesses/accounting/mine/withdraws","/businesses/accounting/prefeex/withdraws","/businesses/mine/banks","/businesses/mine/floorplans","/businesses/mine/foods","/businesses/mine/foods/:foodId/addons","/businesses/mine/foods/search","/businesses/mine/orders/search","/businesses/mine/orders/specified","/businesses/mine/users","/businesses/sales","/businesses/sales/:businessId/banks","/businesses/sales/:businessId/floorplans","/businesses/sales/:businessId/users","/businesses/sales/search","/businesses/search","/businesses/search/b2c","/emails/templates","/facilities","/facilities/groups","/foods/addons/statuses","/foods/addons/types","/foods/statuses","/foods/types","/login","/login/facebook","/login/google","/marketing/pushnotifications","/marketing/pushnotifications/search","/orderpromotions","/orders/:orderId/cancel","/orders/:orderId/decline","/orders/:orderRefId/cancel","/orders/:orderRefId/decline","/orders/restaurant","/orders/search","/payments/sslcommerz/ipn","/promotions/b2c","/promotions/personal","/promotions/public","/promotions/search","/pushtokens","/recoverpassword/email","/refundpolicies","/tags","/tags/filtered","/tickets/:ticketId/activities","/tickets/filtered","/tickets/supportconversation","/tickets/supportconversation/:ticketId","/tickets/supportconversation/:ticketId/b2c","/tickets/supportconversation/:ticketId/support","/upload","/users","/users/customers/search","/users/internals","/users/internals/search","/users/me/locations","/users/me/phones","/users/me/phones/:userPhoneId/otp/verify","/acl","/appversioning/:appVersioningId","/businesses/:businessId","/businesses/:businessId/banks/:bankInfoId","/businesses/:businessId/floorplans/:floorPlanId","/businesses/:businessId/floorplans/:floorPlanId/status","/businesses/:businessId/floorplans/:floorPlanId/tables/delete","/businesses/:businessId/foods/:foodId/addons/:addonId","/businesses/:businessId/foods/:foodMenuId","/businesses/:businessId/hours","/businesses/:businessId/hours/","/businesses/:businessId/sales","/businesses/:businessId/users/:userId","/businesses/mine","/businesses/mine/banks/:bankInfoId","/businesses/mine/floorplans/:floorPlanId","/businesses/mine/floorplans/:floorPlanId/status","/businesses/mine/floorplans/:floorPlanId/tables/delete","/businesses/mine/foods/:foodId/addons/:addonId","/businesses/mine/foods/:foodMenuId","/businesses/mine/hours","/businesses/mine/users/:userId","/businesses/sales/:businessId","/businesses/sales/:businessId/banks/:bankInfoId","/businesses/sales/:businessId/floorplans/:floorPlanId","/businesses/sales/:businessId/floorplans/:floorPlanId/status","/businesses/sales/:businessId/floorplans/:floorPlanId/tables/delete","/businesses/sales/:businessId/hours","/businesses/sales/:businessId/users/:userId","/emails/templates/:emailTemplateId","/facilities/:facilityId","/facilities/groups/:facilityGroupId","/marketing/pushnotifications/:notificationId","/marketing/pushnotifications/:notificationId/cancel","/orderpromotions/settle","/promotions/:promotionId","/promotions/:promotionId/newuser","/promotions/b2c/:promotionId/attachorder","/promotions/b2c/detachorder","/publicnotifications/:userPublicNotificationId/seen","/ratings/:ratingId/mine","/ratings/:ratingId/mine/skipped","/recoverpassword","/smsgatewaybalance","/tags/:tagId","/tickets/:ticketId/wait","/tickets/supportconversation/:ticketId/resolve","/users/customers/:userId","/users/internals/:userId","/users/me","/users/me/password"];
console.log(endpoints.length);
function Node(key) {
this.key = key
this.childs = []
this.variableChildNode = null
}
function constructRouteTree(root, endpoints) {
for(let index = 0; index < endpoints.length; index++) {
const endpoint = endpoints[index];
insertEndpoint(root, endpoint);
}
}
function insertEndpoint(node, endpoint) {
let tempNode = node;
const parts = endpoint.split("/").filter(item => item !== "")
for(let index = 0; index < parts.length; index++) {
const part = parts[index];
// Decide next child node to be selected.
let childNode
if(part.startsWith(":")) {
// variable part
childNode = tempNode.variableChildNode
if(!childNode) {
childNode = new Node(part)
tempNode.variableChildNode = childNode
}
} else {
// fixed part
childNode = findChildNodeOfKey(tempNode, part)
if(!childNode) {
childNode = new Node(part)
tempNode.childs.push(childNode)
}
}
tempNode = childNode
}
}
function findChildNodeOfKey(node, key) {
return node.childs.find(cnode => cnode.key === key)
}
const routeRoot = new Node("/")
constructRouteTree(routeRoot, endpoints)
console.log(JSON.stringify(routeRoot));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment