Skip to content

Commit

Permalink
Merge pull request spring-petclinic#4 from limmentee-organization/f/user
Browse files Browse the repository at this point in the history
USER機能実装完了
  • Loading branch information
sota25 committed Jan 2, 2024
2 parents 6e97ec1 + 0982e20 commit 6908413
Show file tree
Hide file tree
Showing 8 changed files with 237 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.springframework.samples.petclinic.mapper;

import java.util.Collection;

import org.mapstruct.Mapper;
import org.springframework.samples.petclinic.model.Role;
import org.springframework.samples.petclinic.model.User;
import org.springframework.samples.petclinic.rest.dto.RoleDto;
import org.springframework.samples.petclinic.rest.dto.UserDto;

@Mapper
public interface UserMapper {

Role toRole(RoleDto roleDto);

RoleDto toRoleDto(Role role);

Collection<RoleDto> toRoleDtos(Collection<Role> roles);

User toUser(UserDto userDto);

UserDto toUserDto(User user);

Collection<Role> toRoles(Collection<RoleDto> roleDtos);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.springframework.samples.petclinic.model;

import com.fasterxml.jackson.annotation.JsonIgnore;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;

@Entity
@Table(name = "roles", uniqueConstraints = @UniqueConstraint(columnNames = { "username", "role" }))
public class Role extends BaseEntity {

@ManyToOne
@JoinColumn(name = "username")
@JsonIgnore
private User user;

@Column(name = "role")
private String name;

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package org.springframework.samples.petclinic.model;

import java.util.HashSet;
import java.util.Set;

import com.fasterxml.jackson.annotation.JsonIgnore;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;

@Entity
@Table(name = "users")
public class User {

@Id
@Column(name = "username")
private String username;

@Column(name = "password")
private String password;

@Column(name = "enabled")
private Boolean enabled;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER)
private Set<Role> roles;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public Boolean getEnabled() {
return enabled;
}

public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}

public Set<Role> getRoles() {
return roles;
}

public void setRoles(Set<Role> roles) {
this.roles = roles;
}

@JsonIgnore
public void addRole(String roleName) {
if (this.roles == null) {
this.roles = new HashSet<>();
}
Role role = new Role();
role.setName(roleName);
this.roles.add(role);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.springframework.samples.petclinic.repository;

import org.springframework.dao.DataAccessException;
import org.springframework.samples.petclinic.model.User;

public interface UserRepository {

void save(User user) throws DataAccessException;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.springframework.samples.petclinic.repository.springdatajpa;

import org.springframework.context.annotation.Profile;
import org.springframework.data.repository.Repository;
import org.springframework.samples.petclinic.model.User;
import org.springframework.samples.petclinic.repository.UserRepository;

@Profile("spring-data-jpa")
public interface SpringDataUserRepository extends UserRepository, Repository<User, Integer> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.springframework.samples.petclinic.rest.controller;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.samples.petclinic.mapper.UserMapper;
import org.springframework.samples.petclinic.model.User;
import org.springframework.samples.petclinic.rest.api.UsersApi;
import org.springframework.samples.petclinic.rest.dto.UserDto;
import org.springframework.samples.petclinic.service.UserService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@CrossOrigin(exposedHeaders = "errors, content-type")
@RequestMapping("api")
public class UserRestController implements UsersApi {

private final UserService userService;
private final UserMapper userMapper;

public UserRestController(UserService userService, UserMapper userMapper) {
this.userService = userService;
this.userMapper = userMapper;
}

@PreAuthorize("hasRole(@roles.ADMIN)")
@Override
public ResponseEntity<UserDto> addUser(UserDto userDto) {
HttpHeaders headers = new HttpHeaders();
User user = userMapper.toUser(userDto);
this.userService.saveUser(user);
return new ResponseEntity<>(userMapper.toUserDto(user), headers, HttpStatus.CREATED);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.springframework.samples.petclinic.service;

import org.springframework.samples.petclinic.model.User;

public interface UserService {

void saveUser(User user);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.springframework.samples.petclinic.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.samples.petclinic.model.Role;
import org.springframework.samples.petclinic.model.User;
import org.springframework.samples.petclinic.repository.UserRepository;
import org.springframework.transaction.annotation.Transactional;

public class UserServiceImpl implements UserService {

@Autowired
private UserRepository userRepository;

@Override
@Transactional
public void saveUser(User user) {

if (user.getRoles() == null || user.getRoles().isEmpty())
throw new IllegalArgumentException("User must have at least a role set!");
for (Role role : user.getRoles()) {
if (!role.getName().startsWith("ROLE_"))
role.setName("ROLE_" + role.getName());
if (role.getUser() == null)
role.setUser(user);
}

userRepository.save(user);
}

}

0 comments on commit 6908413

Please sign in to comment.