All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.longhaoteng.core.api.ApiEngine Maven / Gradle / Ivy

There is a newer version: 1.0.7
Show newest version
package com.github.longhaoteng.core.api;


import com.github.longhaoteng.core.common.AccessToken;
import com.github.longhaoteng.core.common.AccessTokenManager;
import com.github.longhaoteng.core.common.ApiProperties;
import com.github.longhaoteng.core.enums.ApiLoc;
import com.github.longhaoteng.core.exception.ApiException;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * api engine
 *
 * @author mr.long
 */
@Slf4j
public class ApiEngine {

    @Autowired
    private ApiProperties properties;

    // access token manager
    private AccessTokenManager accessTokenManager;

    // ApiHandler mapping
    private Map mapping;

    public ApiEngine(AccessTokenManager accessTokenManager, List handlers) {
        this.accessTokenManager = accessTokenManager;
        mapping = new HashMap<>();
        if (handlers != null) {
            for (ApiHandler handler : handlers) {
                API api = handler.getClass().getAnnotation(API.class);
                if (api == null) {
                    continue;
                }
                log.info("API {} loaded", api.value());
                mapping.put(api.value(), handler);
            }
        }
    }

    /**
     * handle request
     *
     * @param request api request
     * @return response
     */
    public Response handle(Request request) {
        ApiHandler handler = properties.getLoc() != null && properties.getLoc().equals(ApiLoc.HEADER) ? mapping.get(
                request.getServlet().getHeader("service")) : mapping.get(request.getService());
        if (handler == null) {
            return Response.builder().code(HttpStatus.NOT_FOUND.value()).message("API not found.").build();
        }
        try {
            String token = request.getParameter("token");
            API api = handler.getClass().getAnnotation(API.class);
            AccessToken accessToken = null;
            // need login
            if (api.needLogin()) {
                if (token == null) {
                    // not logged in
                    return Response.builder().code(HttpStatus.UNAUTHORIZED.value()).message("Not logged in.").build();
                }
                // role
                if (StringUtils.isNotBlank(api.role())) {
                    accessToken = accessTokenManager.find(token, api.role());
                } else {
                    accessToken = accessTokenManager.find(token);
                }
                if (accessToken == null) {
                    // login expires
                    return Response.builder()
                            .code(HttpStatus.PROXY_AUTHENTICATION_REQUIRED.value())
                            .message("Login expires.")
                            .build();
                } else {
                    // reset token expiration time
                    if (properties.getRestExpireTime() != null) {
                        accessTokenManager.setExpireTime(token, properties.getRestExpireTime());
                    }
                }
            }
            Response response = Response.builder().build();
            Map resp = Maps.newHashMap();
            handler.handle(request, response, resp, accessToken);
            if (response.getCode() == null) {
                response.setCode(HttpStatus.OK.value()).setMessage("Success.");
            }
            return response.setData(resp);
        } catch (ApiException e) {
            return Response.builder().code(e.getCode()).message(e.getMessage()).build();
        } catch (Exception e) {
            log.error("handle", e);
            return Response.builder().code(HttpStatus.INTERNAL_SERVER_ERROR.value()).message(e.getMessage()).build();
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy