Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 45 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
<relativePath/>
</parent>
<groupId>com.senkiv</groupId>
<artifactId>CarSharing</artifactId>
Expand All @@ -29,6 +29,9 @@
</scm>
<properties>
<java.version>21</java.version>
<mapstruct.version>1.6.3</mapstruct.version>
<lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
<maven.checkstyle.plugin.configLocation>checkstyle.xml</maven.checkstyle.plugin.configLocation>
</properties>
<dependencies>
<dependency>
Expand All @@ -55,7 +58,6 @@
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>

<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
Expand All @@ -76,8 +78,18 @@
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.3.232</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
Expand All @@ -89,6 +101,16 @@
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
Expand All @@ -104,7 +126,26 @@
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
<configuration>
<configLocation>${maven.checkstyle.plugin.configLocation}</configLocation>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
<linkXRef>false</linkXRef>
<sourceDirectories>src</sourceDirectories>
</configuration>
</plugin>
</plugins>
</build>

</project>
12 changes: 12 additions & 0 deletions src/main/java/com/senkiv/carsharing/config/MapperConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.senkiv.carsharing.config;

import org.mapstruct.InjectionStrategy;
import org.mapstruct.NullValueCheckStrategy;

@org.mapstruct.MapperConfig(
componentModel = "spring",
injectionStrategy = InjectionStrategy.CONSTRUCTOR,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS
)
public class MapperConfig {
}
29 changes: 29 additions & 0 deletions src/main/java/com/senkiv/carsharing/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.senkiv.carsharing.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableMethodSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(AbstractHttpConfigurer::disable)
.cors(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(auth -> {
auth.requestMatchers("/cars", "/cars/**").permitAll();
})
.httpBasic(Customizer.withDefaults())
.sessionManagement(
session -> session.sessionCreationPolicy(
SessionCreationPolicy.STATELESS))
.build();
}
}
37 changes: 37 additions & 0 deletions src/main/java/com/senkiv/carsharing/model/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.senkiv.carsharing.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.math.BigDecimal;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.SQLRestriction;

@Entity
@Table(name = "cars")
@Getter
@Setter
@SQLDelete(sql = "UPDATE cars SET is_deleted = true WHERE id = ?;")
@SQLRestriction("is_deleted = false")
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String model;
@Column(nullable = false)
private String brand;
@Column(nullable = false)
private CarType type;
@Column(nullable = false)
private int inventory;
@Column(nullable = false)
private BigDecimal dailyFee;
@Column(nullable = false, columnDefinition = "TINYINT")
private boolean isDeleted;
}
8 changes: 8 additions & 0 deletions src/main/java/com/senkiv/carsharing/model/CarType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.senkiv.carsharing.model;

public enum CarType {
SEDAN,
HATCHBACK,
UNIVERSAL,
SUV
}
40 changes: 40 additions & 0 deletions src/main/java/com/senkiv/carsharing/model/Payment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.senkiv.carsharing.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.MapsId;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import java.math.BigDecimal;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.SQLRestriction;

@Entity
@Table(name = "payments")
@Getter
@Setter
@SQLDelete(sql = "UPDATE payments SET is_deleted = true WHERE id = ?")
@SQLRestriction("is_deleted = false")
public class Payment {
@Id
private Long id;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private PaymentStatus status;
@OneToOne(fetch = FetchType.LAZY, optional = false)
@MapsId
@JoinColumn(name = "rental_id")
private Rental rental;
private String url;
private Long sessionId;
private BigDecimal amountToPay; //calculated rental total price
@Column(nullable = false, columnDefinition = "TINYINT")
private boolean isDeleted;
}
6 changes: 6 additions & 0 deletions src/main/java/com/senkiv/carsharing/model/PaymentStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.senkiv.carsharing.model;

public enum PaymentStatus {
PENDING,
PAID
}
38 changes: 38 additions & 0 deletions src/main/java/com/senkiv/carsharing/model/Rental.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.senkiv.carsharing.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.time.LocalDate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.SQLRestriction;

@Entity
@Table(name = "rentals")
@SQLDelete(sql = "UPDATE rentals SET is_deleted = true WHERE id = ?")
@SQLRestriction("is_deleted = false")
public class Rental {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private LocalDate rentalDate;
@Column(nullable = false)
private LocalDate returnDate;
@Column(nullable = false)
private LocalDate actualReturnDate;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "car_id")
private Car car;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id")
private User user;
@Column(nullable = false, columnDefinition = "TINYINT")
private boolean isDeleted;
}
6 changes: 6 additions & 0 deletions src/main/java/com/senkiv/carsharing/model/Role.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.senkiv.carsharing.model;

public enum Role {
MANAGER,
CUSTOMER
}
70 changes: 70 additions & 0 deletions src/main/java/com/senkiv/carsharing/model/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.senkiv.carsharing.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.util.Collection;
import java.util.List;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

@Entity
@Table(name = "users")
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String firstName;
@Column(nullable = false)
private String lastName;
@Column(nullable = false, unique = true)
private String email;
@Column(nullable = false)
private String password;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private Role role;
@Column(nullable = false, columnDefinition = "TINYINT")
private boolean isDeleted;

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return List.of();
}

@Override
public String getPassword() {
return password;
}

@Override
public String getUsername() {
return email;
}

@Override
public boolean isAccountNonExpired() {
return !isDeleted;
}

@Override
public boolean isAccountNonLocked() {
return !isDeleted;
}

@Override
public boolean isCredentialsNonExpired() {
return !isDeleted;
}

@Override
public boolean isEnabled() {
return !isDeleted;
}
}
7 changes: 7 additions & 0 deletions src/main/resources/application-dev.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
spring.application.name=CarSharing
spring.datasource.url=jdbc:mysql://localhost:3306/car_sharing
spring.datasource.username=root
spring.datasource.password=Senkiv1905!
spring.jpa.open-in-view=false
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.show-sql=true
6 changes: 6 additions & 0 deletions src/main/resources/application-prod.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
spring.application.name=CarSharing
spring.datasource.url=jdbc:mysql://localhost:3306/car_sharing
spring.datasource.username=root
spring.datasource.password=123
spring.jpa.open-in-view=false

1 change: 0 additions & 1 deletion src/main/resources/application.properties

This file was deleted.

Loading