/* * Copyright (C) 2014 Toshiaki Maki * * 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 am.ik.categolj2.api.user; import am.ik.categolj2.api.ApiVersion; import am.ik.categolj2.api.Categolj2Headers; import am.ik.categolj2.domain.model.User; import am.ik.categolj2.domain.service.user.UserService; import com.google.common.base.Strings; import org.dozer.Mapper; import org.springframework.beans.propertyeditors.StringTrimmerEditor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; import javax.inject.Inject; import javax.validation.groups.Default; import java.util.List; import java.util.stream.Collectors; @RestController @RequestMapping("api/" + ApiVersion.CURRENT_VERSION + "/users") public class UserRestController { @Inject UserService userService; @Inject Mapper beanMapper; @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); } @RequestMapping(method = RequestMethod.GET, headers = Categolj2Headers.X_ADMIN) public Page<UserResource> getUsers(@PageableDefault(size = 200) Pageable pageable) { Page<User> page = userService.findPage(pageable); List<UserResource> userResources = page.getContent().stream() .map(user -> beanMapper.map(user, UserResource.class)) .collect(Collectors.toList()); return new PageImpl<>(userResources, pageable, page.getTotalElements()); } @RequestMapping(value = "me", method = RequestMethod.GET, headers = Categolj2Headers.X_ADMIN) public UserResource getMe(Authentication authentication) { return getUser(authentication.getName()); } @RequestMapping(value = "{username}", method = RequestMethod.GET, headers = Categolj2Headers.X_ADMIN) public UserResource getUser(@PathVariable("username") String username) { return beanMapper.map(userService.findOne(username), UserResource.class); } @RequestMapping(method = RequestMethod.POST, headers = Categolj2Headers.X_ADMIN) public ResponseEntity<UserResource> postUsers(@Validated({UserResource.Create.class, Default.class}) @RequestBody UserResource userResource) { User created = userService.create(beanMapper.map(userResource, User.class), userResource.getPassword()); return new ResponseEntity<>(beanMapper.map(created, UserResource.class), HttpStatus.CREATED); } @RequestMapping(value = "{username}", method = RequestMethod.PUT, headers = Categolj2Headers.X_ADMIN) public ResponseEntity<UserResource> putUsers(@PathVariable("username") String username, @Validated({UserResource.Update.class, Default.class}) @RequestBody UserResource userResource) { User updatedUser = userService.findOne(username); beanMapper.map(userResource, updatedUser); if (Strings.isNullOrEmpty(userResource.getPassword())) { updatedUser = userService.updateWithoutPassword(username, updatedUser); } else { updatedUser = userService.update(username, updatedUser, userResource.getPassword()); } return new ResponseEntity<>(beanMapper.map(updatedUser, UserResource.class), HttpStatus.OK); } @RequestMapping(value = "{username}", method = RequestMethod.DELETE, headers = Categolj2Headers.X_ADMIN) public ResponseEntity<Void> postUsers(@PathVariable("username") String username) { userService.delete(username); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } }