Skip to content
Open
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
4 changes: 1 addition & 3 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
# Stage 1: Сборка приложения
FROM maven:3.8.3-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
Expand All @@ -10,5 +9,4 @@ RUN mvn package -Dmaven.test.skip=true
FROM openjdk:17
WORKDIR /app
COPY --from=build /app/target/QuickProjectApp-0.0.1-SNAPSHOT.jar /app/QuickProjectApp.jar
CMD ["java", "-jar", "QuickProjectApp.jar"]

CMD ["java", "-jar", "QuickProjectApp.jar"]
116 changes: 116 additions & 0 deletions backend/QuickProject.postman_collection.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
{
"info": {
"_postman_id": "71a90115-759d-4f6b-93e0-a28d0c86f1fd",
"name": "QuickProject",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
"_exporter_id": "29891838"
},
"item": [
{
"name": "auth/register",
"request": {
"auth": {
"type": "noauth"
},
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\r\n \"email\" : \"ela@mail.ru\",\r\n \"password\" : \"1\",\r\n \"created_at\": \"2024-03-22T18:00:00\",\r\n \"tz\" : \"+3\",\r\n \"enable\" : true\r\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:8081/api/auth/register",
"protocol": "http",
"host": [
"localhost"
],
"port": "8081",
"path": [
"api",
"auth",
"register"
]
}
},
"response": []
},
{
"name": "New Request",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\r\n \"email\" : \"ela@mail.ru\",\r\n \"password\" : \"1\"\r\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:8081/api/auth/authenticate",
"protocol": "http",
"host": [
"localhost"
],
"port": "8081",
"path": [
"api",
"auth",
"authenticate"
]
}
},
"response": []
},
{
"name": "New Request",
"request": {
"auth": {
"type": "noauth"
},
"method": "GET",
"header": [],
"url": {
"raw": "http://localhost:8081/api/users",
"protocol": "http",
"host": [
"localhost"
],
"port": "8081",
"path": [
"api",
"users"
]
}
},
"response": []
},
{
"name": "New Request",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "http://localhost:8081/api/projects",
"protocol": "http",
"host": [
"localhost"
],
"port": "8081",
"path": [
"api",
"projects"
]
}
},
"response": []
}
]
}
14 changes: 7 additions & 7 deletions backend/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@ version: '3.8'

services:

dev_app:
pet_app:
image: pet:dev
container_name: dev_app
container_name: pet_app
build:
context: .
dockerfile: Dockerfile
depends_on:
dev_db:
pet_db:
condition: service_healthy
links:
- dev_db
- pet_db
environment:
WAIT_HOSTS: dev_db:5432
SPRING_PROFILES_ACTIVE: dev
SPRING_DATASOURCE_URL: jdbc:postgresql://dev_db:5432/pet
SPRING_DATASOURCE_URL: jdbc:postgresql://pet_db:5432/pet
SPRING_DATASOURCE_USERNAME: ${DB_USERNAME}
SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD}
SPRING_PARENT_DIRECTORY: /
Expand All @@ -26,9 +26,9 @@ services:
volumes:
- ${HOST_PARENT_DIRECTORY}:/pet

dev_db:
pet_db:
image: postgres
container_name: dev_db
container_name: pet_db
environment:
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
Expand Down
32 changes: 22 additions & 10 deletions backend/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.2</version>
<relativePath/>
<!-- lookup parent from repository --></parent>
<!-- lookup parent from repository -->
</parent>
<groupId>com.QuickProject</groupId>
<artifactId>QuickProjectApp</artifactId>
<version>0.0.1-SNAPSHOT</version>
Expand All @@ -33,7 +34,7 @@

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
Expand All @@ -49,15 +50,27 @@
</dependency>

<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>9.16.0</version>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
</dependency>

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
</dependency>

<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>9.16.0</version>
</dependency>

<dependency>
Expand All @@ -69,11 +82,10 @@
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.1</version>
<version>42.7.2</version>
</dependency>

<!-- Tests -->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.QuickProject.QuickProjectApp.auth;

import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/auth")
@RequiredArgsConstructor
public class AuthenticationController {

private final AuthenticationService service;

@PostMapping("/register")
public ResponseEntity<AuthenticationResponse> register(
@RequestBody RegisterRequest request
) {
return ResponseEntity.ok(service.register(request));
}


@PostMapping("/authenticate")
public ResponseEntity<AuthenticationResponse> authenticate(
@RequestBody AuthenticationRequest request
) {
return ResponseEntity.ok(service.authenticate(request));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.QuickProject.QuickProjectApp.auth;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.UUID;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class AuthenticationRequest {

private String email;

private String password;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.QuickProject.QuickProjectApp.auth;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class AuthenticationResponse {

private String token;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.QuickProject.QuickProjectApp.auth;

import com.QuickProject.QuickProjectApp.config.JwtService;
import com.QuickProject.QuickProjectApp.dao.UserRepository;
import com.QuickProject.QuickProjectApp.entity.user.Role;
import com.QuickProject.QuickProjectApp.entity.user.User;
import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AuthenticationService {

private final UserRepository repository;

private final JwtService jwtService;

private final PasswordEncoder passwordEncoder;

private final AuthenticationManager authenticationManager;

public AuthenticationResponse register(RegisterRequest request) {
var user = User.builder()
.email(request.getEmail())
.password(passwordEncoder.encode(request.getPassword()))
.role(Role.USER)
.created_at(request.getCreated_at())
.enable(request.isEnable())
.tz(request.getTz())
.build();
repository.save(user);
var jwtToken = jwtService.generateToken(user);
return AuthenticationResponse.builder()
.token(jwtToken)
.build();
}

public AuthenticationResponse authenticate(AuthenticationRequest request) {
authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
request.getEmail(),
request.getPassword()
)
);
var user = repository.findByEmail(request.getEmail()).orElseThrow();
var jwtToken = jwtService.generateToken(user);
return AuthenticationResponse.builder()
.token(jwtToken)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.QuickProject.QuickProjectApp.auth;


import com.QuickProject.QuickProjectApp.entity.user.Role;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RegisterRequest {

private String email;

private String password;

private LocalDateTime created_at;

private boolean enable;

private String tz;

private final Role user_role = Role.USER;
}
Loading