From e317c03479309202bcc82b8a42178d6b664f490b Mon Sep 17 00:00:00 2001 From: Daniel Fiala Date: Wed, 19 Jul 2023 23:21:57 +0200 Subject: [PATCH] enhancements(backend): Refactor User module --- .../{user => }/entity/AccountEntity.java | 10 ++-- .../{user => }/entity/SessionEntity.java | 10 ++-- .../{user => }/entity/UserEntity.java | 10 ++-- .../{user => }/mapper/AccountMapper.java | 6 +- .../{user => }/mapper/SessionMapper.java | 6 +- .../{user => }/mapper/UserMapper.java | 6 +- .../shiperist/{user => }/model/Account.java | 8 +-- .../shiperist/{user => }/model/Session.java | 8 +-- .../dev/shiperist/{user => }/model/User.java | 10 ++-- .../repository/AccountRepository.java | 4 +- .../repository/SessionRepository.java | 4 +- .../shiperist/repository/UserRepository.java | 12 ++++ .../shiperist/resource/AccountService.java | 47 ++++++++++++++++ .../shiperist/resource/SessionService.java | 47 ++++++++++++++++ .../dev/shiperist/resource/UserService.java | 55 +++++++++++++++++++ .../dev/shiperist/service/AuthService.java | 9 +++ .../user/model/request/CreateUserRequest.java | 13 ----- .../user/repository/UserRepository.java | 7 --- .../shiperist/user/resource/UserResource.java | 37 ------------- .../accounts/resource/AuthResourceTest.java | 13 +++++ .../user/resource/UserResourceTest.java | 35 ------------ 21 files changed, 224 insertions(+), 133 deletions(-) rename server/src/main/java/dev/shiperist/{user => }/entity/AccountEntity.java (89%) rename server/src/main/java/dev/shiperist/{user => }/entity/SessionEntity.java (82%) rename server/src/main/java/dev/shiperist/{user => }/entity/UserEntity.java (86%) rename server/src/main/java/dev/shiperist/{user => }/mapper/AccountMapper.java (60%) rename server/src/main/java/dev/shiperist/{user => }/mapper/SessionMapper.java (60%) rename server/src/main/java/dev/shiperist/{user => }/mapper/UserMapper.java (60%) rename server/src/main/java/dev/shiperist/{user => }/model/Account.java (79%) rename server/src/main/java/dev/shiperist/{user => }/model/Session.java (62%) rename server/src/main/java/dev/shiperist/{user => }/model/User.java (63%) rename server/src/main/java/dev/shiperist/{user => }/repository/AccountRepository.java (62%) rename server/src/main/java/dev/shiperist/{user => }/repository/SessionRepository.java (62%) create mode 100644 server/src/main/java/dev/shiperist/repository/UserRepository.java create mode 100644 server/src/main/java/dev/shiperist/resource/AccountService.java create mode 100644 server/src/main/java/dev/shiperist/resource/SessionService.java create mode 100644 server/src/main/java/dev/shiperist/resource/UserService.java create mode 100644 server/src/main/java/dev/shiperist/service/AuthService.java delete mode 100644 server/src/main/java/dev/shiperist/user/model/request/CreateUserRequest.java delete mode 100644 server/src/main/java/dev/shiperist/user/repository/UserRepository.java delete mode 100644 server/src/main/java/dev/shiperist/user/resource/UserResource.java create mode 100644 server/src/test/java/dev/shiperist/accounts/resource/AuthResourceTest.java delete mode 100644 server/src/test/java/dev/shiperist/user/resource/UserResourceTest.java diff --git a/server/src/main/java/dev/shiperist/user/entity/AccountEntity.java b/server/src/main/java/dev/shiperist/entity/AccountEntity.java similarity index 89% rename from server/src/main/java/dev/shiperist/user/entity/AccountEntity.java rename to server/src/main/java/dev/shiperist/entity/AccountEntity.java index f5f5a83..65ef660 100644 --- a/server/src/main/java/dev/shiperist/user/entity/AccountEntity.java +++ b/server/src/main/java/dev/shiperist/entity/AccountEntity.java @@ -1,14 +1,14 @@ -package dev.shiperist.user.entity; +package dev.shiperist.entity; import io.quarkus.hibernate.reactive.panache.PanacheEntity; import jakarta.persistence.*; -import lombok.Builder; -import lombok.Getter; +import lombok.Data; +import lombok.EqualsAndHashCode; -@Getter -@Builder +@Data @Entity @Table(name = "account") +@EqualsAndHashCode(callSuper = true) public class AccountEntity extends PanacheEntity { @Column(name = "user_id") diff --git a/server/src/main/java/dev/shiperist/user/entity/SessionEntity.java b/server/src/main/java/dev/shiperist/entity/SessionEntity.java similarity index 82% rename from server/src/main/java/dev/shiperist/user/entity/SessionEntity.java rename to server/src/main/java/dev/shiperist/entity/SessionEntity.java index b8d3ceb..c2a21b4 100644 --- a/server/src/main/java/dev/shiperist/user/entity/SessionEntity.java +++ b/server/src/main/java/dev/shiperist/entity/SessionEntity.java @@ -1,16 +1,16 @@ -package dev.shiperist.user.entity; +package dev.shiperist.entity; import io.quarkus.hibernate.reactive.panache.PanacheEntity; import jakarta.persistence.*; -import lombok.Builder; -import lombok.Getter; +import lombok.Data; +import lombok.EqualsAndHashCode; import java.time.LocalDateTime; -@Getter -@Builder +@Data @Entity @Table(name = "session") +@EqualsAndHashCode(callSuper = true) public class SessionEntity extends PanacheEntity { @Column(name = "session_token", unique = true) diff --git a/server/src/main/java/dev/shiperist/user/entity/UserEntity.java b/server/src/main/java/dev/shiperist/entity/UserEntity.java similarity index 86% rename from server/src/main/java/dev/shiperist/user/entity/UserEntity.java rename to server/src/main/java/dev/shiperist/entity/UserEntity.java index 8e8e58c..fba96b2 100644 --- a/server/src/main/java/dev/shiperist/user/entity/UserEntity.java +++ b/server/src/main/java/dev/shiperist/entity/UserEntity.java @@ -1,20 +1,20 @@ -package dev.shiperist.user.entity; +package dev.shiperist.entity; import io.quarkus.hibernate.reactive.panache.PanacheEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; -import lombok.Builder; -import lombok.Getter; +import lombok.Data; +import lombok.EqualsAndHashCode; import java.time.LocalDateTime; import java.util.Set; -@Getter -@Builder +@Data @Entity @Table(name = "user") +@EqualsAndHashCode(callSuper = true) public class UserEntity extends PanacheEntity { @Column(name = "name") diff --git a/server/src/main/java/dev/shiperist/user/mapper/AccountMapper.java b/server/src/main/java/dev/shiperist/mapper/AccountMapper.java similarity index 60% rename from server/src/main/java/dev/shiperist/user/mapper/AccountMapper.java rename to server/src/main/java/dev/shiperist/mapper/AccountMapper.java index 0d5a1ae..3222f17 100644 --- a/server/src/main/java/dev/shiperist/user/mapper/AccountMapper.java +++ b/server/src/main/java/dev/shiperist/mapper/AccountMapper.java @@ -1,7 +1,7 @@ -package dev.shiperist.user.mapper; +package dev.shiperist.mapper; -import dev.shiperist.user.entity.AccountEntity; -import dev.shiperist.user.model.Account; +import dev.shiperist.entity.AccountEntity; +import dev.shiperist.model.Account; import org.mapstruct.Mapper; @Mapper(componentModel = "jakarta") diff --git a/server/src/main/java/dev/shiperist/user/mapper/SessionMapper.java b/server/src/main/java/dev/shiperist/mapper/SessionMapper.java similarity index 60% rename from server/src/main/java/dev/shiperist/user/mapper/SessionMapper.java rename to server/src/main/java/dev/shiperist/mapper/SessionMapper.java index 9665288..ff7ae07 100644 --- a/server/src/main/java/dev/shiperist/user/mapper/SessionMapper.java +++ b/server/src/main/java/dev/shiperist/mapper/SessionMapper.java @@ -1,7 +1,7 @@ -package dev.shiperist.user.mapper; +package dev.shiperist.mapper; -import dev.shiperist.user.entity.SessionEntity; -import dev.shiperist.user.model.Session; +import dev.shiperist.entity.SessionEntity; +import dev.shiperist.model.Session; import org.mapstruct.Mapper; @Mapper(componentModel = "jakarta") diff --git a/server/src/main/java/dev/shiperist/user/mapper/UserMapper.java b/server/src/main/java/dev/shiperist/mapper/UserMapper.java similarity index 60% rename from server/src/main/java/dev/shiperist/user/mapper/UserMapper.java rename to server/src/main/java/dev/shiperist/mapper/UserMapper.java index 703961e..8a32e05 100644 --- a/server/src/main/java/dev/shiperist/user/mapper/UserMapper.java +++ b/server/src/main/java/dev/shiperist/mapper/UserMapper.java @@ -1,7 +1,7 @@ -package dev.shiperist.user.mapper; +package dev.shiperist.mapper; -import dev.shiperist.user.entity.UserEntity; -import dev.shiperist.user.model.User; +import dev.shiperist.entity.UserEntity; +import dev.shiperist.model.User; import org.mapstruct.Mapper; @Mapper(componentModel = "jakarta") diff --git a/server/src/main/java/dev/shiperist/user/model/Account.java b/server/src/main/java/dev/shiperist/model/Account.java similarity index 79% rename from server/src/main/java/dev/shiperist/user/model/Account.java rename to server/src/main/java/dev/shiperist/model/Account.java index 9c058ba..86eaf3a 100644 --- a/server/src/main/java/dev/shiperist/user/model/Account.java +++ b/server/src/main/java/dev/shiperist/model/Account.java @@ -1,9 +1,9 @@ -package dev.shiperist.user.model; +package dev.shiperist.model; -import dev.shiperist.user.entity.UserEntity; -import lombok.Getter; +import dev.shiperist.entity.UserEntity; +import lombok.Data; -@Getter +@Data public class Account { private String userId; private String type; diff --git a/server/src/main/java/dev/shiperist/user/model/Session.java b/server/src/main/java/dev/shiperist/model/Session.java similarity index 62% rename from server/src/main/java/dev/shiperist/user/model/Session.java rename to server/src/main/java/dev/shiperist/model/Session.java index acb5bda..3cba340 100644 --- a/server/src/main/java/dev/shiperist/user/model/Session.java +++ b/server/src/main/java/dev/shiperist/model/Session.java @@ -1,11 +1,11 @@ -package dev.shiperist.user.model; +package dev.shiperist.model; -import dev.shiperist.user.entity.UserEntity; -import lombok.Getter; +import dev.shiperist.entity.UserEntity; +import lombok.Data; import java.time.LocalDateTime; -@Getter +@Data public class Session { private String sessionToken; private String userId; diff --git a/server/src/main/java/dev/shiperist/user/model/User.java b/server/src/main/java/dev/shiperist/model/User.java similarity index 63% rename from server/src/main/java/dev/shiperist/user/model/User.java rename to server/src/main/java/dev/shiperist/model/User.java index 666fe6a..ea91278 100644 --- a/server/src/main/java/dev/shiperist/user/model/User.java +++ b/server/src/main/java/dev/shiperist/model/User.java @@ -1,13 +1,13 @@ -package dev.shiperist.user.model; +package dev.shiperist.model; -import dev.shiperist.user.entity.AccountEntity; -import dev.shiperist.user.entity.SessionEntity; -import lombok.Getter; +import dev.shiperist.entity.AccountEntity; +import dev.shiperist.entity.SessionEntity; +import lombok.Data; import java.time.LocalDateTime; import java.util.Set; -@Getter +@Data public class User { private String name; private String email; diff --git a/server/src/main/java/dev/shiperist/user/repository/AccountRepository.java b/server/src/main/java/dev/shiperist/repository/AccountRepository.java similarity index 62% rename from server/src/main/java/dev/shiperist/user/repository/AccountRepository.java rename to server/src/main/java/dev/shiperist/repository/AccountRepository.java index 850614f..e4a24a0 100644 --- a/server/src/main/java/dev/shiperist/user/repository/AccountRepository.java +++ b/server/src/main/java/dev/shiperist/repository/AccountRepository.java @@ -1,6 +1,6 @@ -package dev.shiperist.user.repository; +package dev.shiperist.repository; -import dev.shiperist.user.entity.AccountEntity; +import dev.shiperist.entity.AccountEntity; import io.quarkus.hibernate.reactive.panache.PanacheRepository; public class AccountRepository implements PanacheRepository { diff --git a/server/src/main/java/dev/shiperist/user/repository/SessionRepository.java b/server/src/main/java/dev/shiperist/repository/SessionRepository.java similarity index 62% rename from server/src/main/java/dev/shiperist/user/repository/SessionRepository.java rename to server/src/main/java/dev/shiperist/repository/SessionRepository.java index a105b7b..70499a7 100644 --- a/server/src/main/java/dev/shiperist/user/repository/SessionRepository.java +++ b/server/src/main/java/dev/shiperist/repository/SessionRepository.java @@ -1,6 +1,6 @@ -package dev.shiperist.user.repository; +package dev.shiperist.repository; -import dev.shiperist.user.entity.SessionEntity; +import dev.shiperist.entity.SessionEntity; import io.quarkus.hibernate.reactive.panache.PanacheRepository; public class SessionRepository implements PanacheRepository { diff --git a/server/src/main/java/dev/shiperist/repository/UserRepository.java b/server/src/main/java/dev/shiperist/repository/UserRepository.java new file mode 100644 index 0000000..164cc72 --- /dev/null +++ b/server/src/main/java/dev/shiperist/repository/UserRepository.java @@ -0,0 +1,12 @@ +package dev.shiperist.repository; + +import dev.shiperist.entity.UserEntity; +import io.quarkus.hibernate.reactive.panache.PanacheRepository; +import io.smallrye.mutiny.Uni; + +public class UserRepository implements PanacheRepository { + + public Uni findByEmail(String email) { + return find("email", email).firstResult(); + } +} diff --git a/server/src/main/java/dev/shiperist/resource/AccountService.java b/server/src/main/java/dev/shiperist/resource/AccountService.java new file mode 100644 index 0000000..67515fe --- /dev/null +++ b/server/src/main/java/dev/shiperist/resource/AccountService.java @@ -0,0 +1,47 @@ +package dev.shiperist.resource; + +import dev.shiperist.entity.AccountEntity; +import dev.shiperist.mapper.AccountMapper; +import dev.shiperist.model.Account; +import dev.shiperist.repository.AccountRepository; +import io.smallrye.mutiny.Uni; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; + +import java.util.Optional; + +@ApplicationScoped +public class AccountService { + + @Inject + AccountRepository accountRepository; + + @Inject + AccountMapper accountMapper; + + @Transactional + public Uni createAccount(Account account) { + AccountEntity accountEntity = accountMapper.toEntity(account); + return accountRepository.persist(accountEntity).map(accountMapper::toDomain); + } + + @Transactional + public Uni> getAccount(Long id) { + return accountRepository.findById(id) + .map(accountMapper::toDomain) + .map(Optional::of) + .onItem().ifNull().continueWith(Optional.empty()); + } + + @Transactional + public Uni updateAccount(Account account) { + AccountEntity accountEntity = accountMapper.toEntity(account); + return accountRepository.persist(accountEntity).map(accountMapper::toDomain); + } + + @Transactional + public Uni deleteAccount(Long accountId) { + return accountRepository.deleteById(accountId); + } +} diff --git a/server/src/main/java/dev/shiperist/resource/SessionService.java b/server/src/main/java/dev/shiperist/resource/SessionService.java new file mode 100644 index 0000000..ae905fd --- /dev/null +++ b/server/src/main/java/dev/shiperist/resource/SessionService.java @@ -0,0 +1,47 @@ +package dev.shiperist.resource; + +import dev.shiperist.entity.SessionEntity; +import dev.shiperist.mapper.SessionMapper; +import dev.shiperist.model.Session; +import dev.shiperist.repository.SessionRepository; +import io.smallrye.mutiny.Uni; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; + +import java.util.Optional; + +@ApplicationScoped +public class SessionService { + + @Inject + SessionRepository sessionRepository; + + @Inject + SessionMapper sessionMapper; + + @Transactional + public Uni createSession(Session session) { + SessionEntity sessionEntity = sessionMapper.toEntity(session); + return sessionRepository.persist(sessionEntity).map(sessionMapper::toDomain); + } + + @Transactional + public Uni> getSession(Long id) { + return sessionRepository.findById(id) + .map(sessionMapper::toDomain) + .map(Optional::of) + .onItem().ifNull().continueWith(Optional.empty()); + } + + @Transactional + public Uni updateSession(Session session) { + SessionEntity sessionEntity = sessionMapper.toEntity(session); + return sessionRepository.persist(sessionEntity).map(sessionMapper::toDomain); + } + + @Transactional + public Uni deleteSession(Long sessionId) { + return sessionRepository.deleteById(sessionId); + } +} diff --git a/server/src/main/java/dev/shiperist/resource/UserService.java b/server/src/main/java/dev/shiperist/resource/UserService.java new file mode 100644 index 0000000..ffe9b3e --- /dev/null +++ b/server/src/main/java/dev/shiperist/resource/UserService.java @@ -0,0 +1,55 @@ +package dev.shiperist.resource; + +import dev.shiperist.entity.UserEntity; +import dev.shiperist.mapper.UserMapper; +import dev.shiperist.model.User; +import dev.shiperist.repository.UserRepository; +import io.smallrye.mutiny.Uni; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; + +import java.util.Optional; + +@ApplicationScoped +public class UserService { + + @Inject + UserRepository userRepository; + + @Inject + UserMapper userMapper; + + @Transactional + public Uni createUser(User user) { + UserEntity userEntity = userMapper.toEntity(user); + return userRepository.persist(userEntity).map(userMapper::toDomain); + } + + @Transactional + public Uni> getUser(Long id) { + return userRepository.findById(id) + .map(userMapper::toDomain) + .map(Optional::of) + .onItem().ifNull().continueWith(Optional.empty()); + } + + @Transactional + public Uni> getUserByEmail(String email) { + return userRepository.findByEmail(email) + .map(userMapper::toDomain) + .map(Optional::of) + .onItem().ifNull().continueWith(Optional.empty()); + } + + @Transactional + public Uni updateUser(User user) { + UserEntity userEntity = userMapper.toEntity(user); + return userRepository.persist(userEntity).map(userMapper::toDomain); + } + + @Transactional + public Uni deleteUser(Long userId) { + return userRepository.deleteById(userId); + } +} diff --git a/server/src/main/java/dev/shiperist/service/AuthService.java b/server/src/main/java/dev/shiperist/service/AuthService.java new file mode 100644 index 0000000..85704c6 --- /dev/null +++ b/server/src/main/java/dev/shiperist/service/AuthService.java @@ -0,0 +1,9 @@ +package dev.shiperist.service; + +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class AuthService { + + +} diff --git a/server/src/main/java/dev/shiperist/user/model/request/CreateUserRequest.java b/server/src/main/java/dev/shiperist/user/model/request/CreateUserRequest.java deleted file mode 100644 index 543e88a..0000000 --- a/server/src/main/java/dev/shiperist/user/model/request/CreateUserRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.shiperist.user.model.request; - -import lombok.Getter; - -import java.time.LocalDateTime; - -@Getter -public class CreateUserRequest { - private String name; - private String email; - private LocalDateTime isEmailVerified; - private String image; -} diff --git a/server/src/main/java/dev/shiperist/user/repository/UserRepository.java b/server/src/main/java/dev/shiperist/user/repository/UserRepository.java deleted file mode 100644 index a96c5fa..0000000 --- a/server/src/main/java/dev/shiperist/user/repository/UserRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package dev.shiperist.user.repository; - -import dev.shiperist.user.entity.UserEntity; -import io.quarkus.hibernate.reactive.panache.PanacheRepository; - -public class UserRepository implements PanacheRepository { -} diff --git a/server/src/main/java/dev/shiperist/user/resource/UserResource.java b/server/src/main/java/dev/shiperist/user/resource/UserResource.java deleted file mode 100644 index 06b8b9e..0000000 --- a/server/src/main/java/dev/shiperist/user/resource/UserResource.java +++ /dev/null @@ -1,37 +0,0 @@ -package dev.shiperist.user.resource; - -import dev.shiperist.user.entity.UserEntity; -import dev.shiperist.user.mapper.UserMapper; -import dev.shiperist.user.model.User; -import dev.shiperist.user.model.request.CreateUserRequest; -import dev.shiperist.user.repository.UserRepository; -import io.smallrye.mutiny.Uni; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.context.RequestScoped; -import jakarta.inject.Inject; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; - -@Path("/user") -@RequestScoped -public class UserResource { - - @Inject - UserRepository userRepository; - - @Inject - UserMapper userMapper; - - @GET - @Path("/create") - public Uni createUser(CreateUserRequest request) { - UserEntity.UserEntityBuilder builder = UserEntity.builder(); - builder.name(request.getName()); - builder.email(request.getEmail()); - builder.emailVerified(request.getIsEmailVerified()); - builder.image(request.getImage()); - - return userRepository.persist(builder.build()) - .map(userMapper::toDomain); - } -} diff --git a/server/src/test/java/dev/shiperist/accounts/resource/AuthResourceTest.java b/server/src/test/java/dev/shiperist/accounts/resource/AuthResourceTest.java new file mode 100644 index 0000000..af7d69a --- /dev/null +++ b/server/src/test/java/dev/shiperist/accounts/resource/AuthResourceTest.java @@ -0,0 +1,13 @@ +package dev.shiperist.accounts.resource; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +@QuarkusTest +public class AuthResourceTest { + + @Test + public void testCreateUserEndpoint() { + + } +} diff --git a/server/src/test/java/dev/shiperist/user/resource/UserResourceTest.java b/server/src/test/java/dev/shiperist/user/resource/UserResourceTest.java deleted file mode 100644 index 331a125..0000000 --- a/server/src/test/java/dev/shiperist/user/resource/UserResourceTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package dev.shiperist.user.resource; - -import dev.shiperist.user.model.request.CreateUserRequest; -import io.quarkus.test.junit.QuarkusTest; -import io.restassured.http.ContentType; -import org.junit.jupiter.api.Test; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.Matchers.is; - -@QuarkusTest -public class UserResourceTest { - - private Jsonb jsonb = JsonbBuilder.create(); - - @Test - public void testCreateUserEndpoint() { - CreateUserRequest request = new CreateUserRequest(); - request.setName("Test User"); - request.setEmail("test.user@example.com"); - request.setIsEmailVerified(LocalDateTime.now()); - request.setImage("http://example.com/image.jpg"); - - String requestBody = jsonb.toJson(request); - - given() - .body(requestBody) - .header("Content-Type", ContentType.JSON) - .when().post("/create") - .then() - .statusCode(200) - .body("name", is(request.getName())) - .body("email", is(request.getEmail())); - } -}