Signed-off-by: Pekka Helenius <fincer89@hotmail.com>v0.0.3-alpha
@ -0,0 +1,112 @@ | |||
//Pekka Helenius <fincer89@hotmail.com>, Fjordtek 2020 | |||
package com.fjordtek.bookstore.model.auth; | |||
import java.util.List; | |||
import javax.persistence.CascadeType; | |||
import javax.persistence.Column; | |||
import javax.persistence.Entity; | |||
import javax.persistence.FetchType; | |||
import javax.persistence.GeneratedValue; | |||
import javax.persistence.GenerationType; | |||
import javax.persistence.Id; | |||
import javax.persistence.OneToMany; | |||
import javax.persistence.SequenceGenerator; | |||
import javax.persistence.Transient; | |||
/** | |||
* This class implements Role entity which forms | |||
* core structure for the corresponding ROLE table in a database. | |||
* <p> | |||
* Additionally, Role entity objects are Java objects having | |||
* methods, attributes and other class-related additions within them. | |||
* | |||
* @author Pekka Helenius | |||
*/ | |||
@Entity | |||
public class Role { | |||
//////////////////// | |||
// Primary key value in database | |||
@Id | |||
@GeneratedValue( | |||
strategy = GenerationType.IDENTITY, | |||
generator = "roleIdGenerator" | |||
) | |||
@SequenceGenerator( | |||
name = "roleIdGenerator", | |||
sequenceName = "roleIdSequence" | |||
) | |||
private Long id; | |||
@Column( | |||
unique = true, | |||
nullable = false, | |||
columnDefinition = "VARCHAR(20)" | |||
) | |||
private String name; | |||
@OneToMany( | |||
mappedBy = "role", | |||
cascade = CascadeType.ALL, | |||
fetch = FetchType.LAZY, | |||
orphanRemoval = true | |||
) | |||
// Role objects do not have any UserRoles when initializing them | |||
@Transient | |||
private List<UserRole> userRoles; | |||
//////////////////// | |||
// Attribute setters | |||
public void setId(Long id) { | |||
this.id = id; | |||
} | |||
public void setName(String name) { | |||
this.name = name; | |||
} | |||
/* | |||
public void setUserroles(List<UserRole> userRoles) { | |||
this.userRoles = userRoles; | |||
} | |||
*/ | |||
//////////////////// | |||
// Attribute getters | |||
public Long getId() { | |||
return id; | |||
} | |||
public String getName() { | |||
return name; | |||
} | |||
/* | |||
public List<UserRole> getUserroles() { | |||
return userRoles; | |||
} | |||
*/ | |||
//////////////////// | |||
// Class constructors | |||
public Role() { | |||
} | |||
public Role(String name) { | |||
// super(); | |||
this.name = name; | |||
} | |||
//////////////////// | |||
// Class overrides | |||
@Override | |||
public String toString() { | |||
return "[" + "id: " + this.id + ", " + | |||
"name: " + this.name + "]"; | |||
} | |||
} |
@ -0,0 +1,26 @@ | |||
//Pekka Helenius <fincer89@hotmail.com>, Fjordtek 2020 | |||
package com.fjordtek.bookstore.model.auth; | |||
import java.util.List; | |||
import org.springframework.data.repository.CrudRepository; | |||
import org.springframework.data.rest.core.annotation.RepositoryRestResource; | |||
/** | |||
* This interface extends CrudRepository interface, implementing | |||
* custom methods for a repository containing Role entities. | |||
* | |||
* @author Pekka Helenius | |||
*/ | |||
@RepositoryRestResource( | |||
path = "roles", | |||
itemResourceRel = "roles", | |||
exported = true | |||
) | |||
public interface RoleRepository extends CrudRepository<Role, Long> { | |||
List<Role> findByName(String string); | |||
} |
@ -0,0 +1,156 @@ | |||
//Pekka Helenius <fincer89@hotmail.com>, Fjordtek 2020 | |||
package com.fjordtek.bookstore.model.auth; | |||
import java.util.List; | |||
import javax.persistence.CascadeType; | |||
import javax.persistence.Column; | |||
import javax.persistence.Entity; | |||
import javax.persistence.FetchType; | |||
import javax.persistence.GeneratedValue; | |||
import javax.persistence.GenerationType; | |||
import javax.persistence.Id; | |||
import javax.persistence.OneToMany; | |||
import javax.persistence.SequenceGenerator; | |||
import javax.persistence.Transient; | |||
import javax.validation.constraints.Email; | |||
import com.fasterxml.jackson.annotation.JsonIgnore; | |||
/** | |||
* This class implements User entity which forms | |||
* core structure for the corresponding USER table in a database. | |||
* <p> | |||
* Additionally, User entity objects are Java objects having | |||
* methods, attributes and other class-related additions within them. | |||
* | |||
* @author Pekka Helenius | |||
*/ | |||
@Entity | |||
public class User { | |||
// TODO define universally in a single place | |||
private static final int strMax = 100; | |||
private static final int strMaxPasswd = 1024; | |||
//////////////////// | |||
// Primary key value in database | |||
@Id | |||
@GeneratedValue( | |||
strategy = GenerationType.IDENTITY, | |||
generator = "userIdGenerator" | |||
) | |||
@SequenceGenerator( | |||
name = "userIdGenerator", | |||
sequenceName = "userIdSequence" | |||
) | |||
private Long id; | |||
//////////////////// | |||
@Column( | |||
unique = true, | |||
nullable = false, | |||
columnDefinition = "NVARCHAR(" + strMax + ")" | |||
) | |||
private String username; | |||
@Column( | |||
nullable = false, | |||
columnDefinition = "NVARCHAR(" + strMaxPasswd + ")" | |||
) | |||
@JsonIgnore | |||
private String password; | |||
@Column( | |||
nullable = false, | |||
columnDefinition = "NVARCHAR(" + strMax + ")" | |||
) | |||
private String email; | |||
@OneToMany( | |||
mappedBy = "user", | |||
cascade = CascadeType.ALL, | |||
fetch = FetchType.LAZY, | |||
orphanRemoval = true | |||
) | |||
// User objects do not have any UserRoles when initializing them | |||
@Transient | |||
private List<UserRole> userRoles; | |||
//////////////////// | |||
// Attribute setters | |||
public void setId(Long id) { | |||
this.id = id; | |||
} | |||
public void setUsername(String username) { | |||
this.username = username; | |||
} | |||
public void setPassword(String password) { | |||
this.password = password; | |||
} | |||
public void setEmail(String email) { | |||
this.email = email; | |||
} | |||
/* | |||
public void setUserroles(List<UserRole> userRoles) { | |||
this.userRoles = userRoles; | |||
} | |||
*/ | |||
//////////////////// | |||
// Attribute getters | |||
public Long getId() { | |||
return id; | |||
} | |||
public String getUsername() { | |||
return username; | |||
} | |||
public String getPassword() { | |||
return password; | |||
} | |||
public String getEmail() { | |||
return email; | |||
} | |||
/* | |||
public List<UserRole> getUserroles() { | |||
return userRoles; | |||
} | |||
*/ | |||
//////////////////// | |||
// Class constructors | |||
public User() { | |||
} | |||
public User(String username, String password, String email) { | |||
// super(); | |||
this.username = username; | |||
this.password = password; | |||
this.email = email; | |||
} | |||
//////////////////// | |||
// Class overrides | |||
@Override | |||
public String toString() { | |||
return "[" + "id: " + this.id + ", " + | |||
"username: " + this.username + ", " + | |||
"password: " + this.password + ", " + | |||
"email: " + this.email + "]"; | |||
} | |||
} |
@ -0,0 +1,24 @@ | |||
//Pekka Helenius <fincer89@hotmail.com>, Fjordtek 2020 | |||
package com.fjordtek.bookstore.model.auth; | |||
import org.springframework.data.repository.CrudRepository; | |||
import org.springframework.data.rest.core.annotation.RepositoryRestResource; | |||
/** | |||
* This interface extends CrudRepository interface, implementing | |||
* custom methods for a repository containing User entities. | |||
* | |||
* @author Pekka Helenius | |||
*/ | |||
@RepositoryRestResource( | |||
path = "users", | |||
itemResourceRel = "users", | |||
exported = true | |||
) | |||
public interface UserRepository extends CrudRepository<User, Long> { | |||
User findByUsername(String username); | |||
} |
@ -0,0 +1,102 @@ | |||
//Pekka Helenius <fincer89@hotmail.com>, Fjordtek 2020 | |||
package com.fjordtek.bookstore.model.auth; | |||
import javax.persistence.EmbeddedId; | |||
import javax.persistence.Entity; | |||
import javax.persistence.ManyToOne; | |||
import javax.persistence.MapsId; | |||
/** | |||
* This class implements UserRole entity which forms | |||
* core structure for the corresponding USER_ROLE join table in a database. | |||
* <p> | |||
* Main reason for the join table is to allow more sophisticated | |||
* role policy for users. For instance, a user may have multiple roles like | |||
* FINANCE and MARKETING, whereas another user may only have MARKETING | |||
* role. In other words, this back-end implementation allows fine-grained | |||
* user policy for the web service and better business logic. | |||
* <p> | |||
* Primary key of this entity is a composite primary key. | |||
* <p> | |||
* This implementation supports having additional columns in the join table | |||
* if needed, contrary to the direct Spring @ManyToMany annotation. | |||
* <p> | |||
* Additionally, UserRole entity objects are Java objects having | |||
* methods, attributes and other class-related additions within them. | |||
* | |||
* @author Pekka Helenius | |||
*/ | |||
@Entity | |||
public class UserRole { | |||
//////////////////// | |||
// Primary key value in database | |||
@EmbeddedId | |||
private UserRoleCompositeKey id = new UserRoleCompositeKey(); | |||
@ManyToOne | |||
@MapsId("roleId") | |||
private User user; | |||
@ManyToOne | |||
@MapsId("userId") | |||
private Role role; | |||
//////////////////// | |||
// Other attributes | |||
//////////////////// | |||
// Attribute setters | |||
public void setId(UserRoleCompositeKey id) { | |||
this.id = id; | |||
} | |||
public void setUser(User user) { | |||
this.user = user; | |||
} | |||
public void setRole(Role role) { | |||
this.role = role; | |||
} | |||
//////////////////// | |||
// Attribute getters | |||
public UserRoleCompositeKey getId() { | |||
return id; | |||
} | |||
public User getUser() { | |||
return user; | |||
} | |||
public Role getRole() { | |||
return role; | |||
} | |||
//////////////////// | |||
// Class constructors | |||
public UserRole() { | |||
} | |||
public UserRole(User user, Role role) { | |||
//super(); | |||
this.user = user; | |||
this.role = role; | |||
} | |||
//////////////////// | |||
// Class overrides | |||
@Override | |||
public String toString() { | |||
return "[" + "user: " + this.user + ", " + | |||
"role: " + this.role + "]"; | |||
} | |||
} |
@ -0,0 +1,92 @@ | |||
//Pekka Helenius <fincer89@hotmail.com>, Fjordtek 2020 | |||
package com.fjordtek.bookstore.model.auth; | |||
import java.io.Serializable; | |||
import java.util.Objects; | |||
import javax.persistence.Embeddable; | |||
/** | |||
* This class implements a composite primary key based on | |||
* primary keys of User & Role entities. | |||
* <p> | |||
* This class overrides several JPA specific methods. | |||
* | |||
* @author Pekka Helenius | |||
*/ | |||
@Embeddable | |||
public class UserRoleCompositeKey implements Serializable { | |||
private static final long serialVersionUID = 2889337731246989510L; | |||
private Long userId; | |||
private Long roleId; | |||
//////////////////// | |||
// Attribute setters | |||
public void setUserId(Long userId) { | |||
this.userId = userId; | |||
} | |||
public void setRoleId(Long roleId) { | |||
this.roleId = roleId; | |||
} | |||
//////////////////// | |||
// Attribute getters | |||
public Long getUserId() { | |||
return userId; | |||
} | |||
public Long getRoleId() { | |||
return roleId; | |||
} | |||
//////////////////// | |||
// Class constructors | |||
public UserRoleCompositeKey() { | |||
} | |||
public UserRoleCompositeKey(Long userId, Long roleId) { | |||
// super(); | |||
this.userId = userId; | |||
this.roleId = roleId; | |||
} | |||
//////////////////// | |||
// Class overrides | |||
@Override | |||
public boolean equals(Object obj) { | |||
if (this == obj) { | |||
return true; | |||
} | |||
if (obj == null || getClass() != obj.getClass()) { | |||
return false; | |||
} | |||
UserRoleCompositeKey that = (UserRoleCompositeKey) obj; | |||
return Objects.equals(userId, that.userId) && | |||
Objects.equals(roleId, that.roleId); | |||
} | |||
@Override | |||
public int hashCode() { | |||
return Objects.hash(userId, roleId); | |||
} | |||
@Override | |||
public String toString() { | |||
return "[" + "user_id: " + this.userId + ", " + | |||
"role_id: " + this.roleId + "]"; | |||
} | |||
} |
@ -0,0 +1,21 @@ | |||
//Pekka Helenius <fincer89@hotmail.com>, Fjordtek 2020 | |||
package com.fjordtek.bookstore.model.auth; | |||
import org.springframework.data.repository.CrudRepository; | |||
import org.springframework.data.rest.core.annotation.RepositoryRestResource; | |||
/** | |||
* This interface extends CrudRepository interface, implementing | |||
* custom methods for a repository containing UserRole entities. | |||
* | |||
* @author Pekka Helenius | |||
*/ | |||
@RepositoryRestResource( | |||
path = "userroles", | |||
itemResourceRel = "userroles", | |||
exported = true | |||
) | |||
public interface UserRoleRepository extends CrudRepository<UserRole, Long> { | |||
} |