From 06303b9fc5eaa5bb6540bee11818a1b9fc0a426f Mon Sep 17 00:00:00 2001 From: Relism Date: Sun, 2 Mar 2025 19:45:48 +0000 Subject: [PATCH] deploy: 6c929163f8341377dd071081c61417f6788caec1 --- 404.html | 2 +- ...ler-default-implementations.md.CRxyEpV6.js | 102 ++++++++++++++++++ ...efault-implementations.md.CRxyEpV6.lean.js | 102 ++++++++++++++++++ assets/hdi.CNuX0-qb.png | Bin 0 -> 114080 bytes flash/advanced/fullstack-development.html | 2 +- .../handler-default-implementations.html | 61 ++++------- flash/core-concepts/handlers.html | 2 +- flash/core-concepts/request-handler.html | 2 +- flash/core-concepts/request-response.html | 2 +- flash/core-concepts/server-router.html | 2 +- flash/core-concepts/websockets.html | 2 +- flash/file-serving/dynamic-file-server.html | 2 +- flash/file-serving/static-file-server.html | 2 +- flash/index.html | 2 +- flash/introduction/installation.html | 2 +- hashmap.json | 2 +- index.html | 2 +- mobot/index.html | 2 +- serverlibraries/index.html | 2 +- 19 files changed, 242 insertions(+), 53 deletions(-) create mode 100644 assets/flash_advanced_handler-default-implementations.md.CRxyEpV6.js create mode 100644 assets/flash_advanced_handler-default-implementations.md.CRxyEpV6.lean.js create mode 100644 assets/hdi.CNuX0-qb.png diff --git a/404.html b/404.html index 47f6ec2..0724981 100644 --- a/404.html +++ b/404.html @@ -17,7 +17,7 @@
- + \ No newline at end of file diff --git a/assets/flash_advanced_handler-default-implementations.md.CRxyEpV6.js b/assets/flash_advanced_handler-default-implementations.md.CRxyEpV6.js new file mode 100644 index 0000000..47887c4 --- /dev/null +++ b/assets/flash_advanced_handler-default-implementations.md.CRxyEpV6.js @@ -0,0 +1,102 @@ +import{_ as i,c as a,a0 as n,o as t}from"./chunks/framework.p2VkXzrt.js";const e="/assets/hdi.CNuX0-qb.png",h="/assets/hdichain.FX-X2Mhu.png",c=JSON.parse('{"title":"⚡ Handler Default Implementations (HDI)","description":"","frontmatter":{"banner_title":"Flash - Handler Default Implementations","banner_description":"Leverage HDIs for cleaner and more maintainable route logic.","head":[["meta",{"name":"twitter:image","content":"/assets/banner-cards/flash-advanced-handler-default-implementations.png"}],["meta",{"name":"twitter:image:src","content":"https://docs.pixel-services.com/assets/banner-cards/flash-advanced-handler-default-implementations.png"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:height","content":"1280"}],["meta",{"name":"twitter:image:width","content":"669"}],["meta",{"name":"twitter:description","content":""}]]},"headers":[],"relativePath":"flash/advanced/handler-default-implementations.md","filePath":"flash/advanced/handler-default-implementations.md"}'),l={name:"flash/advanced/handler-default-implementations.md"};function p(k,s,r,d,E,o){return t(),a("div",null,s[0]||(s[0]=[n('

⚡ Handler Default Implementations (HDI)

Handler Default Implementations (HDIs) offer a streamlined approach to standardize common behaviors across request handlers in Flash. By extending a base RequestHandler (or chaining multiple base handlers), you can centralize tasks like authentication, user data retrieval, and rate limiting while keeping your code modular and maintainable.

HDIs use the Chain of Responsibility pattern to layer reusable logic, ensuring that shared functionality is defined once and inherited by all handlers.

HDI

🔗 How HDIs Work

Rather than repeating common logic across different handlers, HDIs allow you to create abstract base handlers that encapsulate shared behaviors. When your individual request handlers extend these bases, they automatically inherit predefined functionality, and you only need to implement request-specific logic.

Key Benefits

🛡️ HDI Design Guidelines

1. Base HDI Class

Define an abstract base class that extends RequestHandler to encapsulate common logic:

2. Concrete Handler Implementation

Extend the base HDI class in your handler:

🛠️ Example: API Key Authentication

This example demonstrates how to build an HDI that validates an API key before processing a request.

Abstract API Key Protected Handler

java
public abstract class APIKeyProtectedHandler extends RequestHandler {
+    protected String apiKey;
+
+    public APIKeyProtectedHandler(Request req, Response res) {
+        super(req, res);
+    }
+
+    @Override
+    public Object handle() {
+        apiKey = req.header("X-API-Key");
+        if (apiKey == null || !isValidApiKey(apiKey)) {
+            res.status(403);
+            res.type("application/json");
+            return "{\\"error\\":\\"Invalid API Key\\"}";
+        }
+        return handleAuthorized();
+    }
+
+    protected abstract Object handleAuthorized();
+
+    private boolean isValidApiKey(String key) {
+        // Implement your API key validation logic here
+        return true;
+    }
+}

Concrete API Handler

Extend the abstract handler to process the request only if the API key is valid:

java
@RouteInfo(endpoint = "/data", method = HttpMethod.GET)
+public class GetDataHandler extends APIKeyProtectedHandler {
+    public GetDataHandler(Request req, Response res) {
+        super(req, res);
+    }
+
+    @Override
+    protected Object handleAuthorized() {
+        res.type("application/json");
+        return "{\\"data\\":\\"Your API response here\\"}";
+    }
+}

🏗️ Chaining HDIs for Modular Logic

HDIs can be layered to build complex flows. For instance, you might first authenticate a request, then fetch user data.

Protected Handler (Authentication)

java
public abstract class ProtectedHandler extends RequestHandler {
+    protected String authToken;
+
+    public ProtectedHandler(Request req, Response res) {
+        super(req, res);
+    }
+
+    @Override
+    public Object handle() {
+        authToken = req.header("Authorization");
+        if (authToken == null || !isValidToken(authToken)) {
+            res.status(401);
+            res.type("application/json");
+            return "{\\"error\\":\\"Unauthorized\\"}";
+        }
+        return handleAuthenticated();
+    }
+
+    protected abstract Object handleAuthenticated();
+
+    private boolean isValidToken(String token) {
+        // Validate the token here
+        return true;
+    }
+}

Authenticated Handler (User Data Retrieval)

Extend the ProtectedHandler to fetch user details:

java
public abstract class AuthenticatedHandler extends ProtectedHandler {
+    protected User user;
+
+    public AuthenticatedHandler(Request req, Response res) {
+        super(req, res);
+    }
+
+    @Override
+    protected Object handleAuthenticated() {
+        user = getUserFromDatabase(authToken);
+        if (user == null) {
+            res.status(403);
+            res.type("application/json");
+            return "{\\"error\\":\\"User not found\\"}";
+        }
+        return handleWithUser();
+    }
+
+    protected abstract Object handleWithUser();
+}

Final Handler Implementation

Implement the final handler that uses the authenticated user data:

java
@RouteInfo(endpoint = "/profile", method = HttpMethod.GET)
+public class UserProfileHandler extends AuthenticatedHandler {
+    public UserProfileHandler(Request req, Response res) {
+        super(req, res);
+    }
+
+    @Override
+    protected Object handleWithUser() {
+        res.type("application/json");
+        return "{\\"username\\":\\"" + user.getUsername() + "\\"}";
+    }
+}

For reference, here's a visual representation of how an HDI chain operates:

HDI Chain

',35)]))}const y=i(l,[["render",p]]);export{c as __pageData,y as default}; diff --git a/assets/flash_advanced_handler-default-implementations.md.CRxyEpV6.lean.js b/assets/flash_advanced_handler-default-implementations.md.CRxyEpV6.lean.js new file mode 100644 index 0000000..47887c4 --- /dev/null +++ b/assets/flash_advanced_handler-default-implementations.md.CRxyEpV6.lean.js @@ -0,0 +1,102 @@ +import{_ as i,c as a,a0 as n,o as t}from"./chunks/framework.p2VkXzrt.js";const e="/assets/hdi.CNuX0-qb.png",h="/assets/hdichain.FX-X2Mhu.png",c=JSON.parse('{"title":"⚡ Handler Default Implementations (HDI)","description":"","frontmatter":{"banner_title":"Flash - Handler Default Implementations","banner_description":"Leverage HDIs for cleaner and more maintainable route logic.","head":[["meta",{"name":"twitter:image","content":"/assets/banner-cards/flash-advanced-handler-default-implementations.png"}],["meta",{"name":"twitter:image:src","content":"https://docs.pixel-services.com/assets/banner-cards/flash-advanced-handler-default-implementations.png"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:height","content":"1280"}],["meta",{"name":"twitter:image:width","content":"669"}],["meta",{"name":"twitter:description","content":""}]]},"headers":[],"relativePath":"flash/advanced/handler-default-implementations.md","filePath":"flash/advanced/handler-default-implementations.md"}'),l={name:"flash/advanced/handler-default-implementations.md"};function p(k,s,r,d,E,o){return t(),a("div",null,s[0]||(s[0]=[n('

⚡ Handler Default Implementations (HDI)

Handler Default Implementations (HDIs) offer a streamlined approach to standardize common behaviors across request handlers in Flash. By extending a base RequestHandler (or chaining multiple base handlers), you can centralize tasks like authentication, user data retrieval, and rate limiting while keeping your code modular and maintainable.

HDIs use the Chain of Responsibility pattern to layer reusable logic, ensuring that shared functionality is defined once and inherited by all handlers.

HDI

🔗 How HDIs Work

Rather than repeating common logic across different handlers, HDIs allow you to create abstract base handlers that encapsulate shared behaviors. When your individual request handlers extend these bases, they automatically inherit predefined functionality, and you only need to implement request-specific logic.

Key Benefits

🛡️ HDI Design Guidelines

1. Base HDI Class

Define an abstract base class that extends RequestHandler to encapsulate common logic:

2. Concrete Handler Implementation

Extend the base HDI class in your handler:

🛠️ Example: API Key Authentication

This example demonstrates how to build an HDI that validates an API key before processing a request.

Abstract API Key Protected Handler

java
public abstract class APIKeyProtectedHandler extends RequestHandler {
+    protected String apiKey;
+
+    public APIKeyProtectedHandler(Request req, Response res) {
+        super(req, res);
+    }
+
+    @Override
+    public Object handle() {
+        apiKey = req.header("X-API-Key");
+        if (apiKey == null || !isValidApiKey(apiKey)) {
+            res.status(403);
+            res.type("application/json");
+            return "{\\"error\\":\\"Invalid API Key\\"}";
+        }
+        return handleAuthorized();
+    }
+
+    protected abstract Object handleAuthorized();
+
+    private boolean isValidApiKey(String key) {
+        // Implement your API key validation logic here
+        return true;
+    }
+}

Concrete API Handler

Extend the abstract handler to process the request only if the API key is valid:

java
@RouteInfo(endpoint = "/data", method = HttpMethod.GET)
+public class GetDataHandler extends APIKeyProtectedHandler {
+    public GetDataHandler(Request req, Response res) {
+        super(req, res);
+    }
+
+    @Override
+    protected Object handleAuthorized() {
+        res.type("application/json");
+        return "{\\"data\\":\\"Your API response here\\"}";
+    }
+}

🏗️ Chaining HDIs for Modular Logic

HDIs can be layered to build complex flows. For instance, you might first authenticate a request, then fetch user data.

Protected Handler (Authentication)

java
public abstract class ProtectedHandler extends RequestHandler {
+    protected String authToken;
+
+    public ProtectedHandler(Request req, Response res) {
+        super(req, res);
+    }
+
+    @Override
+    public Object handle() {
+        authToken = req.header("Authorization");
+        if (authToken == null || !isValidToken(authToken)) {
+            res.status(401);
+            res.type("application/json");
+            return "{\\"error\\":\\"Unauthorized\\"}";
+        }
+        return handleAuthenticated();
+    }
+
+    protected abstract Object handleAuthenticated();
+
+    private boolean isValidToken(String token) {
+        // Validate the token here
+        return true;
+    }
+}

Authenticated Handler (User Data Retrieval)

Extend the ProtectedHandler to fetch user details:

java
public abstract class AuthenticatedHandler extends ProtectedHandler {
+    protected User user;
+
+    public AuthenticatedHandler(Request req, Response res) {
+        super(req, res);
+    }
+
+    @Override
+    protected Object handleAuthenticated() {
+        user = getUserFromDatabase(authToken);
+        if (user == null) {
+            res.status(403);
+            res.type("application/json");
+            return "{\\"error\\":\\"User not found\\"}";
+        }
+        return handleWithUser();
+    }
+
+    protected abstract Object handleWithUser();
+}

Final Handler Implementation

Implement the final handler that uses the authenticated user data:

java
@RouteInfo(endpoint = "/profile", method = HttpMethod.GET)
+public class UserProfileHandler extends AuthenticatedHandler {
+    public UserProfileHandler(Request req, Response res) {
+        super(req, res);
+    }
+
+    @Override
+    protected Object handleWithUser() {
+        res.type("application/json");
+        return "{\\"username\\":\\"" + user.getUsername() + "\\"}";
+    }
+}

For reference, here's a visual representation of how an HDI chain operates:

HDI Chain

',35)]))}const y=i(l,[["render",p]]);export{c as __pageData,y as default}; diff --git a/assets/hdi.CNuX0-qb.png b/assets/hdi.CNuX0-qb.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d1b81b398dd550815f7cf399dbf4153c68e1cd GIT binary patch literal 114080 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­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�X=(c)h+-=V0xW53YFjkbwkj=(THa?BKmx1u zLHayURJ{S_-=YA@D*LUcp|4L~dJYV{=aIg?;?e63Rz|(_-<#JPg`{0z)259db**2m z^dvdV<-P^p0)OBwxC2hSmfv?4B?n-rXao^FZ0FA9y3ceJ0xd^AW2ZUDOMR3qYJTqg z`FzkD7*C*=xxg{=vqYu?Un&B?_?0orkA~+zIk@RD=|!HX2TPxQ~caRI_4S4|q;~hp|DHgsz89><6a5a6b0q}YVxWA{I0`8%qqQ|@j4Qgi@ ze44)}Tov~gH7#O`zg858emA_gcxMCujV)B+w{Xi3q#vtp(cBfuXjHl^I)Q$?z-heF zyLBBP)9cW(kWM9znGa~0jsQd-;;;xP@jrV2;rfxS^EY(A4e{`%&G!#9D(4q^^cXsf z#CR$~HduZOnH~eR8XDY7fiYK#pCh0pJX03-*<>cHNr0^1HTz`J+H zNCOvSdcP;ppgp?oi}jpPK4T_KU)A*dUP0>U)Rza8NnjS|aRoZO-@>u!b|6>F$s?W` z9pJhA-gHF5W{rq)5Nxc94(ClTj?0(RgCYw?CnavD3N)0B4DY1`~+LNI%A%~aImw?YQ` zWx(5OUYu0eWvQK|V2}S*r%Td*F=7_A8lVDZceiUG|L5;@-XoV7m(rX75tm1bZF>xv z9nd3OAy*J%4Yv*5#q()vwBZv7y*uVEl9GUW@ITF61h9V??!9yu(yfKjm$eus-n*-* zh4b`8ag}6|3NlIy0w10oCi*3-GYo^Y^4Plny)g$C=06IQ`(UB3n=%pBxDY9I*hCL+PG0 z{~Lt@@0(A)l!zBNVx~gIdkp2WB1xAg7K0)a1g(1(e zJ-Yjq%H_c?s8TCa^^cjPoPOZ8WdK(|m*&f!OEUV>&1O{O3E$1+RU~8H^x1{sMTz|MneniRShpms!}LSigT?TubW9 z?K!br*VOH=B>IU z=48>FxUeuGHhoo_rD3C#*KI<^pI?F)L~F)>m+lbj)I@E3XHuW~ScUoVChx^D99#}K zIA}}i_~WWxLSm2AfaB=M!V~!ZJ~QL>>=$BeH!RE;G!hMe(wGEy@3R$~nS3uY)cZ7; z*Oy8MOl1FRO2Hvef`z91xemb(-2bYwX~%~9_miIX-T(Xk&nW!g server.start(); } }

With the frontend and backend code in place, you can now build the JAR file and deploy it to your server. The JAR file will contain both the frontend and backend code, making it easy to deploy and run your fullstack application.

All you've left to do is run the jarfile on any machine that has Java installed, and your fullstack application will be up and running!

- + \ No newline at end of file diff --git a/flash/advanced/handler-default-implementations.html b/flash/advanced/handler-default-implementations.html index 638b8ac..ef462f8 100644 --- a/flash/advanced/handler-default-implementations.html +++ b/flash/advanced/handler-default-implementations.html @@ -13,7 +13,7 @@ - + @@ -25,36 +25,19 @@ -
Skip to content

⚡ Handler Default Implementations (HDI)

Handler Default Implementations (HDIs) provide an elegant way to standardize common behaviors across multiple request handlers. By defining base handlers that extend RequestHandler (or chaining multiple base handlers together), you can modularize logic for common tasks like authentication, user data retrieval, and rate limiting.

HDIs are designed using the Chain of Responsibility pattern, making it easy to handle requests with layered logic.

🔗 How It Works

Instead of repeating the same logic in each handler, create abstract handler classes that define common functionality. Your handler implementations then extend these base classes, inheriting the shared behavior while implementing the request-specific logic.

Semantics of an HDI

Creating an HDI is simple, but it's useful to follow some guidelines for clarity and maintainability:

  1. Base HDI Class:

    • Extends: The base HDI class should extend RequestHandler.
    • Constructor: The constructor must call the super constructor with Request and Response objects.
    • Override: Override the handle method to include common behavior. The handle method should return the response to the client and should call the Abstract Handler Method, which is implemented by the handler or next HDI in the chain.
      java
      @Override
      +    
      Skip to content

      ⚡ Handler Default Implementations (HDI)

      Handler Default Implementations (HDIs) offer a streamlined approach to standardize common behaviors across request handlers in Flash. By extending a base RequestHandler (or chaining multiple base handlers), you can centralize tasks like authentication, user data retrieval, and rate limiting while keeping your code modular and maintainable.

      HDIs use the Chain of Responsibility pattern to layer reusable logic, ensuring that shared functionality is defined once and inherited by all handlers.

      HDI

      🔗 How HDIs Work

      Rather than repeating common logic across different handlers, HDIs allow you to create abstract base handlers that encapsulate shared behaviors. When your individual request handlers extend these bases, they automatically inherit predefined functionality, and you only need to implement request-specific logic.

      Key Benefits

      • Build-Time Optimization:
        When your project is compiled, Flash’s router merges the entire HDI chain into a single handler instance. This eliminates extra function calls and runtime lookups, resulting in a leaner execution path compared to traditional middleware stacks.

      • Reduced Complexity:
        Unlike frameworks that rely on reflection (e.g., Spring Boot) or a deep middleware stack (e.g., Express.js), HDIs embed inherited behavior directly in the compiled class, minimizing runtime overhead.

      • Type Safety & Clean State Management:
        Protected fields in HDIs allow seamless data sharing between handlers without using global variables, callbacks, or type casting. Note: Always declare these fields as instance (non-static) variables to ensure each handler maintains its own state.

      🛡️ HDI Design Guidelines

      1. Base HDI Class

      Define an abstract base class that extends RequestHandler to encapsulate common logic:

      • Constructor:
        Initialize by passing Request and Response objects to the superclass.

      • Overridden handle Method:
        Implement common logic and delegate to an abstract method for custom behavior.

        java
        @Override
         public Object handle() {
        -    // Common logic here, then call the abstract method
        +    // Insert common logic here (e.g., logging, header processing)
             return handleCustom();
        -}
      • Abstract Handler Method: Define an abstract method that must be implemented by the handler to provide custom logic. It should look like this:
        java
        protected abstract Object handleCustom();
      • Protected Fields: If needed, declare protected fields in the base class to pass data between handlers in the chain.

        INFO

        Protected fields are accessible to the handler implementation inside the Abstract Handler Method. Example HDI :

        java
        public abstract class MyHDI extends RequestHandler {
        -    protected String data; 
        -    public BaseHandler(Request req, Response res) {
        -        super(req, res);
        -    }
        -    @Override
        -    public Object handle() {
        -        data = "Some data"; // Set the data
        -        return handleCustom();
        -    }
        -    protected abstract Object handleCustom();
        -}

        Example Handler Implementation :

        java
        public class MyHandler extends MyHDI {
        -    public MyHandler(Request req, Response res) {
        -        super(req, res);
        -    }
        -    @Override
        -    protected Object handleCustom() {
        -        // The data is accessible here
        -        System.out.println(data);
        -        return "Response";
        -    }
        -}
    • Handler Implementation:

      • Extends: The handler should extend the HDI class (or be the final handler in the chain).
      • Constructor: The constructor should call the super constructor with Request and Response objects.
      • Implement: Implement the Abstract Handler Method from the HDI.
      • Response Logic: The response logic should be in the abstract method, and its return value is sent to the client.
        java
        @Override
        +}
      • Abstract Method:
        Declare an abstract method that must be implemented by subclasses.

        java
        protected abstract Object handleCustom();
      • Protected Fields:
        Use protected instance fields to share data between HDI layers.

        Warning: Do not declare these fields as static. Each handler should manage its own state.

        java
        // Incorrect: static field
        +protected static String data;
        +
        +// Correct: instance field
        +protected String data;

      2. Concrete Handler Implementation

      Extend the base HDI class in your handler:

      • Constructor:
        Call the super constructor with the necessary Request and Response objects.

      • Implement handleCustom():
        Write the request-specific logic here. Protected fields from the base class are available within this method.

        java
        @Override
         protected Object handleCustom() {
        -      // Custom logic here
        -      return "Response";
        -}
      • Protected Fields: The handler implementation can access data from the HDI using the protected fields, inside the Abstract Handler Method.

🛠 Example: API Key Authentication

Now let's go over a simple example to demonstrate how HDIs work. Imagine you need to authenticate API requests by checking an API key. You can create an abstract APIKeyProtectedHandler that extends RequestHandler and handles the API key authentication:

java
public abstract class APIKeyProtectedHandler extends RequestHandler {
+    // Custom logic using inherited data
+    return "Response";
+}

🛠️ Example: API Key Authentication

This example demonstrates how to build an HDI that validates an API key before processing a request.

Abstract API Key Protected Handler

java
public abstract class APIKeyProtectedHandler extends RequestHandler {
     protected String apiKey;
 
     public APIKeyProtectedHandler(Request req, Response res) {
@@ -64,23 +47,21 @@
     @Override
     public Object handle() {
         apiKey = req.header("X-API-Key");
-
         if (apiKey == null || !isValidApiKey(apiKey)) {
             res.status(403);
             res.type("application/json");
             return "{\"error\":\"Invalid API Key\"}";
         }
-
         return handleAuthorized();
     }
 
     protected abstract Object handleAuthorized();
 
     private boolean isValidApiKey(String key) {
-        // Implement key validation logic, e.g., checking against a database
+        // Implement your API key validation logic here
         return true;
     }
-}

Now, your API handler implementation only need to extend APIKeyProtectedHandler, ensuring every request has a valid API key before executing its logic:

java
@RouteInfo(endpoint = "/data", method = HttpMethod.GET)
+}

Concrete API Handler

Extend the abstract handler to process the request only if the API key is valid:

java
@RouteInfo(endpoint = "/data", method = HttpMethod.GET)
 public class GetDataHandler extends APIKeyProtectedHandler {
     public GetDataHandler(Request req, Response res) {
         super(req, res);
@@ -91,7 +72,7 @@
         res.type("application/json");
         return "{\"data\":\"Your API response here\"}";
     }
-}

🏗️ Chaining HDIs for Modular Logic

HDI Chain

HDIs can be chained together to create multiple layers of logic. For example, if you need to authenticate a user and fetch their data from a database, you can create two HDIs:

  • ProtectedHandler ensures authentication.
java
public abstract class ProtectedHandler extends RequestHandler {
+}

🏗️ Chaining HDIs for Modular Logic

HDIs can be layered to build complex flows. For instance, you might first authenticate a request, then fetch user data.

Protected Handler (Authentication)

java
public abstract class ProtectedHandler extends RequestHandler {
     protected String authToken;
 
     public ProtectedHandler(Request req, Response res) {
@@ -110,9 +91,13 @@
     }
 
     protected abstract Object handleAuthenticated();
-}
  • AuthenticatedHandler extends ProtectedHandler to fetch user data from the database, and overrides handleAuthenticated to ensure the user is authenticated before proceeding.
java
public abstract class AuthenticatedHandler extends ProtectedHandler {
+
+    private boolean isValidToken(String token) {
+        // Validate the token here
+        return true;
+    }
+}

Authenticated Handler (User Data Retrieval)

Extend the ProtectedHandler to fetch user details:

java
public abstract class AuthenticatedHandler extends ProtectedHandler {
     protected User user;
-    private String authToken; // inherited from ProtectedHandler
 
     public AuthenticatedHandler(Request req, Response res) {
         super(req, res);
@@ -130,7 +115,7 @@
     }
 
     protected abstract Object handleWithUser();
-}
  • Your handler implementation UserProfileHandler extends AuthenticatedHandler and implements handleWithUser to ensure the user is authenticated and their profile data has been fetched before proceeding.
java
@RouteInfo(endpoint = "/profile", method = HttpMethod.GET)
+}

Final Handler Implementation

Implement the final handler that uses the authenticated user data:

java
@RouteInfo(endpoint = "/profile", method = HttpMethod.GET)
 public class UserProfileHandler extends AuthenticatedHandler {
     public UserProfileHandler(Request req, Response res) {
         super(req, res);
@@ -141,8 +126,8 @@
         res.type("application/json");
         return "{\"username\":\"" + user.getUsername() + "\"}";
     }
-}
- +}

For reference, here's a visual representation of how an HDI chain operates:

HDI Chain

+ \ No newline at end of file diff --git a/flash/core-concepts/handlers.html b/flash/core-concepts/handlers.html index 29c8b0c..0978434 100644 --- a/flash/core-concepts/handlers.html +++ b/flash/core-concepts/handlers.html @@ -28,7 +28,7 @@
Skip to content

📚 Handlers

In Flash, handlers are the building blocks of your application logic. They are responsible for processing incoming requests, executing the necessary logic, and generating the appropriate response.

There are several types of handlers in Flash, each serving a specific purpose and providing a different level of control over the request lifecycle. Understanding the different handler types will help you structure your application logic more effectively and make the most out of Flash's powerful routing system.

📦 Routing Behavior

Before diving into the different handler types, it's essential to understand how routing works in Flash. When a request is received by the server, Flash matches the request path and method against the registered routes to find the appropriate handler. The handler is then executed, and its response is sent back to the client.

Flash supports 3 main types of routing behaviors:

  • Literal Routing: Matches the exact path specified in the route definition.
  • Parametrized Routing: Matches paths with dynamic segments that are extracted as route parameters.
  • Dynamic Routing: Matches any path that starts with the specified prefix and is flagged with a wildcard "*" character.

📌 Handler Types

1. RequestHandler

The RequestHandler is the "standard" type of handler in Flash, it provides the most control over the request lifecycle and allows you to define custom logic for handling requests. You can extend the RequestHandler class to create custom handlers that process incoming requests and generate responses.

Because RequestHandler is an abstract class, you need to implement both the handle() method and the super constructor in your custom handler to define the logic that should be executed when a request is received.

Since RequestHandler is an abstract class, you can leverage and chain HDI's to create cleaner and more maintainable route logic (more on that in the Handler Default Implementations guide).

2. SimpleHandler

The SimpleHandler is a lightweight handler that allows you to define request handling logic in a single method using lambda notation. It is useful for simple request processing tasks that don't require the full lifecycle control provided by RequestHandler.

To create a SimpleHandler, you can use the server.get(), server.post(), server.put(), server.delete() etc. in general, you can use the server.<METHOD>() methods to register the handler with the server.

The arguments for these methods are the route path and a lambda expression that provides the request and response objects and defines the request handling logic.

java
server.get("/hello", (req, res) -> {
     return "Hello, World!";
 });

Both RequestHandler and SimpleHandler can specify the router behavior by the naming convention of the endpoint used to register the handler.

  • Literal Routing: /hello
    Will match exactly /hello

  • Parametrized Routing: /hello/:name
    Will match /hello/John, /hello/Alice, etc.

  • Dynamic Routing: /hello/*
    Will match /hello/../..

- + \ No newline at end of file diff --git a/flash/core-concepts/request-handler.html b/flash/core-concepts/request-handler.html index c63a416..3e532c5 100644 --- a/flash/core-concepts/request-handler.html +++ b/flash/core-concepts/request-handler.html @@ -37,7 +37,7 @@ return response; } }

WARNING

Any logic that needs to be executed before the request handler is registered must be done within the constructor.

Request Handler methods

The RequestHandler class provides several methods that can be used to interact with the request and response objects easily and safely. Following are listed the methods available in the RequestHandler class, with a brief description of their purpose:

MethodParamsDescription
getRequestBody()noneReturns a JSONObject representation of the request body.
getSpecification()noneReturns an instance of HandlerSpecification containing all sorts of information about the handler.
expectedRequestParameter()String name, descriptionReturns an instance of ExpectedRequestParameter for the specified parameter name.
expectedBodyField()String name, descriptionReturns an instance of ExpectedBodyField for the specified field name.
expectedBodyFile()String name, descriptionReturns an instance of ExpectedBodyFile for the specified file name.

(More on the ExpectedRequestParameter, ExpectedBodyField, and ExpectedBodyFile classes in the next section).

- + \ No newline at end of file diff --git a/flash/core-concepts/request-response.html b/flash/core-concepts/request-response.html index 4cb8341..3c8d65a 100644 --- a/flash/core-concepts/request-response.html +++ b/flash/core-concepts/request-response.html @@ -92,7 +92,7 @@ return "File saved at: " + myFile.getAbsolutePath(); } }

This time, you will need to use a tool like Postman to send a POST request to /helloFile with a multipart form data body containing a file named myFile. You should receive a response like File saved at: <path> where <path> is the location where the server saved the file.

- + \ No newline at end of file diff --git a/flash/core-concepts/server-router.html b/flash/core-concepts/server-router.html index 93f238e..9d2afe0 100644 --- a/flash/core-concepts/server-router.html +++ b/flash/core-concepts/server-router.html @@ -49,7 +49,7 @@ return response; } }

In the example above, we create an /api router and register the MyHandler class to handle requests on the /api/hello endpoint.

This is because the path property of the RouteInfo annotation is relative to the base path of the router, which in this case is /api.

Visiting /api/hello from your browser will result in the response Hello, world!.

- + \ No newline at end of file diff --git a/flash/core-concepts/websockets.html b/flash/core-concepts/websockets.html index 5038e03..095b041 100644 --- a/flash/core-concepts/websockets.html +++ b/flash/core-concepts/websockets.html @@ -58,7 +58,7 @@ server.start(); } }

Interacting with Websockets sessions

The WebSocketSession object provides methods to interact with the Websocket session, such as sending messages, closing the connection, and getting the remote address and session ID.

MethodParamsDescription
getChannel()noneReturns an instance of AsynchronousSocketChannel useful for retrieving info about the client .
getRequestInfo()noneReturns an instance of RequestInfo containing all sorts of information about the request (headers, method, path etc.) .
getPath()noneReturns the path to the websocket endpoint as a String.
getId()noneReturns the id of the websocket session as a String, useful if you want to keep track of the connected clients in a custom manager.
getBuffer()noneReturns the ByteBuffer for that session.
sendMessage()String messageSends the message to the client as a String. it's up to the developer to stringify and de-stringify any data you want to send back and forth
close()noneCloses the websocket session.

NOTE

WebsocketHandler includes a setId(String id) method for overriding the default session ID. Unless you have a specific reason to change it, it's best to leave it as is.

Similarly, the setBuffer(ByteBuffer buffer) method allows you to override the default buffer. If you're unsure about this, it's recommended to keep the default setting.

- + \ No newline at end of file diff --git a/flash/file-serving/dynamic-file-server.html b/flash/file-serving/dynamic-file-server.html index edc2fe7..0cc10c9 100644 --- a/flash/file-serving/dynamic-file-server.html +++ b/flash/file-serving/dynamic-file-server.html @@ -53,7 +53,7 @@ )); } } - + \ No newline at end of file diff --git a/flash/file-serving/static-file-server.html b/flash/file-serving/static-file-server.html index 9c8b809..9763cb6 100644 --- a/flash/file-serving/static-file-server.html +++ b/flash/file-serving/static-file-server.html @@ -53,7 +53,7 @@ )); } } - + \ No newline at end of file diff --git a/flash/index.html b/flash/index.html index c4927e4..2426794 100644 --- a/flash/index.html +++ b/flash/index.html @@ -26,7 +26,7 @@
Skip to content

⚡ Flash

Flash is a simple, modern and fast expressive web framework written in Java. The project is maintained by Pixel Services and the open-source community.

- + \ No newline at end of file diff --git a/flash/introduction/installation.html b/flash/introduction/installation.html index 81caaf8..c5ff8b6 100644 --- a/flash/introduction/installation.html +++ b/flash/introduction/installation.html @@ -44,7 +44,7 @@ }
  • And the dependency :

    groovy
    dependencies {
         implementation 'com.pixelservices:flash:{{ latestVersion }}'
     }
  • ⚡ Latest version:
    - + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 2b90f06..c82016d 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"flash_advanced_fullstack-development.md":"DFJ2Nfm_","flash_advanced_handler-default-implementations.md":"ki9D2CCK","flash_core-concepts_handlers.md":"BZuBmBSX","flash_core-concepts_request-handler.md":"fjZWLpOw","flash_core-concepts_request-response.md":"BuTSfkDO","flash_core-concepts_server-router.md":"DIWo49Yl","flash_core-concepts_websockets.md":"ByGVX96c","flash_file-serving_dynamic-file-server.md":"DY_r4ecH","flash_file-serving_static-file-server.md":"BvN0FZB2","flash_index.md":"CAxgiNVz","flash_introduction_installation.md":"BEOKwAAp","index.md":"sDYgKdFh","mobot_index.md":"Be0Zoetq","serverlibraries_index.md":"CeIqSPIs"} +{"flash_advanced_fullstack-development.md":"DFJ2Nfm_","flash_advanced_handler-default-implementations.md":"CRxyEpV6","flash_core-concepts_handlers.md":"BZuBmBSX","flash_core-concepts_request-handler.md":"fjZWLpOw","flash_core-concepts_request-response.md":"BuTSfkDO","flash_core-concepts_server-router.md":"DIWo49Yl","flash_core-concepts_websockets.md":"ByGVX96c","flash_file-serving_dynamic-file-server.md":"DY_r4ecH","flash_file-serving_static-file-server.md":"BvN0FZB2","flash_index.md":"CAxgiNVz","flash_introduction_installation.md":"BEOKwAAp","index.md":"sDYgKdFh","mobot_index.md":"Be0Zoetq","serverlibraries_index.md":"CeIqSPIs"} diff --git a/index.html b/index.html index c2d93b1..ac8359e 100644 --- a/index.html +++ b/index.html @@ -26,7 +26,7 @@
    Skip to content

    Pixel Services Documentation

    Explore the documentation for all public Pixel Services projects




    Our Team

    Say hello to the Pixel Services team !

    Relism

    Relism

    Backend Developer

    Sieadev

    Sieadev

    Developer

    - + \ No newline at end of file diff --git a/mobot/index.html b/mobot/index.html index fc16109..3d21e59 100644 --- a/mobot/index.html +++ b/mobot/index.html @@ -26,7 +26,7 @@
    Skip to content
    - + \ No newline at end of file diff --git a/serverlibraries/index.html b/serverlibraries/index.html index c26d13f..99bef75 100644 --- a/serverlibraries/index.html +++ b/serverlibraries/index.html @@ -26,7 +26,7 @@
    Skip to content
    - + \ No newline at end of file

    🚀 Package and Deploy your app!