am.ik.categolj2.api.user.UserRestController.java Source code

Java tutorial

Introduction

Here is the source code for am.ik.categolj2.api.user.UserRestController.java

Source

/*
 * 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);
    }
}