org.caratarse.auth.services.controller.UserAuthorizationController.java Source code

Java tutorial

Introduction

Here is the source code for org.caratarse.auth.services.controller.UserAuthorizationController.java

Source

/**
 * Copyright (C) 2015 Caratarse Auth Team <lucio.benfante@gmail.com>
 *
 * This file is part of Caratarse Auth Services.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.caratarse.auth.services.controller;

import com.strategicgains.hyperexpress.HyperExpress;
import com.strategicgains.hyperexpress.builder.TokenBinder;
import com.strategicgains.hyperexpress.builder.TokenResolver;
import com.strategicgains.hyperexpress.builder.UrlBuilder;
import com.strategicgains.syntaxe.ValidationException;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpResponseStatus;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.caratarse.auth.model.bo.AuthorizationBo;
import org.caratarse.auth.model.bo.UserAuthorizationBo;
import org.caratarse.auth.model.bo.UserBo;
import org.caratarse.auth.model.dao.UserAuthorizationDao;
import org.caratarse.auth.model.po.Authorization;
import org.caratarse.auth.model.po.User;
import org.caratarse.auth.model.po.UserAuthorization;
import org.caratarse.auth.services.Constants;
import org.caratarse.auth.services.util.HyperExpressBindHelper;
import org.lambico.dao.generic.Page;

import org.restexpress.Request;
import org.restexpress.Response;
import org.restexpress.common.query.QueryFilter;
import org.restexpress.common.query.QueryOrder;
import org.restexpress.common.query.QueryRange;
import org.restexpress.query.QueryFilters;
import org.restexpress.query.QueryOrders;
import org.restexpress.query.QueryRanges;
import org.springframework.transaction.annotation.Transactional;

public class UserAuthorizationController {

    private static final UrlBuilder LOCATION_BUILDER = new UrlBuilder();
    @Resource
    private UserBo userBo;
    @Resource
    private AuthorizationBo authorizationBo;
    @Resource
    private UserAuthorizationDao userAuthorizationDao;
    @Resource
    private UserAuthorizationBo userAuthorizationBo;

    public UserAuthorizationController() {
    }

    public UserAuthorization addAuthorizationToUser(Request request, Response response) {
        String userUuid = request.getHeader(Constants.Url.USER_UUID, "No User UUID supplied");
        String authorizationName = request.getHeader(Constants.Url.AUTHORIZATION_NAME,
                "No Authorization Name supplied");
        UserAuthorization userAuthorizationPermissions = request.getBodyAs(UserAuthorization.class,
                "UserAuthorization with permissions details not provided");

        validateAndThrow(userUuid, authorizationName);

        UserAuthorization userAuthorization = userAuthorizationBo.addAuthorizationToUser(userUuid,
                authorizationName, userAuthorizationPermissions.getPermissions());

        // Construct the response for create...
        response.setResponseCreated();

        TokenResolver resolver = HyperExpress.bind(Constants.Url.USER_UUID, userUuid)
                .bind(Constants.Url.AUTHORIZATION_NAME, authorizationName);

        // Include the Location header...
        String locationPattern = request.getNamedUrl(HttpMethod.GET, Constants.Routes.USER_READ_ROUTE);
        response.addLocationHeader(LOCATION_BUILDER.build(locationPattern, resolver));

        // Return the newly-created item...
        return userAuthorization;
    }

    public UserAuthorization read(Request request, Response response) {
        String userUuid = request.getHeader(Constants.Url.USER_UUID, "No User UUID supplied");
        String authorizationName = request.getHeader(Constants.Url.AUTHORIZATION_NAME,
                "No Authorization Name supplied");
        UserAuthorization userAuthorization = userAuthorizationBo.findUserAuthorization(userUuid,
                authorizationName);
        if (userAuthorization == null) {
            response.setResponseStatus(HttpResponseStatus.NOT_FOUND);
        }

        addTokenBinder();

        return userAuthorization;
    }

    @Transactional
    public List<UserAuthorization> readAll(Request request, Response response) {
        String uuid = request.getHeader(Constants.Url.USER_UUID, "No User UUID supplied");
        QueryFilter filter = QueryFilters.parseFrom(request);
        QueryOrder order = QueryOrders.parseFrom(request);
        QueryRange range = QueryRanges.parseFrom(request, Constants.DEFAULT_RANGE_LIMIT);
        Page<UserAuthorization> entities = userAuthorizationBo.readAllByUserAndService(uuid, filter, range, order);
        response.setCollectionResponse(range, entities.getList().size(), entities.getRowCount());
        HyperExpressBindHelper.bindPaginationTokens(range, entities.getRowCount());
        addTokenBinder();

        return entities.getList();
    }

    private void addTokenBinder() {
        // Bind the resources in the collection with link URL tokens, etc. here...
        HyperExpress.tokenBinder(new TokenBinder<UserAuthorization>() {
            @Override
            public void bind(UserAuthorization entity, TokenResolver resolver) {
                resolver.bind(Constants.Url.USER_AUTHORIZATION_ID, entity.getId().toString())
                        .bind(Constants.Url.AUTHORIZATION_NAME, entity.getAuthorization().getName())
                        .bind(Constants.Url.USER_UUID, entity.getUser().getUuid())
                        .bind(Constants.Url.USER_ID, entity.getUser().getId().toString());
            }
        });
    }

    public void update(Request request, Response response) {
        String userUuid = request.getHeader(Constants.Url.USER_UUID, "No User UUID supplied");
        String authorizationName = request.getHeader(Constants.Url.AUTHORIZATION_NAME,
                "No Authorization Name supplied");
        UserAuthorization dbUserAuthorization = userAuthorizationBo.findUserAuthorization(userUuid,
                authorizationName);
        if (dbUserAuthorization == null) {
            response.setResponseStatus(HttpResponseStatus.NOT_FOUND);
            return;
        }

        UserAuthorization userAuthorizationPermissions = request.getBodyAs(UserAuthorization.class,
                "UserAuthorization with permissions details not provided");
        dbUserAuthorization.copy(userAuthorizationPermissions);
        userAuthorizationBo.store(dbUserAuthorization);
        response.setResponseNoContent();
    }

    public void delete(Request request, Response response) {
        String userUuid = request.getHeader(Constants.Url.USER_UUID, "No User UUID supplied");
        String authorizationName = request.getHeader(Constants.Url.AUTHORIZATION_NAME,
                "No Authorization Name supplied");
        userAuthorizationBo.delete(userUuid, authorizationName);
        response.setResponseNoContent();
    }

    private void validateAndThrow(String userUuid, String authorizationName) {
        List<String> errors = new ArrayList<>();
        User user = userBo.getUser(userUuid);
        if (user == null) {
            errors.add("User with UUID " + userUuid + " not found.");
        }
        Authorization authorization = authorizationBo.findAuthorization(authorizationName);
        if (authorization == null) {
            errors.add("Authorization with name " + authorizationName + " not found.");
        }
        UserAuthorization userAuthorization = userAuthorizationBo.findUserAuthorization(userUuid,
                authorizationName);
        if (userAuthorization != null) {
            errors.add("Authorization " + authorizationName + " already attached to user " + userUuid + ".");
        }
        if (!errors.isEmpty()) {
            throw new ValidationException(errors);
        }
    }

}