diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..389da54e --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: osopromadze +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..e943cfb1 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,37 @@ +name: SonarCloud +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened] +jobs: + build: + name: Build and analyze + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: 17 + distribution: 'zulu' + - name: Cache SonarCloud packages + uses: actions/cache@v3 + with: + path: ~/.sonar/cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + - name: Cache Maven packages + uses: actions/cache@v3 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Build and analyze + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=osopromadze_Spring-Boot-Blog-REST-API \ No newline at end of file diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml index c691b593..5e398432 100644 --- a/.github/workflows/greetings.yml +++ b/.github/workflows/greetings.yml @@ -1,13 +1,13 @@ name: Greetings -on: [pull_request, issues] +on: [pull_request_target, issues] jobs: greeting: runs-on: ubuntu-latest steps: - - uses: actions/first-interaction@v1 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - issue-message: 'Welcome to Spring-Boot-Blog-REST-API community! Thanks so much for creating your first issue :)' - pr-message: 'Thanks so much for creating your first PR, the Spring-Boot-Blog-REST-API community thanks you :)' + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + issue-message: 'Welcome @${{ github.actor }} to Spring-Boot-Blog-REST-API community! Thanks so much for creating your first issue :)' + pr-message: 'Thanks so much @${{ github.actor }} for creating your first PR, the Spring-Boot-Blog-REST-API community thanks you :)' diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 9cc84ea9..00000000 Binary files a/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 6c8c0e08..00000000 --- a/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1 +0,0 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 891a6c7f..00000000 --- a/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: java -dist: trusty -os: linux -addons: - sonarcloud: - organization: "coma123" - token: - secure: "fVilZ8rDtzqhxL7nEXCksKTnxdQXL2Ab5pSmpL0zZHw3zKsiKMWtuzMzIO11g+LIy6P+5sT+3ZAdcEwFeFM02R/CMpGmCIwHqNw7AvPeK8Vl6zeUEmAiV4yboIGL/7AksmSHx2nHZiQagUrLZKFhHaM3YpMmyhhbxuSxJNkZ95NPr43I5TfT7mqDWiaY/Hhmg29N8qjAO51j21j4eZwQLJIDlfnCUcGbTMHmlKsfJIuMcVPUQIE5w5rDaiMDyDdOZxlY/IKXi6JDGHP/TRthFk8zddqVj5qtzkCNKpl0K7ReMHdJb6aTSIsn6IVD+fHRev5ik2FF7HZ8DF0lC/0S62bVcmzTuF0WEWaWNre3l69dB0HBKY0GDxA4hskhVjRSMKjGKrH5Bx/LVXAo2a+U+uIO8ZmB4P7S4rwNF34ZnTke/yw7OmtesZWCDXZNzoidq59BRPL4RkkG0J1FMcWC47AsdnJC1JOX/bdunJ8Nmj2Lxil0RcLgDKK/L0La3UnNE8iKH8gE2E+rwHpKfF0wNt/mzpJYzXJ/l9DwRFyTsJoaVxDshIyM709Hp91CGy2JuNI7FeZZJK3laDmE4dHpr88MOvlPNHhvuxQG1MXUNNI1H2n1ZQlH8p9ZBgouG1LmRtY3GeyiuoSbQWmtUq4iAhb5F5G5/uHwS+BrLLNZSHo=" -script: - # the following command line builds the project, runs the tests with coverage and then execute the SonarCloud analysis - - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install sonar:sonar -Dsonar.projectKey=coma123_Spring-Boot-Blog-REST-API - -before_install: - - chmod +x mvnw -cache: - directories: - - '$HOME/.m2/repository' - - '$HOME/.sonar/cache' diff --git a/Dockerfile b/Dockerfile index ea74f862..e7d65cce 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM openjdk:11-jre-slim +FROM adoptopenjdk/openjdk11:alpine-jre VOLUME /tmp ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar diff --git a/README.md b/README.md index 4f705086..2906f0fd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.com/coma123/Spring-Boot-Blog-REST-API.svg?branch=development)](https://travis-ci.com/coma123/Spring-Boot-Blog-REST-API) [![Sonarcloud Status](https://sonarcloud.io/api/project_badges/measure?project=coma123_Spring-Boot-Blog-REST-API&metric=alert_status)](https://sonarcloud.io/dashboard?id=coma123_Spring-Boot-Blog-REST-API) +[![Build Status](https://travis-ci.com/coma123/Spring-Boot-Blog-REST-API.svg?branch=development)](https://travis-ci.com/coma123/Spring-Boot-Blog-REST-API) [![Sonarcloud Status](https://sonarcloud.io/api/project_badges/measure?project=coma123_Spring-Boot-Blog-REST-API&metric=alert_status)](https://sonarcloud.io/dashboard?id=coma123_Spring-Boot-Blog-REST-API) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/3706/badge)](https://bestpractices.coreinfrastructure.org/projects/3706) # Spring Boot, MySQL, Spring Security, JWT, JPA, Rest API diff --git a/data/blogapi.sql b/data/blogapi.sql new file mode 100644 index 00000000..5cc9ced8 --- /dev/null +++ b/data/blogapi.sql @@ -0,0 +1,192 @@ +USE blogapi; + +UNLOCK TABLES; + +DROP TABLE IF EXISTS `post_tag`; +DROP TABLE IF EXISTS `tags`; +DROP TABLE IF EXISTS `user_role`; +DROP TABLE IF EXISTS `roles`; +DROP TABLE IF EXISTS `comments`; +DROP TABLE IF EXISTS `posts`; +DROP TABLE IF EXISTS `photos`; +DROP TABLE IF EXISTS `albums`; +DROP TABLE IF EXISTS `todos`; +DROP TABLE IF EXISTS `users`; +DROP TABLE IF EXISTS `address`; +DROP TABLE IF EXISTS `company`; +DROP TABLE IF EXISTS `geo`; + +CREATE TABLE `tags` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` bigint(19) unsigned NOT NULL, + `updated_by` bigint(19) unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `geo` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `lat` varchar(255), + `lng` varchar(255), + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` bigint(19) unsigned DEFAULT NULL, + `updated_by` bigint(19) unsigned DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `company` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255), + `catch_phrase` varchar(255), + `bs` varchar(255), + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` bigint(19) unsigned DEFAULT NULL, + `updated_by` bigint(19) unsigned DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `address` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `street` varchar(255), + `suite` varchar(255), + `city` varchar(255), + `zipcode` varchar(255), + `geo_id` bigint(19) unsigned DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` bigint(19) unsigned DEFAULT NULL, + `updated_by` bigint(19) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fk_geo` (`geo_id`), + CONSTRAINT `fk_geo` FOREIGN KEY (`geo_id`) REFERENCES `geo` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `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), + `website` varchar(255), + `company_id` bigint(19) unsigned DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `fk_address` (`address_id`), + KEY `fk_company` (`company_id`), + CONSTRAINT `fk_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_company` FOREIGN KEY (`company_id`) REFERENCES `company` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `todos` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `completed` boolean default false, + `user_id` bigint(19) unsigned DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` bigint(19) unsigned DEFAULT NULL, + `updated_by` bigint(19) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fk_user_todos` (`user_id`), + CONSTRAINT `fk_user_todos` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `albums` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `user_id` bigint(19) unsigned DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` bigint(19) unsigned DEFAULT NULL, + `updated_by` bigint(19) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fk_user_album` (`user_id`), + CONSTRAINT `fk_user_album` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `photos` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `url` varchar(255) NOT NULL, + `thumbnail_url` varchar(255) NOT NULL, + `album_id` bigint(19) unsigned DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` bigint(19) unsigned DEFAULT NULL, + `updated_by` bigint(19) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fk_album` (`album_id`), + CONSTRAINT `fk_album` FOREIGN KEY (`album_id`) REFERENCES `albums` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `posts` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `body` text NOT NULL, + `user_id` bigint(19) unsigned DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` bigint(19) unsigned DEFAULT NULL, + `updated_by` bigint(19) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fk_user_post` (`user_id`), + CONSTRAINT `fk_user_post` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `post_tag` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `post_id` bigint(19) unsigned NOT NULL, + `tag_id` bigint(19) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `fk_posttag_post_id` (`post_id`), + KEY `fk_posttag_tag_id` (`tag_id`), + CONSTRAINT `fk_posttag_post_id` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`), + CONSTRAINT `fk_posttag_tag_id` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `comments` ( + `id` bigint(19) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `email` varchar(255) NOT NULL, + `body` text NOT NULL, + `post_id` bigint(19) unsigned DEFAULT NULL, + `user_id` bigint(19) unsigned DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` bigint(19) unsigned NOT NULL, + `updated_by` bigint(19) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `fk_comment_post` (`post_id`), + KEY `fk_comment_user` (`user_id`), + CONSTRAINT `fk_comment_post` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`), + CONSTRAINT `fk_comment_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `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; + +CREATE TABLE `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 `fk_security_user_id` (`user_id`), + KEY `fk_security_role_id` (`role_id`), + CONSTRAINT `fk_security_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`), + CONSTRAINT `fk_security_role_id` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +LOCK TABLES `roles` WRITE; +INSERT INTO `roles` VALUES (1,'ROLE_ADMIN'),(2,'ROLE_USER'); +UNLOCK TABLES; diff --git a/docker-compose.yml b/docker-compose.yml index 8835e6fa..9bd9053e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,29 +1,36 @@ -version: '3' +version: '3.8' services: - mysql: - image: mysql - restart: always - environment: - MYSQL_DATABASE: 'blogapi' - MYSQL_USER: 'root' - MYSQL_PASSWORD: 'root' - MYSQL_ROOT_PASSWORD: 'root' - ports: - - '3306' - networks: - - production-network - application: - build: - dockerfile: ./Dockerfile - context: . - image: michel-eckhardt/spring-boot-blog - container_name: spring-boot-blog - ports: - - "8080:8080" - networks: - - production-network - depends_on: - - "mysql" -networks: - production-network: - driver: bridge \ No newline at end of file + db: + image: mysql + container_name: blogapi-db + restart: always + environment: + MYSQL_DATABASE: 'blogapi' + MYSQL_PASSWORD: 'root' + MYSQL_ROOT_PASSWORD: 'root' + ports: + - '3306:3306' + networks: + - blogapi-network + healthcheck: + test: "/usr/bin/mysql --user=root --password=root --execute \"SHOW DATABASES;\"" + interval: 2s + timeout: 20s + retries: 10 + volumes: + - ./data:/docker-entrypoint-initdb.d + application: + container_name: blogapi-application + build: + context: ./ + dockerfile: Dockerfile + ports: + - "8080:8080" + networks: + - blogapi-network + depends_on: + - "db" +networks: + blogapi-network: + name: blogapi-network + driver: bridge diff --git a/pom.xml b/pom.xml index 79747541..4b6fd187 100644 --- a/pom.xml +++ b/pom.xml @@ -1,52 +1,61 @@ - - 4.0.0 - - com.sopromadze - blogapi - 0.0.1-SNAPSHOT - jar - - BlogAPI - Blog API project with Spring Boot - - - org.springframework.boot - spring-boot-starter-parent - 2.1.8.RELEASE - - - - - UTF-8 - UTF-8 - 1.8 - - - - - org.springframework.boot - spring-boot-starter - + + 4.0.0 + + com.sopromadze + blogapi + 0.0.1-SNAPSHOT + jar + + BlogAPI + Blog API project with Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 2.1.8.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + coma123 + https://sonarcloud.io + + + + + org.springframework.boot + spring-boot-starter + + + + mysql + mysql-connector-java + runtime + - mysql - mysql-connector-java - runtime + org.projectlombok + lombok + 1.18.12 + provided org.springframework.boot spring-boot-starter-web - - + + org.springframework.boot spring-boot-starter-aop - + org.springframework.boot @@ -84,7 +93,6 @@ 2.3.5 - org.springframework.boot spring-boot-devtools @@ -95,13 +103,6 @@ spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-test - test - - org.springframework.boot spring-boot-starter-security @@ -116,7 +117,7 @@ org.springframework.security.oauth spring-security-oauth2 - 2.3.4.RELEASE + [2.3.5,) @@ -140,13 +141,6 @@ commons-lang3 - - org.modelmapper - modelmapper - 2.3.1 - - - @@ -167,6 +161,4 @@ - - diff --git a/src/main/java/com/sopromadze/blogapi/BlogApiApplication.java b/src/main/java/com/sopromadze/blogapi/BlogApiApplication.java index 925c82bc..6e45ce6b 100644 --- a/src/main/java/com/sopromadze/blogapi/BlogApiApplication.java +++ b/src/main/java/com/sopromadze/blogapi/BlogApiApplication.java @@ -1,9 +1,6 @@ package com.sopromadze.blogapi; -import java.util.TimeZone; - -import javax.annotation.PostConstruct; - +import com.sopromadze.blogapi.security.JwtAuthenticationFilter; import org.modelmapper.ModelMapper; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -11,7 +8,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.data.convert.Jsr310Converters; -import com.sopromadze.blogapi.security.JwtAuthenticationFilter; +import javax.annotation.PostConstruct; +import java.util.TimeZone; @SpringBootApplication @EntityScan(basePackageClasses = { BlogApiApplication.class, Jsr310Converters.class }) @@ -31,10 +29,10 @@ void init() { public JwtAuthenticationFilter jwtAuthenticationFilter() { return new JwtAuthenticationFilter(); } - + @Bean public ModelMapper modelMapper() { - return new ModelMapper(); + return new ModelMapper(); } } diff --git a/src/main/java/com/sopromadze/blogapi/config/AuditingConfig.java b/src/main/java/com/sopromadze/blogapi/config/AuditingConfig.java index 2d820eae..144a9444 100644 --- a/src/main/java/com/sopromadze/blogapi/config/AuditingConfig.java +++ b/src/main/java/com/sopromadze/blogapi/config/AuditingConfig.java @@ -15,24 +15,24 @@ @EnableJpaAuditing public class AuditingConfig { - @Bean - public AuditorAware auditorProvider(){ - return new SpringSecurityAuditAwareImpl(); - } + @Bean + public AuditorAware auditorProvider() { + return new SpringSecurityAuditAwareImpl(); + } } -class SpringSecurityAuditAwareImpl implements AuditorAware{ +class SpringSecurityAuditAwareImpl implements AuditorAware { - @Override - public Optional getCurrentAuditor() { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + @Override + public Optional getCurrentAuditor() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if(authentication == null || !authentication.isAuthenticated() || authentication instanceof AnonymousAuthenticationToken) { - return Optional.empty(); - } + if (authentication == null || !authentication.isAuthenticated() || authentication instanceof AnonymousAuthenticationToken) { + return Optional.empty(); + } - UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal(); + UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal(); - return Optional.ofNullable(userPrincipal.getId()); - } + return Optional.ofNullable(userPrincipal.getId()); + } } diff --git a/src/main/java/com/sopromadze/blogapi/config/SecutiryConfig.java b/src/main/java/com/sopromadze/blogapi/config/SecutiryConfig.java index bfa387f8..1a0c1175 100644 --- a/src/main/java/com/sopromadze/blogapi/config/SecutiryConfig.java +++ b/src/main/java/com/sopromadze/blogapi/config/SecutiryConfig.java @@ -1,5 +1,9 @@ package com.sopromadze.blogapi.config; +import com.sopromadze.blogapi.repository.UserRepository; +import com.sopromadze.blogapi.security.JwtAuthenticationEntryPoint; +import com.sopromadze.blogapi.security.JwtAuthenticationFilter; +import com.sopromadze.blogapi.service.impl.CustomUserDetailsServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,62 +20,57 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import com.sopromadze.blogapi.repository.UserRepository; -import com.sopromadze.blogapi.security.JwtAuthenticationEntryPoint; -import com.sopromadze.blogapi.security.JwtAuthenticationFilter; -import com.sopromadze.blogapi.service.impl.CustomUserDetailsServiceImpl; - @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity( - securedEnabled = true, - jsr250Enabled = true, - prePostEnabled = true) + securedEnabled = true, + jsr250Enabled = true, + prePostEnabled = true) public class SecutiryConfig extends WebSecurityConfigurerAdapter { - private final CustomUserDetailsServiceImpl customUserDetailsService; - private final JwtAuthenticationEntryPoint unauthorizedHandler; - private final JwtAuthenticationFilter jwtAuthenticationFilter; + private final CustomUserDetailsServiceImpl customUserDetailsService; + private final JwtAuthenticationEntryPoint unauthorizedHandler; + private final JwtAuthenticationFilter jwtAuthenticationFilter; - @Autowired - public SecutiryConfig(UserRepository userRepository, CustomUserDetailsServiceImpl customUserDetailsService, JwtAuthenticationEntryPoint unauthorizedHandler, JwtAuthenticationFilter jwtAuthenticationFilter) { - this.customUserDetailsService = customUserDetailsService; - this.unauthorizedHandler = unauthorizedHandler; - this.jwtAuthenticationFilter = jwtAuthenticationFilter; - } + @Autowired + public SecutiryConfig(UserRepository userRepository, CustomUserDetailsServiceImpl customUserDetailsService, + JwtAuthenticationEntryPoint unauthorizedHandler, JwtAuthenticationFilter jwtAuthenticationFilter) { + this.customUserDetailsService = customUserDetailsService; + this.unauthorizedHandler = unauthorizedHandler; + this.jwtAuthenticationFilter = jwtAuthenticationFilter; + } - @Override - protected void configure(HttpSecurity http) throws Exception { - - http.cors().and().csrf().disable() - .exceptionHandling() - .authenticationEntryPoint(unauthorizedHandler) - .and() - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() - .authorizeRequests() - .antMatchers(HttpMethod.GET, "/api/**").permitAll() - .antMatchers(HttpMethod.POST, "/api/auth/**").permitAll() - .antMatchers(HttpMethod.GET, "/api/users/checkUsernameAvailability", "/api/users/checkEmailAvailability").permitAll() - .anyRequest().authenticated(); + @Override + protected void configure(HttpSecurity http) throws Exception { - http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); + http.cors().and().csrf().disable() + .exceptionHandling() + .authenticationEntryPoint(unauthorizedHandler) + .and() + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .authorizeRequests() + .antMatchers(HttpMethod.GET, "/api/**").permitAll() + .antMatchers(HttpMethod.POST, "/api/auth/**").permitAll() + .antMatchers(HttpMethod.GET, "/api/users/checkUsernameAvailability", "/api/users/checkEmailAvailability").permitAll() + .anyRequest().authenticated(); + http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); - } + } - public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { - authenticationManagerBuilder.userDetailsService(customUserDetailsService) - .passwordEncoder(passwordEncoder()); - } + public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { + authenticationManagerBuilder.userDetailsService(customUserDetailsService) + .passwordEncoder(passwordEncoder()); + } - @Bean(BeanIds.AUTHENTICATION_MANAGER) - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); - } + @Bean(BeanIds.AUTHENTICATION_MANAGER) + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } } diff --git a/src/main/java/com/sopromadze/blogapi/config/WebMvcConfig.java b/src/main/java/com/sopromadze/blogapi/config/WebMvcConfig.java index dbde38f6..301ecb17 100644 --- a/src/main/java/com/sopromadze/blogapi/config/WebMvcConfig.java +++ b/src/main/java/com/sopromadze/blogapi/config/WebMvcConfig.java @@ -7,17 +7,17 @@ @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); - } + 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); + } } diff --git a/src/main/java/com/sopromadze/blogapi/controller/AlbumController.java b/src/main/java/com/sopromadze/blogapi/controller/AlbumController.java index 3966ea45..b5dc9ff4 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/AlbumController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/AlbumController.java @@ -1,7 +1,18 @@ package com.sopromadze.blogapi.controller; -import javax.validation.Valid; - +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; @@ -17,19 +28,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.sopromadze.blogapi.exception.ResponseEntityErrorException; -import com.sopromadze.blogapi.model.album.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 javax.validation.Valid; @RestController @RequestMapping("/api/albums") @@ -39,7 +38,7 @@ public class AlbumController { @Autowired private PhotoService photoService; - + @ExceptionHandler(ResponseEntityErrorException.class) public ResponseEntity handleExceptions(ResponseEntityErrorException exception) { return exception.getApiResponse(); @@ -50,7 +49,7 @@ 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); } @@ -82,10 +81,10 @@ public ResponseEntity deleteAlbum(@PathVariable(name = "id") Long i 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); + + return new ResponseEntity<>(response, HttpStatus.OK); } } diff --git a/src/main/java/com/sopromadze/blogapi/controller/AuthController.java b/src/main/java/com/sopromadze/blogapi/controller/AuthController.java index ff8dc5d9..5d49753d 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/AuthController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/AuthController.java @@ -1,11 +1,17 @@ package com.sopromadze.blogapi.controller; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; - -import javax.validation.Valid; - +import com.sopromadze.blogapi.exception.AppException; +import com.sopromadze.blogapi.exception.BlogapiException; +import com.sopromadze.blogapi.model.role.Role; +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.JwtAuthenticationResponse; +import com.sopromadze.blogapi.payload.LoginRequest; +import com.sopromadze.blogapi.payload.SignUpRequest; +import com.sopromadze.blogapi.repository.RoleRepository; +import com.sopromadze.blogapi.repository.UserRepository; +import com.sopromadze.blogapi.security.JwtTokenProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -20,18 +26,10 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; -import com.sopromadze.blogapi.exception.AppException; -import com.sopromadze.blogapi.exception.BlogapiException; -import com.sopromadze.blogapi.model.role.Role; -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.JwtAuthenticationResponse; -import com.sopromadze.blogapi.payload.LoginRequest; -import com.sopromadze.blogapi.payload.SignUpRequest; -import com.sopromadze.blogapi.repository.RoleRepository; -import com.sopromadze.blogapi.repository.UserRepository; -import com.sopromadze.blogapi.security.JwtTokenProvider; +import javax.validation.Valid; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; @RestController @RequestMapping("/api/auth") @@ -66,14 +64,14 @@ public ResponseEntity authenticateUser(@Valid @Reques @PostMapping("/signup") public ResponseEntity registerUser(@Valid @RequestBody SignUpRequest signUpRequest) { - if (userRepository.existsByUsername(signUpRequest.getUsername())) { + if (Boolean.TRUE.equals(userRepository.existsByUsername(signUpRequest.getUsername()))) { throw new BlogapiException(HttpStatus.BAD_REQUEST, "Username is already taken"); } - if (userRepository.existsByEmail(signUpRequest.getEmail())) { + 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(); @@ -81,13 +79,13 @@ public ResponseEntity registerUser(@Valid @RequestBody SignUpReques String username = signUpRequest.getUsername().toLowerCase(); String email = signUpRequest.getEmail().toLowerCase(); - + String password = passwordEncoder.encode(signUpRequest.getPassword()); User user = new User(firstName, lastName, username, email, password); List roles = new ArrayList<>(); - + if (userRepository.count() == 0) { roles.add(roleRepository.findByName(RoleName.ROLE_USER) .orElseThrow(() -> new AppException(USER_ROLE_NOT_SET))); diff --git a/src/main/java/com/sopromadze/blogapi/controller/CategoryController.java b/src/main/java/com/sopromadze/blogapi/controller/CategoryController.java index 260228cf..39b63842 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/CategoryController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/CategoryController.java @@ -1,7 +1,13 @@ package com.sopromadze.blogapi.controller; -import javax.validation.Valid; - +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; @@ -15,14 +21,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.category.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 javax.validation.Valid; @RestController @RequestMapping("/api/categories") @@ -41,7 +40,7 @@ public PagedResponse getAllCategories( @PreAuthorize("hasRole('USER')") public ResponseEntity addCategory(@Valid @RequestBody Category category, @CurrentUser UserPrincipal currentUser) { - + return categoryService.addCategory(category, currentUser); } diff --git a/src/main/java/com/sopromadze/blogapi/controller/CommentController.java b/src/main/java/com/sopromadze/blogapi/controller/CommentController.java index fac1dbde..2a402910 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/CommentController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/CommentController.java @@ -1,7 +1,13 @@ package com.sopromadze.blogapi.controller; -import javax.validation.Valid; - +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; @@ -16,14 +22,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.sopromadze.blogapi.model.comment.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 javax.validation.Valid; @RestController @RequestMapping("/api/posts/{postId}/comments") @@ -35,10 +34,10 @@ public class CommentController { 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); + + return new ResponseEntity< >(allComments, HttpStatus.OK); } @PostMapping @@ -46,16 +45,16 @@ public ResponseEntity> getAllComments(@PathVariable(name 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); + + 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); + + return new ResponseEntity<>(comment, HttpStatus.OK); } @PutMapping("/{id}") @@ -63,22 +62,22 @@ public ResponseEntity getComment(@PathVariable(name = "postId") Long po 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); + + 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); + + 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 index d5570e16..2f0846d0 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/PhotoController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/PhotoController.java @@ -1,7 +1,13 @@ package com.sopromadze.blogapi.controller; -import javax.validation.Valid; - +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; @@ -16,14 +22,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -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 javax.validation.Valid; @RestController @RequestMapping("/api/photos") @@ -43,32 +42,32 @@ public PagedResponse getAllPhotos( public ResponseEntity addPhoto(@Valid @RequestBody PhotoRequest photoRequest, @CurrentUser UserPrincipal currentUser) { PhotoResponse photoResponse = photoService.addPhoto(photoRequest, currentUser); - - return new ResponseEntity(photoResponse, HttpStatus.OK); + + 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); + + 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); + + 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); + + 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 index 77f3901f..5b8efcc7 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/PostController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/PostController.java @@ -1,7 +1,14 @@ package com.sopromadze.blogapi.controller; -import javax.validation.Valid; - +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; @@ -16,15 +23,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.sopromadze.blogapi.model.post.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 javax.validation.Valid; @RestController @RequestMapping("/api/posts") @@ -37,8 +36,8 @@ 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); + + return new ResponseEntity< >(response, HttpStatus.OK); } @GetMapping("/category/{id}") @@ -47,8 +46,8 @@ public ResponseEntity> getPostsByCategory( @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); + + return new ResponseEntity< >(response, HttpStatus.OK); } @GetMapping("/tag/{id}") @@ -57,8 +56,8 @@ public ResponseEntity> getPostsByTag( @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); + + return new ResponseEntity< >(response, HttpStatus.OK); } @PostMapping @@ -66,15 +65,15 @@ public ResponseEntity> getPostsByTag( public ResponseEntity addPost(@Valid @RequestBody PostRequest postRequest, @CurrentUser UserPrincipal currentUser) { PostResponse postResponse = postService.addPost(postRequest, currentUser); - - return new ResponseEntity(postResponse, HttpStatus.CREATED); + + 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); + + return new ResponseEntity< >(post, HttpStatus.OK); } @PutMapping("/{id}") @@ -82,15 +81,15 @@ public ResponseEntity getPost(@PathVariable(name = "id") Long id) { 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); + + 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); + + return new ResponseEntity< >(apiResponse, HttpStatus.OK); } } diff --git a/src/main/java/com/sopromadze/blogapi/controller/TagController.java b/src/main/java/com/sopromadze/blogapi/controller/TagController.java index e5a461c8..9a9b45c8 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/TagController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/TagController.java @@ -1,7 +1,12 @@ package com.sopromadze.blogapi.controller; -import javax.validation.Valid; - +import com.sopromadze.blogapi.model.Tag; +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.TagService; +import com.sopromadze.blogapi.utils.AppConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -16,60 +21,54 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.sopromadze.blogapi.model.tag.Tag; -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.TagService; -import com.sopromadze.blogapi.utils.AppConstants; +import javax.validation.Valid; @RestController @RequestMapping("/api/tags") public class TagController { @Autowired - private TagService tagService; - - @GetMapping - public ResponseEntity> getAllTags( - @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 = tagService.getAllTags(page, size); - - return new ResponseEntity>(response, HttpStatus.OK); - } - - @PostMapping - @PreAuthorize("hasRole('USER')") - public ResponseEntity addTag(@Valid @RequestBody Tag tag, @CurrentUser UserPrincipal currentUser){ - Tag newTag = tagService.addTag(tag, currentUser); - - return new ResponseEntity(newTag, HttpStatus.CREATED); - } - - @GetMapping("/{id}") - public ResponseEntity getTag(@PathVariable(name = "id") Long id){ - Tag tag = tagService.getTag(id); - - return new ResponseEntity(tag, HttpStatus.OK); - } - - @PutMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity updateTag(@PathVariable(name = "id") Long id, @Valid @RequestBody Tag tag, @CurrentUser UserPrincipal currentUser){ - - Tag updatedTag = tagService.updateTag(id, tag, currentUser); - - return new ResponseEntity(updatedTag, HttpStatus.OK); - } - - @DeleteMapping("/{id}") - @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") - public ResponseEntity deleteTag(@PathVariable(name = "id") Long id, @CurrentUser UserPrincipal currentUser){ - ApiResponse apiResponse = tagService.deleteTag(id, currentUser); - - return new ResponseEntity(apiResponse, HttpStatus.OK); - } + private TagService tagService; + + @GetMapping + public ResponseEntity> getAllTags( + @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 = tagService.getAllTags(page, size); + + return new ResponseEntity< >(response, HttpStatus.OK); + } + + @PostMapping + @PreAuthorize("hasRole('USER')") + public ResponseEntity addTag(@Valid @RequestBody Tag tag, @CurrentUser UserPrincipal currentUser) { + Tag newTag = tagService.addTag(tag, currentUser); + + return new ResponseEntity< >(newTag, HttpStatus.CREATED); + } + + @GetMapping("/{id}") + public ResponseEntity getTag(@PathVariable(name = "id") Long id) { + Tag tag = tagService.getTag(id); + + return new ResponseEntity< >(tag, HttpStatus.OK); + } + + @PutMapping("/{id}") + @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") + public ResponseEntity updateTag(@PathVariable(name = "id") Long id, @Valid @RequestBody Tag tag, @CurrentUser UserPrincipal currentUser) { + + Tag updatedTag = tagService.updateTag(id, tag, currentUser); + + return new ResponseEntity< >(updatedTag, HttpStatus.OK); + } + + @DeleteMapping("/{id}") + @PreAuthorize("hasRole('USER') or hasRole('ADMIN')") + public ResponseEntity deleteTag(@PathVariable(name = "id") Long id, @CurrentUser UserPrincipal currentUser) { + ApiResponse apiResponse = tagService.deleteTag(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 index d59f912b..aeb57789 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/TodoController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/TodoController.java @@ -1,7 +1,12 @@ package com.sopromadze.blogapi.controller; -import javax.validation.Valid; - +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; @@ -16,80 +21,75 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.sopromadze.blogapi.model.todo.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 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); - } + 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/UserController.java b/src/main/java/com/sopromadze/blogapi/controller/UserController.java index 12085ad8..f6b717e2 100644 --- a/src/main/java/com/sopromadze/blogapi/controller/UserController.java +++ b/src/main/java/com/sopromadze/blogapi/controller/UserController.java @@ -1,7 +1,20 @@ package com.sopromadze.blogapi.controller; -import javax.validation.Valid; - +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.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; @@ -16,21 +29,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.sopromadze.blogapi.model.album.Album; -import com.sopromadze.blogapi.model.post.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.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 javax.validation.Valid; @RestController @RequestMapping("/api/users") @@ -48,28 +47,28 @@ public class UserController { @PreAuthorize("hasRole('USER')") public ResponseEntity getCurrentUser(@CurrentUser UserPrincipal currentUser) { UserSummary userSummary = userService.getCurrentUser(currentUser); - - return new ResponseEntity(userSummary, HttpStatus.OK); + + 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); + + return new ResponseEntity< >(userIdentityAvailability, HttpStatus.OK); } @GetMapping("/checkEmailAvailability") public ResponseEntity checkEmailAvailability(@RequestParam(value = "email") String email) { - UserIdentityAvailability userIdentityAvailability = userService.checkEmailAvailability(email); - return new ResponseEntity(userIdentityAvailability, HttpStatus.OK); + UserIdentityAvailability userIdentityAvailability = userService.checkEmailAvailability(email); + return new ResponseEntity< >(userIdentityAvailability, HttpStatus.OK); } @GetMapping("/{username}/profile") public ResponseEntity getUSerProfile(@PathVariable(value = "username") String username) { UserProfile userProfile = userService.getUserProfile(username); - - return new ResponseEntity(userProfile, HttpStatus.OK); + + return new ResponseEntity< >(userProfile, HttpStatus.OK); } @GetMapping("/{username}/posts") @@ -77,8 +76,8 @@ public ResponseEntity> getPostsCreatedBy(@PathVariable(value @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); + + return new ResponseEntity< >(response, HttpStatus.OK); } @GetMapping("/{username}/albums") @@ -87,16 +86,16 @@ public ResponseEntity> getUserAlbums(@PathVariable(name = " @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); + + return new ResponseEntity< >(response, HttpStatus.OK); } @PostMapping @PreAuthorize("hasRole('ADMIN')") public ResponseEntity addUser(@Valid @RequestBody User user) { User newUser = userService.addUser(user); - - return new ResponseEntity(newUser, HttpStatus.CREATED); + + return new ResponseEntity< >(newUser, HttpStatus.CREATED); } @PutMapping("/{username}") @@ -104,8 +103,8 @@ public ResponseEntity addUser(@Valid @RequestBody User user) { public ResponseEntity updateUser(@Valid @RequestBody User newUser, @PathVariable(value = "username") String username, @CurrentUser UserPrincipal currentUser) { User updatedUSer = userService.updateUser(newUser, username, currentUser); - - return new ResponseEntity(updatedUSer, HttpStatus.CREATED); + + return new ResponseEntity< >(updatedUSer, HttpStatus.CREATED); } @DeleteMapping("/{username}") @@ -113,24 +112,24 @@ public ResponseEntity updateUser(@Valid @RequestBody User newUser, public ResponseEntity deleteUser(@PathVariable(value = "username") String username, @CurrentUser UserPrincipal currentUser) { ApiResponse apiResponse = userService.deleteUser(username, currentUser); - - return new ResponseEntity(apiResponse, HttpStatus.OK); + + 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); + + 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); + + return new ResponseEntity< >(apiResponse, HttpStatus.OK); } @PutMapping("/setOrUpdateInfo") @@ -138,8 +137,8 @@ public ResponseEntity takeAdmin(@PathVariable(name = "username") St public ResponseEntity setAddress(@CurrentUser UserPrincipal currentUser, @Valid @RequestBody InfoRequest infoRequest) { UserProfile userProfile = userService.setOrUpdateInfo(currentUser, infoRequest); - - return new ResponseEntity(userProfile, HttpStatus.OK); + + return new ResponseEntity< >(userProfile, HttpStatus.OK); } } diff --git a/src/main/java/com/sopromadze/blogapi/exception/AccessDeniedException.java b/src/main/java/com/sopromadze/blogapi/exception/AccessDeniedException.java index 55951ac7..ba5391e1 100644 --- a/src/main/java/com/sopromadze/blogapi/exception/AccessDeniedException.java +++ b/src/main/java/com/sopromadze/blogapi/exception/AccessDeniedException.java @@ -1,29 +1,28 @@ package com.sopromadze.blogapi.exception; +import com.sopromadze.blogapi.payload.ApiResponse; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; -import com.sopromadze.blogapi.payload.ApiResponse; - @ResponseStatus(code = HttpStatus.UNAUTHORIZED) public class AccessDeniedException extends RuntimeException { private static final long serialVersionUID = 1L; - + private ApiResponse apiResponse; private String message; - + public AccessDeniedException(ApiResponse apiResponse) { super(); this.apiResponse = apiResponse; } - public AccessDeniedException(String message){ + public AccessDeniedException(String message) { super(message); this.message = message; } - - public AccessDeniedException(String message, Throwable cause){ + + public AccessDeniedException(String message, Throwable cause) { super(message, cause); } diff --git a/src/main/java/com/sopromadze/blogapi/exception/BadRequestException.java b/src/main/java/com/sopromadze/blogapi/exception/BadRequestException.java index 3f862a22..a35149fe 100644 --- a/src/main/java/com/sopromadze/blogapi/exception/BadRequestException.java +++ b/src/main/java/com/sopromadze/blogapi/exception/BadRequestException.java @@ -1,16 +1,15 @@ package com.sopromadze.blogapi.exception; +import com.sopromadze.blogapi.payload.ApiResponse; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; -import com.sopromadze.blogapi.payload.ApiResponse; - @ResponseStatus(HttpStatus.BAD_REQUEST) public class BadRequestException extends RuntimeException { private static final long serialVersionUID = 1L; - + private ApiResponse apiResponse; - + public BadRequestException(ApiResponse apiResponse) { super(); this.apiResponse = apiResponse; @@ -23,7 +22,7 @@ public BadRequestException(String message) { public BadRequestException(String message, Throwable cause) { super(message, cause); } - + public ApiResponse getApiResponse() { return apiResponse; } diff --git a/src/main/java/com/sopromadze/blogapi/exception/BlogapiException.java b/src/main/java/com/sopromadze/blogapi/exception/BlogapiException.java index ba6f9523..4da4fd63 100644 --- a/src/main/java/com/sopromadze/blogapi/exception/BlogapiException.java +++ b/src/main/java/com/sopromadze/blogapi/exception/BlogapiException.java @@ -5,16 +5,16 @@ public class BlogapiException extends RuntimeException { private static final long serialVersionUID = -6593330219878485669L; - + private final HttpStatus status; private final String message; - + public BlogapiException(HttpStatus status, String message) { super(); this.status = status; this.message = message; } - + public BlogapiException(HttpStatus status, String message, Throwable exception) { super(exception); this.status = status; @@ -24,7 +24,7 @@ public BlogapiException(HttpStatus status, String message, Throwable exception) public HttpStatus getStatus() { return status; } - + public String getMessage() { return message; } diff --git a/src/main/java/com/sopromadze/blogapi/exception/ResourceNotFoundException.java b/src/main/java/com/sopromadze/blogapi/exception/ResourceNotFoundException.java index c9c5fb75..4dd90e07 100644 --- a/src/main/java/com/sopromadze/blogapi/exception/ResourceNotFoundException.java +++ b/src/main/java/com/sopromadze/blogapi/exception/ResourceNotFoundException.java @@ -1,14 +1,13 @@ package com.sopromadze.blogapi.exception; +import com.sopromadze.blogapi.payload.ApiResponse; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; -import com.sopromadze.blogapi.payload.ApiResponse; - @ResponseStatus(value = HttpStatus.NOT_FOUND) public class ResourceNotFoundException extends RuntimeException { private static final long serialVersionUID = 1L; - + private transient ApiResponse apiResponse; private String resourceName; @@ -37,10 +36,10 @@ public Object getFieldValue() { public ApiResponse getApiResponse() { return apiResponse; } - + private void setApiResponse() { String message = String.format("%s not found with %s: '%s'", resourceName, fieldName, fieldValue); - + apiResponse = new ApiResponse(Boolean.FALSE, message); } } diff --git a/src/main/java/com/sopromadze/blogapi/exception/ResponseEntityErrorException.java b/src/main/java/com/sopromadze/blogapi/exception/ResponseEntityErrorException.java index ec51d833..f5aeaaed 100644 --- a/src/main/java/com/sopromadze/blogapi/exception/ResponseEntityErrorException.java +++ b/src/main/java/com/sopromadze/blogapi/exception/ResponseEntityErrorException.java @@ -1,14 +1,13 @@ package com.sopromadze.blogapi.exception; -import org.springframework.http.ResponseEntity; - import com.sopromadze.blogapi.payload.ApiResponse; +import org.springframework.http.ResponseEntity; public class ResponseEntityErrorException extends RuntimeException { private static final long serialVersionUID = -3156815846745801694L; - + private transient ResponseEntity apiResponse; - + public ResponseEntityErrorException(ResponseEntity apiResponse) { this.apiResponse = apiResponse; } diff --git a/src/main/java/com/sopromadze/blogapi/exception/RestControllerExceptionHandler.java b/src/main/java/com/sopromadze/blogapi/exception/RestControllerExceptionHandler.java index 9cbeadfb..a9372e45 100644 --- a/src/main/java/com/sopromadze/blogapi/exception/RestControllerExceptionHandler.java +++ b/src/main/java/com/sopromadze/blogapi/exception/RestControllerExceptionHandler.java @@ -1,9 +1,7 @@ package com.sopromadze.blogapi.exception; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - +import com.sopromadze.blogapi.payload.ApiResponse; +import com.sopromadze.blogapi.payload.ExceptionResponse; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; @@ -16,57 +14,57 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import com.sopromadze.blogapi.payload.ApiResponse; -import com.sopromadze.blogapi.payload.ExceptionResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; @ControllerAdvice public class RestControllerExceptionHandler { - - public ResponseEntity resolveException(BlogapiException exception){ + + public ResponseEntity resolveException(BlogapiException exception) { String message = exception.getMessage(); HttpStatus status = exception.getStatus(); - + ApiResponse apiResponse = new ApiResponse(); - + apiResponse.setSuccess(Boolean.FALSE); apiResponse.setMessage(message); - + return new ResponseEntity<>(apiResponse, status); } - + @ExceptionHandler(UnauthorizedException.class) @ResponseBody @ResponseStatus(code = HttpStatus.UNAUTHORIZED) - public ResponseEntity resolveException(UnauthorizedException exception){ - + public ResponseEntity resolveException(UnauthorizedException exception) { + ApiResponse apiResponse = exception.getApiResponse(); - + return new ResponseEntity<>(apiResponse, HttpStatus.UNAUTHORIZED); } - + @ExceptionHandler(BadRequestException.class) @ResponseBody - public ResponseEntity resolveException(BadRequestException exception){ + public ResponseEntity resolveException(BadRequestException exception) { ApiResponse apiResponse = exception.getApiResponse(); - - return new ResponseEntity(apiResponse, HttpStatus.BAD_REQUEST); + + return new ResponseEntity<>(apiResponse, HttpStatus.BAD_REQUEST); } - - + @ExceptionHandler(ResourceNotFoundException.class) @ResponseBody - public ResponseEntity resolveException(ResourceNotFoundException exception){ + public ResponseEntity resolveException(ResourceNotFoundException exception) { ApiResponse apiResponse = exception.getApiResponse(); - - return new ResponseEntity(apiResponse, HttpStatus.NOT_FOUND); + + return new ResponseEntity<>(apiResponse, HttpStatus.NOT_FOUND); } - + @ExceptionHandler(AccessDeniedException.class) @ResponseBody - public ResponseEntity resolveException(AccessDeniedException exception){ + public ResponseEntity resolveException(AccessDeniedException exception) { ApiResponse apiResponse = exception.getApiResponse(); - - return new ResponseEntity(apiResponse, HttpStatus.FORBIDDEN); + + return new ResponseEntity< >(apiResponse, HttpStatus.FORBIDDEN); } @ExceptionHandler({ MethodArgumentNotValidException.class }) @@ -102,7 +100,7 @@ public ResponseEntity resolveException(HttpRequestMethodNotSu + ex.getSupportedHttpMethods(); List messages = new ArrayList<>(1); messages.add(message); - + return new ResponseEntity<>(new ExceptionResponse(messages, HttpStatus.METHOD_NOT_ALLOWED.getReasonPhrase(), HttpStatus.METHOD_NOT_ALLOWED.value()), HttpStatus.METHOD_NOT_ALLOWED); } diff --git a/src/main/java/com/sopromadze/blogapi/exception/UnauthorizedException.java b/src/main/java/com/sopromadze/blogapi/exception/UnauthorizedException.java index f6de4522..1760c66b 100644 --- a/src/main/java/com/sopromadze/blogapi/exception/UnauthorizedException.java +++ b/src/main/java/com/sopromadze/blogapi/exception/UnauthorizedException.java @@ -1,29 +1,28 @@ package com.sopromadze.blogapi.exception; +import com.sopromadze.blogapi.payload.ApiResponse; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; -import com.sopromadze.blogapi.payload.ApiResponse; - @ResponseStatus(code = HttpStatus.UNAUTHORIZED) public class UnauthorizedException extends RuntimeException { private static final long serialVersionUID = 1L; - + private ApiResponse apiResponse; private String message; - + public UnauthorizedException(ApiResponse apiResponse) { super(); this.apiResponse = apiResponse; } - public UnauthorizedException(String message){ + public UnauthorizedException(String message) { super(message); this.message = message; } - - public UnauthorizedException(String message, Throwable cause){ + + public UnauthorizedException(String message, Throwable cause) { super(message, cause); } diff --git a/src/main/java/com/sopromadze/blogapi/model/album/Album.java b/src/main/java/com/sopromadze/blogapi/model/Album.java similarity index 81% rename from src/main/java/com/sopromadze/blogapi/model/album/Album.java rename to src/main/java/com/sopromadze/blogapi/model/Album.java index 56a628f5..311d5991 100644 --- a/src/main/java/com/sopromadze/blogapi/model/album/Album.java +++ b/src/main/java/com/sopromadze/blogapi/model/Album.java @@ -1,8 +1,10 @@ -package com.sopromadze.blogapi.model.album; +package com.sopromadze.blogapi.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.sopromadze.blogapi.model.audit.UserDateAudit; +import com.sopromadze.blogapi.model.user.User; +import lombok.Data; +import lombok.EqualsAndHashCode; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -17,13 +19,13 @@ import javax.persistence.Table; import javax.persistence.UniqueConstraint; import javax.validation.constraints.NotBlank; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.sopromadze.blogapi.model.audit.UserDateAudit; -import com.sopromadze.blogapi.model.photo.Photo; -import com.sopromadze.blogapi.model.user.User; - +@EqualsAndHashCode(callSuper = true) @Entity +@Data @Table(name = "albums", uniqueConstraints = { @UniqueConstraint(columnNames = { "title" }) }) public class Album extends UserDateAudit { private static final long serialVersionUID = 1L; @@ -43,31 +45,11 @@ public class Album extends UserDateAudit { @OneToMany(mappedBy = "album", cascade = CascadeType.ALL, orphanRemoval = true) private List photo; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - @JsonIgnore public User getUser() { return user; } - public void setUser(User user) { - this.user = user; - } - public List getPhoto() { return this.photo == null ? null : new ArrayList<>(this.photo); } diff --git a/src/main/java/com/sopromadze/blogapi/model/category/Category.java b/src/main/java/com/sopromadze/blogapi/model/Category.java similarity index 77% rename from src/main/java/com/sopromadze/blogapi/model/category/Category.java rename to src/main/java/com/sopromadze/blogapi/model/Category.java index 58451985..102c6e39 100644 --- a/src/main/java/com/sopromadze/blogapi/model/category/Category.java +++ b/src/main/java/com/sopromadze/blogapi/model/Category.java @@ -1,8 +1,11 @@ -package com.sopromadze.blogapi.model.category; +package com.sopromadze.blogapi.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import com.sopromadze.blogapi.model.audit.UserDateAudit; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -12,53 +15,34 @@ import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; -import com.sopromadze.blogapi.model.audit.UserDateAudit; -import com.sopromadze.blogapi.model.post.Post; - +@EqualsAndHashCode(callSuper = true) @Entity +@Data +@NoArgsConstructor @Table(name = "categories") @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") -public class Category extends UserDateAudit{ +public class Category extends UserDateAudit { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - + @Column(name = "name") private String name; - + @OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true) private List posts; - public Category() { - - } - public Category(String name) { super(); this.name = name; } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - public List getPosts() { return this.posts == null ? null : new ArrayList<>(this.posts); } diff --git a/src/main/java/com/sopromadze/blogapi/model/comment/Comment.java b/src/main/java/com/sopromadze/blogapi/model/Comment.java similarity index 66% rename from src/main/java/com/sopromadze/blogapi/model/comment/Comment.java rename to src/main/java/com/sopromadze/blogapi/model/Comment.java index 1e7d2fa5..d9d21972 100644 --- a/src/main/java/com/sopromadze/blogapi/model/comment/Comment.java +++ b/src/main/java/com/sopromadze/blogapi/model/Comment.java @@ -1,4 +1,11 @@ -package com.sopromadze.blogapi.model.comment; +package com.sopromadze.blogapi.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.sopromadze.blogapi.model.audit.UserDateAudit; +import com.sopromadze.blogapi.model.user.User; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import javax.persistence.Column; import javax.persistence.Entity; @@ -13,16 +20,14 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.sopromadze.blogapi.model.audit.UserDateAudit; -import com.sopromadze.blogapi.model.post.Post; -import com.sopromadze.blogapi.model.user.User; - +@EqualsAndHashCode(callSuper = true) @Entity +@Data +@NoArgsConstructor @Table(name = "comments") public class Comment extends UserDateAudit { - private static final long serialVersionUID = 1L; - + private static final long serialVersionUID = 1L; + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -51,61 +56,17 @@ public class Comment extends UserDateAudit { @JoinColumn(name = "user_id") private User user; - public Comment(){ - - } - public Comment(@NotBlank @Size(min = 10, message = "Comment body must be minimum 10 characters") String body) { this.body = body; } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getBody() { - return body; - } - - public void setBody(String body) { - this.body = body; - } - @JsonIgnore public Post getPost() { return post; } - public void setPost(Post post) { - this.post = post; - } - @JsonIgnore public User getUser() { return user; } - - public void setUser(User user) { - this.user = user; - } } diff --git a/src/main/java/com/sopromadze/blogapi/model/photo/Photo.java b/src/main/java/com/sopromadze/blogapi/model/Photo.java similarity index 67% rename from src/main/java/com/sopromadze/blogapi/model/photo/Photo.java rename to src/main/java/com/sopromadze/blogapi/model/Photo.java index 48ae0ee4..7aaa1d2a 100644 --- a/src/main/java/com/sopromadze/blogapi/model/photo/Photo.java +++ b/src/main/java/com/sopromadze/blogapi/model/Photo.java @@ -1,4 +1,10 @@ -package com.sopromadze.blogapi.model.photo; +package com.sopromadze.blogapi.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.sopromadze.blogapi.model.audit.UserDateAudit; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import javax.persistence.Column; import javax.persistence.Entity; @@ -12,11 +18,10 @@ import javax.persistence.UniqueConstraint; import javax.validation.constraints.NotBlank; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.sopromadze.blogapi.model.album.Album; -import com.sopromadze.blogapi.model.audit.UserDateAudit; - +@EqualsAndHashCode(callSuper = true) @Entity +@Data +@NoArgsConstructor @Table(name = "photos", uniqueConstraints = { @UniqueConstraint(columnNames = { "title" }) }) public class Photo extends UserDateAudit { private static final long serialVersionUID = 1L; @@ -41,10 +46,6 @@ public class Photo extends UserDateAudit { @JoinColumn(name = "album_id") private Album album; - public Photo() { - - } - public Photo(@NotBlank String title, @NotBlank String url, @NotBlank String thumbnailUrl, Album album) { this.title = title; this.url = url; @@ -52,44 +53,8 @@ public Photo(@NotBlank String title, @NotBlank String url, @NotBlank String thum this.album = album; } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getThumbnailUrl() { - return thumbnailUrl; - } - - public void setThumbnailUrl(String thumbnailUrl) { - this.thumbnailUrl = thumbnailUrl; - } - @JsonIgnore public Album getAlbum() { return album; } - - public void setAlbum(Album album) { - this.album = album; - } } diff --git a/src/main/java/com/sopromadze/blogapi/model/post/Post.java b/src/main/java/com/sopromadze/blogapi/model/Post.java similarity index 79% rename from src/main/java/com/sopromadze/blogapi/model/post/Post.java rename to src/main/java/com/sopromadze/blogapi/model/Post.java index 369c6b65..6b97dbcf 100644 --- a/src/main/java/com/sopromadze/blogapi/model/post/Post.java +++ b/src/main/java/com/sopromadze/blogapi/model/Post.java @@ -1,8 +1,12 @@ -package com.sopromadze.blogapi.model.post; +package com.sopromadze.blogapi.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import com.sopromadze.blogapi.model.audit.UserDateAudit; +import com.sopromadze.blogapi.model.user.User; +import lombok.Data; +import lombok.EqualsAndHashCode; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -18,17 +22,13 @@ import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.UniqueConstraint; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; -import com.sopromadze.blogapi.model.audit.UserDateAudit; -import com.sopromadze.blogapi.model.category.Category; -import com.sopromadze.blogapi.model.comment.Comment; -import com.sopromadze.blogapi.model.tag.Tag; -import com.sopromadze.blogapi.model.user.User; - +@EqualsAndHashCode(callSuper = true) @Entity +@Data @Table(name = "posts", uniqueConstraints = { @UniqueConstraint(columnNames = { "title" }) }) @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class Post extends UserDateAudit { @@ -60,30 +60,6 @@ public class Post extends UserDateAudit { @JoinTable(name = "post_tag", joinColumns = @JoinColumn(name = "post_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "tag_id", referencedColumnName = "id")) private List tags; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getBody() { - return body; - } - - public void setBody(String body) { - this.body = body; - } - @JsonIgnore public User getUser() { return user; @@ -105,14 +81,6 @@ public void setComments(List comments) { } } - public Category getCategory() { - return category; - } - - public void setCategory(Category category) { - this.category = category; - } - public List getTags() { return tags == null ? null : new ArrayList<>(tags); } diff --git a/src/main/java/com/sopromadze/blogapi/model/tag/Tag.java b/src/main/java/com/sopromadze/blogapi/model/Tag.java similarity index 82% rename from src/main/java/com/sopromadze/blogapi/model/tag/Tag.java rename to src/main/java/com/sopromadze/blogapi/model/Tag.java index 5b69208a..a3cbd193 100644 --- a/src/main/java/com/sopromadze/blogapi/model/tag/Tag.java +++ b/src/main/java/com/sopromadze/blogapi/model/Tag.java @@ -1,8 +1,11 @@ -package com.sopromadze.blogapi.model.tag; +package com.sopromadze.blogapi.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +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; @@ -14,12 +17,14 @@ import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.sopromadze.blogapi.model.audit.UserDateAudit; -import com.sopromadze.blogapi.model.post.Post; - +@EqualsAndHashCode(callSuper = true) @Entity +@Data +@NoArgsConstructor @Table(name = "tags") //@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class Tag extends UserDateAudit { @@ -38,31 +43,11 @@ public class Tag extends UserDateAudit { @JoinTable(name = "post_tag", joinColumns = @JoinColumn(name = "tag_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "post_id", referencedColumnName = "id")) private List posts; - public Tag() { - - } - public Tag(String name) { super(); this.name = name; } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - public List getPosts() { return posts == null ? null : new ArrayList<>(posts); } diff --git a/src/main/java/com/sopromadze/blogapi/model/todo/Todo.java b/src/main/java/com/sopromadze/blogapi/model/Todo.java similarity index 71% rename from src/main/java/com/sopromadze/blogapi/model/todo/Todo.java rename to src/main/java/com/sopromadze/blogapi/model/Todo.java index d5c3559e..7fed93d1 100644 --- a/src/main/java/com/sopromadze/blogapi/model/todo/Todo.java +++ b/src/main/java/com/sopromadze/blogapi/model/Todo.java @@ -1,4 +1,10 @@ -package com.sopromadze.blogapi.model.todo; +package com.sopromadze.blogapi.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.sopromadze.blogapi.model.audit.UserDateAudit; +import com.sopromadze.blogapi.model.user.User; +import lombok.Data; +import lombok.EqualsAndHashCode; import javax.persistence.Column; import javax.persistence.Entity; @@ -12,11 +18,9 @@ import javax.persistence.UniqueConstraint; import javax.validation.constraints.NotBlank; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.sopromadze.blogapi.model.audit.UserDateAudit; -import com.sopromadze.blogapi.model.user.User; - +@EqualsAndHashCode(callSuper = true) @Entity +@Data @Table(name = "todos", uniqueConstraints = { @UniqueConstraint(columnNames = { "title" }) }) public class Todo extends UserDateAudit { @@ -37,36 +41,8 @@ public class Todo extends UserDateAudit { @JoinColumn(name = "user_id") private User user; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public Boolean getCompleted() { - return completed; - } - - public void setCompleted(Boolean completed) { - this.completed = completed; - } - @JsonIgnore public User getUser() { return user; } - - public void setUser(User user) { - this.user = user; - } } 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 63b2fac4..c9f8abe7 100644 --- a/src/main/java/com/sopromadze/blogapi/model/audit/DateAudit.java +++ b/src/main/java/com/sopromadze/blogapi/model/audit/DateAudit.java @@ -1,6 +1,7 @@ package com.sopromadze.blogapi.model.audit; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -12,36 +13,22 @@ import java.time.Instant; @MappedSuperclass +@Data @EntityListeners(AuditingEntityListener.class) @JsonIgnoreProperties( - value = {"createdAt", "updatedAt"}, - allowGetters = true + value = { "createdAt", "updatedAt" }, + allowGetters = true ) public abstract class DateAudit implements Serializable { private static final long serialVersionUID = 1L; @CreatedDate - @Column(nullable = false, updatable = false) - private Instant createdAt; + @Column(nullable = false, updatable = false) + private Instant createdAt; - @LastModifiedDate - @Column(nullable = false) - private Instant updatedAt; + @LastModifiedDate + @Column(nullable = false) + private Instant updatedAt; - public Instant getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(Instant createdAt) { - this.createdAt = createdAt; - } - - public Instant getUpdatedAt() { - return updatedAt; - } - - public void setUpdatedAt(Instant updatedAt) { - this.updatedAt = updatedAt; - } } diff --git a/src/main/java/com/sopromadze/blogapi/model/audit/UserDateAudit.java b/src/main/java/com/sopromadze/blogapi/model/audit/UserDateAudit.java index f1f72bf1..10644bd5 100644 --- a/src/main/java/com/sopromadze/blogapi/model/audit/UserDateAudit.java +++ b/src/main/java/com/sopromadze/blogapi/model/audit/UserDateAudit.java @@ -1,40 +1,28 @@ package com.sopromadze.blogapi.model.audit; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; +import lombok.EqualsAndHashCode; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.LastModifiedBy; import javax.persistence.Column; import javax.persistence.MappedSuperclass; +@EqualsAndHashCode(callSuper = true) @MappedSuperclass +@Data @JsonIgnoreProperties( - value = {"createdBY", "updatedBy"}, - allowGetters = true + value = { "createdBY", "updatedBy" }, + allowGetters = true ) -public abstract class UserDateAudit extends DateAudit{ +public abstract class UserDateAudit extends DateAudit { private static final long serialVersionUID = 1L; @CreatedBy - @Column(updatable = false) - private Long createdBy; + @Column(updatable = false) + private Long createdBy; - @LastModifiedBy - private Long updatedBy; - - public Long getCreatedBy() { - return createdBy; - } - - public void setCreatedBy(Long createdBy) { - this.createdBy = createdBy; - } - - public Long getUpdatedBy() { - return updatedBy; - } - - public void setUpdatedBy(Long updatedBy) { - this.updatedBy = updatedBy; - } + @LastModifiedBy + private Long updatedBy; } 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 dd4b716d..00231ca9 100644 --- a/src/main/java/com/sopromadze/blogapi/model/role/Role.java +++ b/src/main/java/com/sopromadze/blogapi/model/role/Role.java @@ -1,42 +1,33 @@ package com.sopromadze.blogapi.model.role; +import lombok.Data; +import lombok.NoArgsConstructor; import org.hibernate.annotations.NaturalId; -import javax.persistence.*; +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; @Entity +@Data +@NoArgsConstructor @Table(name = "roles") public class Role { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Enumerated(EnumType.STRING) - @NaturalId - @Column(name = "name") - private RoleName name; - - public Role(){ - - } - - public Role(RoleName name) { - this.name = name; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public RoleName getName() { - return name; - } - - public void setName(RoleName name) { - this.name = name; - } + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Enumerated(EnumType.STRING) + @NaturalId + @Column(name = "name") + private RoleName name; + + public Role(RoleName name) { + this.name = name; + } } 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 ae05926c..f2064b2f 100644 --- a/src/main/java/com/sopromadze/blogapi/model/role/RoleName.java +++ b/src/main/java/com/sopromadze/blogapi/model/role/RoleName.java @@ -1,6 +1,6 @@ package com.sopromadze.blogapi.model.role; public enum RoleName { - ROLE_ADMIN, - ROLE_USER, + ROLE_ADMIN, + ROLE_USER, } 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 6c9ec73c..f686bbbf 100644 --- a/src/main/java/com/sopromadze/blogapi/model/user/Address.java +++ b/src/main/java/com/sopromadze/blogapi/model/user/Address.java @@ -1,6 +1,11 @@ package com.sopromadze.blogapi.model.user; -import java.time.Instant; +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; @@ -11,11 +16,12 @@ import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; +import java.time.Instant; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.sopromadze.blogapi.model.audit.UserDateAudit; - +@EqualsAndHashCode(callSuper = true) @Entity +@Data +@NoArgsConstructor @Table(name = "address") public class Address extends UserDateAudit { private static final long serialVersionUID = 1L; @@ -43,10 +49,6 @@ public class Address extends UserDateAudit { @OneToOne(mappedBy = "address") private User user; - public Address() { - - } - public Address(String street, String suite, String city, String zipcode, Geo geo) { this.street = street; this.suite = suite; @@ -55,55 +57,11 @@ public Address(String street, String suite, String city, String zipcode, Geo geo this.geo = geo; } - public String getStreet() { - return street; - } - - public void setStreet(String street) { - this.street = street; - } - - public String getSuite() { - return suite; - } - - public void setSuite(String suite) { - this.suite = suite; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getZipcode() { - return zipcode; - } - - public void setZipcode(String zipcode) { - this.zipcode = zipcode; - } - @JsonIgnore public Long getId() { return id; } - public void setId(Long id) { - this.id = id; - } - - public Geo getGeo() { - return geo; - } - - public void setGeo(Geo geo) { - this.geo = geo; - } - @JsonIgnore @Override public Long getCreatedBy() { 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 fbd8a059..7cc93a2f 100644 --- a/src/main/java/com/sopromadze/blogapi/model/user/Company.java +++ b/src/main/java/com/sopromadze/blogapi/model/user/Company.java @@ -1,6 +1,10 @@ package com.sopromadze.blogapi.model.user; -import java.time.Instant; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.sopromadze.blogapi.model.audit.UserDateAudit; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import javax.persistence.Column; import javax.persistence.Entity; @@ -9,11 +13,12 @@ import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; +import java.time.Instant; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.sopromadze.blogapi.model.audit.UserDateAudit; - +@EqualsAndHashCode(callSuper = true) @Entity +@Data +@NoArgsConstructor @Table(name = "company") public class Company extends UserDateAudit { private static final long serialVersionUID = 1L; @@ -34,9 +39,6 @@ public class Company extends UserDateAudit { @OneToOne(mappedBy = "company") private User user; - public Company() { - - } public Company(String name, String catchPhrase, String bs) { this.name = name; @@ -44,30 +46,6 @@ public Company(String name, String catchPhrase, String bs) { this.bs = bs; } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getCatchPhrase() { - return catchPhrase; - } - - public void setCatchPhrase(String catchPhrase) { - this.catchPhrase = catchPhrase; - } - - public String getBs() { - return bs; - } - - public void setBs(String bs) { - this.bs = bs; - } - @JsonIgnore public Long getId() { return id; 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 ed402caa..f2845e22 100644 --- a/src/main/java/com/sopromadze/blogapi/model/user/Geo.java +++ b/src/main/java/com/sopromadze/blogapi/model/user/Geo.java @@ -1,6 +1,10 @@ package com.sopromadze.blogapi.model.user; -import java.time.Instant; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.sopromadze.blogapi.model.audit.UserDateAudit; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import javax.persistence.Column; import javax.persistence.Entity; @@ -9,11 +13,12 @@ import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; +import java.time.Instant; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.sopromadze.blogapi.model.audit.UserDateAudit; - +@EqualsAndHashCode(callSuper = true) @Entity +@Data +@NoArgsConstructor @Table(name = "geo") public class Geo extends UserDateAudit { private static final long serialVersionUID = 1L; @@ -32,39 +37,11 @@ public class Geo extends UserDateAudit { @OneToOne(mappedBy = "geo") private Address address; - public Geo() { - - } - public Geo(String lat, String lng) { this.lat = lat; this.lng = lng; } - public String getLat() { - return lat; - } - - public void setLat(String lat) { - this.lat = lat; - } - - public String getLng() { - return lng; - } - - public void setLng(String lng) { - this.lng = lng; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - @JsonIgnore @Override public Long getCreatedBy() { 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 46f5a79e..90f2e489 100644 --- a/src/main/java/com/sopromadze/blogapi/model/user/User.java +++ b/src/main/java/com/sopromadze/blogapi/model/user/User.java @@ -1,8 +1,17 @@ package com.sopromadze.blogapi.model.user; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +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 lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.NaturalId; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -21,19 +30,14 @@ import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; -import org.hibernate.annotations.NaturalId; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.sopromadze.blogapi.model.album.Album; -import com.sopromadze.blogapi.model.audit.DateAudit; -import com.sopromadze.blogapi.model.comment.Comment; -import com.sopromadze.blogapi.model.post.Post; -import com.sopromadze.blogapi.model.role.Role; -import com.sopromadze.blogapi.model.todo.Todo; - +@EqualsAndHashCode(callSuper = true) @Entity +@Data +@NoArgsConstructor @Table(name = "users", uniqueConstraints = { @UniqueConstraint(columnNames = { "username" }), @UniqueConstraint(columnNames = { "email" }) }) public class User extends DateAudit { @@ -106,10 +110,6 @@ public class User extends DateAudit { @JoinColumn(name = "company_id") private Company company; - public User() { - - } - public User(String firstName, String lastName, String username, String email, String password) { this.firstName = firstName; this.lastName = lastName; @@ -118,69 +118,15 @@ public User(String firstName, String lastName, String username, String email, St this.password = password; } - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public Address getAddress() { - return address; - } - - public void setAddress(Address address) { - this.address = address; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getWebsite() { - return website; - } - - public void setWebsite(String website) { - this.website = website; - } - - public Company getCompany() { - return company; - } - - public void setCompany(Company company) { - this.company = company; - } public List getTodos() { - + return todos == null ? null : new ArrayList<>(todos); } public void setTodos(List todos) { - + if (todos == null) { this.todos = null; } else { @@ -189,12 +135,12 @@ public void setTodos(List todos) { } public List getAlbums() { - + return albums == null ? null : new ArrayList<>(albums); } public void setAlbums(List albums) { - + if (albums == null) { this.albums = null; } else { @@ -202,37 +148,14 @@ public void setAlbums(List albums) { } } - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } public List getPosts() { - + return posts == null ? null : new ArrayList<>(posts); } public void setPosts(List posts) { - + if (posts == null) { this.posts = null; } else { diff --git a/src/main/java/com/sopromadze/blogapi/payload/AlbumResponse.java b/src/main/java/com/sopromadze/blogapi/payload/AlbumResponse.java index 81eaf533..ea57f7df 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/AlbumResponse.java +++ b/src/main/java/com/sopromadze/blogapi/payload/AlbumResponse.java @@ -1,14 +1,18 @@ package com.sopromadze.blogapi.payload; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.sopromadze.blogapi.model.photo.Photo; +import com.sopromadze.blogapi.model.Photo; import com.sopromadze.blogapi.model.user.User; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data @JsonInclude(Include.NON_NULL) public class AlbumResponse extends UserDateAuditPayload { private Long id; @@ -19,37 +23,13 @@ public class AlbumResponse extends UserDateAuditPayload { private List photo; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - public List getPhoto() { - + return photo == null ? null : new ArrayList<>(photo); } public void setPhoto(List photo) { - + if (photo == null) { this.photo = null; } else { diff --git a/src/main/java/com/sopromadze/blogapi/payload/ApiResponse.java b/src/main/java/com/sopromadze/blogapi/payload/ApiResponse.java index 28e64390..4dfa14ab 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/ApiResponse.java +++ b/src/main/java/com/sopromadze/blogapi/payload/ApiResponse.java @@ -1,67 +1,44 @@ package com.sopromadze.blogapi.payload; -import java.io.Serializable; - -import org.springframework.http.HttpStatus; - import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.Data; +import org.springframework.http.HttpStatus; + +import java.io.Serializable; +@Data @JsonPropertyOrder({ - "success", - "message" + "success", + "message" }) public class ApiResponse implements Serializable { - + @JsonIgnore private static final long serialVersionUID = 7702134516418120340L; - + @JsonProperty("success") private Boolean success; - + @JsonProperty("message") - private String message; - + private String message; + @JsonIgnore private HttpStatus status; - - public ApiResponse() { - - } - - public ApiResponse(Boolean success, String message) { - this.success = success; - this.message = message; - } - - public ApiResponse(Boolean success, String message, HttpStatus httpStatus) { - this.success = success; - this.message = message; - this.status = httpStatus; - } - public Boolean getSuccess() { - return success; - } + public ApiResponse() { - public void setSuccess(Boolean success) { - this.success = success; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } + } - public HttpStatus getStatus() { - return status; + public ApiResponse(Boolean success, String message) { + this.success = success; + this.message = message; } - public void setStatus(HttpStatus status) { - this.status = status; + public ApiResponse(Boolean success, String message, HttpStatus httpStatus) { + this.success = success; + this.message = message; + this.status = httpStatus; } } diff --git a/src/main/java/com/sopromadze/blogapi/payload/CommentRequest.java b/src/main/java/com/sopromadze/blogapi/payload/CommentRequest.java index cf1b95c6..c88239ff 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/CommentRequest.java +++ b/src/main/java/com/sopromadze/blogapi/payload/CommentRequest.java @@ -1,18 +1,13 @@ package com.sopromadze.blogapi.payload; +import lombok.Data; + import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; +@Data public class CommentRequest { - @NotBlank - @Size(min = 10, message = "Comment body must be minimum 10 characters") - private String body; - - public String getBody() { - return body; - } - - public void setBody(String body) { - this.body = body; - } + @NotBlank + @Size(min = 10, message = "Comment body must be minimum 10 characters") + private String body; } diff --git a/src/main/java/com/sopromadze/blogapi/payload/DateAuditPayload.java b/src/main/java/com/sopromadze/blogapi/payload/DateAuditPayload.java index 07926ae8..7ec74a5a 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/DateAuditPayload.java +++ b/src/main/java/com/sopromadze/blogapi/payload/DateAuditPayload.java @@ -4,23 +4,23 @@ public abstract class DateAuditPayload { - private Instant createdAt; + private Instant createdAt; - private Instant updatedAt; + private Instant updatedAt; - public Instant getCreatedAt() { - return createdAt; - } + public Instant getCreatedAt() { + return createdAt; + } - public void setCreatedAt(Instant createdAt) { - this.createdAt = createdAt; - } + public void setCreatedAt(Instant createdAt) { + this.createdAt = createdAt; + } - public Instant getUpdatedAt() { - return updatedAt; - } + public Instant getUpdatedAt() { + return updatedAt; + } - public void setUpdatedAt(Instant updatedAt) { - this.updatedAt = updatedAt; - } + public void setUpdatedAt(Instant updatedAt) { + this.updatedAt = updatedAt; + } } diff --git a/src/main/java/com/sopromadze/blogapi/payload/ExceptionResponse.java b/src/main/java/com/sopromadze/blogapi/payload/ExceptionResponse.java index f4c4a168..a243981b 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/ExceptionResponse.java +++ b/src/main/java/com/sopromadze/blogapi/payload/ExceptionResponse.java @@ -1,58 +1,38 @@ package com.sopromadze.blogapi.payload; +import lombok.Data; + import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.List; +@Data public class ExceptionResponse { - private String error; - private Integer status; - private List messages; - private Instant timestamp; + private String error; + private Integer status; + private List messages; + private Instant timestamp; - public ExceptionResponse(List messages, String error, Integer status) { + public ExceptionResponse(List messages, String error, Integer status) { setMessages(messages); - this.error = error; - this.status = status; - this.timestamp = Instant.now(); - } + this.error = error; + this.status = status; + this.timestamp = Instant.now(); + } + + public List getMessages() { - public List getMessages() { - return messages == null ? null : new ArrayList<>(messages); - } + } + + public final void setMessages(List messages) { - public final void setMessages(List messages) { - if (messages == null) { this.messages = null; } else { this.messages = Collections.unmodifiableList(messages); } - } - - public String getError() { - return error; - } - - public void setError(String error) { - this.error = error; - } - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public Instant getTimestamp() { - return timestamp; - } + } - public void setTimestamp(Instant timestamp) { - this.timestamp = timestamp; - } } diff --git a/src/main/java/com/sopromadze/blogapi/payload/InfoRequest.java b/src/main/java/com/sopromadze/blogapi/payload/InfoRequest.java index 5417bbe2..7baf210f 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/InfoRequest.java +++ b/src/main/java/com/sopromadze/blogapi/payload/InfoRequest.java @@ -1,7 +1,10 @@ package com.sopromadze.blogapi.payload; +import lombok.Data; + import javax.validation.constraints.NotBlank; +@Data public class InfoRequest { @NotBlank @@ -29,92 +32,4 @@ public class InfoRequest { private String lat; private String lng; - - public String getStreet() { - return street; - } - - public void setStreet(String street) { - this.street = street; - } - - public String getSuite() { - return suite; - } - - public void setSuite(String suite) { - this.suite = suite; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getZipcode() { - return zipcode; - } - - public void setZipcode(String zipcode) { - this.zipcode = zipcode; - } - - public String getLat() { - return lat; - } - - public void setLat(String lat) { - this.lat = lat; - } - - public String getLng() { - return lng; - } - - public void setLng(String lng) { - this.lng = lng; - } - - public String getCompanyName() { - return companyName; - } - - public void setCompanyName(String companyName) { - this.companyName = companyName; - } - - public String getCatchPhrase() { - return catchPhrase; - } - - public void setCatchPhrase(String catchPhrase) { - this.catchPhrase = catchPhrase; - } - - public String getBs() { - return bs; - } - - public void setBs(String bs) { - this.bs = bs; - } - - public String getWebsite() { - return website; - } - - public void setWebsite(String website) { - this.website = website; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } } diff --git a/src/main/java/com/sopromadze/blogapi/payload/JwtAuthenticationResponse.java b/src/main/java/com/sopromadze/blogapi/payload/JwtAuthenticationResponse.java index 47f2d1bb..148aa475 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/JwtAuthenticationResponse.java +++ b/src/main/java/com/sopromadze/blogapi/payload/JwtAuthenticationResponse.java @@ -1,26 +1,14 @@ package com.sopromadze.blogapi.payload; -public class JwtAuthenticationResponse { - private String accessToken; - private String tokenType = "Bearer"; - - public JwtAuthenticationResponse(String accessToken) { - this.accessToken = accessToken; - } +import lombok.Data; - public String getAccessToken() { - return accessToken; - } - - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } +@Data +public class JwtAuthenticationResponse { + private String accessToken; + private String tokenType = "Bearer"; - public String getTokenType() { - return tokenType; - } + public JwtAuthenticationResponse(String accessToken) { + this.accessToken = accessToken; + } - public void setTokenType(String tokenType) { - this.tokenType = tokenType; - } } diff --git a/src/main/java/com/sopromadze/blogapi/payload/LoginRequest.java b/src/main/java/com/sopromadze/blogapi/payload/LoginRequest.java index 4a04b5cb..ac1b0ee8 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/LoginRequest.java +++ b/src/main/java/com/sopromadze/blogapi/payload/LoginRequest.java @@ -1,27 +1,14 @@ package com.sopromadze.blogapi.payload; +import lombok.Data; + import javax.validation.constraints.NotBlank; +@Data public class LoginRequest { - @NotBlank - private String usernameOrEmail; - - @NotBlank - private String password; - - public String getUsernameOrEmail() { - return usernameOrEmail; - } - - public void setUsernameOrEmail(String usernameOrEmail) { - this.usernameOrEmail = usernameOrEmail; - } - - public String getPassword() { - return password; - } + @NotBlank + private String usernameOrEmail; - public void setPassword(String password) { - this.password = password; - } + @NotBlank + private String password; } diff --git a/src/main/java/com/sopromadze/blogapi/payload/PagedResponse.java b/src/main/java/com/sopromadze/blogapi/payload/PagedResponse.java index d6d8bf3e..9e73e40e 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/PagedResponse.java +++ b/src/main/java/com/sopromadze/blogapi/payload/PagedResponse.java @@ -1,79 +1,48 @@ package com.sopromadze.blogapi.payload; +import lombok.Data; + import java.util.ArrayList; import java.util.Collections; import java.util.List; +@Data public class PagedResponse { - private List content; - private int page; - private int size; - private long totalElements; - private int totalPages; - private boolean last; - - public PagedResponse(){ - - } - - public PagedResponse(List content, int page, int size, long totalElements, int totalPages, boolean last) { - setContent(content); - this.page = page; - this.size = size; - this.totalElements = totalElements; - this.totalPages = totalPages; - this.last = last; - } - - public List getContent() { + private List content; + private int page; + private int size; + private long totalElements; + private int totalPages; + private boolean last; + + public PagedResponse() { + + } + + public PagedResponse(List content, int page, int size, long totalElements, int totalPages, boolean last) { + setContent(content); + this.page = page; + this.size = size; + this.totalElements = totalElements; + this.totalPages = totalPages; + this.last = last; + } + + public List getContent() { return content == null ? null : new ArrayList<>(content); - } + } - public final void setContent(List content) { + public final void setContent(List content) { if (content == null) { this.content = null; } else { this.content = Collections.unmodifiableList(content); } - } - - public int getPage() { - return page; - } - - public void setPage(int page) { - this.page = page; - } - - public int getSize() { - return size; - } - - public void setSize(int size) { - this.size = size; - } - - public long getTotalElements() { - return totalElements; - } - - public void setTotalElements(long totalElements) { - this.totalElements = totalElements; - } - - public int getTotalPages() { - return totalPages; - } + } - public void setTotalPages(int totalPages) { - this.totalPages = totalPages; - } - public boolean isLast() { - return last; - } - public void setLast(boolean last) { - this.last = last; - } + public boolean isLast() { + return last; + } } diff --git a/src/main/java/com/sopromadze/blogapi/payload/PhotoRequest.java b/src/main/java/com/sopromadze/blogapi/payload/PhotoRequest.java index 6a7ac57d..74950489 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/PhotoRequest.java +++ b/src/main/java/com/sopromadze/blogapi/payload/PhotoRequest.java @@ -1,55 +1,26 @@ package com.sopromadze.blogapi.payload; +import lombok.Data; + import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +@Data public class PhotoRequest { - @NotBlank - @Size(min = 3) - private String title; - - @NotBlank - @Size(min = 10) - private String url; - - @NotBlank - @Size(min = 10) - private String thumbnailUrl; - - @NotNull - private Long albumId; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getThumbnailUrl() { - return thumbnailUrl; - } + @NotBlank + @Size(min = 3) + private String title; - public void setThumbnailUrl(String thumbnailUrl) { - this.thumbnailUrl = thumbnailUrl; - } + @NotBlank + @Size(min = 10) + private String url; - public Long getAlbumId() { - return albumId; - } + @NotBlank + @Size(min = 10) + private String thumbnailUrl; - public void setAlbumId(Long albumId) { - this.albumId = albumId; - } + @NotNull + private Long albumId; } diff --git a/src/main/java/com/sopromadze/blogapi/payload/PhotoResponse.java b/src/main/java/com/sopromadze/blogapi/payload/PhotoResponse.java index 2038142f..e695b977 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/PhotoResponse.java +++ b/src/main/java/com/sopromadze/blogapi/payload/PhotoResponse.java @@ -1,57 +1,21 @@ package com.sopromadze.blogapi.payload; -public class PhotoResponse { - private Long id; - private String title; - private String url; - private String thumbnailUrl; - private Long albumId; - - public PhotoResponse(Long id, String title, String url, String thumbnailUrl, Long albumId) { - this.id = id; - this.title = title; - this.url = url; - this.thumbnailUrl = thumbnailUrl; - this.albumId = albumId; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } +import lombok.Data; - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getThumbnailUrl() { - return thumbnailUrl; - } - - public void setThumbnailUrl(String thumbnailUrl) { - this.thumbnailUrl = thumbnailUrl; - } - - public Long getAlbumId() { - return albumId; - } +@Data +public class PhotoResponse { + private Long id; + private String title; + private String url; + private String thumbnailUrl; + private Long albumId; + + public PhotoResponse(Long id, String title, String url, String thumbnailUrl, Long albumId) { + this.id = id; + this.title = title; + this.url = url; + this.thumbnailUrl = thumbnailUrl; + this.albumId = albumId; + } - public void setAlbumId(Long albumId) { - this.albumId = albumId; - } } diff --git a/src/main/java/com/sopromadze/blogapi/payload/PostRequest.java b/src/main/java/com/sopromadze/blogapi/payload/PostRequest.java index 562e36f6..28d7ed13 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/PostRequest.java +++ b/src/main/java/com/sopromadze/blogapi/payload/PostRequest.java @@ -1,13 +1,15 @@ package com.sopromadze.blogapi.payload; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +@Data public class PostRequest { @NotBlank @@ -23,37 +25,13 @@ public class PostRequest { private List tags; - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getBody() { - return body; - } - - public void setBody(String body) { - this.body = body; - } - - public Long getCategoryId() { - return categoryId; - } - - public void setCategoryId(Long categoryId) { - this.categoryId = categoryId; - } - public List getTags() { - + return tags == null ? Collections.emptyList() : new ArrayList<>(tags); } public void setTags(List tags) { - + if (tags == null) { this.tags = null; } else { diff --git a/src/main/java/com/sopromadze/blogapi/payload/PostResponse.java b/src/main/java/com/sopromadze/blogapi/payload/PostResponse.java index 0416755f..f054e518 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/PostResponse.java +++ b/src/main/java/com/sopromadze/blogapi/payload/PostResponse.java @@ -1,39 +1,27 @@ package com.sopromadze.blogapi.payload; +import lombok.Data; + import java.util.ArrayList; import java.util.Collections; import java.util.List; +@Data public class PostResponse { - private String title; - private String body; - private String category; - private List tags; - - public String getTitle() { - return title; - } - public void setTitle(String title) { - this.title = title; - } - public String getBody() { - return body; - } - public void setBody(String body) { - this.body = body; - } - public String getCategory() { - return category; - } - public void setCategory(String category) { - this.category = category; - } + private String title; + private String body; + private String category; + private List tags; + + + public List getTags() { - + return tags == null ? null : new ArrayList<>(tags); } + public void setTags(List tags) { - + if (tags == null) { this.tags = null; } else { diff --git a/src/main/java/com/sopromadze/blogapi/payload/SignUpRequest.java b/src/main/java/com/sopromadze/blogapi/payload/SignUpRequest.java index 46eeb955..3f993f13 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/SignUpRequest.java +++ b/src/main/java/com/sopromadze/blogapi/payload/SignUpRequest.java @@ -1,68 +1,31 @@ package com.sopromadze.blogapi.payload; +import lombok.Data; + import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; +@Data public class SignUpRequest { - @NotBlank - @Size(min = 4, max = 40) - private String firstName; - - @NotBlank - @Size(min = 4, max = 40) - private String lastName; - - @NotBlank - @Size(min = 3, max = 15) - private String username; - - @NotBlank - @Size(max = 40) - @Email - private String email; - - @NotBlank - @Size(min = 6, max = 20) - private String password; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } + @NotBlank + @Size(min = 4, max = 40) + private String firstName; + + @NotBlank + @Size(min = 4, max = 40) + private String lastName; + + @NotBlank + @Size(min = 3, max = 15) + private String username; + + @NotBlank + @Size(max = 40) + @Email + private String email; + + @NotBlank + @Size(min = 6, max = 20) + private String password; } diff --git a/src/main/java/com/sopromadze/blogapi/payload/UserDateAuditPayload.java b/src/main/java/com/sopromadze/blogapi/payload/UserDateAuditPayload.java index 6952da87..834f095d 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/UserDateAuditPayload.java +++ b/src/main/java/com/sopromadze/blogapi/payload/UserDateAuditPayload.java @@ -1,24 +1,13 @@ package com.sopromadze.blogapi.payload; -public abstract class UserDateAuditPayload extends DateAuditPayload { - private Long createdBy; - - private Long updatedBy; - - public Long getCreatedBy() { - return createdBy; - } +import lombok.Data; +import lombok.EqualsAndHashCode; - public void setCreatedBy(Long createdBy) { - this.createdBy = createdBy; - } - - public Long getUpdatedBy() { - return updatedBy; - } +@EqualsAndHashCode(callSuper = true) +@Data +public abstract class UserDateAuditPayload extends DateAuditPayload { + private Long createdBy; - public void setUpdatedBy(Long updatedBy) { - this.updatedBy = updatedBy; - } + private Long updatedBy; } diff --git a/src/main/java/com/sopromadze/blogapi/payload/UserIdentityAvailability.java b/src/main/java/com/sopromadze/blogapi/payload/UserIdentityAvailability.java index d2dffb93..c5d09fc2 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/UserIdentityAvailability.java +++ b/src/main/java/com/sopromadze/blogapi/payload/UserIdentityAvailability.java @@ -1,17 +1,11 @@ package com.sopromadze.blogapi.payload; -public class UserIdentityAvailability { - private Boolean available; - - public UserIdentityAvailability(Boolean available) { - this.available = available; - } +import lombok.AllArgsConstructor; +import lombok.Data; - public Boolean getAvailable() { - return available; - } +@Data +@AllArgsConstructor +public class UserIdentityAvailability { + private Boolean available; - public void setAvailable(Boolean available) { - this.available = available; - } } diff --git a/src/main/java/com/sopromadze/blogapi/payload/UserProfile.java b/src/main/java/com/sopromadze/blogapi/payload/UserProfile.java index 968ede71..b428ea12 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/UserProfile.java +++ b/src/main/java/com/sopromadze/blogapi/payload/UserProfile.java @@ -2,125 +2,25 @@ import com.sopromadze.blogapi.model.user.Address; import com.sopromadze.blogapi.model.user.Company; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; import java.time.Instant; +@Data +@AllArgsConstructor +@NoArgsConstructor public class UserProfile { - private Long id; - private String username; - private String firstName; - private String lastName; - private Instant joinedAt; - private String email; - private Address address; - private String phone; - private String website; - private Company company; - private Long postCount; - - public UserProfile(){ - - } - - public UserProfile(Long id, String username, String firstName, String lastName, Instant joinedAt, String email, Address address, String phone, String website, Company company, Long postCount) { - this.id = id; - this.username = username; - this.firstName = firstName; - this.lastName = lastName; - this.joinedAt = joinedAt; - this.email = email; - this.address = address; - this.phone = phone; - this.website = website; - this.company = company; - this.postCount = postCount; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public Instant getJoinedAt() { - return joinedAt; - } - - public void setJoinedAt(Instant joinedAt) { - this.joinedAt = joinedAt; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public Address getAddress() { - return address; - } - - public void setAddress(Address address) { - this.address = address; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getWebsite() { - return website; - } - - public void setWebsite(String website) { - this.website = website; - } - - public Company getCompany() { - return company; - } - - public void setCompany(Company company) { - this.company = company; - } - - public Long getPostCount() { - return postCount; - } - - public void setPostCount(Long postCount) { - this.postCount = postCount; - } + private Long id; + private String username; + private String firstName; + private String lastName; + private Instant joinedAt; + private String email; + private Address address; + private String phone; + private String website; + private Company company; + private Long postCount; } diff --git a/src/main/java/com/sopromadze/blogapi/payload/UserSummary.java b/src/main/java/com/sopromadze/blogapi/payload/UserSummary.java index f1a1c3c3..7fe8fe92 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/UserSummary.java +++ b/src/main/java/com/sopromadze/blogapi/payload/UserSummary.java @@ -1,47 +1,13 @@ package com.sopromadze.blogapi.payload; -public class UserSummary { - private Long id; - private String username; - private String firstName; - private String lastName; - - public UserSummary(Long id, String username, String firstName, String lastName) { - this.id = id; - this.username = username; - this.firstName = firstName; - this.lastName = lastName; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getUsername() { - return username; - } +import lombok.AllArgsConstructor; +import lombok.Data; - public void setUsername(String username) { - this.username = username; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } +@Data +@AllArgsConstructor +public class UserSummary { + private Long id; + private String username; + private String firstName; + private String lastName; } diff --git a/src/main/java/com/sopromadze/blogapi/payload/request/AlbumRequest.java b/src/main/java/com/sopromadze/blogapi/payload/request/AlbumRequest.java index b1a48284..83e4f1eb 100644 --- a/src/main/java/com/sopromadze/blogapi/payload/request/AlbumRequest.java +++ b/src/main/java/com/sopromadze/blogapi/payload/request/AlbumRequest.java @@ -1,13 +1,15 @@ package com.sopromadze.blogapi.payload.request; +import com.sopromadze.blogapi.model.Photo; +import com.sopromadze.blogapi.model.user.User; +import com.sopromadze.blogapi.payload.UserDateAuditPayload; +import lombok.Data; + import java.util.ArrayList; import java.util.Collections; import java.util.List; -import com.sopromadze.blogapi.model.photo.Photo; -import com.sopromadze.blogapi.model.user.User; -import com.sopromadze.blogapi.payload.UserDateAuditPayload; - +@Data public class AlbumRequest extends UserDateAuditPayload { private Long id; @@ -18,37 +20,13 @@ public class AlbumRequest extends UserDateAuditPayload { private List photo; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - public List getPhoto() { - + return photo == null ? null : new ArrayList<>(photo); } public void setPhoto(List photo) { - + if (photo == null) { this.photo = null; } else { diff --git a/src/main/java/com/sopromadze/blogapi/repository/AlbumRepository.java b/src/main/java/com/sopromadze/blogapi/repository/AlbumRepository.java index 5630e218..12d6837f 100644 --- a/src/main/java/com/sopromadze/blogapi/repository/AlbumRepository.java +++ b/src/main/java/com/sopromadze/blogapi/repository/AlbumRepository.java @@ -1,13 +1,12 @@ 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; -import com.sopromadze.blogapi.model.album.Album; - @Repository public interface AlbumRepository extends JpaRepository { - Page findByCreatedBy(Long userId, Pageable pageable); + 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 index 179b206a..55c00914 100644 --- a/src/main/java/com/sopromadze/blogapi/repository/CategoryRepository.java +++ b/src/main/java/com/sopromadze/blogapi/repository/CategoryRepository.java @@ -1,10 +1,9 @@ package com.sopromadze.blogapi.repository; +import com.sopromadze.blogapi.model.Category; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import com.sopromadze.blogapi.model.category.Category; - @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 index 59b0b4e3..b4fb3be3 100644 --- a/src/main/java/com/sopromadze/blogapi/repository/CommentRepository.java +++ b/src/main/java/com/sopromadze/blogapi/repository/CommentRepository.java @@ -1,12 +1,11 @@ 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; -import com.sopromadze.blogapi.model.comment.Comment; - @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 index 30c5bba5..a6f52698 100644 --- a/src/main/java/com/sopromadze/blogapi/repository/PhotoRepository.java +++ b/src/main/java/com/sopromadze/blogapi/repository/PhotoRepository.java @@ -1,12 +1,11 @@ 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; -import com.sopromadze.blogapi.model.photo.Photo; - @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 index 9faf5591..a748afb8 100644 --- a/src/main/java/com/sopromadze/blogapi/repository/PostRepository.java +++ b/src/main/java/com/sopromadze/blogapi/repository/PostRepository.java @@ -1,19 +1,21 @@ package com.sopromadze.blogapi.repository; -import java.util.List; - +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 com.sopromadze.blogapi.model.post.Post; -import com.sopromadze.blogapi.model.tag.Tag; +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); + 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/RoleRepository.java b/src/main/java/com/sopromadze/blogapi/repository/RoleRepository.java index 19a1e97f..067294c6 100644 --- a/src/main/java/com/sopromadze/blogapi/repository/RoleRepository.java +++ b/src/main/java/com/sopromadze/blogapi/repository/RoleRepository.java @@ -1,11 +1,10 @@ package com.sopromadze.blogapi.repository; -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - import com.sopromadze.blogapi.model.role.Role; import com.sopromadze.blogapi.model.role.RoleName; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; public interface RoleRepository extends JpaRepository { Optional findByName(RoleName name); diff --git a/src/main/java/com/sopromadze/blogapi/repository/TagRepository.java b/src/main/java/com/sopromadze/blogapi/repository/TagRepository.java index 6f9352a1..e9620636 100644 --- a/src/main/java/com/sopromadze/blogapi/repository/TagRepository.java +++ b/src/main/java/com/sopromadze/blogapi/repository/TagRepository.java @@ -1,10 +1,9 @@ package com.sopromadze.blogapi.repository; +import com.sopromadze.blogapi.model.Tag; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import com.sopromadze.blogapi.model.tag.Tag; - @Repository public interface TagRepository extends JpaRepository { Tag findByName(String name); diff --git a/src/main/java/com/sopromadze/blogapi/repository/TodoRepository.java b/src/main/java/com/sopromadze/blogapi/repository/TodoRepository.java index 67f5512f..3cb55e71 100644 --- a/src/main/java/com/sopromadze/blogapi/repository/TodoRepository.java +++ b/src/main/java/com/sopromadze/blogapi/repository/TodoRepository.java @@ -1,12 +1,11 @@ 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; -import com.sopromadze.blogapi.model.todo.Todo; - @Repository public interface TodoRepository extends JpaRepository { Page findByCreatedBy(Long userId, Pageable pageable); diff --git a/src/main/java/com/sopromadze/blogapi/repository/UserRepository.java b/src/main/java/com/sopromadze/blogapi/repository/UserRepository.java index 92629c30..94290248 100644 --- a/src/main/java/com/sopromadze/blogapi/repository/UserRepository.java +++ b/src/main/java/com/sopromadze/blogapi/repository/UserRepository.java @@ -1,13 +1,13 @@ package com.sopromadze.blogapi.repository; -import java.util.Optional; - -import javax.validation.constraints.NotBlank; - +import com.sopromadze.blogapi.exception.ResourceNotFoundException; +import com.sopromadze.blogapi.model.user.User; +import com.sopromadze.blogapi.security.UserPrincipal; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import com.sopromadze.blogapi.model.user.User; +import javax.validation.constraints.NotBlank; +import java.util.Optional; @Repository public interface UserRepository extends JpaRepository { @@ -20,4 +20,13 @@ public interface UserRepository extends JpaRepository { Boolean existsByEmail(@NotBlank String email); Optional findByUsernameOrEmail(String username, String email); + + default User getUser(UserPrincipal currentUser) { + return getUserByName(currentUser.getUsername()); + } + + default User 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 2833d6a4..400b4a48 100644 --- a/src/main/java/com/sopromadze/blogapi/security/CurrentUser.java +++ b/src/main/java/com/sopromadze/blogapi/security/CurrentUser.java @@ -2,9 +2,13 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; -import java.lang.annotation.*; +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; -@Target({ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) +@Target({ ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented @AuthenticationPrincipal diff --git a/src/main/java/com/sopromadze/blogapi/security/JwtAuthenticationEntryPoint.java b/src/main/java/com/sopromadze/blogapi/security/JwtAuthenticationEntryPoint.java index bc0913eb..b9f644ab 100644 --- a/src/main/java/com/sopromadze/blogapi/security/JwtAuthenticationEntryPoint.java +++ b/src/main/java/com/sopromadze/blogapi/security/JwtAuthenticationEntryPoint.java @@ -13,10 +13,12 @@ @Component public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { - private static final Logger LOGGER = LoggerFactory.getLogger(JwtAuthenticationEntryPoint.class); - @Override - public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException { - LOGGER.error("Responding with unauthorized error. Message - {}", e.getMessage()); - httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Sorry, You're not authorized to access this resource."); - } + private static final Logger LOGGER = LoggerFactory.getLogger(JwtAuthenticationEntryPoint.class); + + @Override + public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) + throws IOException, ServletException { + LOGGER.error("Responding with unauthorized error. Message - {}", e.getMessage()); + httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Sorry, You're not authorized to access this resource."); + } } diff --git a/src/main/java/com/sopromadze/blogapi/security/JwtAuthenticationFilter.java b/src/main/java/com/sopromadze/blogapi/security/JwtAuthenticationFilter.java index 18af240d..3c162554 100644 --- a/src/main/java/com/sopromadze/blogapi/security/JwtAuthenticationFilter.java +++ b/src/main/java/com/sopromadze/blogapi/security/JwtAuthenticationFilter.java @@ -1,5 +1,6 @@ package com.sopromadze.blogapi.security; +import com.sopromadze.blogapi.service.CustomUserDetailsService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -10,8 +11,6 @@ import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; -import com.sopromadze.blogapi.service.CustomUserDetailsService; - import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -19,40 +18,40 @@ import java.io.IOException; public class JwtAuthenticationFilter extends OncePerRequestFilter { - @Autowired - private JwtTokenProvider tokenProvider; - - @Autowired - private CustomUserDetailsService customUserDetailsService; - - private static final Logger LOGGER = LoggerFactory.getLogger(JwtAuthenticationFilter.class); - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - try{ - String jwt = getJwtFromRequest(request); - - if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)){ - Long userId = tokenProvider.getUserIdFromJWT(jwt); - - UserDetails userDetails = customUserDetailsService.loadUserById(userId); - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - - SecurityContextHolder.getContext().setAuthentication(authenticationToken); - } - } catch (Exception ex){ - LOGGER.error("Could not set user authentication in security context", ex); - } - - filterChain.doFilter(request, response); - } - - private String getJwtFromRequest(HttpServletRequest request){ - String bearerToken = request.getHeader("Authorization"); - if(StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")){ - return bearerToken.substring(7, bearerToken.length()); - } - return null; - } + private static final Logger LOGGER = LoggerFactory.getLogger(JwtAuthenticationFilter.class); + @Autowired + private JwtTokenProvider tokenProvider; + @Autowired + private CustomUserDetailsService customUserDetailsService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + try { + String jwt = getJwtFromRequest(request); + + if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)) { + Long userId = tokenProvider.getUserIdFromJWT(jwt); + + UserDetails userDetails = customUserDetailsService.loadUserById(userId); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, + userDetails.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + } catch (Exception ex) { + LOGGER.error("Could not set user authentication in security context", ex); + } + + filterChain.doFilter(request, response); + } + + private String getJwtFromRequest(HttpServletRequest request) { + String bearerToken = request.getHeader("Authorization"); + if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { + return bearerToken.substring(7, bearerToken.length()); + } + return null; + } } diff --git a/src/main/java/com/sopromadze/blogapi/security/JwtTokenProvider.java b/src/main/java/com/sopromadze/blogapi/security/JwtTokenProvider.java index cb5ad334..77fad327 100644 --- a/src/main/java/com/sopromadze/blogapi/security/JwtTokenProvider.java +++ b/src/main/java/com/sopromadze/blogapi/security/JwtTokenProvider.java @@ -1,13 +1,5 @@ package com.sopromadze.blogapi.security; -import java.util.Date; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.Authentication; -import org.springframework.stereotype.Component; - import io.jsonwebtoken.Claims; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.Jwts; @@ -15,55 +7,62 @@ import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureException; import io.jsonwebtoken.UnsupportedJwtException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; + +import java.util.Date; @Component public class JwtTokenProvider { - private static final Logger LOGGER = LoggerFactory.getLogger(JwtTokenProvider.class); + private static final Logger LOGGER = LoggerFactory.getLogger(JwtTokenProvider.class); - @Value(value = "${app.jwtSecret}") - private String jwtSecret; + @Value(value = "${app.jwtSecret}") + private String jwtSecret; - @Value(value = "${app.jwtExpirationInMs}") - private int jwtExpirationInMs; + @Value(value = "${app.jwtExpirationInMs}") + private int jwtExpirationInMs; - public String generateToken(Authentication authentication){ - UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal(); + public String generateToken(Authentication authentication) { + UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal(); - Date now = new Date(); - Date expiryDate = new Date(now.getTime() + jwtExpirationInMs); + Date now = new Date(); + Date expiryDate = new Date(now.getTime() + jwtExpirationInMs); - return Jwts.builder() - .setSubject(Long.toString(userPrincipal.getId())) - .setIssuedAt(new Date()) - .setExpiration(expiryDate) - .signWith(SignatureAlgorithm.HS512, jwtSecret) - .compact(); - } + return Jwts.builder() + .setSubject(Long.toString(userPrincipal.getId())) + .setIssuedAt(new Date()) + .setExpiration(expiryDate) + .signWith(SignatureAlgorithm.HS512, jwtSecret) + .compact(); + } - public Long getUserIdFromJWT(String token){ - Claims claims = Jwts.parser() - .setSigningKey(jwtSecret) - .parseClaimsJws(token) - .getBody(); + public Long getUserIdFromJWT(String token) { + Claims claims = Jwts.parser() + .setSigningKey(jwtSecret) + .parseClaimsJws(token) + .getBody(); - return Long.valueOf(claims.getSubject()); - } + return Long.valueOf(claims.getSubject()); + } - public boolean validateToken(String authToken){ - try { - Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(authToken); - return true; - } catch (SignatureException ex){ - LOGGER.error("Invalid JWT signature"); - } catch (MalformedJwtException ex){ - LOGGER.error("Invalid JWT token"); - } catch (ExpiredJwtException ex){ - LOGGER.error("Expired JWT token"); - } catch (UnsupportedJwtException ex){ - LOGGER.error("Unsupported JWT token"); - } catch (IllegalArgumentException ex){ - LOGGER.error("JWT claims string is empty"); - } - return false; - } + public boolean validateToken(String authToken) { + try { + Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(authToken); + return true; + } catch (SignatureException ex) { + LOGGER.error("Invalid JWT signature"); + } catch (MalformedJwtException ex) { + LOGGER.error("Invalid JWT token"); + } catch (ExpiredJwtException ex) { + LOGGER.error("Expired JWT token"); + } catch (UnsupportedJwtException ex) { + LOGGER.error("Unsupported JWT token"); + } catch (IllegalArgumentException ex) { + LOGGER.error("JWT claims string is empty"); + } + return false; + } } diff --git a/src/main/java/com/sopromadze/blogapi/security/UserPrincipal.java b/src/main/java/com/sopromadze/blogapi/security/UserPrincipal.java index 18751533..3402459f 100644 --- a/src/main/java/com/sopromadze/blogapi/security/UserPrincipal.java +++ b/src/main/java/com/sopromadze/blogapi/security/UserPrincipal.java @@ -1,18 +1,17 @@ package com.sopromadze.blogapi.security; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.sopromadze.blogapi.model.user.User; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.sopromadze.blogapi.model.user.User; - public class UserPrincipal implements UserDetails { private static final long serialVersionUID = 1L; @@ -40,7 +39,7 @@ public UserPrincipal(Long id, String firstName, String lastName, String username this.username = username; this.email = email; this.password = password; - + if (authorities == null) { this.authorities = null; } else { diff --git a/src/main/java/com/sopromadze/blogapi/service/AlbumService.java b/src/main/java/com/sopromadze/blogapi/service/AlbumService.java index a98092ff..ef4a3621 100644 --- a/src/main/java/com/sopromadze/blogapi/service/AlbumService.java +++ b/src/main/java/com/sopromadze/blogapi/service/AlbumService.java @@ -1,13 +1,12 @@ package com.sopromadze.blogapi.service; -import org.springframework.http.ResponseEntity; - -import com.sopromadze.blogapi.model.album.Album; +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 { @@ -23,4 +22,4 @@ public interface AlbumService { PagedResponse getUserAlbums(String username, int page, int size); -} \ No newline at end of file +} diff --git a/src/main/java/com/sopromadze/blogapi/service/CategoryService.java b/src/main/java/com/sopromadze/blogapi/service/CategoryService.java index ce6369b2..65734a3e 100644 --- a/src/main/java/com/sopromadze/blogapi/service/CategoryService.java +++ b/src/main/java/com/sopromadze/blogapi/service/CategoryService.java @@ -1,12 +1,11 @@ package com.sopromadze.blogapi.service; -import org.springframework.http.ResponseEntity; - import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.category.Category; +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 { @@ -21,4 +20,4 @@ ResponseEntity updateCategory(Long id, Category newCategory, UserPrinc ResponseEntity deleteCategory(Long id, UserPrincipal currentUser) throws UnauthorizedException; -} \ No newline at end of file +} diff --git a/src/main/java/com/sopromadze/blogapi/service/CommentService.java b/src/main/java/com/sopromadze/blogapi/service/CommentService.java index 65ef8d88..cdbc34de 100644 --- a/src/main/java/com/sopromadze/blogapi/service/CommentService.java +++ b/src/main/java/com/sopromadze/blogapi/service/CommentService.java @@ -1,6 +1,6 @@ package com.sopromadze.blogapi.service; -import com.sopromadze.blogapi.model.comment.Comment; +import com.sopromadze.blogapi.model.Comment; import com.sopromadze.blogapi.payload.ApiResponse; import com.sopromadze.blogapi.payload.CommentRequest; import com.sopromadze.blogapi.payload.PagedResponse; @@ -18,4 +18,4 @@ public interface CommentService { ApiResponse deleteComment(Long postId, Long id, UserPrincipal currentUser); -} \ 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 index 23e2f6cd..d4754205 100644 --- a/src/main/java/com/sopromadze/blogapi/service/PostService.java +++ b/src/main/java/com/sopromadze/blogapi/service/PostService.java @@ -1,6 +1,6 @@ package com.sopromadze.blogapi.service; -import com.sopromadze.blogapi.model.post.Post; +import com.sopromadze.blogapi.model.Post; import com.sopromadze.blogapi.payload.ApiResponse; import com.sopromadze.blogapi.payload.PagedResponse; import com.sopromadze.blogapi.payload.PostRequest; @@ -25,4 +25,4 @@ public interface PostService { Post getPost(Long id); -} \ No newline at end of file +} diff --git a/src/main/java/com/sopromadze/blogapi/service/TagService.java b/src/main/java/com/sopromadze/blogapi/service/TagService.java index 134a63ff..db321cca 100644 --- a/src/main/java/com/sopromadze/blogapi/service/TagService.java +++ b/src/main/java/com/sopromadze/blogapi/service/TagService.java @@ -1,6 +1,6 @@ package com.sopromadze.blogapi.service; -import com.sopromadze.blogapi.model.tag.Tag; +import com.sopromadze.blogapi.model.Tag; import com.sopromadze.blogapi.payload.ApiResponse; import com.sopromadze.blogapi.payload.PagedResponse; import com.sopromadze.blogapi.security.UserPrincipal; @@ -17,4 +17,4 @@ public interface TagService { ApiResponse deleteTag(Long id, UserPrincipal currentUser); -} \ No newline at end of file +} diff --git a/src/main/java/com/sopromadze/blogapi/service/TodoService.java b/src/main/java/com/sopromadze/blogapi/service/TodoService.java index a54866ae..23e7903d 100644 --- a/src/main/java/com/sopromadze/blogapi/service/TodoService.java +++ b/src/main/java/com/sopromadze/blogapi/service/TodoService.java @@ -1,6 +1,6 @@ package com.sopromadze.blogapi.service; -import com.sopromadze.blogapi.model.todo.Todo; +import com.sopromadze.blogapi.model.Todo; import com.sopromadze.blogapi.payload.ApiResponse; import com.sopromadze.blogapi.payload.PagedResponse; import com.sopromadze.blogapi.security.UserPrincipal; @@ -21,4 +21,4 @@ public interface TodoService { ApiResponse deleteTodo(Long id, UserPrincipal currentUser); -} \ No newline at end of file +} diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/AlbumServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/AlbumServiceImpl.java index 31fb00d9..6964008e 100644 --- a/src/main/java/com/sopromadze/blogapi/service/impl/AlbumServiceImpl.java +++ b/src/main/java/com/sopromadze/blogapi/service/impl/AlbumServiceImpl.java @@ -1,25 +1,8 @@ package com.sopromadze.blogapi.service.impl; -import static com.sopromadze.blogapi.utils.AppConstants.ID; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -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 com.sopromadze.blogapi.exception.BlogapiException; import com.sopromadze.blogapi.exception.ResourceNotFoundException; -import com.sopromadze.blogapi.model.album.Album; +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; @@ -31,106 +14,120 @@ 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 USER_STR = "User"; - - private static final String USERNAME_STR = "username"; - 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; - + private AlbumRepository albumRepository; + @Autowired - private UserRepository userRepository; - + 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.findByUsername(currentUser.getUsername()).orElseThrow(() -> new ResourceNotFoundException(USER_STR, USERNAME_STR, currentUser.getUsername())); - - 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.findByUsername(currentUser.getUsername()).orElseThrow(() -> new ResourceNotFoundException(USER_STR, USERNAME_STR, currentUser.getUsername())); - 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.findByUsername(currentUser.getUsername()).orElseThrow(() -> new ResourceNotFoundException(USER_STR, USERNAME_STR, currentUser.getUsername())); - 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.findByUsername(username).orElseThrow(() -> new ResourceNotFoundException(USER_STR, USERNAME_STR, 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()); - } + + @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 index 54b40f1b..a98064b3 100644 --- a/src/main/java/com/sopromadze/blogapi/service/impl/CategoryServiceImpl.java +++ b/src/main/java/com/sopromadze/blogapi/service/impl/CategoryServiceImpl.java @@ -1,8 +1,15 @@ package com.sopromadze.blogapi.service.impl; -import java.util.Collections; -import java.util.List; - +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; @@ -13,69 +20,64 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.stereotype.Service; -import com.sopromadze.blogapi.exception.ResourceNotFoundException; -import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.category.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 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){ + 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()); + + 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); - } - + 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); - } - + 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) throws UnauthorizedException { - 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"); - } - + 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) throws UnauthorizedException{ - 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"); - } + 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 index 69805cb5..00258de7 100644 --- a/src/main/java/com/sopromadze/blogapi/service/impl/CommentServiceImpl.java +++ b/src/main/java/com/sopromadze/blogapi/service/impl/CommentServiceImpl.java @@ -1,18 +1,9 @@ package com.sopromadze.blogapi.service.impl; -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; - import com.sopromadze.blogapi.exception.BlogapiException; import com.sopromadze.blogapi.exception.ResourceNotFoundException; -import com.sopromadze.blogapi.model.comment.Comment; -import com.sopromadze.blogapi.model.post.Post; +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; @@ -24,6 +15,14 @@ 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 { @@ -55,7 +54,7 @@ public PagedResponse getAllComments(Long postId, int page, int size) { Page comments = commentRepository.findByPostId(postId, pageable); - return new PagedResponse(comments.getContent(), comments.getNumber(), comments.getSize(), + return new PagedResponse<>(comments.getContent(), comments.getNumber(), comments.getSize(), comments.getTotalElements(), comments.getTotalPages(), comments.isLast()); } @@ -63,16 +62,13 @@ public PagedResponse getAllComments(Long postId, int page, int size) { 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.findByUsername(currentUser.getUsername()) - .orElseThrow(() -> new ResourceNotFoundException("User", "username", currentUser.getUsername())); + 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()); - Comment newComment = commentRepository.save(comment); - - return newComment; + return commentRepository.save(comment); } @Override @@ -84,7 +80,7 @@ public Comment getComment(Long postId, Long id) { if (comment.getPost().getId().equals(post.getId())) { return comment; } - + throw new BlogapiException(HttpStatus.BAD_REQUEST, COMMENT_DOES_NOT_BELONG_TO_POST); } @@ -103,10 +99,9 @@ public Comment updateComment(Long postId, Long id, CommentRequest commentRequest if (comment.getUser().getId().equals(currentUser.getId()) || currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { comment.setBody(commentRequest.getBody()); - Comment updatedComment = commentRepository.save(comment); - return updatedComment; + return commentRepository.save(comment); } - + throw new BlogapiException(HttpStatus.UNAUTHORIZED, YOU_DON_T_HAVE_PERMISSION_TO + "update" + 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 71071666..27451513 100644 --- a/src/main/java/com/sopromadze/blogapi/service/impl/CustomUserDetailsServiceImpl.java +++ b/src/main/java/com/sopromadze/blogapi/service/impl/CustomUserDetailsServiceImpl.java @@ -4,7 +4,6 @@ import com.sopromadze.blogapi.repository.UserRepository; import com.sopromadze.blogapi.security.UserPrincipal; import com.sopromadze.blogapi.service.CustomUserDetailsService; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; @@ -14,22 +13,23 @@ import javax.transaction.Transactional; @Service -public class CustomUserDetailsServiceImpl implements UserDetailsService, CustomUserDetailsService { +public class CustomUserDetailsServiceImpl implements UserDetailsService, CustomUserDetailsService { @Autowired private UserRepository userRepository; - @Override - @Transactional - public UserDetails loadUserByUsername(String usernameOrEmail) throws UsernameNotFoundException { - User user = userRepository.findByUsernameOrEmail(usernameOrEmail, usernameOrEmail).orElseThrow(() -> new UsernameNotFoundException(String.format("User not found with this username or email: %s", usernameOrEmail))); - return UserPrincipal.create(user); - } + @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))); + return UserPrincipal.create(user); + } - @Override + @Override @Transactional - public UserDetails loadUserById(Long id){ - User user = userRepository.findById(id).orElseThrow(() -> new UsernameNotFoundException(String.format("User not found with id: %s", id))); + public UserDetails loadUserById(Long id) { + User user = userRepository.findById(id).orElseThrow(() -> new UsernameNotFoundException(String.format("User not found with id: %s", id))); - return UserPrincipal.create(user); - } + 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 index b43c29fd..dfa90b86 100644 --- a/src/main/java/com/sopromadze/blogapi/service/impl/PhotoServiceImpl.java +++ b/src/main/java/com/sopromadze/blogapi/service/impl/PhotoServiceImpl.java @@ -1,26 +1,9 @@ package com.sopromadze.blogapi.service.impl; -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; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -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 com.sopromadze.blogapi.exception.ResourceNotFoundException; import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.album.Album; -import com.sopromadze.blogapi.model.photo.Photo; +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; @@ -32,6 +15,22 @@ 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 { @@ -67,11 +66,9 @@ public PagedResponse getAllPhotos(int page, int size) { @Override public PhotoResponse getPhoto(Long id) { Photo photo = photoRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(PHOTO, ID, id)); - - PhotoResponse photoResponse = new PhotoResponse(photo.getId(), photo.getTitle(), photo.getUrl(), + + return new PhotoResponse(photo.getId(), photo.getTitle(), photo.getUrl(), photo.getThumbnailUrl(), photo.getAlbum().getId()); - - return photoResponse; } @Override @@ -88,9 +85,9 @@ public PhotoResponse updatePhoto(Long id, PhotoRequest photoRequest, UserPrincip 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); } @@ -105,9 +102,9 @@ public PhotoResponse addPhoto(PhotoRequest photoRequest, UserPrincipal currentUs 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); } @@ -119,9 +116,9 @@ public ApiResponse deletePhoto(Long id, UserPrincipal currentUser) { 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); } diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/PostServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/PostServiceImpl.java index 5e94cffc..8666ec58 100644 --- a/src/main/java/com/sopromadze/blogapi/service/impl/PostServiceImpl.java +++ b/src/main/java/com/sopromadze/blogapi/service/impl/PostServiceImpl.java @@ -1,33 +1,12 @@ package com.sopromadze.blogapi.service.impl; -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; -import static com.sopromadze.blogapi.utils.AppConstants.USERNAME; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -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 com.sopromadze.blogapi.exception.BadRequestException; import com.sopromadze.blogapi.exception.ResourceNotFoundException; import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.category.Category; -import com.sopromadze.blogapi.model.post.Post; +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.tag.Tag; import com.sopromadze.blogapi.model.user.User; import com.sopromadze.blogapi.payload.ApiResponse; import com.sopromadze.blogapi.payload.PagedResponse; @@ -41,6 +20,24 @@ 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 { @@ -73,8 +70,7 @@ public PagedResponse getAllPosts(int page, int size) { @Override public PagedResponse getPostsByCreatedBy(String username, int page, int size) { validatePageNumberAndSize(page, size); - User user = userRepository.findByUsername(username) - .orElseThrow(() -> new ResourceNotFoundException(USER, USERNAME, username)); + User user = userRepository.getUserByName(username); Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, CREATED_AT); Page posts = postRepository.findByCreatedBy(user.getId(), pageable); @@ -107,7 +103,7 @@ public PagedResponse getPostsByTag(Long id, int page, int size) { Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, CREATED_AT); - Page posts = postRepository.findByTags(Arrays.asList(tag), pageable); + Page posts = postRepository.findByTags(Collections.singletonList(tag), pageable); List content = posts.getNumberOfElements() == 0 ? Collections.emptyList() : posts.getContent(); @@ -125,8 +121,7 @@ public Post updatePost(Long id, PostRequest newPostRequest, UserPrincipal curren post.setTitle(newPostRequest.getTitle()); post.setBody(newPostRequest.getBody()); post.setCategory(category); - Post updatedPost = postRepository.save(post); - return updatedPost; + return postRepository.save(post); } ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to edit this post"); @@ -153,8 +148,8 @@ public PostResponse addPost(PostRequest postRequest, UserPrincipal currentUser) .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()); + + List tags = new ArrayList<>(postRequest.getTags().size()); for (String name : postRequest.getTags()) { Tag tag = tagRepository.findByName(name); @@ -178,7 +173,7 @@ public PostResponse addPost(PostRequest postRequest, UserPrincipal currentUser) postResponse.setBody(newPost.getBody()); postResponse.setCategory(newPost.getCategory().getName()); - List tagNames = new ArrayList(newPost.getTags().size()); + List tagNames = new ArrayList<>(newPost.getTags().size()); for (Tag tag : newPost.getTags()) { tagNames.add(tag.getName()); @@ -191,8 +186,7 @@ public PostResponse addPost(PostRequest postRequest, UserPrincipal currentUser) @Override public Post getPost(Long id) { - Post post = postRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(POST, ID, id)); - return post; + return postRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(POST, ID, id)); } private void validatePageNumberAndSize(int page, int size) { diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/TagServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/TagServiceImpl.java index 359d3939..18488a23 100644 --- a/src/main/java/com/sopromadze/blogapi/service/impl/TagServiceImpl.java +++ b/src/main/java/com/sopromadze/blogapi/service/impl/TagServiceImpl.java @@ -1,83 +1,81 @@ package com.sopromadze.blogapi.service.impl; -import java.util.Collections; -import java.util.List; - -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 com.sopromadze.blogapi.exception.ResourceNotFoundException; import com.sopromadze.blogapi.exception.UnauthorizedException; +import com.sopromadze.blogapi.model.Tag; import com.sopromadze.blogapi.model.role.RoleName; -import com.sopromadze.blogapi.model.tag.Tag; import com.sopromadze.blogapi.payload.ApiResponse; import com.sopromadze.blogapi.payload.PagedResponse; import com.sopromadze.blogapi.repository.TagRepository; import com.sopromadze.blogapi.security.UserPrincipal; import com.sopromadze.blogapi.service.TagService; 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.Collections; +import java.util.List; @Service public class TagServiceImpl implements TagService { - + @Autowired private TagRepository tagRepository; - + @Override - public PagedResponse getAllTags(int page, int size){ + public PagedResponse getAllTags(int page, int size) { AppUtils.validatePageNumberAndSize(page, size); - + Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "createdAt"); - + Page tags = tagRepository.findAll(pageable); - + List content = tags.getNumberOfElements() == 0 ? Collections.emptyList() : tags.getContent(); - - return new PagedResponse(content, tags.getNumber(), tags.getSize(), tags.getTotalElements(), tags.getTotalPages(), tags.isLast()); + + return new PagedResponse<>(content, tags.getNumber(), tags.getSize(), tags.getTotalElements(), tags.getTotalPages(), tags.isLast()); } - + @Override - public Tag getTag(Long id){ - Tag tag = tagRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Tag", "id", id)); - return tag; - } - + public Tag getTag(Long id) { + return tagRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Tag", "id", id)); + } + @Override - public Tag addTag(Tag tag, UserPrincipal currentUser){ - Tag newTag = tagRepository.save(tag); - return newTag; - } - + public Tag addTag(Tag tag, UserPrincipal currentUser) { + return tagRepository.save(tag); + } + @Override - public Tag updateTag(Long id, Tag newTag, UserPrincipal currentUser){ - Tag tag = tagRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Tag", "id", id)); - if (tag.getCreatedBy().equals(currentUser.getId()) || currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))){ - tag.setName(newTag.getName()); - Tag updatedTag = tagRepository.save(tag); - return updatedTag; - } - ApiResponse apiResponse =new ApiResponse(Boolean.FALSE, "You don't have permission to edit this tag"); - - throw new UnauthorizedException(apiResponse); - } - + public Tag updateTag(Long id, Tag newTag, UserPrincipal currentUser) { + Tag tag = tagRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Tag", "id", id)); + if (tag.getCreatedBy().equals(currentUser.getId()) || currentUser.getAuthorities() + .contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { + tag.setName(newTag.getName()); + return tagRepository.save(tag); + } + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to edit this tag"); + + throw new UnauthorizedException(apiResponse); + } + @Override - public ApiResponse deleteTag(Long id, UserPrincipal currentUser){ - Tag tag = tagRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Tag", "id", id)); - if (tag.getCreatedBy().equals(currentUser.getId()) || currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))){ - tagRepository.deleteById(id); - return new ApiResponse(Boolean.TRUE, "You successfully deleted tag"); - } - - ApiResponse apiResponse =new ApiResponse(Boolean.FALSE, "You don't have permission to delete this tag"); - - throw new UnauthorizedException(apiResponse); - } + public ApiResponse deleteTag(Long id, UserPrincipal currentUser) { + Tag tag = tagRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Tag", "id", id)); + if (tag.getCreatedBy().equals(currentUser.getId()) || currentUser.getAuthorities() + .contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { + tagRepository.deleteById(id); + return new ApiResponse(Boolean.TRUE, "You successfully deleted tag"); + } + + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to delete this tag"); + + throw new UnauthorizedException(apiResponse); + } } diff --git a/src/main/java/com/sopromadze/blogapi/service/impl/TodoServiceImpl.java b/src/main/java/com/sopromadze/blogapi/service/impl/TodoServiceImpl.java index 43eccd13..9ef3b2e8 100644 --- a/src/main/java/com/sopromadze/blogapi/service/impl/TodoServiceImpl.java +++ b/src/main/java/com/sopromadze/blogapi/service/impl/TodoServiceImpl.java @@ -1,26 +1,9 @@ package com.sopromadze.blogapi.service.impl; -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.USER; -import static com.sopromadze.blogapi.utils.AppConstants.USERNAME; -import static com.sopromadze.blogapi.utils.AppConstants.YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION; - -import java.util.Collections; -import java.util.List; - -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 com.sopromadze.blogapi.exception.BadRequestException; import com.sopromadze.blogapi.exception.ResourceNotFoundException; import com.sopromadze.blogapi.exception.UnauthorizedException; -import com.sopromadze.blogapi.model.todo.Todo; +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; @@ -29,10 +12,23 @@ 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; @@ -43,34 +39,30 @@ public class TodoServiceImpl implements TodoService { @Override public Todo completeTodo(Long id, UserPrincipal currentUser) { Todo todo = todoRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(TODO, ID, id)); - - User user = userRepository.findByUsername(currentUser.getUsername()) - .orElseThrow(() -> new ResourceNotFoundException(USER, USERNAME, currentUser.getUsername())); - + + User user = userRepository.getUser(currentUser); + if (todo.getUser().getId().equals(user.getId())) { todo.setCompleted(Boolean.TRUE); - Todo result = todoRepository.save(todo); - return result; + 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.findByUsername(currentUser.getUsername()) - .orElseThrow(() -> new ResourceNotFoundException(USER, USERNAME, currentUser.getUsername())); + User user = userRepository.getUser(currentUser); if (todo.getUser().getId().equals(user.getId())) { todo.setCompleted(Boolean.FALSE); - Todo result = todoRepository.save(todo); - return result; + return todoRepository.save(todo); } - + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION); - + throw new UnauthorizedException(apiResponse); } @@ -80,7 +72,7 @@ public PagedResponse getAllTodos(UserPrincipal currentUser, int page, int 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(), @@ -89,58 +81,52 @@ public PagedResponse getAllTodos(UserPrincipal currentUser, int page, int @Override public Todo addTodo(Todo todo, UserPrincipal currentUser) { - User user = userRepository.findByUsername(currentUser.getUsername()) - .orElseThrow(() -> new ResourceNotFoundException(USER, USERNAME, currentUser.getUsername())); + User user = userRepository.getUser(currentUser); todo.setUser(user); - Todo result = todoRepository.save(todo); - return result; + return todoRepository.save(todo); } @Override public Todo getTodo(Long id, UserPrincipal currentUser) { - User user = userRepository.findByUsername(currentUser.getUsername()) - .orElseThrow(() -> new ResourceNotFoundException(USER, USERNAME, currentUser.getUsername())); + User user = userRepository.getUser(currentUser); Todo todo = todoRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(TODO, ID, id)); - - if(todo.getUser().getId().equals(user.getId())) { + + 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.findByUsername(currentUser.getUsername()) - .orElseThrow(() -> new ResourceNotFoundException(USER, USERNAME, currentUser.getUsername())); + 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()); - Todo result = todoRepository.save(todo); - return result; + 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.findByUsername(currentUser.getUsername()) - .orElseThrow(() -> new ResourceNotFoundException(USER, USERNAME, currentUser.getUsername())); + 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); } 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 a27ff271..d740f27b 100644 --- a/src/main/java/com/sopromadze/blogapi/service/impl/UserServiceImpl.java +++ b/src/main/java/com/sopromadze/blogapi/service/impl/UserServiceImpl.java @@ -1,14 +1,5 @@ package com.sopromadze.blogapi.service.impl; -import java.util.ArrayList; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; - import com.sopromadze.blogapi.exception.AccessDeniedException; import com.sopromadze.blogapi.exception.AppException; import com.sopromadze.blogapi.exception.BadRequestException; @@ -30,6 +21,14 @@ import com.sopromadze.blogapi.repository.UserRepository; import com.sopromadze.blogapi.security.UserPrincipal; import com.sopromadze.blogapi.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +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 UserServiceImpl implements UserService { @@ -65,8 +64,7 @@ public UserIdentityAvailability checkEmailAvailability(String email) { @Override public UserProfile getUserProfile(String username) { - User user = userRepository.findByUsername(username) - .orElseThrow(() -> new ResourceNotFoundException("User", "username", username)); + User user = userRepository.getUserByName(username); Long postCount = postRepository.countByCreatedBy(user.getId()); @@ -93,14 +91,12 @@ public User addUser(User user) { user.setRoles(roles); user.setPassword(passwordEncoder.encode(user.getPassword())); - User result = userRepository.save(user); - return result; + return userRepository.save(user); } @Override public User updateUser(User newUser, String username, UserPrincipal currentUser) { - User user = userRepository.findByUsername(username) - .orElseThrow(() -> new ResourceNotFoundException("User", "username", username)); + User user = userRepository.getUserByName(username); if (user.getId().equals(currentUser.getId()) || currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { user.setFirstName(newUser.getFirstName()); @@ -111,8 +107,7 @@ public User updateUser(User newUser, String username, UserPrincipal currentUser) user.setWebsite(newUser.getWebsite()); user.setCompany(newUser.getCompany()); - User updatedUser = userRepository.save(user); - return updatedUser; + return userRepository.save(user); } @@ -125,11 +120,12 @@ public User updateUser(User newUser, String username, UserPrincipal currentUser) public ApiResponse deleteUser(String username, UserPrincipal currentUser) { User user = userRepository.findByUsername(username) .orElseThrow(() -> new ResourceNotFoundException("User", "id", username)); - if (!user.getId().equals(currentUser.getId()) || !currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))) { + 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: " + username); throw new AccessDeniedException(apiResponse); } - + userRepository.deleteById(user.getId()); return new ApiResponse(Boolean.TRUE, "You successfully deleted profile of: " + username); @@ -137,8 +133,7 @@ public ApiResponse deleteUser(String username, UserPrincipal currentUser) { @Override public ApiResponse giveAdmin(String username) { - User user = userRepository.findByUsername(username) - .orElseThrow(() -> new ResourceNotFoundException("User", "username", username)); + User user = userRepository.getUserByName(username); List roles = new ArrayList<>(); roles.add(roleRepository.findByName(RoleName.ROLE_ADMIN) .orElseThrow(() -> new AppException("User role not set"))); @@ -151,8 +146,7 @@ public ApiResponse giveAdmin(String username) { @Override public ApiResponse removeAdmin(String username) { - User user = userRepository.findByUsername(username) - .orElseThrow(() -> new ResourceNotFoundException("User", "username", username)); + User user = userRepository.getUserByName(username); List roles = new ArrayList<>(); roles.add( roleRepository.findByName(RoleName.ROLE_USER).orElseThrow(() -> new AppException("User role not set"))); @@ -179,13 +173,12 @@ public UserProfile setOrUpdateInfo(UserPrincipal currentUser, InfoRequest infoRe Long postCount = postRepository.countByCreatedBy(updatedUser.getId()); - UserProfile userProfile = new UserProfile(updatedUser.getId(), updatedUser.getUsername(), + return new UserProfile(updatedUser.getId(), updatedUser.getUsername(), updatedUser.getFirstName(), updatedUser.getLastName(), updatedUser.getCreatedAt(), updatedUser.getEmail(), updatedUser.getAddress(), updatedUser.getPhone(), updatedUser.getWebsite(), updatedUser.getCompany(), postCount); - return userProfile; } - + ApiResponse apiResponse = new ApiResponse(Boolean.FALSE, "You don't have permission to update users profile", HttpStatus.FORBIDDEN); throw new AccessDeniedException(apiResponse); } diff --git a/src/main/java/com/sopromadze/blogapi/utils/AppConstants.java b/src/main/java/com/sopromadze/blogapi/utils/AppConstants.java index cea9424a..19df8f75 100644 --- a/src/main/java/com/sopromadze/blogapi/utils/AppConstants.java +++ b/src/main/java/com/sopromadze/blogapi/utils/AppConstants.java @@ -1,31 +1,31 @@ package com.sopromadze.blogapi.utils; public class AppConstants { - public static final String DEFAULT_PAGE_NUMBER = "0"; - - public static final String DEFAULT_PAGE_SIZE = "30"; - - public static final int MAX_PAGE_SIZE = 30; - - public static final String CREATED_AT = "createdAt"; - - public static final String ID = "id"; - - public static final String PHOTO = "Photo"; - - public static final String ALBUM = "Album"; - - public static final String USERNAME = "username"; - - public static final String USER = "User"; - - public static final String CATEGORY = "Category"; - - public static final String TAG = "Tag"; - - public static final String POST = "Post"; - - public static final String TODO = "ToDo"; - - public static final String YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION = "You don't have permission to make this operation"; + public static final String DEFAULT_PAGE_NUMBER = "0"; + + public static final String DEFAULT_PAGE_SIZE = "30"; + + public static final int MAX_PAGE_SIZE = 30; + + public static final String CREATED_AT = "createdAt"; + + public static final String ID = "id"; + + public static final String PHOTO = "Photo"; + + public static final String ALBUM = "Album"; + + public static final String USERNAME = "username"; + + public static final String USER = "User"; + + public static final String CATEGORY = "Category"; + + public static final String TAG = "Tag"; + + public static final String POST = "Post"; + + public static final String TODO = "ToDo"; + + public static final String YOU_DON_T_HAVE_PERMISSION_TO_MAKE_THIS_OPERATION = "You don't have permission to make this operation"; } diff --git a/src/main/java/com/sopromadze/blogapi/utils/AppUtils.java b/src/main/java/com/sopromadze/blogapi/utils/AppUtils.java index b1c9e116..fccdf832 100644 --- a/src/main/java/com/sopromadze/blogapi/utils/AppUtils.java +++ b/src/main/java/com/sopromadze/blogapi/utils/AppUtils.java @@ -1,21 +1,20 @@ package com.sopromadze.blogapi.utils; -import org.springframework.http.HttpStatus; - import com.sopromadze.blogapi.exception.BlogapiException; +import org.springframework.http.HttpStatus; public class AppUtils { public static void validatePageNumberAndSize(int page, int size) { - if(page < 0) { - throw new BlogapiException(HttpStatus.BAD_REQUEST, "Page number cannot be less than zero."); - } + if (page < 0) { + throw new BlogapiException(HttpStatus.BAD_REQUEST, "Page number cannot be less than zero."); + } - if(size < 0) { - throw new BlogapiException(HttpStatus.BAD_REQUEST, "Size number cannot be less than zero."); - } + if (size < 0) { + throw new BlogapiException(HttpStatus.BAD_REQUEST, "Size number cannot be less than zero."); + } - if(size > AppConstants.MAX_PAGE_SIZE) { - throw new BlogapiException(HttpStatus.BAD_REQUEST, "Page size must not be greater than " + AppConstants.MAX_PAGE_SIZE); - } - } + if (size > AppConstants.MAX_PAGE_SIZE) { + throw new BlogapiException(HttpStatus.BAD_REQUEST, "Page size must not be greater than " + AppConstants.MAX_PAGE_SIZE); + } + } } diff --git a/src/main/resources/_application.properties b/src/main/resources/_application.properties new file mode 100644 index 00000000..d7d7b14c --- /dev/null +++ b/src/main/resources/_application.properties @@ -0,0 +1,12 @@ +spring.jpa.hibernate.ddl-auto=none +spring.datasource.url=jdbc:mysql://localhost:3306/blogapi?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true +spring.datasource.username=root +spring.datasource.password=root +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect +app.jwtSecret=secret +# Expiration in milliseconds - 1 Hour +app.jwtExpirationInMs=3600000 +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false +spring.jackson.time-zone=UTC +cors.allowedOrings=* diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 2caf73ae..00000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1,19 +0,0 @@ -spring.jpa.hibernate.ddl-auto = none -spring.datasource.url = jdbc:mysql://localhost:3306/blogapi?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true -spring.datasource.username = root -spring.datasource.password = root - -spring.jpa.show-sql = true - -spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect - -app.jwtSecret = secret - -# Expiration in milliseconds - 1 Hour -app.jwtExpirationInMs = 3600000 - - -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false -spring.jackson.time-zone = UTC - -cors.allowedOrings=* \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 00000000..ef6d7e3d --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,23 @@ +spring: + datasource: + url: jdbc:mysql://blogapi-db:3306/blogapi?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true + username: root + password: root + jpa: + hibernate: + ddl-auto: none + show-sql: true + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5Dialect + jackson: + serialization: + WRITE_DATES_AS_TIMESTAMPS: false + time-zone: UTC + +app: + jwtSecret: secret + jwtExpirationInMs: 3600000 + +cors: + allowedOrings: '*' diff --git a/src/test/java/com/sopromadze/blogapi/AbstractTest.java b/src/test/java/com/sopromadze/blogapi/AbstractTest.java deleted file mode 100644 index 01f7f5d2..00000000 --- a/src/test/java/com/sopromadze/blogapi/AbstractTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.sopromadze.blogapi; - -import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; - -import javax.annotation.PostConstruct; -import javax.servlet.Filter; - -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = BlogApiApplication.class) -@WebAppConfiguration -public abstract class AbstractTest { - protected MockMvc mvc; - - @Autowired - protected WebApplicationContext webApplicationContext; - - @Autowired - protected Filter springSecurityFilterChain; - - @PostConstruct - protected void setUp() { - mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity(springSecurityFilterChain)) - .build(); - } - -} diff --git a/src/test/java/com/sopromadze/blogapi/BlogApiApplicationTests.java b/src/test/java/com/sopromadze/blogapi/BlogApiApplicationTests.java index c2938f48..b1247c5c 100644 --- a/src/test/java/com/sopromadze/blogapi/BlogApiApplicationTests.java +++ b/src/test/java/com/sopromadze/blogapi/BlogApiApplicationTests.java @@ -9,8 +9,8 @@ @SpringBootTest(classes = BlogApiApplication.class) public class BlogApiApplicationTests { - @Test - public void contextLoads() { - } + @Test + public void contextLoads() { + } } diff --git a/src/test/java/com/sopromadze/blogapi/model/album/AlbumTest.java b/src/test/java/com/sopromadze/blogapi/model/album/AlbumTest.java deleted file mode 100644 index 9dc6da08..00000000 --- a/src/test/java/com/sopromadze/blogapi/model/album/AlbumTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.sopromadze.blogapi.model.album; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.junit4.SpringRunner; - -import com.sopromadze.blogapi.utils.TestUtils; - -@RunWith(SpringRunner.class) -public class AlbumTest { - - private Album album; - - @Before - public void setup() { - album = TestUtils.createAlbum(); - } - - @Test - public void getIdTest() { - Assert.assertNotNull("id can not be null", album.getId()); - } - - @Test - public void getTitleTest() { - Assert.assertNotNull("title can not be null", album.getTitle()); - } - - @Test - public void getUserTest() { - Assert.assertNotNull("user can not be null", album.getUser()); - } - - @Test - public void getPhotoTest() { - Assert.assertNotNull("user can not be null", album.getPhoto()); - } -} diff --git a/src/test/java/com/sopromadze/blogapi/utils/TestUtils.java b/src/test/java/com/sopromadze/blogapi/utils/TestUtils.java deleted file mode 100644 index e29b3315..00000000 --- a/src/test/java/com/sopromadze/blogapi/utils/TestUtils.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.sopromadze.blogapi.utils; - -import java.util.Arrays; - -import com.sopromadze.blogapi.model.album.Album; -import com.sopromadze.blogapi.model.photo.Photo; -import com.sopromadze.blogapi.model.user.User; - -public class TestUtils { - - public static Album createAlbum() { - Album album = new Album(); - - album.setId(Long.valueOf(1)); - album.setTitle("album"); - album.setUser(createUser()); - album.setPhoto(Arrays.asList(TestUtils.createPhoto())); - - return album; - } - - public static User createUser() { - User user = new User(); - - user.setId(Long.valueOf(1)); - user.setFirstName("admin"); - user.setLastName("admin"); - user.setEmail("admin@site.com"); - user.setUsername("admin"); - user.setPassword("password"); - user.setWebsite("site.com"); - - return user; - } - - public static Photo createPhoto() { - Photo photo = new Photo(); - - photo.setId(Long.valueOf(1)); - - return photo; - } -}