From c17d8ba546ad970e733233998039c3d1a9086259 Mon Sep 17 00:00:00 2001 From: guru-nitin_nextiva Date: Mon, 9 Dec 2024 15:38:36 +0530 Subject: [PATCH] first commit full crud --- pom.xml | 1 - .../blogapi/config/GlobalCorsConfig.java | 27 +++ .../blogapi/config/SecutiryConfig.java | 6 +- .../blogapi/config/WebMvcConfig.java | 33 +-- .../blogapi/controller/AlbumController.java | 90 -------- .../controller/CategoryController.java | 66 ------ .../blogapi/controller/CommentController.java | 83 ------- .../blogapi/controller/PhotoController.java | 73 ------- .../blogapi/controller/PostController.java | 95 -------- .../blogapi/controller/TodoController.java | 95 -------- .../controller/{ => v1}/AuthController.java | 4 +- .../controller/{ => v1}/TagController.java | 12 +- .../controller/{ => v1}/UserController.java | 45 +--- .../controller/v2/CAuthController.java | 128 +++++++++++ .../controller/v2/CUserController.java | 118 ++++++++++ .../controller/v2/HotelController.java | 70 ++++++ .../blogapi/controller/v2/ItemController.java | 73 +++++++ .../blogapi/controller/v2/MenuController.java | 179 +++++++++++++++ .../exception/NotAcceptableException.java | 25 +++ .../exception/ResourceNotFoundException.java | 5 + .../RestControllerExceptionHandler.java | 1 + .../com/sopromadze/blogapi/model/Album.java | 13 +- .../sopromadze/blogapi/model/Category.java | 9 +- .../com/sopromadze/blogapi/model/Comment.java | 10 +- .../com/sopromadze/blogapi/model/Photo.java | 11 +- .../com/sopromadze/blogapi/model/Post.java | 15 +- .../com/sopromadze/blogapi/model/Tag.java | 12 +- .../com/sopromadze/blogapi/model/Todo.java | 11 +- .../blogapi/model/audit/DateAudit.java | 3 + .../sopromadze/blogapi/model/role/Role.java | 9 +- .../blogapi/model/role/RoleName.java | 1 + .../blogapi/model/user/Address.java | 11 +- .../blogapi/model/user/Company.java | 8 +- .../sopromadze/blogapi/model/user/Geo.java | 8 +- .../sopromadze/blogapi/model/user/User.java | 19 +- .../sopromadze/blogapi/model/v2/MAddress.java | 42 ++++ .../sopromadze/blogapi/model/v2/MHotel.java | 40 ++++ .../sopromadze/blogapi/model/v2/MItem.java | 52 +++++ .../sopromadze/blogapi/model/v2/MMenu.java | 47 ++++ .../sopromadze/blogapi/model/v2/MUser.java | 83 +++++++ .../blogapi/model/v2/role/MRole.java | 28 +++ .../blogapi/model/v2/role/MRoleName.java | 7 + .../blogapi/payload/LoginRequest.java | 2 +- .../blogapi/payload/SignUpRequest.java | 16 +- .../blogapi/payload/UserSummary.java | 2 +- .../payload/v2/request/HotelUpdateDTO.java | 20 ++ .../payload/v2/request/MenuUpdateDTO.java | 10 + .../blogapi/repository/AlbumRepository.java | 12 - .../repository/CategoryRepository.java | 10 - .../blogapi/repository/CommentRepository.java | 12 - .../blogapi/repository/PhotoRepository.java | 12 - .../blogapi/repository/PostRepository.java | 21 -- .../blogapi/repository/TodoRepository.java | 12 - .../repository/v2/HotelRepository.java | 10 + .../blogapi/repository/v2/ItemRepository.java | 20 ++ .../blogapi/repository/v2/MenuRepository.java | 17 ++ .../repository/v2/RRoleRepository.java | 12 + .../repository/v2/RUserRepository.java | 43 ++++ .../blogapi/security/CurrentUser.java | 6 +- .../blogapi/security/JwtTokenProvider.java | 8 +- .../blogapi/security/UserPrincipal.java | 20 +- .../blogapi/service/AlbumService.java | 25 --- .../blogapi/service/CategoryService.java | 23 -- .../blogapi/service/CommentService.java | 21 -- .../blogapi/service/PhotoService.java | 23 -- .../blogapi/service/PostService.java | 28 --- .../blogapi/service/TodoService.java | 24 -- .../blogapi/service/UserService.java | 6 +- .../service/impl/AlbumServiceImpl.java | 133 ------------ .../service/impl/CategoryServiceImpl.java | 103 --------- .../service/impl/CommentServiceImpl.java | 127 ----------- .../impl/CustomUserDetailsServiceImpl.java | 18 +- .../service/impl/PhotoServiceImpl.java | 142 ------------ .../blogapi/service/impl/PostServiceImpl.java | 205 ------------------ .../blogapi/service/impl/TodoServiceImpl.java | 146 ------------- .../blogapi/service/impl/UserServiceImpl.java | 28 +-- .../blogapi/service/v2/HotelService.java | 22 ++ .../blogapi/service/v2/ItemService.java | 30 +++ .../blogapi/service/v2/MenuService.java | 29 +++ .../blogapi/service/v2/SUserService.java | 41 ++++ .../service/v2/impl/HotelServiceImpl.java | 76 +++++++ .../service/v2/impl/ItemServiceImpl.java | 112 ++++++++++ .../service/v2/impl/MenuServiceImpl.java | 138 ++++++++++++ .../service/v2/impl/SUserServiceImpl.java | 171 +++++++++++++++ .../blogapi/utils/ObjectTransformUtil.java | 69 ++++++ src/main/resources/application.yml | 11 +- src/main/resources/guuhaa.sql | 179 +++++++++++++++ 87 files changed, 2023 insertions(+), 1840 deletions(-) create mode 100644 src/main/java/com/sopromadze/blogapi/config/GlobalCorsConfig.java delete mode 100644 src/main/java/com/sopromadze/blogapi/controller/AlbumController.java delete mode 100644 src/main/java/com/sopromadze/blogapi/controller/CategoryController.java delete mode 100644 src/main/java/com/sopromadze/blogapi/controller/CommentController.java delete mode 100644 src/main/java/com/sopromadze/blogapi/controller/PhotoController.java delete mode 100644 src/main/java/com/sopromadze/blogapi/controller/PostController.java delete mode 100644 src/main/java/com/sopromadze/blogapi/controller/TodoController.java rename src/main/java/com/sopromadze/blogapi/controller/{ => v1}/AuthController.java (96%) rename src/main/java/com/sopromadze/blogapi/controller/{ => v1}/TagController.java (79%) rename src/main/java/com/sopromadze/blogapi/controller/{ => v1}/UserController.java (64%) create mode 100644 src/main/java/com/sopromadze/blogapi/controller/v2/CAuthController.java create mode 100644 src/main/java/com/sopromadze/blogapi/controller/v2/CUserController.java create mode 100644 src/main/java/com/sopromadze/blogapi/controller/v2/HotelController.java create mode 100644 src/main/java/com/sopromadze/blogapi/controller/v2/ItemController.java create mode 100644 src/main/java/com/sopromadze/blogapi/controller/v2/MenuController.java create mode 100644 src/main/java/com/sopromadze/blogapi/exception/NotAcceptableException.java create mode 100644 src/main/java/com/sopromadze/blogapi/model/v2/MAddress.java create mode 100644 src/main/java/com/sopromadze/blogapi/model/v2/MHotel.java create mode 100644 src/main/java/com/sopromadze/blogapi/model/v2/MItem.java create mode 100644 src/main/java/com/sopromadze/blogapi/model/v2/MMenu.java create mode 100644 src/main/java/com/sopromadze/blogapi/model/v2/MUser.java create mode 100644 src/main/java/com/sopromadze/blogapi/model/v2/role/MRole.java create mode 100644 src/main/java/com/sopromadze/blogapi/model/v2/role/MRoleName.java create mode 100644 src/main/java/com/sopromadze/blogapi/payload/v2/request/HotelUpdateDTO.java create mode 100644 src/main/java/com/sopromadze/blogapi/payload/v2/request/MenuUpdateDTO.java delete mode 100644 src/main/java/com/sopromadze/blogapi/repository/AlbumRepository.java delete mode 100644 src/main/java/com/sopromadze/blogapi/repository/CategoryRepository.java delete mode 100644 src/main/java/com/sopromadze/blogapi/repository/CommentRepository.java delete mode 100644 src/main/java/com/sopromadze/blogapi/repository/PhotoRepository.java delete mode 100644 src/main/java/com/sopromadze/blogapi/repository/PostRepository.java delete mode 100644 src/main/java/com/sopromadze/blogapi/repository/TodoRepository.java create mode 100644 src/main/java/com/sopromadze/blogapi/repository/v2/HotelRepository.java create mode 100644 src/main/java/com/sopromadze/blogapi/repository/v2/ItemRepository.java create mode 100644 src/main/java/com/sopromadze/blogapi/repository/v2/MenuRepository.java create mode 100644 src/main/java/com/sopromadze/blogapi/repository/v2/RRoleRepository.java create mode 100644 src/main/java/com/sopromadze/blogapi/repository/v2/RUserRepository.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/AlbumService.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/CategoryService.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/CommentService.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/PhotoService.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/PostService.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/TodoService.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/impl/AlbumServiceImpl.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/impl/CategoryServiceImpl.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/impl/CommentServiceImpl.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/impl/PhotoServiceImpl.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/impl/PostServiceImpl.java delete mode 100644 src/main/java/com/sopromadze/blogapi/service/impl/TodoServiceImpl.java create mode 100644 src/main/java/com/sopromadze/blogapi/service/v2/HotelService.java create mode 100644 src/main/java/com/sopromadze/blogapi/service/v2/ItemService.java create mode 100644 src/main/java/com/sopromadze/blogapi/service/v2/MenuService.java create mode 100644 src/main/java/com/sopromadze/blogapi/service/v2/SUserService.java create mode 100644 src/main/java/com/sopromadze/blogapi/service/v2/impl/HotelServiceImpl.java create mode 100644 src/main/java/com/sopromadze/blogapi/service/v2/impl/ItemServiceImpl.java create mode 100644 src/main/java/com/sopromadze/blogapi/service/v2/impl/MenuServiceImpl.java create mode 100644 src/main/java/com/sopromadze/blogapi/service/v2/impl/SUserServiceImpl.java create mode 100644 src/main/java/com/sopromadze/blogapi/utils/ObjectTransformUtil.java create mode 100644 src/main/resources/guuhaa.sql diff --git a/pom.xml b/pom.xml index 4b6fd187..1e935df0 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,6 @@ org.springframework.boot spring-boot-starter - mysql mysql-connector-java diff --git a/src/main/java/com/sopromadze/blogapi/config/GlobalCorsConfig.java b/src/main/java/com/sopromadze/blogapi/config/GlobalCorsConfig.java new file mode 100644 index 00000000..db4e2050 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/config/GlobalCorsConfig.java @@ -0,0 +1,27 @@ +package com.sopromadze.blogapi.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +import java.util.Arrays; + +@Configuration +public class GlobalCorsConfig { + + @Bean + public CorsFilter corsFilter() { + CorsConfiguration config = new CorsConfiguration(); + config.setAllowedOrigins(Arrays.asList("http://localhost:5051")); // Frontend origin + config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "PATCH")); + config.setAllowedHeaders(Arrays.asList("*")); + config.setAllowCredentials(true); + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + + return new CorsFilter(source); + } +} diff --git a/src/main/java/com/sopromadze/blogapi/config/SecutiryConfig.java b/src/main/java/com/sopromadze/blogapi/config/SecutiryConfig.java index 1a0c1175..43033d78 100644 --- a/src/main/java/com/sopromadze/blogapi/config/SecutiryConfig.java +++ b/src/main/java/com/sopromadze/blogapi/config/SecutiryConfig.java @@ -50,8 +50,10 @@ protected void configure(HttpSecurity http) throws Exception { .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() - .antMatchers(HttpMethod.GET, "/api/**").permitAll() - .antMatchers(HttpMethod.POST, "/api/auth/**").permitAll() +// .antMatchers(HttpMethod.GET, "/api/**").permitAll() +// .antMatchers(HttpMethod.POST, "/api/auth/**").permitAll() +// .antMatchers(HttpMethod.GET, "/api/v2/**").permitAll() + .antMatchers(HttpMethod.POST, "/api/v2/auth/**").permitAll() .antMatchers(HttpMethod.GET, "/api/users/checkUsernameAvailability", "/api/users/checkEmailAvailability").permitAll() .anyRequest().authenticated(); diff --git a/src/main/java/com/sopromadze/blogapi/config/WebMvcConfig.java b/src/main/java/com/sopromadze/blogapi/config/WebMvcConfig.java index 301ecb17..546a4624 100644 --- a/src/main/java/com/sopromadze/blogapi/config/WebMvcConfig.java +++ b/src/main/java/com/sopromadze/blogapi/config/WebMvcConfig.java @@ -5,19 +5,20 @@ import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -@Configuration -public class WebMvcConfig implements WebMvcConfigurer { - - @Value("cors.allowedOrings") - private String allowedOrigins; - - public void addCorsMappings(CorsRegistry registry) { - final long MAX_AGE_SECS = 3600; - - registry.addMapping("/**") - .allowedOrigins(allowedOrigins) - .allowedMethods("GET", "POST", "PUT", "DELETE") - .allowedHeaders("*") - .maxAge(MAX_AGE_SECS); - } -} +//@Configuration +//public class WebMvcConfig implements WebMvcConfigurer { +// +// @Value("cors.allowedOrings") +// private String allowedOrigins; +// +// public void addCorsMappings(CorsRegistry registry) { +// final long MAX_AGE_SECS = 3600; +// +// registry.addMapping("/**") +// .allowedOrigins("http://localhost:5051") // Frontend origin +// .allowedMethods("GET", "POST", "PUT","PATCH", "DELETE", "OPTIONS") // HTTP methods +// .allowedHeaders("*") // Allow all headers +// .allowCredentials(true) +// .maxAge(MAX_AGE_SECS); +// } +//} diff --git a/src/main/java/com/sopromadze/blogapi/controller/AlbumController.java b/src/main/java/com/sopromadze/blogapi/controller/AlbumController.java deleted file mode 100644 index b5dc9ff4..00000000 --- a/src/main/java/com/sopromadze/blogapi/controller/AlbumController.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.sopromadze.blogapi.controller; - -import com.sopromadze.blogapi.exception.ResponseEntityErrorException; -import com.sopromadze.blogapi.model.Album; -import com.sopromadze.blogapi.payload.AlbumResponse; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.payload.PhotoResponse; -import com.sopromadze.blogapi.payload.request.AlbumRequest; -import com.sopromadze.blogapi.security.CurrentUser; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.AlbumService; -import com.sopromadze.blogapi.service.PhotoService; -import com.sopromadze.blogapi.utils.AppConstants; -import com.sopromadze.blogapi.utils.AppUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -@RestController -@RequestMapping("/api/albums") -public class AlbumController { - @Autowired - private AlbumService albumService; - - @Autowired - private PhotoService photoService; - - @ExceptionHandler(ResponseEntityErrorException.class) - public ResponseEntity handleExceptions(ResponseEntityErrorException exception) { - return exception.getApiResponse(); - } - - @GetMapping - public PagedResponse getAllAlbums( - @RequestParam(name = "page", required = false, defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) Integer page, - @RequestParam(name = "size", required = false, defaultValue = AppConstants.DEFAULT_PAGE_SIZE) Integer size) { - AppUtils.validatePageNumberAndSize(page, size); - - return albumService.getAllAlbums(page, size); - } - - @PostMapping - @PreAuthorize("hasRole('USER')") - public ResponseEntity addAlbum(@Valid @RequestBody AlbumRequest albumRequest, @CurrentUser UserPrincipal currentUser) { - return albumService.addAlbum(albumRequest, currentUser); - } - - @GetMapping("/{id}") - public ResponseEntity getAlbum(@PathVariable(name = "id") Long id) { - return albumService.getAlbum(id); - } - - @PutMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity updateAlbum(@PathVariable(name = "id") Long id, @Valid @RequestBody AlbumRequest newAlbum, - @CurrentUser UserPrincipal currentUser) { - return albumService.updateAlbum(id, newAlbum, currentUser); - } - - @DeleteMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity deleteAlbum(@PathVariable(name = "id") Long id, @CurrentUser UserPrincipal currentUser) { - return albumService.deleteAlbum(id, currentUser); - } - - @GetMapping("/{id}/photos") - public ResponseEntity> getAllPhotosByAlbum(@PathVariable(name = "id") Long id, - @RequestParam(name = "page", required = false, defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) Integer page, - @RequestParam(name = "size", required = false, defaultValue = AppConstants.DEFAULT_PAGE_SIZE) Integer size) { - - PagedResponse response = photoService.getAllPhotosByAlbum(id, page, size); - - return new ResponseEntity<>(response, HttpStatus.OK); - } - -} diff --git a/src/main/java/com/sopromadze/blogapi/controller/CategoryController.java b/src/main/java/com/sopromadze/blogapi/controller/CategoryController.java deleted file mode 100644 index 39b63842..00000000 --- a/src/main/java/com/sopromadze/blogapi/controller/CategoryController.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.sopromadze.blogapi.controller; - -import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.Category; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.security.CurrentUser; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.CategoryService; -import com.sopromadze.blogapi.utils.AppConstants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -@RestController -@RequestMapping("/api/categories") -public class CategoryController { - @Autowired - private CategoryService categoryService; - - @GetMapping - public PagedResponse getAllCategories( - @RequestParam(name = "page", required = false, defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) Integer page, - @RequestParam(name = "size", required = false, defaultValue = AppConstants.DEFAULT_PAGE_SIZE) Integer size) { - return categoryService.getAllCategories(page, size); - } - - @PostMapping - @PreAuthorize("hasRole('USER')") - public ResponseEntity addCategory(@Valid @RequestBody Category category, - @CurrentUser UserPrincipal currentUser) { - - return categoryService.addCategory(category, currentUser); - } - - @GetMapping("/{id}") - public ResponseEntity getCategory(@PathVariable(name = "id") Long id) { - return categoryService.getCategory(id); - } - - @PutMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity updateCategory(@PathVariable(name = "id") Long id, - @Valid @RequestBody Category category, @CurrentUser UserPrincipal currentUser) throws UnauthorizedException { - return categoryService.updateCategory(id, category, currentUser); - } - - @DeleteMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity deleteCategory(@PathVariable(name = "id") Long id, - @CurrentUser UserPrincipal currentUser) throws UnauthorizedException { - return categoryService.deleteCategory(id, currentUser); - } - -} diff --git a/src/main/java/com/sopromadze/blogapi/controller/CommentController.java b/src/main/java/com/sopromadze/blogapi/controller/CommentController.java deleted file mode 100644 index 2a402910..00000000 --- a/src/main/java/com/sopromadze/blogapi/controller/CommentController.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.sopromadze.blogapi.controller; - -import com.sopromadze.blogapi.model.Comment; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.CommentRequest; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.security.CurrentUser; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.CommentService; -import com.sopromadze.blogapi.utils.AppConstants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -@RestController -@RequestMapping("/api/posts/{postId}/comments") -public class CommentController { - @Autowired - private CommentService commentService; - - @GetMapping - public ResponseEntity> getAllComments(@PathVariable(name = "postId") Long postId, - @RequestParam(name = "page", required = false, defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) Integer page, - @RequestParam(name = "size", required = false, defaultValue = AppConstants.DEFAULT_PAGE_SIZE) Integer size) { - - PagedResponse allComments = commentService.getAllComments(postId, page, size); - - return new ResponseEntity< >(allComments, HttpStatus.OK); - } - - @PostMapping - @PreAuthorize("hasRole('USER')") - public ResponseEntity addComment(@Valid @RequestBody CommentRequest commentRequest, - @PathVariable(name = "postId") Long postId, @CurrentUser UserPrincipal currentUser) { - Comment newComment = commentService.addComment(commentRequest, postId, currentUser); - - return new ResponseEntity<>(newComment, HttpStatus.CREATED); - } - - @GetMapping("/{id}") - public ResponseEntity getComment(@PathVariable(name = "postId") Long postId, - @PathVariable(name = "id") Long id) { - Comment comment = commentService.getComment(postId, id); - - return new ResponseEntity<>(comment, HttpStatus.OK); - } - - @PutMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity updateComment(@PathVariable(name = "postId") Long postId, - @PathVariable(name = "id") Long id, @Valid @RequestBody CommentRequest commentRequest, - @CurrentUser UserPrincipal currentUser) { - - Comment updatedComment = commentService.updateComment(postId, id, commentRequest, currentUser); - - return new ResponseEntity<>(updatedComment, HttpStatus.OK); - } - - @DeleteMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity deleteComment(@PathVariable(name = "postId") Long postId, - @PathVariable(name = "id") Long id, @CurrentUser UserPrincipal currentUser) { - - ApiResponse response = commentService.deleteComment(postId, id, currentUser); - - HttpStatus status = response.getSuccess() ? HttpStatus.OK : HttpStatus.BAD_REQUEST; - - return new ResponseEntity<>(response, status); - } - -} diff --git a/src/main/java/com/sopromadze/blogapi/controller/PhotoController.java b/src/main/java/com/sopromadze/blogapi/controller/PhotoController.java deleted file mode 100644 index 2f0846d0..00000000 --- a/src/main/java/com/sopromadze/blogapi/controller/PhotoController.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.sopromadze.blogapi.controller; - -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.payload.PhotoRequest; -import com.sopromadze.blogapi.payload.PhotoResponse; -import com.sopromadze.blogapi.security.CurrentUser; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.PhotoService; -import com.sopromadze.blogapi.utils.AppConstants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -@RestController -@RequestMapping("/api/photos") -public class PhotoController { - @Autowired - private PhotoService photoService; - - @GetMapping - public PagedResponse getAllPhotos( - @RequestParam(name = "page", required = false, defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) Integer page, - @RequestParam(name = "size", required = false, defaultValue = AppConstants.DEFAULT_PAGE_SIZE) Integer size) { - return photoService.getAllPhotos(page, size); - } - - @PostMapping - @PreAuthorize("hasRole('USER')") - public ResponseEntity addPhoto(@Valid @RequestBody PhotoRequest photoRequest, - @CurrentUser UserPrincipal currentUser) { - PhotoResponse photoResponse = photoService.addPhoto(photoRequest, currentUser); - - return new ResponseEntity< >(photoResponse, HttpStatus.OK); - } - - @GetMapping("/{id}") - public ResponseEntity getPhoto(@PathVariable(name = "id") Long id) { - PhotoResponse photoResponse = photoService.getPhoto(id); - - return new ResponseEntity< >(photoResponse, HttpStatus.OK); - } - - @PutMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity updatePhoto(@PathVariable(name = "id") Long id, - @Valid @RequestBody PhotoRequest photoRequest, @CurrentUser UserPrincipal currentUser) { - - PhotoResponse photoResponse = photoService.updatePhoto(id, photoRequest, currentUser); - - return new ResponseEntity< >(photoResponse, HttpStatus.OK); - } - - @DeleteMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity deletePhoto(@PathVariable(name = "id") Long id, @CurrentUser UserPrincipal currentUser) { - ApiResponse apiResponse = photoService.deletePhoto(id, currentUser); - - return new ResponseEntity< >(apiResponse, HttpStatus.OK); - } -} diff --git a/src/main/java/com/sopromadze/blogapi/controller/PostController.java b/src/main/java/com/sopromadze/blogapi/controller/PostController.java deleted file mode 100644 index 5b8efcc7..00000000 --- a/src/main/java/com/sopromadze/blogapi/controller/PostController.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.sopromadze.blogapi.controller; - -import com.sopromadze.blogapi.model.Post; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.payload.PostRequest; -import com.sopromadze.blogapi.payload.PostResponse; -import com.sopromadze.blogapi.security.CurrentUser; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.PostService; -import com.sopromadze.blogapi.utils.AppConstants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -@RestController -@RequestMapping("/api/posts") -public class PostController { - @Autowired - private PostService postService; - - @GetMapping - public ResponseEntity> getAllPosts( - @RequestParam(value = "page", required = false, defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) Integer page, - @RequestParam(value = "size", required = false, defaultValue = AppConstants.DEFAULT_PAGE_SIZE) Integer size) { - PagedResponse response = postService.getAllPosts(page, size); - - return new ResponseEntity< >(response, HttpStatus.OK); - } - - @GetMapping("/category/{id}") - public ResponseEntity> getPostsByCategory( - @RequestParam(value = "page", required = false, defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) Integer page, - @RequestParam(value = "size", required = false, defaultValue = AppConstants.DEFAULT_PAGE_SIZE) Integer size, - @PathVariable(name = "id") Long id) { - PagedResponse response = postService.getPostsByCategory(id, page, size); - - return new ResponseEntity< >(response, HttpStatus.OK); - } - - @GetMapping("/tag/{id}") - public ResponseEntity> getPostsByTag( - @RequestParam(value = "page", required = false, defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) Integer page, - @RequestParam(value = "size", required = false, defaultValue = AppConstants.DEFAULT_PAGE_SIZE) Integer size, - @PathVariable(name = "id") Long id) { - PagedResponse response = postService.getPostsByTag(id, page, size); - - return new ResponseEntity< >(response, HttpStatus.OK); - } - - @PostMapping - @PreAuthorize("hasRole('USER')") - public ResponseEntity addPost(@Valid @RequestBody PostRequest postRequest, - @CurrentUser UserPrincipal currentUser) { - PostResponse postResponse = postService.addPost(postRequest, currentUser); - - return new ResponseEntity< >(postResponse, HttpStatus.CREATED); - } - - @GetMapping("/{id}") - public ResponseEntity getPost(@PathVariable(name = "id") Long id) { - Post post = postService.getPost(id); - - return new ResponseEntity< >(post, HttpStatus.OK); - } - - @PutMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity updatePost(@PathVariable(name = "id") Long id, - @Valid @RequestBody PostRequest newPostRequest, @CurrentUser UserPrincipal currentUser) { - Post post = postService.updatePost(id, newPostRequest, currentUser); - - return new ResponseEntity< >(post, HttpStatus.OK); - } - - @DeleteMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity deletePost(@PathVariable(name = "id") Long id, @CurrentUser UserPrincipal currentUser) { - ApiResponse apiResponse = postService.deletePost(id, currentUser); - - return new ResponseEntity< >(apiResponse, HttpStatus.OK); - } -} diff --git a/src/main/java/com/sopromadze/blogapi/controller/TodoController.java b/src/main/java/com/sopromadze/blogapi/controller/TodoController.java deleted file mode 100644 index aeb57789..00000000 --- a/src/main/java/com/sopromadze/blogapi/controller/TodoController.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.sopromadze.blogapi.controller; - -import com.sopromadze.blogapi.model.Todo; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.security.CurrentUser; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.TodoService; -import com.sopromadze.blogapi.utils.AppConstants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -@RestController -@RequestMapping("/api/todos") -public class TodoController { - - @Autowired - private TodoService todoService; - - @GetMapping - @PreAuthorize("hasRole('USER')") - public ResponseEntity> getAllTodos( - @CurrentUser UserPrincipal currentUser, - @RequestParam(value = "page", required = false, defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) Integer page, - @RequestParam(name = "size", required = false, defaultValue = AppConstants.DEFAULT_PAGE_SIZE) Integer size) { - - PagedResponse response = todoService.getAllTodos(currentUser, page, size); - - return new ResponseEntity< >(response, HttpStatus.OK); - } - - @PostMapping - @PreAuthorize("hasRole('USER')") - public ResponseEntity addTodo(@Valid @RequestBody Todo todo, @CurrentUser UserPrincipal currentUser) { - Todo newTodo = todoService.addTodo(todo, currentUser); - - return new ResponseEntity< >(newTodo, HttpStatus.CREATED); - } - - @GetMapping("/{id}") - @PreAuthorize("hasRole('USER')") - public ResponseEntity getTodo(@PathVariable(value = "id") Long id, @CurrentUser UserPrincipal currentUser) { - Todo todo = todoService.getTodo(id, currentUser); - - return new ResponseEntity< >(todo, HttpStatus.OK); - } - - @PutMapping("/{id}") - @PreAuthorize("hasRole('USER')") - public ResponseEntity updateTodo(@PathVariable(value = "id") Long id, @Valid @RequestBody Todo newTodo, - @CurrentUser UserPrincipal currentUser) { - Todo updatedTodo = todoService.updateTodo(id, newTodo, currentUser); - - return new ResponseEntity< >(updatedTodo, HttpStatus.OK); - } - - @DeleteMapping("/{id}") - @PreAuthorize("hasRole('USER')") - public ResponseEntity deleteTodo(@PathVariable(value = "id") Long id, @CurrentUser UserPrincipal currentUser) { - ApiResponse apiResponse = todoService.deleteTodo(id, currentUser); - - return new ResponseEntity<>(apiResponse, HttpStatus.OK); - } - - @PutMapping("/{id}/complete") - @PreAuthorize("hasRole('USER')") - public ResponseEntity completeTodo(@PathVariable(value = "id") Long id, @CurrentUser UserPrincipal currentUser) { - - Todo todo = todoService.completeTodo(id, currentUser); - - return new ResponseEntity< >(todo, HttpStatus.OK); - } - - @PutMapping("/{id}/unComplete") - @PreAuthorize("hasRole('USER')") - public ResponseEntity unCompleteTodo(@PathVariable(value = "id") Long id, @CurrentUser UserPrincipal currentUser) { - - Todo todo = todoService.unCompleteTodo(id, currentUser); - - return new ResponseEntity< >(todo, HttpStatus.OK); - } -} diff --git a/src/main/java/com/sopromadze/blogapi/controller/AuthController.java b/src/main/java/com/sopromadze/blogapi/controller/v1/AuthController.java similarity index 96% rename from src/main/java/com/sopromadze/blogapi/controller/AuthController.java rename to src/main/java/com/sopromadze/blogapi/controller/v1/AuthController.java index 5d49753d..5445cb70 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/AuthController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/v1/AuthController.java @@ -1,4 +1,4 @@ -package com.sopromadze.blogapi.controller; +package com.sopromadze.blogapi.controller.v1; import com.sopromadze.blogapi.exception.AppException; import com.sopromadze.blogapi.exception.BlogapiException; @@ -54,7 +54,7 @@ public class AuthController { @PostMapping("/signin") public ResponseEntity authenticateUser(@Valid @RequestBody LoginRequest loginRequest) { Authentication authentication = authenticationManager.authenticate( - new UsernamePasswordAuthenticationToken(loginRequest.getUsernameOrEmail(), loginRequest.getPassword())); + new UsernamePasswordAuthenticationToken(loginRequest.getPhoneOrEmail(), loginRequest.getPassword())); SecurityContextHolder.getContext().setAuthentication(authentication); diff --git a/src/main/java/com/sopromadze/blogapi/controller/TagController.java b/src/main/java/com/sopromadze/blogapi/controller/v1/TagController.java similarity index 79% rename from src/main/java/com/sopromadze/blogapi/controller/TagController.java rename to src/main/java/com/sopromadze/blogapi/controller/v1/TagController.java index 9a9b45c8..c51c88b4 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/TagController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/v1/TagController.java @@ -1,4 +1,4 @@ -package com.sopromadze.blogapi.controller; +package com.sopromadze.blogapi.controller.v1; import com.sopromadze.blogapi.model.Tag; import com.sopromadze.blogapi.payload.ApiResponse; @@ -11,15 +11,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.validation.Valid; diff --git a/src/main/java/com/sopromadze/blogapi/controller/UserController.java b/src/main/java/com/sopromadze/blogapi/controller/v1/UserController.java similarity index 64% rename from src/main/java/com/sopromadze/blogapi/controller/UserController.java rename to src/main/java/com/sopromadze/blogapi/controller/v1/UserController.java index f6b717e2..a41550b4 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/UserController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/v1/UserController.java @@ -1,33 +1,18 @@ -package com.sopromadze.blogapi.controller; +package com.sopromadze.blogapi.controller.v1; import com.sopromadze.blogapi.model.Album; import com.sopromadze.blogapi.model.Post; import com.sopromadze.blogapi.model.user.User; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.InfoRequest; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.payload.UserIdentityAvailability; -import com.sopromadze.blogapi.payload.UserProfile; -import com.sopromadze.blogapi.payload.UserSummary; +import com.sopromadze.blogapi.payload.*; import com.sopromadze.blogapi.security.CurrentUser; import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.AlbumService; -import com.sopromadze.blogapi.service.PostService; import com.sopromadze.blogapi.service.UserService; import com.sopromadze.blogapi.utils.AppConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -37,12 +22,6 @@ public class UserController { @Autowired private UserService userService; - @Autowired - private PostService postService; - - @Autowired - private AlbumService albumService; - @GetMapping("/me") @PreAuthorize("hasRole('USER')") public ResponseEntity getCurrentUser(@CurrentUser UserPrincipal currentUser) { @@ -71,24 +50,6 @@ public ResponseEntity getUSerProfile(@PathVariable(value = "usernam return new ResponseEntity< >(userProfile, HttpStatus.OK); } - @GetMapping("/{username}/posts") - public ResponseEntity> getPostsCreatedBy(@PathVariable(value = "username") String username, - @RequestParam(value = "page", required = false, defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) Integer page, - @RequestParam(value = "size", required = false, defaultValue = AppConstants.DEFAULT_PAGE_SIZE) Integer size) { - PagedResponse response = postService.getPostsByCreatedBy(username, page, size); - - return new ResponseEntity< >(response, HttpStatus.OK); - } - - @GetMapping("/{username}/albums") - public ResponseEntity> getUserAlbums(@PathVariable(name = "username") String username, - @RequestParam(name = "page", required = false, defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) Integer page, - @RequestParam(name = "size", required = false, defaultValue = AppConstants.DEFAULT_PAGE_SIZE) Integer size) { - - PagedResponse response = albumService.getUserAlbums(username, page, size); - - return new ResponseEntity< >(response, HttpStatus.OK); - } @PostMapping @PreAuthorize("hasRole('ADMIN')") diff --git a/src/main/java/com/sopromadze/blogapi/controller/v2/CAuthController.java b/src/main/java/com/sopromadze/blogapi/controller/v2/CAuthController.java new file mode 100644 index 00000000..95a1ae87 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/controller/v2/CAuthController.java @@ -0,0 +1,128 @@ +package com.sopromadze.blogapi.controller.v2; + +import com.sopromadze.blogapi.exception.AppException; +import com.sopromadze.blogapi.exception.BlogapiException; +import com.sopromadze.blogapi.model.v2.MUser; +import com.sopromadze.blogapi.model.v2.role.MRole; +import com.sopromadze.blogapi.model.v2.role.MRoleName; +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.payload.JwtAuthenticationResponse; +import com.sopromadze.blogapi.payload.LoginRequest; +import com.sopromadze.blogapi.payload.SignUpRequest; +import com.sopromadze.blogapi.repository.v2.RRoleRepository; +import com.sopromadze.blogapi.repository.v2.RUserRepository; +import com.sopromadze.blogapi.security.JwtTokenProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import javax.validation.Valid; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/api/v2/auth") +public class CAuthController { + private static final Logger LOG = LoggerFactory.getLogger(CAuthController.class); + private static final String USER_ROLE_NOT_SET = "User role not set"; + + @Autowired + private AuthenticationManager authenticationManager; + + @Autowired + private RUserRepository userRepository; + + @Autowired + private RRoleRepository roleRepository; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private JwtTokenProvider jwtTokenProvider; + + @PostMapping("/login") + public ResponseEntity authenticateUser(@Valid @RequestBody LoginRequest loginRequest) { + Authentication authentication = authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken(loginRequest.getPhoneOrEmail(), loginRequest.getPassword())); + System.out.println("authentication"); + + System.out.println(authentication); + + SecurityContextHolder.getContext().setAuthentication(authentication); + + String jwt = jwtTokenProvider.generateToken(authentication); + +// UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal(); + +// Cookie cookie = new Cookie("Authorization", "Bearer " + jwt); +// cookie.setHttpOnly(true); // Prevents JavaScript access +// cookie.setSecure(true); // Ensures the cookie is sent only over HTTPS (use false for local testing) +// cookie.setPath("/"); // Makes the cookie available to all endpoints +// cookie.setMaxAge(3600); + + + + + return ResponseEntity.ok(new JwtAuthenticationResponse(jwt)); + } + + @PostMapping("/signup")//not in use + public ResponseEntity registerUser(@Valid @RequestBody SignUpRequest signUpRequest) { + if (Boolean.TRUE.equals(userRepository.existsByUserName(signUpRequest.getUsername()))) { + throw new BlogapiException(HttpStatus.BAD_REQUEST, "Username is already taken"); + } + + if (Boolean.TRUE.equals(userRepository.existsByEmail(signUpRequest.getEmail()))) { + throw new BlogapiException(HttpStatus.BAD_REQUEST, "Email is already taken"); + } + + String firstName = signUpRequest.getFirstName().toLowerCase(); + + String lastName = signUpRequest.getLastName().toLowerCase(); + + String username = signUpRequest.getUsername().toLowerCase(); + + String email = signUpRequest.getEmail().toLowerCase(); + + String phone = signUpRequest.getPhone(); + + String password = passwordEncoder.encode(signUpRequest.getPassword()); + + MUser user = new MUser(firstName, lastName, username, email,phone, password,null); + + List roles = new ArrayList<>(); + + if (userRepository.count() == 0) { + roles.add(roleRepository.findByName(MRoleName.ROLE_USER) + .orElseThrow(() -> new AppException(USER_ROLE_NOT_SET))); + roles.add(roleRepository.findByName(MRoleName.ROLE_ADMIN) + .orElseThrow(() -> new AppException(USER_ROLE_NOT_SET))); + } else { + roles.add(roleRepository.findByName(MRoleName.ROLE_USER) + .orElseThrow(() -> new AppException(USER_ROLE_NOT_SET))); + } + + user.setRoles(roles); + + MUser result = userRepository.save(user); + + URI location = ServletUriComponentsBuilder.fromCurrentContextPath().path("/api/v2/users/{userId}") + .buildAndExpand(result.getId()).toUri(); + + return ResponseEntity.created(location).body(new ApiResponse(Boolean.TRUE, "User registered successfully")); + } +} diff --git a/src/main/java/com/sopromadze/blogapi/controller/v2/CUserController.java b/src/main/java/com/sopromadze/blogapi/controller/v2/CUserController.java new file mode 100644 index 00000000..88bd2be0 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/controller/v2/CUserController.java @@ -0,0 +1,118 @@ +package com.sopromadze.blogapi.controller.v2; + +import com.sopromadze.blogapi.model.v2.MUser; +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.payload.InfoRequest; +import com.sopromadze.blogapi.payload.UserIdentityAvailability; +import com.sopromadze.blogapi.payload.UserProfile; +import com.sopromadze.blogapi.security.CurrentUser; +import com.sopromadze.blogapi.security.UserPrincipal; +import com.sopromadze.blogapi.service.v2.SUserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("/api/v2/users") +public class CUserController { + + private static final Logger LOG = LoggerFactory.getLogger(CUserController.class); + + @Autowired + private SUserService userService; + + @GetMapping("/me") + @PreAuthorize("hasRole('USER')") + public ResponseEntity getCurrentUser(@CurrentUser UserPrincipal currentUser) { + MUser userSummary = userService.getCurrentUserFull(currentUser); + + return new ResponseEntity< >(userSummary, HttpStatus.OK); + } + + + @GetMapping() + @PreAuthorize("hasRole('USER')") + public ResponseEntity> getAllUserByHotel(@CurrentUser UserPrincipal currentUser) { + System.out.println("currentUser------->"+currentUser); + + List userSummary = userService.getALlUserOfHotel(currentUser); + return new ResponseEntity< >(userSummary, HttpStatus.OK); + } + + + + @GetMapping("/checkUsernameAvailability") + public ResponseEntity checkUsernameAvailability(@RequestParam(value = "username") String username) { + UserIdentityAvailability userIdentityAvailability = userService.checkUsernameAvailability(username); + + return new ResponseEntity< >(userIdentityAvailability, HttpStatus.OK); + } + + @GetMapping("/checkPhoneAvailability") + public ResponseEntity checkEmailAvailability(@RequestParam(value = "phone") String phone) { + UserIdentityAvailability userIdentityAvailability = userService.checkPhoneAvailability(phone); + return new ResponseEntity< >(userIdentityAvailability, HttpStatus.OK); + } + + + @PostMapping + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity addUser(@Valid @RequestBody MUser user,@CurrentUser UserPrincipal currentUser) { + MUser newUser = userService.addUser(user,currentUser); + + return new ResponseEntity< >(newUser, HttpStatus.CREATED); + } + + @PutMapping("/{userId}") + @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") + public ResponseEntity updateUser( + @Valid @RequestBody MUser newUser, + @PathVariable(value = "userId") String username, + @CurrentUser UserPrincipal currentUser) { + MUser updatedUSer = userService.updateUser(newUser, username, currentUser); + + return new ResponseEntity< >(updatedUSer, HttpStatus.OK); + } + + @DeleteMapping("/{username}") + @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") + public ResponseEntity deleteUser(@PathVariable(value = "userId") String userId, + @CurrentUser UserPrincipal currentUser) { + ApiResponse apiResponse = userService.deleteUser(userId, currentUser); + + return new ResponseEntity< >(apiResponse, HttpStatus.OK); + } + + @PutMapping("/{username}/giveAdmin") + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity giveAdmin(@PathVariable(name = "username") String username) { + ApiResponse apiResponse = userService.giveAdmin(username); + + return new ResponseEntity< >(apiResponse, HttpStatus.OK); + } + + @PutMapping("/{username}/takeAdmin") + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity takeAdmin(@PathVariable(name = "username") String username) { + ApiResponse apiResponse = userService.removeAdmin(username); + + return new ResponseEntity< >(apiResponse, HttpStatus.OK); + } + + @PutMapping("/setOrUpdateInfo") + @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") + public ResponseEntity setAddress(@CurrentUser UserPrincipal currentUser, + @Valid @RequestBody InfoRequest infoRequest) { + UserProfile userProfile = userService.setOrUpdateInfo(currentUser, infoRequest); + + return new ResponseEntity< >(userProfile, HttpStatus.OK); + } + +} diff --git a/src/main/java/com/sopromadze/blogapi/controller/v2/HotelController.java b/src/main/java/com/sopromadze/blogapi/controller/v2/HotelController.java new file mode 100644 index 00000000..bcb4e465 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/controller/v2/HotelController.java @@ -0,0 +1,70 @@ +package com.sopromadze.blogapi.controller.v2; + +import com.sopromadze.blogapi.model.v2.MHotel; +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.payload.v2.request.HotelUpdateDTO; +import com.sopromadze.blogapi.security.CurrentUser; +import com.sopromadze.blogapi.security.UserPrincipal; +import com.sopromadze.blogapi.service.v2.HotelService; +import com.sopromadze.blogapi.service.v2.SUserService; +import com.sopromadze.blogapi.utils.ObjectTransformUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.Map; + +@RestController +@RequestMapping("/api/v2/hotel") +public class HotelController { + private static final Logger LOG = LoggerFactory.getLogger(HotelController.class); + + @Autowired + private HotelService hotelService; + + private SUserService userService; + + @GetMapping("/mine") + @PreAuthorize("hasRole('USER') or hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity getCurrentHotel(@CurrentUser UserPrincipal currentUser) { + System.out.println(currentUser.getHotel()); + MHotel hotel = hotelService.get(currentUser.getHotel().getId()); + + return new ResponseEntity< >(hotel, HttpStatus.OK); + } + + @PostMapping + @PreAuthorize("hasRole('BOSS')") + public ResponseEntity createHotel(@Valid @RequestBody MHotel hotel, @CurrentUser UserPrincipal currentUser) { + + MHotel Newhotel = hotelService.create(hotel,currentUser); + + return new ResponseEntity< >(Newhotel, HttpStatus.CREATED); + } + + @PatchMapping("/{hotelId}") + @PreAuthorize("hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity getMenu(@PathVariable(value = "hotelId") Long hotelId, @Valid @RequestBody Map hotel, @CurrentUser UserPrincipal currentUser) { + + MHotel resp = hotelService.update(hotel,currentUser); + + return new ResponseEntity(resp, HttpStatus.OK); + } + + @DeleteMapping + @PreAuthorize("hasRole('BOSS')") + public ResponseEntity deleteHotel(@Valid @RequestBody String phone, @CurrentUser UserPrincipal currentUser) { + + ApiResponse resp = hotelService.delete(phone,currentUser); + + return new ResponseEntity(resp, HttpStatus.OK); + } + + + +} diff --git a/src/main/java/com/sopromadze/blogapi/controller/v2/ItemController.java b/src/main/java/com/sopromadze/blogapi/controller/v2/ItemController.java new file mode 100644 index 00000000..98866735 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/controller/v2/ItemController.java @@ -0,0 +1,73 @@ +package com.sopromadze.blogapi.controller.v2; + +import com.sopromadze.blogapi.model.v2.MItem; +import com.sopromadze.blogapi.model.v2.MMenu; +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.payload.v2.request.MenuUpdateDTO; +import com.sopromadze.blogapi.security.CurrentUser; +import com.sopromadze.blogapi.security.UserPrincipal; +import com.sopromadze.blogapi.service.v2.ItemService; +import com.sopromadze.blogapi.service.v2.MenuService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/v2/item") +public class ItemController { + + private static final Logger LOG = LoggerFactory.getLogger(ItemController.class); + + @Autowired + private ItemService itemService; + + @Autowired + private MenuService menuService; + + @GetMapping + @PreAuthorize("hasRole('USER') or hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity> getActiveMenuItem(@CurrentUser UserPrincipal currentUser) { + List menu = menuService.getActive(currentUser.getHotel().getId()); + List ActiveItems = menu.stream().map(t-> t.getItems()).collect(Collectors.toList()); + + return new ResponseEntity< >(ActiveItems, HttpStatus.OK); + } + + + @GetMapping("/{itemId}") + @PreAuthorize("hasRole('USER') or hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity getSingleItem( + @PathVariable(value = "itemId") Long itemId) { + + MItem newitem = itemService.get( itemId); + + return new ResponseEntity<>(newitem, HttpStatus.CREATED); + } + + @DeleteMapping("/{itemId}") + @PreAuthorize("hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity deleteMenu(@PathVariable(value = "itemId") Long itemId) { + + ApiResponse resp = itemService.delete(itemId); + + return new ResponseEntity(resp, HttpStatus.OK); + } + + @DeleteMapping("/multiple") + @PreAuthorize("hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity deleteMenu( @Valid @RequestBody List ids) { + + ApiResponse resp = itemService.delete(ids); + + return new ResponseEntity(resp, HttpStatus.OK); + } +} diff --git a/src/main/java/com/sopromadze/blogapi/controller/v2/MenuController.java b/src/main/java/com/sopromadze/blogapi/controller/v2/MenuController.java new file mode 100644 index 00000000..ac0f7e6e --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/controller/v2/MenuController.java @@ -0,0 +1,179 @@ +package com.sopromadze.blogapi.controller.v2; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.sopromadze.blogapi.model.v2.MItem; +import com.sopromadze.blogapi.model.v2.MMenu; +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.payload.v2.request.MenuUpdateDTO; +import com.sopromadze.blogapi.security.CurrentUser; +import com.sopromadze.blogapi.security.UserPrincipal; +import com.sopromadze.blogapi.service.v2.ItemService; +import com.sopromadze.blogapi.service.v2.MenuService; +import com.sopromadze.blogapi.utils.ObjectTransformUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; +import java.util.Map; + +@RestController +@Validated +@RequestMapping("/api/v2/menu") +public class MenuController { + + private static final Logger LOG = LoggerFactory.getLogger(MenuController.class); + + @Autowired + private MenuService menuService; + + @Autowired + private ItemService itemService; + + + @GetMapping("/all") + @PreAuthorize("hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity> getAllMenu(@CurrentUser UserPrincipal currentUser) { + List hotel = menuService.getAllInHotel(currentUser.getHotel().getId()); + return new ResponseEntity<>(hotel, HttpStatus.OK); + } + + @GetMapping + @PreAuthorize("hasRole('USER') or hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity> getActiveMenu(@CurrentUser UserPrincipal currentUser) { + List hotel = menuService.getActive(currentUser.getHotel().getId()); + return new ResponseEntity<>(hotel, HttpStatus.OK); + } + + + +// CRUD ON SINGLE + + @GetMapping("/{menuId}") + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity getMenu(@PathVariable(value = "menuId") Long menuId, @CurrentUser UserPrincipal currentUser) { + + MMenu resp = menuService.get(menuId); + return new ResponseEntity(resp, HttpStatus.CREATED); + } + + @PostMapping + @PreAuthorize("hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity createMenu(@Valid @RequestBody MMenu menu, @CurrentUser UserPrincipal currentUser) { + + menu.setHotelId(currentUser.getHotel().getId()); + MMenu updatedMenu = menuService.create(menu, currentUser); + + return new ResponseEntity<>(updatedMenu, HttpStatus.CREATED); + } + + @PutMapping("/{menuId}") + @PreAuthorize("hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity getMenu(@PathVariable(value = "menuId") Long menuId, @Valid @RequestBody MMenu menu, @CurrentUser UserPrincipal currentUser) { + menu.setId(menuId); + MMenu resp = menuService.update(menu, currentUser); + + return new ResponseEntity(resp, HttpStatus.OK); + } + + @PatchMapping("/{menuId}") + @PreAuthorize("hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity patchMenu(@PathVariable Long menuId, @Valid @RequestBody Map menuUpdateDTO, @CurrentUser UserPrincipal currentUser) { + MMenu updatedMenu = menuService.partialUpdate(menuId, menuUpdateDTO, currentUser); + return ResponseEntity.ok(updatedMenu); + } + + @DeleteMapping("/{menuId}") + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity deleteMenu(@PathVariable(value = "menuId") Long menuId, @CurrentUser UserPrincipal currentUser) { + + ApiResponse resp = menuService.delete(menuId, currentUser); + + return new ResponseEntity(resp, HttpStatus.OK); + } + + +// ITEMS + + @PostMapping("/{menuId}/item") + @PreAuthorize("hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity createItems(@PathVariable(value = "menuId") Long menuId, @Valid @RequestBody MItem item, @CurrentUser UserPrincipal currentUser) { + + MItem newitem = itemService.create(item, menuId); + + return new ResponseEntity<>(newitem, HttpStatus.OK); + } + + + @PostMapping("/{menuId}/multi-item") + @PreAuthorize("hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity> createMultiItems(@PathVariable(value = "menuId") Long menuId, @Valid @RequestBody List item, @CurrentUser UserPrincipal currentUser) { + + List newitem = itemService.create(item, menuId); + + return new ResponseEntity<>(newitem, HttpStatus.OK); + } + + + @GetMapping("/{menuId}/item") + @PreAuthorize("hasRole('USER') or hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity> getItems(@PathVariable(value = "menuId") Long menuId) { + + List newitem = itemService.getByMenuId( menuId); + + return new ResponseEntity<>(newitem, HttpStatus.CREATED); + } + + @GetMapping("/{menuId}/item/{itemId}") + @PreAuthorize("hasRole('USER') or hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity getSingleItem( + @PathVariable(value = "menuId") Long menuId, + @PathVariable(value = "itemId") Long itemId) { + + MItem newitem = itemService.get( menuId); + + return new ResponseEntity<>(newitem, HttpStatus.CREATED); + } + + @PatchMapping("/{menuId}/item/{itemId}") + @PreAuthorize("hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity updateItem( + @PathVariable(value = "menuId") Long menuId, + @PathVariable(value = "itemId") Long itemId, + @Valid @RequestBody Map item) { + + MItem resp = itemService.partialUpdate(menuId,itemId,item); + + return new ResponseEntity<>(resp, HttpStatus.OK); + } + + @DeleteMapping("/{menuId}/item/{itemId}") + @PreAuthorize("hasRole('ADMIN') or hasRole('BOSS')") + public ResponseEntity deleteItem(@PathVariable(value = "itemId") Long itemId) { + + ApiResponse resp = itemService.delete(itemId); + return new ResponseEntity(resp, HttpStatus.OK); + + } + + +// COPY + + @GetMapping("/{menuId}/copy") + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity copy(@PathVariable(value = "menuId") Long menuId, @CurrentUser UserPrincipal currentUser) { + + MMenu resp = menuService.copy(menuId, currentUser); + + return new ResponseEntity<>(resp, HttpStatus.CREATED); + } + + +} diff --git a/src/main/java/com/sopromadze/blogapi/exception/NotAcceptableException.java b/src/main/java/com/sopromadze/blogapi/exception/NotAcceptableException.java new file mode 100644 index 00000000..9d981e3f --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/exception/NotAcceptableException.java @@ -0,0 +1,25 @@ +package com.sopromadze.blogapi.exception; + +import com.sopromadze.blogapi.payload.ApiResponse; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.NOT_ACCEPTABLE) +public class NotAcceptableException extends RuntimeException { + private static final long serialVersionUID = 1L; + + private ApiResponse apiResponse; + + public NotAcceptableException(ApiResponse apiResponse) { + super(); + this.apiResponse = apiResponse; + } + + public NotAcceptableException(String message) { + super(message); + } + + public ApiResponse getApiResponse() { + return apiResponse; + } +} diff --git a/src/main/java/com/sopromadze/blogapi/exception/ResourceNotFoundException.java b/src/main/java/com/sopromadze/blogapi/exception/ResourceNotFoundException.java index 4dd90e07..b45d941b 100644 --- a/src/main/java/com/sopromadze/blogapi/exception/ResourceNotFoundException.java +++ b/src/main/java/com/sopromadze/blogapi/exception/ResourceNotFoundException.java @@ -21,6 +21,11 @@ public ResourceNotFoundException(String resourceName, String fieldName, Object f this.fieldValue = fieldValue; } + public ResourceNotFoundException(String resourceName) { + super(); + this.resourceName = resourceName; + } + public String getResourceName() { return resourceName; } diff --git a/src/main/java/com/sopromadze/blogapi/exception/RestControllerExceptionHandler.java b/src/main/java/com/sopromadze/blogapi/exception/RestControllerExceptionHandler.java index a9372e45..92c55bab 100644 --- a/src/main/java/com/sopromadze/blogapi/exception/RestControllerExceptionHandler.java +++ b/src/main/java/com/sopromadze/blogapi/exception/RestControllerExceptionHandler.java @@ -43,6 +43,7 @@ public ResponseEntity resolveException(UnauthorizedException except return new ResponseEntity<>(apiResponse, HttpStatus.UNAUTHORIZED); } + @ExceptionHandler(BadRequestException.class) @ResponseBody public ResponseEntity resolveException(BadRequestException exception) { diff --git a/src/main/java/com/sopromadze/blogapi/model/Album.java b/src/main/java/com/sopromadze/blogapi/model/Album.java index 311d5991..d660647f 100644 --- a/src/main/java/com/sopromadze/blogapi/model/Album.java +++ b/src/main/java/com/sopromadze/blogapi/model/Album.java @@ -6,18 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; -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.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; +import javax.persistence.*; import javax.validation.constraints.NotBlank; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/com/sopromadze/blogapi/model/Category.java b/src/main/java/com/sopromadze/blogapi/model/Category.java index 102c6e39..8cd76d90 100644 --- a/src/main/java/com/sopromadze/blogapi/model/Category.java +++ b/src/main/java/com/sopromadze/blogapi/model/Category.java @@ -7,14 +7,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import javax.persistence.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/sopromadze/blogapi/model/Comment.java b/src/main/java/com/sopromadze/blogapi/model/Comment.java index d9d21972..b48eb1ac 100644 --- a/src/main/java/com/sopromadze/blogapi/model/Comment.java +++ b/src/main/java/com/sopromadze/blogapi/model/Comment.java @@ -7,15 +7,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -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.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import javax.persistence.*; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; diff --git a/src/main/java/com/sopromadze/blogapi/model/Photo.java b/src/main/java/com/sopromadze/blogapi/model/Photo.java index 7aaa1d2a..53af35fa 100644 --- a/src/main/java/com/sopromadze/blogapi/model/Photo.java +++ b/src/main/java/com/sopromadze/blogapi/model/Photo.java @@ -6,16 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -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.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; +import javax.persistence.*; import javax.validation.constraints.NotBlank; @EqualsAndHashCode(callSuper = true) diff --git a/src/main/java/com/sopromadze/blogapi/model/Post.java b/src/main/java/com/sopromadze/blogapi/model/Post.java index 6b97dbcf..eb70d215 100644 --- a/src/main/java/com/sopromadze/blogapi/model/Post.java +++ b/src/main/java/com/sopromadze/blogapi/model/Post.java @@ -8,20 +8,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; -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.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; +import javax.persistence.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/sopromadze/blogapi/model/Tag.java b/src/main/java/com/sopromadze/blogapi/model/Tag.java index a3cbd193..1f613351 100644 --- a/src/main/java/com/sopromadze/blogapi/model/Tag.java +++ b/src/main/java/com/sopromadze/blogapi/model/Tag.java @@ -2,21 +2,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.sopromadze.blogapi.model.audit.UserDateAudit; -import com.sopromadze.blogapi.model.Post; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -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.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.Table; +import javax.persistence.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/sopromadze/blogapi/model/Todo.java b/src/main/java/com/sopromadze/blogapi/model/Todo.java index 7fed93d1..3da13e18 100644 --- a/src/main/java/com/sopromadze/blogapi/model/Todo.java +++ b/src/main/java/com/sopromadze/blogapi/model/Todo.java @@ -6,16 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; -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.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; +import javax.persistence.*; import javax.validation.constraints.NotBlank; @EqualsAndHashCode(callSuper = true) diff --git a/src/main/java/com/sopromadze/blogapi/model/audit/DateAudit.java b/src/main/java/com/sopromadze/blogapi/model/audit/DateAudit.java index c9f8abe7..04185d10 100644 --- a/src/main/java/com/sopromadze/blogapi/model/audit/DateAudit.java +++ b/src/main/java/com/sopromadze/blogapi/model/audit/DateAudit.java @@ -1,5 +1,6 @@ package com.sopromadze.blogapi.model.audit; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; import org.springframework.data.annotation.CreatedDate; @@ -24,10 +25,12 @@ public abstract class DateAudit implements Serializable { private static final long serialVersionUID = 1L; @CreatedDate + @JsonIgnore @Column(nullable = false, updatable = false) private Instant createdAt; @LastModifiedDate + @JsonIgnore @Column(nullable = false) private Instant updatedAt; diff --git a/src/main/java/com/sopromadze/blogapi/model/role/Role.java b/src/main/java/com/sopromadze/blogapi/model/role/Role.java index 00231ca9..6edd584e 100644 --- a/src/main/java/com/sopromadze/blogapi/model/role/Role.java +++ b/src/main/java/com/sopromadze/blogapi/model/role/Role.java @@ -4,14 +4,7 @@ import lombok.NoArgsConstructor; import org.hibernate.annotations.NaturalId; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; @Entity @Data diff --git a/src/main/java/com/sopromadze/blogapi/model/role/RoleName.java b/src/main/java/com/sopromadze/blogapi/model/role/RoleName.java index f2064b2f..2d36341c 100644 --- a/src/main/java/com/sopromadze/blogapi/model/role/RoleName.java +++ b/src/main/java/com/sopromadze/blogapi/model/role/RoleName.java @@ -3,4 +3,5 @@ public enum RoleName { ROLE_ADMIN, ROLE_USER, + ROLE_BOSS, } diff --git a/src/main/java/com/sopromadze/blogapi/model/user/Address.java b/src/main/java/com/sopromadze/blogapi/model/user/Address.java index f686bbbf..db8df0a4 100644 --- a/src/main/java/com/sopromadze/blogapi/model/user/Address.java +++ b/src/main/java/com/sopromadze/blogapi/model/user/Address.java @@ -2,20 +2,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.sopromadze.blogapi.model.audit.UserDateAudit; -import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToOne; -import javax.persistence.Table; +import javax.persistence.*; import java.time.Instant; @EqualsAndHashCode(callSuper = true) diff --git a/src/main/java/com/sopromadze/blogapi/model/user/Company.java b/src/main/java/com/sopromadze/blogapi/model/user/Company.java index 7cc93a2f..e14924ab 100644 --- a/src/main/java/com/sopromadze/blogapi/model/user/Company.java +++ b/src/main/java/com/sopromadze/blogapi/model/user/Company.java @@ -6,13 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToOne; -import javax.persistence.Table; +import javax.persistence.*; import java.time.Instant; @EqualsAndHashCode(callSuper = true) diff --git a/src/main/java/com/sopromadze/blogapi/model/user/Geo.java b/src/main/java/com/sopromadze/blogapi/model/user/Geo.java index f2845e22..2b57f5d8 100644 --- a/src/main/java/com/sopromadze/blogapi/model/user/Geo.java +++ b/src/main/java/com/sopromadze/blogapi/model/user/Geo.java @@ -6,13 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToOne; -import javax.persistence.Table; +import javax.persistence.*; import java.time.Instant; @EqualsAndHashCode(callSuper = true) diff --git a/src/main/java/com/sopromadze/blogapi/model/user/User.java b/src/main/java/com/sopromadze/blogapi/model/user/User.java index 90f2e489..55ffbe70 100644 --- a/src/main/java/com/sopromadze/blogapi/model/user/User.java +++ b/src/main/java/com/sopromadze/blogapi/model/user/User.java @@ -3,30 +3,17 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.sopromadze.blogapi.model.Album; -import com.sopromadze.blogapi.model.audit.DateAudit; import com.sopromadze.blogapi.model.Comment; import com.sopromadze.blogapi.model.Post; -import com.sopromadze.blogapi.model.role.Role; import com.sopromadze.blogapi.model.Todo; +import com.sopromadze.blogapi.model.audit.DateAudit; +import com.sopromadze.blogapi.model.role.Role; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import org.hibernate.annotations.NaturalId; -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.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; +import javax.persistence.*; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; diff --git a/src/main/java/com/sopromadze/blogapi/model/v2/MAddress.java b/src/main/java/com/sopromadze/blogapi/model/v2/MAddress.java new file mode 100644 index 00000000..fb8386b9 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/model/v2/MAddress.java @@ -0,0 +1,42 @@ +package com.sopromadze.blogapi.model.v2; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Data +@NoArgsConstructor +@Table(name = "t_address") +public class MAddress { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "door_no") + private String doorNo; + + private String line1; + + private String line2; + + private String city; + + private String state; + + private String pincode; + + private String lat; + + private String lng; + + @JsonIgnore + public Long getId() { + return id; + } + +} diff --git a/src/main/java/com/sopromadze/blogapi/model/v2/MHotel.java b/src/main/java/com/sopromadze/blogapi/model/v2/MHotel.java new file mode 100644 index 00000000..1d461b2f --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/model/v2/MHotel.java @@ -0,0 +1,40 @@ +package com.sopromadze.blogapi.model.v2; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.sopromadze.blogapi.model.audit.DateAudit; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Data +@NoArgsConstructor +@Table(name = "t_hotel") +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +@AllArgsConstructor +public class MHotel extends DateAudit { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "full_name") + private String fullName; + + @Column(name = "user_name") + private String userName; + + private String email; + + @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "address_id") + private MAddress address; + + private String phone; + + private String website; + +} diff --git a/src/main/java/com/sopromadze/blogapi/model/v2/MItem.java b/src/main/java/com/sopromadze/blogapi/model/v2/MItem.java new file mode 100644 index 00000000..56003c15 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/model/v2/MItem.java @@ -0,0 +1,52 @@ +package com.sopromadze.blogapi.model.v2; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.sopromadze.blogapi.model.audit.DateAudit; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +import javax.persistence.*; + +@Entity +@Data +@NoArgsConstructor +@Table(name = "t_item") +//@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +@AllArgsConstructor +public class MItem extends DateAudit { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NonNull + @Column(name = "title") + private String title; + + @Column(name = "alias") + private String alias; + + @Column(name = "shortcut") + private String shortcut; + + + private String description; + + private Boolean isActive = true; + + @Column(name = "is_veg") + private Boolean isVeg = true; + + @NonNull + @Column(name = "price") + private Long price; + + + @JsonIgnore + @Column(name = "menu_id") + private Long menuId; + +} diff --git a/src/main/java/com/sopromadze/blogapi/model/v2/MMenu.java b/src/main/java/com/sopromadze/blogapi/model/v2/MMenu.java new file mode 100644 index 00000000..8103f332 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/model/v2/MMenu.java @@ -0,0 +1,47 @@ +package com.sopromadze.blogapi.model.v2; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.sopromadze.blogapi.model.audit.DateAudit; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Data +@NoArgsConstructor +@Table(name = "t_menu") +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +@AllArgsConstructor +public class MMenu extends DateAudit { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NonNull + @Column(name = "title") + private String title; + + @Column(name = "description") + private String description; + + @Column(name = "is_active") + private Boolean isActive; + + @JsonIgnore + @Column(name = "hotel_id") + private Long hotelId; + + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "menu_id") + private List items = new ArrayList<>(); + + +} diff --git a/src/main/java/com/sopromadze/blogapi/model/v2/MUser.java b/src/main/java/com/sopromadze/blogapi/model/v2/MUser.java new file mode 100644 index 00000000..31edfbfd --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/model/v2/MUser.java @@ -0,0 +1,83 @@ +package com.sopromadze.blogapi.model.v2; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.sopromadze.blogapi.model.audit.DateAudit; +import com.sopromadze.blogapi.model.v2.role.MRole; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.NaturalId; + +import javax.persistence.*; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Entity +@NoArgsConstructor +@Data +@Table(name = "t_users", uniqueConstraints = { @UniqueConstraint(columnNames = { "email" }) }) +public class MUser extends DateAudit { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + @NotBlank + @Column(name = "first_name") + @Size(max = 40) + private String firstName; + + @Column(name = "last_name") + @Size(max = 40) + private String lastName; + + @NotBlank + @Column(name = "username") + @Size(max = 50) + private String userName; + + @NotBlank + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @Size(max = 100) + @Column(name = "password") + private String password; + + @NotBlank + @NaturalId + @Size(max = 40) + @Email + private String email; + + @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "address_id") + private MAddress address; + + @Column(name = "phone") + private String phone; + + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = "t_user_role", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")) + private List roles; + + + @ManyToOne(optional = true, fetch = FetchType.EAGER) // A user can optionally belong to a hotel + @JoinColumn(name = "hotel_id") // Foreign key column in the `t_users` table + private MHotel hotel; + + + public MUser(String firstName, String lastName, String username, String email,String phone, String password,MHotel hotel) { + this.firstName = firstName; + this.lastName = lastName; + this.userName = username; + this.email = email; + this.password = password; + this.phone= phone; + this.hotel = hotel; + } +} diff --git a/src/main/java/com/sopromadze/blogapi/model/v2/role/MRole.java b/src/main/java/com/sopromadze/blogapi/model/v2/role/MRole.java new file mode 100644 index 00000000..94dfef5c --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/model/v2/role/MRole.java @@ -0,0 +1,28 @@ +package com.sopromadze.blogapi.model.v2.role; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.NaturalId; + +import javax.persistence.*; + +@Entity +@Data +@NoArgsConstructor +@Table(name = "t_roles") +public class MRole { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonIgnore + private Long id; + + @Enumerated(EnumType.STRING) + @NaturalId + @Column(name = "name") + private MRoleName name; + + public MRole(MRoleName name) { + this.name = name; + } +} diff --git a/src/main/java/com/sopromadze/blogapi/model/v2/role/MRoleName.java b/src/main/java/com/sopromadze/blogapi/model/v2/role/MRoleName.java new file mode 100644 index 00000000..2f35b874 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/model/v2/role/MRoleName.java @@ -0,0 +1,7 @@ +package com.sopromadze.blogapi.model.v2.role; + +public enum MRoleName { + ROLE_ADMIN, + ROLE_USER, + ROLE_BOSS +} diff --git a/src/main/java/com/sopromadze/blogapi/payload/LoginRequest.java b/src/main/java/com/sopromadze/blogapi/payload/LoginRequest.java index ac1b0ee8..32ac424c 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/LoginRequest.java +++ b/src/main/java/com/sopromadze/blogapi/payload/LoginRequest.java @@ -7,7 +7,7 @@ @Data public class LoginRequest { @NotBlank - private String usernameOrEmail; + private String phoneOrEmail; @NotBlank private String password; diff --git a/src/main/java/com/sopromadze/blogapi/payload/SignUpRequest.java b/src/main/java/com/sopromadze/blogapi/payload/SignUpRequest.java index 3f993f13..10587fda 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/SignUpRequest.java +++ b/src/main/java/com/sopromadze/blogapi/payload/SignUpRequest.java @@ -4,20 +4,21 @@ import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; @Data public class SignUpRequest { - @NotBlank - @Size(min = 4, max = 40) + + @NotBlank(message = "first Name cannot be blank") + @Size(min = 4, max = 20) private String firstName; - @NotBlank - @Size(min = 4, max = 40) + @Size( max = 20) private String lastName; @NotBlank - @Size(min = 3, max = 15) + @Size(min = 3, max = 50) private String username; @NotBlank @@ -28,4 +29,9 @@ public class SignUpRequest { @NotBlank @Size(min = 6, max = 20) private String password; + + @NotBlank(message = "Phone number cannot be blank") + @Size(min = 10, max = 10, message = "Phone number must be exactly 10 digits") + @Pattern(regexp = "\\d{10}", message = "Phone number must contain only digits") + private String phone; } diff --git a/src/main/java/com/sopromadze/blogapi/payload/UserSummary.java b/src/main/java/com/sopromadze/blogapi/payload/UserSummary.java index 7fe8fe92..1d2d28b1 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/UserSummary.java +++ b/src/main/java/com/sopromadze/blogapi/payload/UserSummary.java @@ -7,7 +7,7 @@ @AllArgsConstructor public class UserSummary { private Long id; - private String username; + private String userName; private String firstName; private String lastName; } diff --git a/src/main/java/com/sopromadze/blogapi/payload/v2/request/HotelUpdateDTO.java b/src/main/java/com/sopromadze/blogapi/payload/v2/request/HotelUpdateDTO.java new file mode 100644 index 00000000..44954855 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/payload/v2/request/HotelUpdateDTO.java @@ -0,0 +1,20 @@ +package com.sopromadze.blogapi.payload.v2.request; + +import com.sopromadze.blogapi.model.v2.MAddress; +import lombok.Data; +import lombok.NonNull; + +@Data +public class HotelUpdateDTO { + + + private String fullName; + private String userName; + private String email; + private MAddress address; + + + private String phone; + private String website; + +} \ No newline at end of file diff --git a/src/main/java/com/sopromadze/blogapi/payload/v2/request/MenuUpdateDTO.java b/src/main/java/com/sopromadze/blogapi/payload/v2/request/MenuUpdateDTO.java new file mode 100644 index 00000000..8a0a5a41 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/payload/v2/request/MenuUpdateDTO.java @@ -0,0 +1,10 @@ +package com.sopromadze.blogapi.payload.v2.request; + +import lombok.Data; + +@Data +public class MenuUpdateDTO { + private String name; + private Boolean isActive; + private String description; +} \ No newline at end of file diff --git a/src/main/java/com/sopromadze/blogapi/repository/AlbumRepository.java b/src/main/java/com/sopromadze/blogapi/repository/AlbumRepository.java deleted file mode 100644 index 12d6837f..00000000 --- a/src/main/java/com/sopromadze/blogapi/repository/AlbumRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sopromadze.blogapi.repository; - -import com.sopromadze.blogapi.model.Album; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface AlbumRepository extends JpaRepository { - Page findByCreatedBy(Long userId, Pageable pageable); -} diff --git a/src/main/java/com/sopromadze/blogapi/repository/CategoryRepository.java b/src/main/java/com/sopromadze/blogapi/repository/CategoryRepository.java deleted file mode 100644 index 55c00914..00000000 --- a/src/main/java/com/sopromadze/blogapi/repository/CategoryRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sopromadze.blogapi.repository; - -import com.sopromadze.blogapi.model.Category; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface CategoryRepository extends JpaRepository { - -} diff --git a/src/main/java/com/sopromadze/blogapi/repository/CommentRepository.java b/src/main/java/com/sopromadze/blogapi/repository/CommentRepository.java deleted file mode 100644 index b4fb3be3..00000000 --- a/src/main/java/com/sopromadze/blogapi/repository/CommentRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sopromadze.blogapi.repository; - -import com.sopromadze.blogapi.model.Comment; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface CommentRepository extends JpaRepository { - Page findByPostId(Long postId, Pageable pageable); -} diff --git a/src/main/java/com/sopromadze/blogapi/repository/PhotoRepository.java b/src/main/java/com/sopromadze/blogapi/repository/PhotoRepository.java deleted file mode 100644 index a6f52698..00000000 --- a/src/main/java/com/sopromadze/blogapi/repository/PhotoRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sopromadze.blogapi.repository; - -import com.sopromadze.blogapi.model.Photo; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface PhotoRepository extends JpaRepository { - Page findByAlbumId(Long albumId, Pageable pageable); -} diff --git a/src/main/java/com/sopromadze/blogapi/repository/PostRepository.java b/src/main/java/com/sopromadze/blogapi/repository/PostRepository.java deleted file mode 100644 index a748afb8..00000000 --- a/src/main/java/com/sopromadze/blogapi/repository/PostRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sopromadze.blogapi.repository; - -import com.sopromadze.blogapi.model.Post; -import com.sopromadze.blogapi.model.Tag; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface PostRepository extends JpaRepository { - Page findByCreatedBy(Long userId, Pageable pageable); - - Page findByCategory(Long categoryId, Pageable pageable); - - Page findByTags(List tags, Pageable pageable); - - Long countByCreatedBy(Long userId); -} diff --git a/src/main/java/com/sopromadze/blogapi/repository/TodoRepository.java b/src/main/java/com/sopromadze/blogapi/repository/TodoRepository.java deleted file mode 100644 index 3cb55e71..00000000 --- a/src/main/java/com/sopromadze/blogapi/repository/TodoRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sopromadze.blogapi.repository; - -import com.sopromadze.blogapi.model.Todo; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface TodoRepository extends JpaRepository { - Page findByCreatedBy(Long userId, Pageable pageable); -} diff --git a/src/main/java/com/sopromadze/blogapi/repository/v2/HotelRepository.java b/src/main/java/com/sopromadze/blogapi/repository/v2/HotelRepository.java new file mode 100644 index 00000000..093a2430 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/repository/v2/HotelRepository.java @@ -0,0 +1,10 @@ +package com.sopromadze.blogapi.repository.v2; + +import com.sopromadze.blogapi.model.v2.MHotel; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface HotelRepository extends JpaRepository { + +} diff --git a/src/main/java/com/sopromadze/blogapi/repository/v2/ItemRepository.java b/src/main/java/com/sopromadze/blogapi/repository/v2/ItemRepository.java new file mode 100644 index 00000000..1f0574a8 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/repository/v2/ItemRepository.java @@ -0,0 +1,20 @@ +package com.sopromadze.blogapi.repository.v2; + +import com.sopromadze.blogapi.model.v2.MItem; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ItemRepository extends JpaRepository { +// List findByHotelId(Long hotelId); + List findAllByMenuId(Long menuId); + + void deleteAllById(List itemIds); + + List findAllByMenuIdIn(List menuIds); + + + +} diff --git a/src/main/java/com/sopromadze/blogapi/repository/v2/MenuRepository.java b/src/main/java/com/sopromadze/blogapi/repository/v2/MenuRepository.java new file mode 100644 index 00000000..f4f54cf3 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/repository/v2/MenuRepository.java @@ -0,0 +1,17 @@ +package com.sopromadze.blogapi.repository.v2; + +import com.sopromadze.blogapi.model.v2.MMenu; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface MenuRepository extends JpaRepository { + List findByHotelId(Long hotelId); + + List findByIdAndIsActiveTrue(Long hotelId); + + +} diff --git a/src/main/java/com/sopromadze/blogapi/repository/v2/RRoleRepository.java b/src/main/java/com/sopromadze/blogapi/repository/v2/RRoleRepository.java new file mode 100644 index 00000000..d6d8199b --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/repository/v2/RRoleRepository.java @@ -0,0 +1,12 @@ +package com.sopromadze.blogapi.repository.v2; + +//import com.sopromadze.blogapi.model.role.Role; +import com.sopromadze.blogapi.model.v2.role.MRole; +import com.sopromadze.blogapi.model.v2.role.MRoleName; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface RRoleRepository extends JpaRepository { + Optional findByName(MRoleName name); +} diff --git a/src/main/java/com/sopromadze/blogapi/repository/v2/RUserRepository.java b/src/main/java/com/sopromadze/blogapi/repository/v2/RUserRepository.java new file mode 100644 index 00000000..754ab313 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/repository/v2/RUserRepository.java @@ -0,0 +1,43 @@ +package com.sopromadze.blogapi.repository.v2; + +import com.sopromadze.blogapi.exception.ResourceNotFoundException; +import com.sopromadze.blogapi.model.v2.MUser; +import com.sopromadze.blogapi.security.UserPrincipal; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import javax.validation.constraints.NotBlank; +import java.util.List; +import java.util.Optional; + +@Repository +public interface RUserRepository extends JpaRepository { + Optional findByUserName(@NotBlank String userName); + + Optional findById(@NotBlank String userName); + + List findByHotel_Id(Long hotelId); + + Optional findByEmail(@NotBlank String email); + + Boolean existsByUserName(@NotBlank String userName); + + Boolean existsByEmail(@NotBlank String email); + + Boolean existsByPhone(@NotBlank String phone); + + Optional findByEmailOrPhone(String userName, String email); + + Optional findByFirstNameOrLastName(String firstName, String LastName); + + default MUser getUser(UserPrincipal currentUser) { + return getUserByName(currentUser.getUsername()); + } + + default MUser getUserByName(String userName) { + return findByUserName(userName) + .orElseThrow(() -> new ResourceNotFoundException("User", "userName", userName)); + } + + +} diff --git a/src/main/java/com/sopromadze/blogapi/security/CurrentUser.java b/src/main/java/com/sopromadze/blogapi/security/CurrentUser.java index 400b4a48..657f1ec4 100644 --- a/src/main/java/com/sopromadze/blogapi/security/CurrentUser.java +++ b/src/main/java/com/sopromadze/blogapi/security/CurrentUser.java @@ -2,11 +2,7 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; @Target({ ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/com/sopromadze/blogapi/security/JwtTokenProvider.java b/src/main/java/com/sopromadze/blogapi/security/JwtTokenProvider.java index 77fad327..17716412 100644 --- a/src/main/java/com/sopromadze/blogapi/security/JwtTokenProvider.java +++ b/src/main/java/com/sopromadze/blogapi/security/JwtTokenProvider.java @@ -1,12 +1,6 @@ package com.sopromadze.blogapi.security; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.ExpiredJwtException; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.MalformedJwtException; -import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.SignatureException; -import io.jsonwebtoken.UnsupportedJwtException; +import io.jsonwebtoken.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/com/sopromadze/blogapi/security/UserPrincipal.java b/src/main/java/com/sopromadze/blogapi/security/UserPrincipal.java index 3402459f..51cec540 100644 --- a/src/main/java/com/sopromadze/blogapi/security/UserPrincipal.java +++ b/src/main/java/com/sopromadze/blogapi/security/UserPrincipal.java @@ -1,7 +1,10 @@ package com.sopromadze.blogapi.security; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.sopromadze.blogapi.model.user.User; +import com.sopromadze.blogapi.model.v2.MHotel; +import com.sopromadze.blogapi.model.v2.MUser; +import lombok.Getter; +import lombok.ToString; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; @@ -12,6 +15,7 @@ import java.util.Objects; import java.util.stream.Collectors; +@ToString public class UserPrincipal implements UserDetails { private static final long serialVersionUID = 1L; @@ -29,15 +33,19 @@ public class UserPrincipal implements UserDetails { @JsonIgnore private String password; + @Getter + private MHotel hotel; + private Collection authorities; - public UserPrincipal(Long id, String firstName, String lastName, String username, String email, String password, - Collection authorities) { + public UserPrincipal(Long id, String firstName, String lastName, String username, String email, String password, MHotel hotel, + Collection authorities) { this.id = id; this.firstName = firstName; this.lastName = lastName; this.username = username; this.email = email; + this.hotel = hotel; this.password = password; if (authorities == null) { @@ -47,12 +55,12 @@ public UserPrincipal(Long id, String firstName, String lastName, String username } } - public static UserPrincipal create(User user) { + public static UserPrincipal create(MUser user) { List authorities = user.getRoles().stream() .map(role -> new SimpleGrantedAuthority(role.getName().name())).collect(Collectors.toList()); - return new UserPrincipal(user.getId(), user.getFirstName(), user.getLastName(), user.getUsername(), - user.getEmail(), user.getPassword(), authorities); + return new UserPrincipal(user.getId(), user.getFirstName(), user.getLastName(), user.getUserName(), + user.getEmail(), user.getPassword(),user.getHotel(), authorities); } public Long getId() { diff --git a/src/main/java/com/sopromadze/blogapi/service/AlbumService.java b/src/main/java/com/sopromadze/blogapi/service/AlbumService.java deleted file mode 100644 index ef4a3621..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/AlbumService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sopromadze.blogapi.service; - -import com.sopromadze.blogapi.model.Album; -import com.sopromadze.blogapi.payload.AlbumResponse; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.payload.request.AlbumRequest; -import com.sopromadze.blogapi.security.UserPrincipal; -import org.springframework.http.ResponseEntity; - -public interface AlbumService { - - PagedResponse getAllAlbums(int page, int size); - - ResponseEntity addAlbum(AlbumRequest albumRequest, UserPrincipal currentUser); - - ResponseEntity getAlbum(Long id); - - ResponseEntity updateAlbum(Long id, AlbumRequest newAlbum, UserPrincipal currentUser); - - ResponseEntity deleteAlbum(Long id, UserPrincipal currentUser); - - PagedResponse getUserAlbums(String username, int page, int size); - -} diff --git a/src/main/java/com/sopromadze/blogapi/service/CategoryService.java b/src/main/java/com/sopromadze/blogapi/service/CategoryService.java deleted file mode 100644 index 65734a3e..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/CategoryService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sopromadze.blogapi.service; - -import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.Category; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.security.UserPrincipal; -import org.springframework.http.ResponseEntity; - -public interface CategoryService { - - PagedResponse getAllCategories(int page, int size); - - ResponseEntity getCategory(Long id); - - ResponseEntity addCategory(Category category, UserPrincipal currentUser); - - ResponseEntity updateCategory(Long id, Category newCategory, UserPrincipal currentUser) - throws UnauthorizedException; - - ResponseEntity deleteCategory(Long id, UserPrincipal currentUser) throws UnauthorizedException; - -} diff --git a/src/main/java/com/sopromadze/blogapi/service/CommentService.java b/src/main/java/com/sopromadze/blogapi/service/CommentService.java deleted file mode 100644 index cdbc34de..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/CommentService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sopromadze.blogapi.service; - -import com.sopromadze.blogapi.model.Comment; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.CommentRequest; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.security.UserPrincipal; - -public interface CommentService { - - PagedResponse getAllComments(Long postId, int page, int size); - - Comment addComment(CommentRequest commentRequest, Long postId, UserPrincipal currentUser); - - Comment getComment(Long postId, Long id); - - Comment updateComment(Long postId, Long id, CommentRequest commentRequest, UserPrincipal currentUser); - - ApiResponse deleteComment(Long postId, Long id, UserPrincipal currentUser); - -} diff --git a/src/main/java/com/sopromadze/blogapi/service/PhotoService.java b/src/main/java/com/sopromadze/blogapi/service/PhotoService.java deleted file mode 100644 index b59c767f..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/PhotoService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sopromadze.blogapi.service; - -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.payload.PhotoRequest; -import com.sopromadze.blogapi.payload.PhotoResponse; -import com.sopromadze.blogapi.security.UserPrincipal; - -public interface PhotoService { - - PagedResponse getAllPhotos(int page, int size); - - PhotoResponse getPhoto(Long id); - - PhotoResponse updatePhoto(Long id, PhotoRequest photoRequest, UserPrincipal currentUser); - - PhotoResponse addPhoto(PhotoRequest photoRequest, UserPrincipal currentUser); - - ApiResponse deletePhoto(Long id, UserPrincipal currentUser); - - PagedResponse getAllPhotosByAlbum(Long albumId, int page, int size); - -} \ No newline at end of file diff --git a/src/main/java/com/sopromadze/blogapi/service/PostService.java b/src/main/java/com/sopromadze/blogapi/service/PostService.java deleted file mode 100644 index d4754205..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/PostService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.sopromadze.blogapi.service; - -import com.sopromadze.blogapi.model.Post; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.payload.PostRequest; -import com.sopromadze.blogapi.payload.PostResponse; -import com.sopromadze.blogapi.security.UserPrincipal; - -public interface PostService { - - PagedResponse getAllPosts(int page, int size); - - PagedResponse getPostsByCreatedBy(String username, int page, int size); - - PagedResponse getPostsByCategory(Long id, int page, int size); - - PagedResponse getPostsByTag(Long id, int page, int size); - - Post updatePost(Long id, PostRequest newPostRequest, UserPrincipal currentUser); - - ApiResponse deletePost(Long id, UserPrincipal currentUser); - - PostResponse addPost(PostRequest postRequest, UserPrincipal currentUser); - - Post getPost(Long id); - -} diff --git a/src/main/java/com/sopromadze/blogapi/service/TodoService.java b/src/main/java/com/sopromadze/blogapi/service/TodoService.java deleted file mode 100644 index 23e7903d..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/TodoService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sopromadze.blogapi.service; - -import com.sopromadze.blogapi.model.Todo; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.security.UserPrincipal; - -public interface TodoService { - - Todo completeTodo(Long id, UserPrincipal currentUser); - - Todo unCompleteTodo(Long id, UserPrincipal currentUser); - - PagedResponse getAllTodos(UserPrincipal currentUser, int page, int size); - - Todo addTodo(Todo todo, UserPrincipal currentUser); - - Todo getTodo(Long id, UserPrincipal currentUser); - - Todo updateTodo(Long id, Todo newTodo, UserPrincipal currentUser); - - ApiResponse deleteTodo(Long id, UserPrincipal currentUser); - -} diff --git a/src/main/java/com/sopromadze/blogapi/service/UserService.java b/src/main/java/com/sopromadze/blogapi/service/UserService.java index a134a637..3f29a01b 100644 --- a/src/main/java/com/sopromadze/blogapi/service/UserService.java +++ b/src/main/java/com/sopromadze/blogapi/service/UserService.java @@ -1,11 +1,7 @@ package com.sopromadze.blogapi.service; import com.sopromadze.blogapi.model.user.User; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.InfoRequest; -import com.sopromadze.blogapi.payload.UserIdentityAvailability; -import com.sopromadze.blogapi.payload.UserProfile; -import com.sopromadze.blogapi.payload.UserSummary; +import com.sopromadze.blogapi.payload.*; import com.sopromadze.blogapi.security.UserPrincipal; public interface UserService { diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/AlbumServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/AlbumServiceImpl.java deleted file mode 100644 index 6964008e..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/impl/AlbumServiceImpl.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.sopromadze.blogapi.service.impl; - -import com.sopromadze.blogapi.exception.BlogapiException; -import com.sopromadze.blogapi.exception.ResourceNotFoundException; -import com.sopromadze.blogapi.model.Album; -import com.sopromadze.blogapi.model.role.RoleName; -import com.sopromadze.blogapi.model.user.User; -import com.sopromadze.blogapi.payload.AlbumResponse; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.payload.request.AlbumRequest; -import com.sopromadze.blogapi.repository.AlbumRepository; -import com.sopromadze.blogapi.repository.UserRepository; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.AlbumService; -import com.sopromadze.blogapi.utils.AppUtils; -import org.modelmapper.ModelMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import static com.sopromadze.blogapi.utils.AppConstants.ID; - -@Service -public class AlbumServiceImpl implements AlbumService { - private static final String CREATED_AT = "createdAt"; - - private static final String ALBUM_STR = "Album"; - - private static final String YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION = "You don't have permission to make this operation"; - - @Autowired - private AlbumRepository albumRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private ModelMapper modelMapper; - - @Override - public PagedResponse getAllAlbums(int page, int size) { - AppUtils.validatePageNumberAndSize(page, size); - - Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, CREATED_AT); - - Page albums = albumRepository.findAll(pageable); - - if (albums.getNumberOfElements() == 0) { - return new PagedResponse<>(Collections.emptyList(), albums.getNumber(), albums.getSize(), albums.getTotalElements(), - albums.getTotalPages(), albums.isLast()); - } - - List albumResponses = Arrays.asList(modelMapper.map(albums.getContent(), AlbumResponse[].class)); - - return new PagedResponse<>(albumResponses, albums.getNumber(), albums.getSize(), albums.getTotalElements(), albums.getTotalPages(), - albums.isLast()); - } - - @Override - public ResponseEntity addAlbum(AlbumRequest albumRequest, UserPrincipal currentUser) { - User user = userRepository.getUser(currentUser); - - Album album = new Album(); - - modelMapper.map(albumRequest, album); - - album.setUser(user); - Album newAlbum = albumRepository.save(album); - return new ResponseEntity<>(newAlbum, HttpStatus.CREATED); - } - - @Override - public ResponseEntity getAlbum(Long id) { - Album album = albumRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(ALBUM_STR, ID, id)); - return new ResponseEntity<>(album, HttpStatus.OK); - } - - @Override - public ResponseEntity updateAlbum(Long id, AlbumRequest newAlbum, UserPrincipal currentUser) { - Album album = albumRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(ALBUM_STR, ID, id)); - User user = userRepository.getUser(currentUser); - if (album.getUser().getId().equals(user.getId()) || currentUser.getAuthorities() - .contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { - album.setTitle(newAlbum.getTitle()); - Album updatedAlbum = albumRepository.save(album); - - AlbumResponse albumResponse = new AlbumResponse(); - - modelMapper.map(updatedAlbum, albumResponse); - - return new ResponseEntity<>(albumResponse, HttpStatus.OK); - } - - throw new BlogapiException(HttpStatus.UNAUTHORIZED, YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION); - } - - @Override - public ResponseEntity deleteAlbum(Long id, UserPrincipal currentUser) { - Album album = albumRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(ALBUM_STR, ID, id)); - User user = userRepository.getUser(currentUser); - if (album.getUser().getId().equals(user.getId()) || currentUser.getAuthorities() - .contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { - albumRepository.deleteById(id); - return new ResponseEntity<>(new ApiResponse(Boolean.TRUE, "You successfully deleted album"), HttpStatus.OK); - } - - throw new BlogapiException(HttpStatus.UNAUTHORIZED, YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION); - } - - @Override - public PagedResponse getUserAlbums(String username, int page, int size) { - User user = userRepository.getUserByName(username); - - Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, CREATED_AT); - - Page albums = albumRepository.findByCreatedBy(user.getId(), pageable); - - List content = albums.getNumberOfElements() > 0 ? albums.getContent() : Collections.emptyList(); - - return new PagedResponse<>(content, albums.getNumber(), albums.getSize(), albums.getTotalElements(), albums.getTotalPages(), albums.isLast()); - } -} diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/CategoryServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/CategoryServiceImpl.java deleted file mode 100644 index a98064b3..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/impl/CategoryServiceImpl.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.sopromadze.blogapi.service.impl; - -import com.sopromadze.blogapi.exception.ResourceNotFoundException; -import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.Category; -import com.sopromadze.blogapi.model.role.RoleName; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.repository.CategoryRepository; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.CategoryService; -import com.sopromadze.blogapi.utils.AppUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.stereotype.Service; - -import java.util.Collections; -import java.util.List; - -@Service -public class CategoryServiceImpl implements CategoryService { - - @Autowired - private CategoryRepository categoryRepository; - - @Override - public PagedResponse getAllCategories(int page, int size) { - AppUtils.validatePageNumberAndSize(page, size); - - Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "createdAt"); - - Page categories = categoryRepository.findAll(pageable); - - List content = categories.getNumberOfElements() == 0 ? Collections.emptyList() : categories.getContent(); - - return new PagedResponse<>(content, categories.getNumber(), categories.getSize(), categories.getTotalElements(), - categories.getTotalPages(), categories.isLast()); - } - - @Override - public ResponseEntity getCategory(Long id) { - Category category = categoryRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Category", "id", id)); - return new ResponseEntity<>(category, HttpStatus.OK); - } - - @Override - public ResponseEntity addCategory(Category category, UserPrincipal currentUser) { - Category newCategory = categoryRepository.save(category); - return new ResponseEntity<>(newCategory, HttpStatus.CREATED); - } - - @Override - public ResponseEntity updateCategory(Long id, Category newCategory, UserPrincipal currentUser) { - Category category = categoryRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Category", "id", id)); - if (category.getCreatedBy().equals(currentUser.getId()) || currentUser.getAuthorities() - .contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { - category.setName(newCategory.getName()); - Category updatedCategory = categoryRepository.save(category); - return new ResponseEntity<>(updatedCategory, HttpStatus.OK); - } - - throw new UnauthorizedException("You don't have permission to edit this category"); - } - - @Override - public ResponseEntity deleteCategory(Long id, UserPrincipal currentUser) { - Category category = categoryRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("category", "id", id)); - if (category.getCreatedBy().equals(currentUser.getId()) || currentUser.getAuthorities() - .contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { - categoryRepository.deleteById(id); - return new ResponseEntity<>(new ApiResponse(Boolean.TRUE, "You successfully deleted category"), HttpStatus.OK); - } - throw new UnauthorizedException("You don't have permission to delete this category"); - } -} - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/CommentServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/CommentServiceImpl.java deleted file mode 100644 index 00258de7..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/impl/CommentServiceImpl.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.sopromadze.blogapi.service.impl; - -import com.sopromadze.blogapi.exception.BlogapiException; -import com.sopromadze.blogapi.exception.ResourceNotFoundException; -import com.sopromadze.blogapi.model.Comment; -import com.sopromadze.blogapi.model.Post; -import com.sopromadze.blogapi.model.role.RoleName; -import com.sopromadze.blogapi.model.user.User; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.CommentRequest; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.repository.CommentRepository; -import com.sopromadze.blogapi.repository.PostRepository; -import com.sopromadze.blogapi.repository.UserRepository; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.CommentService; -import com.sopromadze.blogapi.utils.AppUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.http.HttpStatus; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.stereotype.Service; - -@Service -public class CommentServiceImpl implements CommentService { - private static final String THIS_COMMENT = " this comment"; - - private static final String YOU_DON_T_HAVE_PERMISSION_TO = "You don't have permission to "; - - private static final String ID_STR = "id"; - - private static final String COMMENT_STR = "Comment"; - - private static final String POST_STR = "Post"; - - private static final String COMMENT_DOES_NOT_BELONG_TO_POST = "Comment does not belong to post"; - - @Autowired - private CommentRepository commentRepository; - - @Autowired - private PostRepository postRepository; - - @Autowired - private UserRepository userRepository; - - @Override - public PagedResponse getAllComments(Long postId, int page, int size) { - AppUtils.validatePageNumberAndSize(page, size); - Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "createdAt"); - - Page comments = commentRepository.findByPostId(postId, pageable); - - return new PagedResponse<>(comments.getContent(), comments.getNumber(), comments.getSize(), - comments.getTotalElements(), comments.getTotalPages(), comments.isLast()); - } - - @Override - public Comment addComment(CommentRequest commentRequest, Long postId, UserPrincipal currentUser) { - Post post = postRepository.findById(postId) - .orElseThrow(() -> new ResourceNotFoundException(POST_STR, ID_STR, postId)); - User user = userRepository.getUser(currentUser); - Comment comment = new Comment(commentRequest.getBody()); - comment.setUser(user); - comment.setPost(post); - comment.setName(currentUser.getUsername()); - comment.setEmail(currentUser.getEmail()); - return commentRepository.save(comment); - } - - @Override - public Comment getComment(Long postId, Long id) { - Post post = postRepository.findById(postId) - .orElseThrow(() -> new ResourceNotFoundException(POST_STR, ID_STR, postId)); - Comment comment = commentRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(COMMENT_STR, ID_STR, id)); - if (comment.getPost().getId().equals(post.getId())) { - return comment; - } - - throw new BlogapiException(HttpStatus.BAD_REQUEST, COMMENT_DOES_NOT_BELONG_TO_POST); - } - - @Override - public Comment updateComment(Long postId, Long id, CommentRequest commentRequest, - UserPrincipal currentUser) { - Post post = postRepository.findById(postId) - .orElseThrow(() -> new ResourceNotFoundException(POST_STR, ID_STR, postId)); - Comment comment = commentRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(COMMENT_STR, ID_STR, id)); - - if (!comment.getPost().getId().equals(post.getId())) { - throw new BlogapiException(HttpStatus.BAD_REQUEST, COMMENT_DOES_NOT_BELONG_TO_POST); - } - - if (comment.getUser().getId().equals(currentUser.getId()) - || currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { - comment.setBody(commentRequest.getBody()); - return commentRepository.save(comment); - } - - throw new BlogapiException(HttpStatus.UNAUTHORIZED, YOU_DON_T_HAVE_PERMISSION_TO + "update" + THIS_COMMENT); - } - - @Override - public ApiResponse deleteComment(Long postId, Long id, UserPrincipal currentUser) { - Post post = postRepository.findById(postId) - .orElseThrow(() -> new ResourceNotFoundException(POST_STR, ID_STR, postId)); - Comment comment = commentRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(COMMENT_STR, ID_STR, id)); - - if (!comment.getPost().getId().equals(post.getId())) { - return new ApiResponse(Boolean.FALSE, COMMENT_DOES_NOT_BELONG_TO_POST); - } - - if (comment.getUser().getId().equals(currentUser.getId()) - || currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { - commentRepository.deleteById(comment.getId()); - return new ApiResponse(Boolean.TRUE, "You successfully deleted comment"); - } - - throw new BlogapiException(HttpStatus.UNAUTHORIZED, YOU_DON_T_HAVE_PERMISSION_TO + "delete" + THIS_COMMENT); - } -} diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/CustomUserDetailsServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/CustomUserDetailsServiceImpl.java index 27451513..d954b207 100644 --- a/src/main/java/com/sopromadze/blogapi/service/impl/CustomUserDetailsServiceImpl.java +++ b/src/main/java/com/sopromadze/blogapi/service/impl/CustomUserDetailsServiceImpl.java @@ -1,7 +1,7 @@ package com.sopromadze.blogapi.service.impl; -import com.sopromadze.blogapi.model.user.User; -import com.sopromadze.blogapi.repository.UserRepository; +import com.sopromadze.blogapi.model.v2.MUser; +import com.sopromadze.blogapi.repository.v2.RUserRepository; import com.sopromadze.blogapi.security.UserPrincipal; import com.sopromadze.blogapi.service.CustomUserDetailsService; import org.springframework.beans.factory.annotation.Autowired; @@ -15,20 +15,24 @@ @Service public class CustomUserDetailsServiceImpl implements UserDetailsService, CustomUserDetailsService { @Autowired - private UserRepository userRepository; + private RUserRepository userRepository; @Override @Transactional - public UserDetails loadUserByUsername(String usernameOrEmail) { - User user = userRepository.findByUsernameOrEmail(usernameOrEmail, usernameOrEmail) - .orElseThrow(() -> new UsernameNotFoundException(String.format("User not found with this username or email: %s", usernameOrEmail))); + public UserDetails loadUserByUsername(String emailOrPhone) { + MUser user = userRepository.findByEmailOrPhone(emailOrPhone, emailOrPhone) + .orElseThrow(() -> new UsernameNotFoundException(String.format("User not found with this username or email: %s", emailOrPhone))); + + + System.out.println("loadUserByUsername >> "+user); + return UserPrincipal.create(user); } @Override @Transactional public UserDetails loadUserById(Long id) { - User user = userRepository.findById(id).orElseThrow(() -> new UsernameNotFoundException(String.format("User not found with id: %s", id))); + MUser user = userRepository.findById(id).orElseThrow(() -> new UsernameNotFoundException(String.format("User not found with id: %s", id))); return UserPrincipal.create(user); } diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/PhotoServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/PhotoServiceImpl.java deleted file mode 100644 index dfa90b86..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/impl/PhotoServiceImpl.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.sopromadze.blogapi.service.impl; - -import com.sopromadze.blogapi.exception.ResourceNotFoundException; -import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.Album; -import com.sopromadze.blogapi.model.Photo; -import com.sopromadze.blogapi.model.role.RoleName; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.payload.PhotoRequest; -import com.sopromadze.blogapi.payload.PhotoResponse; -import com.sopromadze.blogapi.repository.AlbumRepository; -import com.sopromadze.blogapi.repository.PhotoRepository; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.PhotoService; -import com.sopromadze.blogapi.utils.AppConstants; -import com.sopromadze.blogapi.utils.AppUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static com.sopromadze.blogapi.utils.AppConstants.ALBUM; -import static com.sopromadze.blogapi.utils.AppConstants.CREATED_AT; -import static com.sopromadze.blogapi.utils.AppConstants.ID; -import static com.sopromadze.blogapi.utils.AppConstants.PHOTO; - -@Service -public class PhotoServiceImpl implements PhotoService { - - @Autowired - private PhotoRepository photoRepository; - - @Autowired - private AlbumRepository albumRepository; - - @Override - public PagedResponse getAllPhotos(int page, int size) { - AppUtils.validatePageNumberAndSize(page, size); - - Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, CREATED_AT); - Page photos = photoRepository.findAll(pageable); - - List photoResponses = new ArrayList<>(photos.getContent().size()); - for (Photo photo : photos.getContent()) { - photoResponses.add(new PhotoResponse(photo.getId(), photo.getTitle(), photo.getUrl(), - photo.getThumbnailUrl(), photo.getAlbum().getId())); - } - - if (photos.getNumberOfElements() == 0) { - return new PagedResponse<>(Collections.emptyList(), photos.getNumber(), photos.getSize(), - photos.getTotalElements(), photos.getTotalPages(), photos.isLast()); - } - return new PagedResponse<>(photoResponses, photos.getNumber(), photos.getSize(), photos.getTotalElements(), - photos.getTotalPages(), photos.isLast()); - - } - - @Override - public PhotoResponse getPhoto(Long id) { - Photo photo = photoRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(PHOTO, ID, id)); - - return new PhotoResponse(photo.getId(), photo.getTitle(), photo.getUrl(), - photo.getThumbnailUrl(), photo.getAlbum().getId()); - } - - @Override - public PhotoResponse updatePhoto(Long id, PhotoRequest photoRequest, UserPrincipal currentUser) { - Album album = albumRepository.findById(photoRequest.getAlbumId()) - .orElseThrow(() -> new ResourceNotFoundException(ALBUM, ID, photoRequest.getAlbumId())); - Photo photo = photoRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(PHOTO, ID, id)); - if (photo.getAlbum().getUser().getId().equals(currentUser.getId()) - || currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { - photo.setTitle(photoRequest.getTitle()); - photo.setThumbnailUrl(photoRequest.getThumbnailUrl()); - photo.setAlbum(album); - Photo updatedPhoto = photoRepository.save(photo); - return new PhotoResponse(updatedPhoto.getId(), updatedPhoto.getTitle(), - updatedPhoto.getUrl(), updatedPhoto.getThumbnailUrl(), updatedPhoto.getAlbum().getId()); - } - - ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to update this photo"); - - throw new UnauthorizedException(apiResponse); - } - - @Override - public PhotoResponse addPhoto(PhotoRequest photoRequest, UserPrincipal currentUser) { - Album album = albumRepository.findById(photoRequest.getAlbumId()) - .orElseThrow(() -> new ResourceNotFoundException(ALBUM, ID, photoRequest.getAlbumId())); - if (album.getUser().getId().equals(currentUser.getId())) { - Photo photo = new Photo(photoRequest.getTitle(), photoRequest.getUrl(), photoRequest.getThumbnailUrl(), - album); - Photo newPhoto = photoRepository.save(photo); - return new PhotoResponse(newPhoto.getId(), newPhoto.getTitle(), newPhoto.getUrl(), - newPhoto.getThumbnailUrl(), newPhoto.getAlbum().getId()); - } - - ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to add photo in this album"); - - throw new UnauthorizedException(apiResponse); - } - - @Override - public ApiResponse deletePhoto(Long id, UserPrincipal currentUser) { - Photo photo = photoRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(PHOTO, ID, id)); - if (photo.getAlbum().getUser().getId().equals(currentUser.getId()) - || currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { - photoRepository.deleteById(id); - return new ApiResponse(Boolean.TRUE, "Photo deleted successfully"); - } - - ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to delete this photo"); - - throw new UnauthorizedException(apiResponse); - } - - @Override - public PagedResponse getAllPhotosByAlbum(Long albumId, int page, int size) { - AppUtils.validatePageNumberAndSize(page, size); - - Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, AppConstants.CREATED_AT); - - Page photos = photoRepository.findByAlbumId(albumId, pageable); - - List photoResponses = new ArrayList<>(photos.getContent().size()); - for (Photo photo : photos.getContent()) { - photoResponses.add(new PhotoResponse(photo.getId(), photo.getTitle(), photo.getUrl(), - photo.getThumbnailUrl(), photo.getAlbum().getId())); - } - - return new PagedResponse<>(photoResponses, photos.getNumber(), photos.getSize(), photos.getTotalElements(), - photos.getTotalPages(), photos.isLast()); - } -} diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/PostServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/PostServiceImpl.java deleted file mode 100644 index 8666ec58..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/impl/PostServiceImpl.java +++ /dev/null @@ -1,205 +0,0 @@ -package com.sopromadze.blogapi.service.impl; - -import com.sopromadze.blogapi.exception.BadRequestException; -import com.sopromadze.blogapi.exception.ResourceNotFoundException; -import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.Category; -import com.sopromadze.blogapi.model.Post; -import com.sopromadze.blogapi.model.Tag; -import com.sopromadze.blogapi.model.role.RoleName; -import com.sopromadze.blogapi.model.user.User; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.payload.PostRequest; -import com.sopromadze.blogapi.payload.PostResponse; -import com.sopromadze.blogapi.repository.CategoryRepository; -import com.sopromadze.blogapi.repository.PostRepository; -import com.sopromadze.blogapi.repository.TagRepository; -import com.sopromadze.blogapi.repository.UserRepository; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.PostService; -import com.sopromadze.blogapi.utils.AppConstants; -import com.sopromadze.blogapi.utils.AppUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static com.sopromadze.blogapi.utils.AppConstants.CATEGORY; -import static com.sopromadze.blogapi.utils.AppConstants.CREATED_AT; -import static com.sopromadze.blogapi.utils.AppConstants.ID; -import static com.sopromadze.blogapi.utils.AppConstants.POST; -import static com.sopromadze.blogapi.utils.AppConstants.TAG; -import static com.sopromadze.blogapi.utils.AppConstants.USER; - -@Service -public class PostServiceImpl implements PostService { - @Autowired - private PostRepository postRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private CategoryRepository categoryRepository; - - @Autowired - private TagRepository tagRepository; - - @Override - public PagedResponse getAllPosts(int page, int size) { - validatePageNumberAndSize(page, size); - - Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, CREATED_AT); - - Page posts = postRepository.findAll(pageable); - - List content = posts.getNumberOfElements() == 0 ? Collections.emptyList() : posts.getContent(); - - return new PagedResponse<>(content, posts.getNumber(), posts.getSize(), posts.getTotalElements(), - posts.getTotalPages(), posts.isLast()); - } - - @Override - public PagedResponse getPostsByCreatedBy(String username, int page, int size) { - validatePageNumberAndSize(page, size); - User user = userRepository.getUserByName(username); - Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, CREATED_AT); - Page posts = postRepository.findByCreatedBy(user.getId(), pageable); - - List content = posts.getNumberOfElements() == 0 ? Collections.emptyList() : posts.getContent(); - - return new PagedResponse<>(content, posts.getNumber(), posts.getSize(), posts.getTotalElements(), - posts.getTotalPages(), posts.isLast()); - } - - @Override - public PagedResponse getPostsByCategory(Long id, int page, int size) { - AppUtils.validatePageNumberAndSize(page, size); - Category category = categoryRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException(CATEGORY, ID, id)); - - Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, CREATED_AT); - Page posts = postRepository.findByCategory(category.getId(), pageable); - - List content = posts.getNumberOfElements() == 0 ? Collections.emptyList() : posts.getContent(); - - return new PagedResponse<>(content, posts.getNumber(), posts.getSize(), posts.getTotalElements(), - posts.getTotalPages(), posts.isLast()); - } - - @Override - public PagedResponse getPostsByTag(Long id, int page, int size) { - AppUtils.validatePageNumberAndSize(page, size); - - Tag tag = tagRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(TAG, ID, id)); - - Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, CREATED_AT); - - Page posts = postRepository.findByTags(Collections.singletonList(tag), pageable); - - List content = posts.getNumberOfElements() == 0 ? Collections.emptyList() : posts.getContent(); - - return new PagedResponse<>(content, posts.getNumber(), posts.getSize(), posts.getTotalElements(), - posts.getTotalPages(), posts.isLast()); - } - - @Override - public Post updatePost(Long id, PostRequest newPostRequest, UserPrincipal currentUser) { - Post post = postRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(POST, ID, id)); - Category category = categoryRepository.findById(newPostRequest.getCategoryId()) - .orElseThrow(() -> new ResourceNotFoundException(CATEGORY, ID, newPostRequest.getCategoryId())); - if (post.getUser().getId().equals(currentUser.getId()) - || currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { - post.setTitle(newPostRequest.getTitle()); - post.setBody(newPostRequest.getBody()); - post.setCategory(category); - return postRepository.save(post); - } - ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to edit this post"); - - throw new UnauthorizedException(apiResponse); - } - - @Override - public ApiResponse deletePost(Long id, UserPrincipal currentUser) { - Post post = postRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(POST, ID, id)); - if (post.getUser().getId().equals(currentUser.getId()) - || currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { - postRepository.deleteById(id); - return new ApiResponse(Boolean.TRUE, "You successfully deleted post"); - } - - ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to delete this post"); - - throw new UnauthorizedException(apiResponse); - } - - @Override - public PostResponse addPost(PostRequest postRequest, UserPrincipal currentUser) { - User user = userRepository.findById(currentUser.getId()) - .orElseThrow(() -> new ResourceNotFoundException(USER, ID, 1L)); - Category category = categoryRepository.findById(postRequest.getCategoryId()) - .orElseThrow(() -> new ResourceNotFoundException(CATEGORY, ID, postRequest.getCategoryId())); - - List tags = new ArrayList<>(postRequest.getTags().size()); - - for (String name : postRequest.getTags()) { - Tag tag = tagRepository.findByName(name); - tag = tag == null ? tagRepository.save(new Tag(name)) : tag; - - tags.add(tag); - } - - Post post = new Post(); - post.setBody(postRequest.getBody()); - post.setTitle(postRequest.getTitle()); - post.setCategory(category); - post.setUser(user); - post.setTags(tags); - - Post newPost = postRepository.save(post); - - PostResponse postResponse = new PostResponse(); - - postResponse.setTitle(newPost.getTitle()); - postResponse.setBody(newPost.getBody()); - postResponse.setCategory(newPost.getCategory().getName()); - - List tagNames = new ArrayList<>(newPost.getTags().size()); - - for (Tag tag : newPost.getTags()) { - tagNames.add(tag.getName()); - } - - postResponse.setTags(tagNames); - - return postResponse; - } - - @Override - public Post getPost(Long id) { - return postRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(POST, ID, id)); - } - - private void validatePageNumberAndSize(int page, int size) { - if (page < 0) { - throw new BadRequestException("Page number cannot be less than zero."); - } - - if (size < 0) { - throw new BadRequestException("Size number cannot be less than zero."); - } - - if (size > AppConstants.MAX_PAGE_SIZE) { - throw new BadRequestException("Page size must not be greater than " + AppConstants.MAX_PAGE_SIZE); - } - } -} diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/TodoServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/TodoServiceImpl.java deleted file mode 100644 index 9ef3b2e8..00000000 --- a/src/main/java/com/sopromadze/blogapi/service/impl/TodoServiceImpl.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.sopromadze.blogapi.service.impl; - -import com.sopromadze.blogapi.exception.BadRequestException; -import com.sopromadze.blogapi.exception.ResourceNotFoundException; -import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.Todo; -import com.sopromadze.blogapi.model.user.User; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.PagedResponse; -import com.sopromadze.blogapi.repository.TodoRepository; -import com.sopromadze.blogapi.repository.UserRepository; -import com.sopromadze.blogapi.security.UserPrincipal; -import com.sopromadze.blogapi.service.TodoService; -import com.sopromadze.blogapi.utils.AppConstants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.stereotype.Service; - -import java.util.Collections; -import java.util.List; - -import static com.sopromadze.blogapi.utils.AppConstants.CREATED_AT; -import static com.sopromadze.blogapi.utils.AppConstants.ID; -import static com.sopromadze.blogapi.utils.AppConstants.TODO; -import static com.sopromadze.blogapi.utils.AppConstants.YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION; - -@Service -public class TodoServiceImpl implements TodoService { - - @Autowired - private TodoRepository todoRepository; - - @Autowired - private UserRepository userRepository; - - @Override - public Todo completeTodo(Long id, UserPrincipal currentUser) { - Todo todo = todoRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(TODO, ID, id)); - - User user = userRepository.getUser(currentUser); - - if (todo.getUser().getId().equals(user.getId())) { - todo.setCompleted(Boolean.TRUE); - return todoRepository.save(todo); - } - - ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION); - - throw new UnauthorizedException(apiResponse); - } - - @Override - public Todo unCompleteTodo(Long id, UserPrincipal currentUser) { - Todo todo = todoRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(TODO, ID, id)); - User user = userRepository.getUser(currentUser); - if (todo.getUser().getId().equals(user.getId())) { - todo.setCompleted(Boolean.FALSE); - return todoRepository.save(todo); - } - - ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION); - - throw new UnauthorizedException(apiResponse); - } - - @Override - public PagedResponse getAllTodos(UserPrincipal currentUser, int page, int size) { - validatePageNumberAndSize(page, size); - Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, CREATED_AT); - - Page todos = todoRepository.findByCreatedBy(currentUser.getId(), pageable); - - List content = todos.getNumberOfElements() == 0 ? Collections.emptyList() : todos.getContent(); - - return new PagedResponse<>(content, todos.getNumber(), todos.getSize(), todos.getTotalElements(), - todos.getTotalPages(), todos.isLast()); - } - - @Override - public Todo addTodo(Todo todo, UserPrincipal currentUser) { - User user = userRepository.getUser(currentUser); - todo.setUser(user); - return todoRepository.save(todo); - } - - @Override - public Todo getTodo(Long id, UserPrincipal currentUser) { - User user = userRepository.getUser(currentUser); - Todo todo = todoRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(TODO, ID, id)); - - if (todo.getUser().getId().equals(user.getId())) { - return todo; - } - - ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION); - - throw new UnauthorizedException(apiResponse); - } - - @Override - public Todo updateTodo(Long id, Todo newTodo, UserPrincipal currentUser) { - User user = userRepository.getUser(currentUser); - Todo todo = todoRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(TODO, ID, id)); - if (todo.getUser().getId().equals(user.getId())) { - todo.setTitle(newTodo.getTitle()); - todo.setCompleted(newTodo.getCompleted()); - return todoRepository.save(todo); - } - - ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION); - - throw new UnauthorizedException(apiResponse); - } - - @Override - public ApiResponse deleteTodo(Long id, UserPrincipal currentUser) { - User user = userRepository.getUser(currentUser); - Todo todo = todoRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(TODO, ID, id)); - - if (todo.getUser().getId().equals(user.getId())) { - todoRepository.deleteById(id); - return new ApiResponse(Boolean.TRUE, "You successfully deleted todo"); - } - - ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION); - - throw new UnauthorizedException(apiResponse); - } - - private void validatePageNumberAndSize(int page, int size) { - if (page < 0) { - throw new BadRequestException("Page number cannot be less than zero."); - } - - if (size < 0) { - throw new BadRequestException("Size number cannot be less than zero."); - } - - if (size > AppConstants.MAX_PAGE_SIZE) { - throw new BadRequestException("Page size must not be greater than " + AppConstants.MAX_PAGE_SIZE); - } - } -} diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/UserServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/UserServiceImpl.java index d740f27b..b68e25a1 100644 --- a/src/main/java/com/sopromadze/blogapi/service/impl/UserServiceImpl.java +++ b/src/main/java/com/sopromadze/blogapi/service/impl/UserServiceImpl.java @@ -1,22 +1,13 @@ package com.sopromadze.blogapi.service.impl; -import com.sopromadze.blogapi.exception.AccessDeniedException; -import com.sopromadze.blogapi.exception.AppException; -import com.sopromadze.blogapi.exception.BadRequestException; -import com.sopromadze.blogapi.exception.ResourceNotFoundException; -import com.sopromadze.blogapi.exception.UnauthorizedException; +import com.sopromadze.blogapi.exception.*; import com.sopromadze.blogapi.model.role.Role; import com.sopromadze.blogapi.model.role.RoleName; import com.sopromadze.blogapi.model.user.Address; import com.sopromadze.blogapi.model.user.Company; import com.sopromadze.blogapi.model.user.Geo; import com.sopromadze.blogapi.model.user.User; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.InfoRequest; -import com.sopromadze.blogapi.payload.UserIdentityAvailability; -import com.sopromadze.blogapi.payload.UserProfile; -import com.sopromadze.blogapi.payload.UserSummary; -import com.sopromadze.blogapi.repository.PostRepository; +import com.sopromadze.blogapi.payload.*; import com.sopromadze.blogapi.repository.RoleRepository; import com.sopromadze.blogapi.repository.UserRepository; import com.sopromadze.blogapi.security.UserPrincipal; @@ -35,9 +26,6 @@ public class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository; - @Autowired - private PostRepository postRepository; - @Autowired private RoleRepository roleRepository; @@ -64,13 +52,7 @@ public UserIdentityAvailability checkEmailAvailability(String email) { @Override public UserProfile getUserProfile(String username) { - User user = userRepository.getUserByName(username); - - Long postCount = postRepository.countByCreatedBy(user.getId()); - - return new UserProfile(user.getId(), user.getUsername(), user.getFirstName(), user.getLastName(), - user.getCreatedAt(), user.getEmail(), user.getAddress(), user.getPhone(), user.getWebsite(), - user.getCompany(), postCount); + return null; } @Override @@ -171,12 +153,12 @@ public UserProfile setOrUpdateInfo(UserPrincipal currentUser, InfoRequest infoRe user.setPhone(infoRequest.getPhone()); User updatedUser = userRepository.save(user); - Long postCount = postRepository.countByCreatedBy(updatedUser.getId()); +// Long postCount = postRepository.countByCreatedBy(updatedUser.getId()); return new UserProfile(updatedUser.getId(), updatedUser.getUsername(), updatedUser.getFirstName(), updatedUser.getLastName(), updatedUser.getCreatedAt(), updatedUser.getEmail(), updatedUser.getAddress(), updatedUser.getPhone(), updatedUser.getWebsite(), - updatedUser.getCompany(), postCount); + updatedUser.getCompany(), null); } ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to update users profile", HttpStatus.FORBIDDEN); diff --git a/src/main/java/com/sopromadze/blogapi/service/v2/HotelService.java b/src/main/java/com/sopromadze/blogapi/service/v2/HotelService.java new file mode 100644 index 00000000..1bf8ebae --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/service/v2/HotelService.java @@ -0,0 +1,22 @@ +package com.sopromadze.blogapi.service.v2; + +import com.sopromadze.blogapi.model.v2.MHotel; +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.security.UserPrincipal; + +import java.util.Map; + +public interface HotelService { + + MHotel create(MHotel user, UserPrincipal currentUser); + +// MHotel update(MHotel newUser, String username, UserPrincipal currentUser); + + + MHotel get(Long hotelId); + + + MHotel update(Map updates, UserPrincipal currentUser); + + ApiResponse delete(String phone, UserPrincipal currentUser); +} \ No newline at end of file diff --git a/src/main/java/com/sopromadze/blogapi/service/v2/ItemService.java b/src/main/java/com/sopromadze/blogapi/service/v2/ItemService.java new file mode 100644 index 00000000..3c253f94 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/service/v2/ItemService.java @@ -0,0 +1,30 @@ +package com.sopromadze.blogapi.service.v2; + +import com.sopromadze.blogapi.model.v2.MItem; +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.security.UserPrincipal; + +import java.util.List; +import java.util.Map; + +public interface ItemService { + + MItem get(Long itemId); + + MItem create(MItem user, Long MenuId); + + List create(List item, Long menuId); + + + MItem update(MItem item, Long menuId); + + List getAllActive(Long hotelId); + + List getByMenuId(Long hotelId); + + ApiResponse delete(Long itemId); + + ApiResponse delete(List itemIds); + + MItem partialUpdate(Long menuId, Long itemId, Map updates); +} \ No newline at end of file diff --git a/src/main/java/com/sopromadze/blogapi/service/v2/MenuService.java b/src/main/java/com/sopromadze/blogapi/service/v2/MenuService.java new file mode 100644 index 00000000..2a409070 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/service/v2/MenuService.java @@ -0,0 +1,29 @@ +package com.sopromadze.blogapi.service.v2; + +import com.sopromadze.blogapi.model.v2.MMenu; +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.security.UserPrincipal; + +import java.util.List; +import java.util.Map; + +public interface MenuService { + + MMenu create(MMenu user, UserPrincipal currentUser); + MMenu update(MMenu user, UserPrincipal currentUser); + +// MMenu update(MMenu newUser, String username, UserPrincipal currentUser); + + List getAllInHotel(Long menuId); + MMenu get(Long menuId); + + List getActive(Long hotelId); + +// MMenu get(Long menuId); + + ApiResponse delete(long menuId, UserPrincipal currentUser); + + MMenu copy(long menuId, UserPrincipal currentUser); + + MMenu partialUpdate(Long menuId, Map updates, UserPrincipal currentUser); +} \ No newline at end of file diff --git a/src/main/java/com/sopromadze/blogapi/service/v2/SUserService.java b/src/main/java/com/sopromadze/blogapi/service/v2/SUserService.java new file mode 100644 index 00000000..28a5d29c --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/service/v2/SUserService.java @@ -0,0 +1,41 @@ +package com.sopromadze.blogapi.service.v2; + +//import com.sopromadze.blogapi.model.user.MUser; + +import com.sopromadze.blogapi.model.v2.MHotel; +import com.sopromadze.blogapi.model.v2.MUser; +import com.sopromadze.blogapi.payload.*; +import com.sopromadze.blogapi.security.UserPrincipal; + +import java.util.List; + +public interface SUserService { + + UserSummary getCurrentUser(UserPrincipal currentUser); + + List getALlUserOfHotel(UserPrincipal currentUser); + + MUser getCurrentUserFull(UserPrincipal currentUser); + + UserIdentityAvailability checkUsernameAvailability(String username); + + +// UserProfile getUserProfile(String username); + + UserIdentityAvailability checkPhoneAvailability(String phone); + + MUser addUser(MUser user,UserPrincipal currentUser); + + MUser createUserForHotel(MHotel hotel); + + MUser updateUser(MUser newUser, String username, UserPrincipal currentUser); + + ApiResponse deleteUser(String userId, UserPrincipal currentUser); + + ApiResponse giveAdmin(String username); + + ApiResponse removeAdmin(String username); + + UserProfile setOrUpdateInfo(UserPrincipal currentUser, InfoRequest infoRequest); + +} \ No newline at end of file diff --git a/src/main/java/com/sopromadze/blogapi/service/v2/impl/HotelServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/v2/impl/HotelServiceImpl.java new file mode 100644 index 00000000..7fa703c6 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/service/v2/impl/HotelServiceImpl.java @@ -0,0 +1,76 @@ +package com.sopromadze.blogapi.service.v2.impl; + +import com.sopromadze.blogapi.exception.AccessDeniedException; +import com.sopromadze.blogapi.model.v2.MHotel; +import com.sopromadze.blogapi.model.v2.MMenu; +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.repository.v2.HotelRepository; +import com.sopromadze.blogapi.repository.v2.RUserRepository; +import com.sopromadze.blogapi.security.UserPrincipal; +import com.sopromadze.blogapi.service.v2.HotelService; +import com.sopromadze.blogapi.service.v2.SUserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.Field; +import java.util.Map; + +import static com.sopromadze.blogapi.utils.ObjectTransformUtil.partialMapper; + +@Service +public class HotelServiceImpl implements HotelService { + private static final Logger LOG = LoggerFactory.getLogger(HotelServiceImpl.class); + + @Autowired + private HotelRepository hotelRepository; + + @Autowired + private RUserRepository userRepository; + + @Autowired + private SUserService userService; + + @Override + public MHotel get(Long hotelId) { + + return hotelRepository.getOne(hotelId); + } + + @Override + public MHotel create(MHotel hotel, UserPrincipal currentUser) { + + + if((hotel.getId() == null || hotel.getId() < 1) && !userService.checkPhoneAvailability(hotel.getPhone()).getAvailable()){ + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "Phone nnumber already taken " + hotel.getPhone()); + throw new AccessDeniedException(apiResponse); + + } + MHotel updatedHotel= hotelRepository.save(hotel); + + userService.createUserForHotel(updatedHotel); + + return updatedHotel; + } + + @Override + public MHotel update(Map updates, UserPrincipal currentUser) { + MHotel hotel= hotelRepository.getOne(currentUser.getHotel().getId()); + + partialMapper(updates,hotel); + + MHotel updatedHotel= hotelRepository.save(hotel); + + return updatedHotel; + } + + @Override + public ApiResponse delete(String phone, UserPrincipal currentUser) { + + return new ApiResponse(Boolean.TRUE, "You successfully deleted Hotel of: " + phone); + + } + +} diff --git a/src/main/java/com/sopromadze/blogapi/service/v2/impl/ItemServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/v2/impl/ItemServiceImpl.java new file mode 100644 index 00000000..e82e6c2c --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/service/v2/impl/ItemServiceImpl.java @@ -0,0 +1,112 @@ +package com.sopromadze.blogapi.service.v2.impl; + +import com.sopromadze.blogapi.exception.BadRequestException; +import com.sopromadze.blogapi.exception.ResourceNotFoundException; +import com.sopromadze.blogapi.model.v2.MItem; +import com.sopromadze.blogapi.model.v2.MMenu; +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.repository.v2.ItemRepository; +import com.sopromadze.blogapi.repository.v2.MenuRepository; +import com.sopromadze.blogapi.service.v2.ItemService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataRetrievalFailureException; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.sopromadze.blogapi.utils.ObjectTransformUtil.partialMapper; + +@Service +public class ItemServiceImpl implements ItemService { + + private static final Logger LOG = LoggerFactory.getLogger(ItemServiceImpl.class); + + @Autowired + private ItemRepository itemRepository; + + @Autowired + private MenuRepository menuRepository; + + @Override + public MItem get(Long itemId) { + + return itemRepository.findById(itemId).orElseThrow(()-> new ResourceNotFoundException("itemId")); + } + + @Override + public MItem create(MItem item,Long menuId) { + item.setMenuId(menuId); + item.setId(null); + + return itemRepository.save(item); + } + + @Override + public List create(List item, Long menuId) { + item.stream().forEach(t-> { + t.setMenuId(menuId); + t.setId(null); + }); + return itemRepository.saveAll(item); + } + + @Override + public MItem update(MItem item, Long menuId) { + item.setMenuId(menuId); + + return itemRepository.save(item); + } + + @Override + public List getAllActive(Long hotelId) { + List allActiveMenu = menuRepository.findByHotelId(hotelId); + List ids = allActiveMenu.stream().map(t->t.getId()).collect(Collectors.toList()); + return itemRepository.findAllByMenuIdIn(ids); + } + + @Override + public List getByMenuId(Long hotelId) { + return itemRepository.findAllByMenuId(hotelId); + } + + + @Override + public ApiResponse delete(Long itemId) { + try{ + itemRepository.deleteById(itemId); + return new ApiResponse(true,"Items deleted successfully"); + + }catch (DataRetrievalFailureException e){ + throw new ResourceNotFoundException("field not available"); + } + catch (Exception e){ + throw new BadRequestException("Error to function"); + } + } + + @Override + public ApiResponse delete(List itemIds) { + try{ + itemRepository.deleteAllById(itemIds); + return new ApiResponse(true,"Items deleted successfully"); + + }catch (DataRetrievalFailureException e){ + throw new ResourceNotFoundException("field not available"); + }catch (Exception e){ + throw new BadRequestException("Error to function "); + } + } + + @Override + public MItem partialUpdate(Long menuId, Long itemId, Map updates) { + MItem item = itemRepository.findById(itemId).orElseThrow(()-> new ResourceNotFoundException("itemId")); + + partialMapper(updates,item); + + return itemRepository.save(item); + } +} diff --git a/src/main/java/com/sopromadze/blogapi/service/v2/impl/MenuServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/v2/impl/MenuServiceImpl.java new file mode 100644 index 00000000..c096d461 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/service/v2/impl/MenuServiceImpl.java @@ -0,0 +1,138 @@ +package com.sopromadze.blogapi.service.v2.impl; + +import com.sopromadze.blogapi.exception.AccessDeniedException; +import com.sopromadze.blogapi.exception.ResourceNotFoundException; +import com.sopromadze.blogapi.model.role.RoleName; +import com.sopromadze.blogapi.model.v2.MItem; +import com.sopromadze.blogapi.model.v2.MMenu; +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.repository.v2.HotelRepository; +import com.sopromadze.blogapi.repository.v2.ItemRepository; +import com.sopromadze.blogapi.repository.v2.MenuRepository; +import com.sopromadze.blogapi.security.UserPrincipal; +import com.sopromadze.blogapi.service.v2.MenuService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ReflectionUtils; + +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Field; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static com.sopromadze.blogapi.utils.ObjectTransformUtil.partialMapper; + +@Service +public class MenuServiceImpl implements MenuService { + private static final Logger LOG = LoggerFactory.getLogger(MenuServiceImpl.class); + + @Autowired + private HotelRepository hotelRepository; + + @Autowired + private MenuRepository menuRepository; + + @Autowired + private ItemRepository itemRepository; + + @Override + public MMenu create(MMenu menu, UserPrincipal currentUser) { + menu.setId(null); + menu.setHotelId(currentUser.getHotel().getId()); + + if ( !currentUser.getAuthorities() + .contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to delete Menu"); + throw new AccessDeniedException(apiResponse); + } + return menuRepository.save(menu); + } + + @Override + public MMenu update(MMenu menu, UserPrincipal currentUser) { + menu.setHotelId(currentUser.getHotel().getId()); + this.checkPermission(menu.getId(), currentUser); + return menuRepository.save(menu); + } + + @Override + public List getAllInHotel(Long hotelId) { + List menus = menuRepository.findByHotelId(hotelId); + return menus != null ? menus : Collections.emptyList(); + } + + @Override + public MMenu get(Long menuId) { + return menuRepository.getOne(menuId); + } + + @Override + public List getActive(Long hotelId) { + + List menus = menuRepository.findByIdAndIsActiveTrue(hotelId);//orElseThrow(() -> new ResourceNotFoundException("Hotel not found with id: "+hotelId)); + if (menus.isEmpty()) { + throw new ResourceNotFoundException("No active hotel found with id: " + hotelId); + } + return menus; + } + + @Override + public ApiResponse delete(long menuId, UserPrincipal currentUser) { + if ( !currentUser.getAuthorities() + .contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to delete menu " ); + throw new AccessDeniedException(apiResponse); + } + this.checkPermission(menuId, currentUser); + menuRepository.deleteById(menuId); + return new ApiResponse(Boolean.TRUE, "You successfully deleted Hotel " ); + } + + @Override + public MMenu copy(long menuId, UserPrincipal currentUser) { + + this.checkPermission(menuId, currentUser); + + MMenu currMenu = menuRepository.findById(menuId) + .orElseThrow(() -> new ResourceNotFoundException("menuId not found with "+menuId)); + currMenu.setId(null); + + List items = itemRepository.findAllByMenuId(currMenu.getId()); + items.forEach(t->t.setId(null)); + + currMenu.setItems(items); + return menuRepository.save(currMenu); + + } + + @Override + public MMenu partialUpdate(Long menuId, Map updates, UserPrincipal currentUser) { + this.checkPermission(menuId, currentUser); + + MMenu existingMenu = menuRepository.findById(menuId) + .orElseThrow(() -> new ResourceNotFoundException("Menu not found with id: " + menuId)); + System.out.println("\n\nexistingMenu"+existingMenu+"\n"); + partialMapper(updates,existingMenu); + System.out.println("\n\nAfter Menu"+existingMenu+"\n"); + + return menuRepository.save(existingMenu); + } + + private Boolean checkPermission(Long menuId, UserPrincipal currentUser){ + + List allAvailableMenu = this.getAllInHotel(currentUser.getHotel().getId()); + boolean isMenuIdPresent = allAvailableMenu.stream() + .anyMatch(menu -> menu.getId().equals(menuId)); + if(!isMenuIdPresent){ + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission "); + throw new AccessDeniedException(apiResponse); + } + return isMenuIdPresent; + + } + +} diff --git a/src/main/java/com/sopromadze/blogapi/service/v2/impl/SUserServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/v2/impl/SUserServiceImpl.java new file mode 100644 index 00000000..125a9039 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/service/v2/impl/SUserServiceImpl.java @@ -0,0 +1,171 @@ +package com.sopromadze.blogapi.service.v2.impl; + +import com.sopromadze.blogapi.exception.*; +import com.sopromadze.blogapi.model.role.RoleName; +import com.sopromadze.blogapi.model.v2.MHotel; +import com.sopromadze.blogapi.model.v2.MUser; +import com.sopromadze.blogapi.model.v2.role.MRole; +import com.sopromadze.blogapi.model.v2.role.MRoleName; +import com.sopromadze.blogapi.payload.*; +import com.sopromadze.blogapi.repository.v2.RRoleRepository; +import com.sopromadze.blogapi.repository.v2.RUserRepository; +import com.sopromadze.blogapi.security.UserPrincipal; +import com.sopromadze.blogapi.service.v2.SUserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class SUserServiceImpl implements SUserService { + private static final Logger LOG = LoggerFactory.getLogger(SUserServiceImpl.class); + + @Autowired + private RUserRepository userRepository; + + @Autowired + private RRoleRepository roleRepository; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Override + public UserSummary getCurrentUser(UserPrincipal currentUser) { + return new UserSummary(currentUser.getId(), currentUser.getUsername(), currentUser.getFirstName(), + currentUser.getLastName()); + } + @Override + public List getALlUserOfHotel(UserPrincipal currentUser) { + List users= userRepository.findByHotel_Id(currentUser.getHotel().getId()); + if (users.isEmpty()) { + throw new ResourceNotFoundException("No users found for hotel ID " + currentUser.getHotel().getId()); + } + return users; + } + + @Override + public MUser getCurrentUserFull(UserPrincipal currentUser) { + return userRepository.findById(currentUser.getId()) + .orElseThrow(() -> new ResourceNotFoundException("resour not found with "+currentUser.getId())); +// return new UserSummary(currentUser.getId(), currentUser.getUsername(), currentUser.getFirstName(), +// currentUser.getLastName()); + } + + @Override + public UserIdentityAvailability checkUsernameAvailability(String username) { + Boolean isAvailable = !userRepository.existsByUserName(username); + return new UserIdentityAvailability(isAvailable); + } + + @Override + public UserIdentityAvailability checkPhoneAvailability(String phone) { + Boolean isAvailable = !userRepository.existsByPhone(phone); + return new UserIdentityAvailability(isAvailable); + } + + + @Override + public MUser addUser(MUser user,UserPrincipal currentUser) { + if (userRepository.existsByUserName(user.getUserName())) { + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "Username is already taken"); + throw new BadRequestException(apiResponse); + } + + if (userRepository.existsByEmail(user.getEmail())) { + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "Email is already taken"); + throw new BadRequestException(apiResponse); + } + + List roles = new ArrayList<>(); + roles.add( + roleRepository.findByName(MRoleName.ROLE_USER).orElseThrow(() -> new AppException("MUser role not set"))); + user.setRoles(roles); + user.setHotel(currentUser.getHotel()); + user.setPassword(passwordEncoder.encode(user.getPassword())); + return userRepository.save(user); + } + + @Override + public MUser createUserForHotel(MHotel hotel) { + + + if (userRepository.existsByPhone(hotel.getPhone())) { + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "Phone No is already taken"); + throw new BadRequestException(apiResponse); + } + + String password = passwordEncoder.encode("1234567890"); + + MUser user = new MUser(hotel.getUserName(), "", hotel.getFullName(), hotel.getEmail(), hotel.getPhone(), password,hotel); + + List roles = new ArrayList<>(); + + roles.add(roleRepository.findByName(MRoleName.ROLE_USER) + .orElseThrow(() -> new AppException("Unable to set User with Role"))); + roles.add(roleRepository.findByName(MRoleName.ROLE_ADMIN) + .orElseThrow(() -> new AppException("Unable to set User with Role"))); + + user.setRoles(roles); + + MUser result = userRepository.save(user); + + return result; + + } + + @Override + public MUser updateUser(MUser newUser, String username, UserPrincipal currentUser) { + MUser user = userRepository.getUserByName(username); + if (user.getId().equals(currentUser.getId()) + || currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { + user.setFirstName(newUser.getFirstName()); + user.setLastName(newUser.getLastName()); + user.setPassword(passwordEncoder.encode(newUser.getPassword())); + user.setAddress(newUser.getAddress()); + user.setPhone(newUser.getPhone()); + + return userRepository.save(user); + + } + + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to update profile of: " + username); + throw new UnauthorizedException(apiResponse); + + } + + @Override + public ApiResponse deleteUser(String emailId, UserPrincipal currentUser) { + MUser user = userRepository.findByEmail(emailId) + .orElseThrow(() -> new ResourceNotFoundException("MUser", "id", emailId)); + if (!user.getId().equals(currentUser.getId()) || !currentUser.getAuthorities() + .contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to delete profile of: " + emailId); + throw new AccessDeniedException(apiResponse); + } + + userRepository.deleteById(user.getId()); + + return new ApiResponse(Boolean.TRUE, "You successfully deleted profile of: " + emailId); + } + + @Override + public ApiResponse giveAdmin(String username) { + return null; + } + + @Override + public ApiResponse removeAdmin(String username) { + return null; + } + + @Override + public UserProfile setOrUpdateInfo(UserPrincipal currentUser, InfoRequest infoRequest) { + return null; + } +// +} diff --git a/src/main/java/com/sopromadze/blogapi/utils/ObjectTransformUtil.java b/src/main/java/com/sopromadze/blogapi/utils/ObjectTransformUtil.java new file mode 100644 index 00000000..448f6b82 --- /dev/null +++ b/src/main/java/com/sopromadze/blogapi/utils/ObjectTransformUtil.java @@ -0,0 +1,69 @@ +package com.sopromadze.blogapi.utils; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.sopromadze.blogapi.exception.NotAcceptableException; +import com.sopromadze.blogapi.model.v2.MMenu; +import org.hibernate.Hibernate; +import org.springframework.util.ReflectionUtils; +//import org.apache.commons.beanutils.BeanUtils; + +import java.lang.reflect.Field; +import java.util.Map; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ObjectTransformUtil { + + + public static Map convertToMap( T mainObj) { + ObjectMapper mapper = new ObjectMapper(); + return mapper.convertValue(mainObj, new TypeReference>() { + }); + } + + + + public static void partialMapper(Map updates, T existingObj) { + if (updates == null || existingObj == null) { + throw new IllegalArgumentException("Updates map and existing object must not be null."); + } + + T unproxiedObj = (T) Hibernate.unproxy(existingObj); + Class clazz = unproxiedObj.getClass(); + + for (Map.Entry entry : updates.entrySet()) { + String fieldName = entry.getKey(); + Object newValue = entry.getValue(); + + try { + Field field = clazz.getDeclaredField(fieldName); + + if (field.getName().equals("id")) { + continue; + } + field.setAccessible(true); + + if (newValue != null && !field.getType().isAssignableFrom(newValue.getClass())) { + // Handle Integer to Long or Integer conversion + if (field.getType().equals(Long.class) && newValue.getClass().equals(Integer.class)) { + newValue = Long.valueOf((Integer) newValue); // Convert Integer to Long + } else if (field.getType().equals(Integer.class) && newValue.getClass().equals(Long.class)) { + newValue = ((Long) newValue).intValue(); // Convert Long to Integer + } else { + throw new NotAcceptableException( + "Type mismatch for field '" + fieldName + "'. Expected: " + field.getType().getName() + ", But received: " + newValue.getClass() + ); + } + } + + field.set(unproxiedObj, newValue); + + } catch (NoSuchFieldException e) { + throw new NotAcceptableException("Field '" + fieldName + "' does not exist "); + } catch (IllegalAccessException e) { + throw new NotAcceptableException("Failed to access field: " + fieldName); + } + } + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ef6d7e3d..4a375ba3 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,8 +1,8 @@ spring: datasource: - url: jdbc:mysql://blogapi-db:3306/blogapi?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true + url: jdbc:mysql://localhost:3306/db_ncx_master?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true username: root - password: root + password: rootroot jpa: hibernate: ddl-auto: none @@ -13,8 +13,11 @@ spring: jackson: serialization: WRITE_DATES_AS_TIMESTAMPS: false - time-zone: UTC - + time-zone: IST + devtools: + add-properties: true +server: + port: 9080 app: jwtSecret: secret jwtExpirationInMs: 3600000 diff --git a/src/main/resources/guuhaa.sql b/src/main/resources/guuhaa.sql new file mode 100644 index 00000000..861c1d8c --- /dev/null +++ b/src/main/resources/guuhaa.sql @@ -0,0 +1,179 @@ +-- DROP ALL TABLES TO AVOID DUPLICATES +DROP TABLE IF EXISTS `t_item_transaction`; +DROP TABLE IF EXISTS `t_transaction`; +DROP TABLE IF EXISTS `t_item`; +DROP TABLE IF EXISTS `t_hotel_active_menu`; +DROP TABLE IF EXISTS `t_hotel_menu`; +DROP TABLE IF EXISTS `t_menu`; +DROP TABLE IF EXISTS `t_user_role`; +DROP TABLE IF EXISTS `t_roles`; +DROP TABLE IF EXISTS `t_users`; +DROP TABLE IF EXISTS `t_hotel`; +DROP TABLE IF EXISTS `t_address`; + +-- TABLE: t_address +CREATE TABLE `t_address` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `door_no` varchar(255), + `line1` varchar(255), + `line2` varchar(255), + `land_mark` varchar(255), + `city` varchar(255), + `state` varchar(255), + `pincode` varchar(255), + `lat` varchar(255), + `lng` varchar(255), + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- TABLE: t_hotel +CREATE TABLE `t_hotel` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `full_name` varchar(255) NOT NULL, + `username` varchar(255) NOT NULL, + `email` varchar(255) NOT NULL, + `address_id` bigint(19) unsigned DEFAULT NULL, + `phone` varchar(255), + `menu_id` bigint(19) unsigned DEFAULT NULL, + `website` varchar(255), + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `fkx_address` (`address_id`), + KEY `fkx_menu` (`menu_id`), + CONSTRAINT `fkx_address` FOREIGN KEY (`address_id`) REFERENCES `t_address` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fkx_menu` FOREIGN KEY (`menu_id`) REFERENCES `t_menu` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- TABLE: t_users +CREATE TABLE `t_users` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `username` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `email` varchar(255) NOT NULL, + `address_id` bigint(19) unsigned DEFAULT NULL, + `phone` varchar(255), + `hotel_id` bigint(19) unsigned DEFAULT NULL, + `is_active` boolean DEFAULT true, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `fkx_user_address` (`address_id`), + CONSTRAINT `fkx_user_address` FOREIGN KEY (`address_id`) REFERENCES `t_address` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + KEY `fkx_user_hotel` (`hotel_id`), + CONSTRAINT `fkx_user_hotel` FOREIGN KEY (`hotel_id`) REFERENCES `t_hotel` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- TABLE: t_roles +CREATE TABLE `t_roles` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- TABLE: t_user_role +CREATE TABLE `t_user_role` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint(19) unsigned NOT NULL, + `role_id` bigint(19) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `fkx_user_role_user` (`user_id`), + KEY `fkx_user_role_role` (`role_id`), + CONSTRAINT `fkx_user_role_user` FOREIGN KEY (`user_id`) REFERENCES `t_users` (`id`), + CONSTRAINT `fkx_user_role_role` FOREIGN KEY (`role_id`) REFERENCES `t_roles` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- TABLE: t_menu +CREATE TABLE `t_menu` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `completed` boolean DEFAULT false, + `hotel_id` bigint(19) unsigned NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- TABLE: t_hotel_menu +CREATE TABLE `t_hotel_menu` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `hotel_id` bigint(19) unsigned NOT NULL, + `menu_id` bigint(19) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `fkx_hotel_menu_hotel` (`hotel_id`), + KEY `fkx_hotel_menu_menu` (`menu_id`), + CONSTRAINT `fkx_hotel_menu_hotel` FOREIGN KEY (`hotel_id`) REFERENCES `t_hotel` (`id`), + CONSTRAINT `fkx_hotel_menu_menu` FOREIGN KEY (`menu_id`) REFERENCES `t_menu` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- TABLE: t_item +CREATE TABLE `t_item` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `alias` varchar(255) NOT NULL, + `shortcut` varchar(255) NOT NULL, + `is_available` boolean DEFAULT false, + `is_veg` TINYINT(1) DEFAULT true; + `price` bigint(19) DEFAULT NULL, + `menu_id` bigint(19) unsigned NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `fkx_item_menu` (`menu_id`), + CONSTRAINT `fkx_item_menu` FOREIGN KEY (`menu_id`) REFERENCES `t_menu` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- TABLE: t_hotel_active_menu +--CREATE TABLE `t_hotel_active_menu` ( +-- `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, +-- `hotel_id` bigint(19) unsigned NOT NULL, +-- `menu_id` bigint(19) unsigned NOT NULL, +-- `is_active` boolean NOT NULL DEFAULT true, +-- PRIMARY KEY (`id`), +-- UNIQUE KEY `unique_active_menu_per_hotel` (`hotel_id`, `menu_id`), +-- KEY `fkx_hotel_active_menu_hotel` (`hotel_id`), +-- KEY `fkx_hotel_active_menu_menu` (`menu_id`), +-- CONSTRAINT `fkx_hotel_active_menu_hotel` FOREIGN KEY (`hotel_id`) REFERENCES `t_hotel` (`id`), +-- CONSTRAINT `fkx_hotel_active_menu_menu` FOREIGN KEY (`menu_id`) REFERENCES `t_menu` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +--) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- TABLE: t_transaction +CREATE TABLE `t_transaction` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `total` decimal(10,2) NOT NULL, + `payment_type` ENUM('cash', 'UPI', 'card') NOT NULL, + `handler` varchar(255) NOT NULL, + `note` varchar(255), + `created_by` bigint(19) unsigned DEFAULT NULL, + `hotel_id` bigint(19) unsigned NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `fkx_transaction_hotel` (`hotel_id`), + CONSTRAINT `fkx_transaction_hotel` FOREIGN KEY (`hotel_id`) REFERENCES `t_hotel` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- TABLE: t_item_transaction +CREATE TABLE `t_item_transaction` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `alias` varchar(255) NOT NULL, + `shortcut` varchar(255) NOT NULL, + `is_available` boolean DEFAULT false, + `price` bigint(19) DEFAULT NULL, + `transaction_id` bigint(19) unsigned NOT NULL, + `menu_id` bigint(19) unsigned NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `fkx_item_transaction_transaction` (`transaction_id`), + KEY `fkx_item_transaction_menu` (`menu_id`), + CONSTRAINT `fkx_item_transaction_transaction` FOREIGN KEY (`transaction_id`) REFERENCES `t_transaction` (`id`) ON DELETE CASCADE, + CONSTRAINT `fkx_item_transaction_menu` FOREIGN KEY (`menu_id`) REFERENCES `t_menu` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +INSERT INTO `t_roles` VALUES (1,'ROLE_ADMIN'),(2,'ROLE_USER'),(3,'ROLE_BOSS');