/** * 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.ValidationEngine; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpResponseStatus; import java.util.List; import javax.annotation.Resource; import org.caratarse.auth.model.bo.UserBo; import org.caratarse.auth.model.po.User; 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; public class UserController { private static final UrlBuilder LOCATION_BUILDER = new UrlBuilder(); @Resource private UserBo userBo; public UserController() { } public User create(Request request, Response response) { User user = request.getBodyAs(User.class, "User details not provided"); ValidationEngine.validateAndThrow(user); userBo.store(user); // Construct the response for create... response.setResponseCreated(); TokenResolver resolver = HyperExpress.bind(Constants.Url.USER_UUID, user.getUuid()); // 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 user; } public User read(Request request, Response response) { String uuid = request.getHeader(Constants.Url.USER_UUID, "No User UUID supplied"); User user = userBo.getUser(uuid); if (user == null) { response.setResponseStatus(HttpResponseStatus.NOT_FOUND); } addTokenBinder(); return user; } public List<User> readAll(Request request, Response response) { QueryFilter filter = QueryFilters.parseFrom(request); QueryOrder order = QueryOrders.parseFrom(request); QueryRange range = QueryRanges.parseFrom(request, 20); Page<User> entities = userBo.readAll(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<User>() { @Override public void bind(User entity, TokenResolver resolver) { resolver.bind(Constants.Url.USER_UUID, entity.getUuid()) .bind(Constants.Url.USER_ID, entity.getId().toString()); } }); } public void update(Request request, Response response) { String uuid = request.getHeader(Constants.Url.USER_UUID, "No User UUID supplied"); User dbUser = userBo.getUser(uuid); if (dbUser == null) { response.setResponseStatus(HttpResponseStatus.NOT_FOUND); return; } User user = request.getBodyAs(User.class, "User details not provided"); dbUser.copy(user); ValidationEngine.validateAndThrow(dbUser); userBo.store(dbUser); response.setResponseNoContent(); } public void delete(Request request, Response response) { String uuid = request.getHeader(Constants.Url.USER_UUID, "No User UUID supplied"); userBo.deleteUser(uuid); response.setResponseNoContent(); } }