Handle EzyFox Server Client Request

1. Handle Request By Controller

In this way, a controller is a singleton instance, it means a controller is created one time when application start up. It's proper to handle many request in a group
import java.util.Set;

import com.tvd12.ezyfox.bean.annotation.EzyAutoBind;
import com.tvd12.ezyfox.binding.annotation.EzyObjectBinding;
import com.tvd12.ezyfox.core.annotation.EzyRequestController;
import com.tvd12.ezyfox.core.annotation.EzyDoHandle;
import com.tvd12.ezyfoxserver.entity.EzyUser;
import com.tvd12.ezyfoxserver.support.factory.EzyResponseFactory;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;

@Setter
@EzyRequestController("chat")
public class ChatController {

    @EzyAutoBind
    private EzyResponseFactory appResponseFactory; 
    
    @EzyDoHandle("sendMessageToMe")
    public Object sendMessageToMe(EzyUser user, SendMessageToOneRequest request) {
        return new SendMessageResponse(user.getName(), request.getMessage());
    }
    
    @EzyDoHandle("sendMessageToOne")
    public void sendMessageToOne(EzyUser user, SendMessageToOneRequest request) {
        appResponseFactory.newObjectResponse()
            .command("chat/sendMessage")
            .data(new SendMessageResponse(user.getName(), request.getMessage()))
            .username(request.getTo()) // send response to which user has that username
            .execute(); // execute to send response
            
    }
    
    @EzyDoHandle("sendMessageToGroup")
    public void sendMessageToGroup(EzyUser user, SendMessageToOneRequest request) {
        appResponseFactory.newObjectResponse()
            .command("chat/sendMessage")
            .data(new SendMessageResponse(user.getName(), request.getMessage()))
            .usernames(request.getTo()) // send response to a collection of users
            .execute(); // execute to send response
            
    }
    
    @Data
    @EzyObjectBinding(write = false)
    public static class SendMessageToOneRequest {
        private String to;
        private String message;
    }
    
    @Getter
    @EzyObjectBinding(read = false)
    @AllArgsConstructor
    public static class SendMessageResponse {
        private String from;
        private String message;
    }
    
    @Data
    @EzyObjectBinding(write = false)
    public static class SendMessageToGroupRequest {
        private Set<String> to;
        private String message;
    }
        
}
You can find out full source code in Simple Chat Example
You also can inject EzyAppContext, EzyUserSessionEvent and EzySession to your handler method like this:
@EzyDoHandle("sendMessageToOne")
public void sendMessageToOne(
        EzyAppContext context, // or EzyContext
        EzyUserSessionEvent event,
        EzyUser user,
        EzySession session,
        SendMessageToOneRequest request
) {
    // response
}
And if you don't need any component you can remove it, even all of them:
@EzyDoHandle("sendMessageToOne")
public void sendMessageToOne() {
    // do something
}
When do we use EzyUser?
An user has many sessions, so you can use EzyUser when you need send a response to all sessions of the user. Example, in a chat application, your user has many device and each device is a EzySession, so when there is a message come, you will broadcast the message to all session, so you will use EzyUser
When you just want to send response to exactly the requested session. Example, in a lucky wheel game, the requeste will come from a devide, and you need response exactly result to that devide, so you must use EzySession
When do we use EzySession?
In this way, a handler is a singleton instance, it means a handler is created one time when application start up. It's proper to handle a complicated request and you need a lot of Line of Codes to complete

2. Handle Request By Singleton Handler

import static com.example.simple_chat.constant.Commands.HELLO;

import com.example.simple_chat.common.Greeting;
import com.tvd12.ezyfox.bean.annotation.EzyAutoBind;
import com.tvd12.ezyfox.bean.annotation.EzyPrototype;
import com.tvd12.ezyfox.binding.annotation.EzyObjectBinding;
import com.tvd12.ezyfox.core.annotation.EzyRequestListener;
import com.tvd12.ezyfox.function.EzyHandler;
import com.tvd12.ezyfox.util.EzyLoggable;
import com.tvd12.ezyfoxserver.context.EzyAppContext;
import com.tvd12.ezyfoxserver.context.EzyAppContextAware;
import com.tvd12.ezyfoxserver.entity.EzySession;
import com.tvd12.ezyfoxserver.entity.EzySessionAware;
import com.tvd12.ezyfoxserver.entity.EzyUser;
import com.tvd12.ezyfoxserver.entity.EzyUserAware;
import com.tvd12.ezyfoxserver.support.factory.EzyResponseFactory;

import lombok.Setter;

@Setter
@EzyPrototype
@EzyObjectBinding // @EzyArrayBinding
@EzyRequestListener(HELLO)
public class HelloRequestHandler 
    extends EzyLoggable
    implements 
        EzyHandler,
        EzyAppContextAware, 
        EzySessionAware, 
        EzyUserAware {

    @EzyAutoBind
    protected Greeting greeting;
    
    @EzyAutoBind
    protected EzyResponseFactory appResponseFactory;
    
    protected EzyUser user;
    protected EzySession session;
    protected EzyAppContext appContext;
    
    protected String who;
    
    @Override
    public void handle() {
        appResponseFactory.newObjectResponse()
            .command(HELLO)
            .param("hello", greeting.greet(who))
            .session(session)
            .execute();
    }
}
You can find out full source code in Simple Chat Example

3. Handle Request By Prototype Handler

In this way, a handler is a prototype class, it means a handler is created when there is a new request from an user. It's proper to handle a complicated request, when you need a lot of Line of Codes to complete and when you don't want to create a request class
import static com.example.simple_chat.constant.Commands.HELLO;

import com.example.simple_chat.common.Greeting;
import com.tvd12.ezyfox.bean.annotation.EzyAutoBind;
import com.tvd12.ezyfox.bean.annotation.EzyPrototype;
import com.tvd12.ezyfox.binding.annotation.EzyObjectBinding;
import com.tvd12.ezyfox.core.annotation.EzyRequestListener;
import com.tvd12.ezyfox.function.EzyHandler;
import com.tvd12.ezyfox.util.EzyLoggable;
import com.tvd12.ezyfoxserver.context.EzyAppContext;
import com.tvd12.ezyfoxserver.context.EzyAppContextAware;
import com.tvd12.ezyfoxserver.entity.EzySession;
import com.tvd12.ezyfoxserver.entity.EzySessionAware;
import com.tvd12.ezyfoxserver.entity.EzyUser;
import com.tvd12.ezyfoxserver.entity.EzyUserAware;
import com.tvd12.ezyfoxserver.support.factory.EzyResponseFactory;

import lombok.Setter;

@Setter
@EzyPrototype
@EzyObjectBinding // @EzyArrayBinding
@EzyRequestListener(HELLO)
public class HelloRequestHandler 
    extends EzyLoggable
    implements 
        EzyHandler,
        EzyAppContextAware, 
        EzySessionAware, 
        EzyUserAware {

    @EzyAutoBind
    protected Greeting greeting;
    
    @EzyAutoBind
    protected EzyResponseFactory appResponseFactory;
    
    protected EzyUser user;
    protected EzySession session;
    protected EzyAppContext appContext;
    
    protected String who;
    
    @Override
    public void handle() {
        appResponseFactory.newObjectResponse()
            .command(HELLO)
            .param("hello", greeting.greet(who))
            .session(session)
            .execute();
    }
}
You can find out full source code in Hello World Example

Next step