Skip to content

Commit c781472

Browse files
committed
made a user service
1 parent 765e1e1 commit c781472

File tree

13 files changed

+305
-4
lines changed

13 files changed

+305
-4
lines changed

src/main/java/mate/academy/Main.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,29 @@
22

33
import java.time.LocalDate;
44
import java.time.LocalDateTime;
5+
import mate.academy.lib.Injector;
56
import mate.academy.model.CinemaHall;
67
import mate.academy.model.Movie;
78
import mate.academy.model.MovieSession;
9+
import mate.academy.model.User;
810
import mate.academy.service.CinemaHallService;
911
import mate.academy.service.MovieService;
1012
import mate.academy.service.MovieSessionService;
13+
import mate.academy.service.UserService;
1114

1215
public class Main {
16+
private static final Injector injector
17+
= Injector.getInstance("mate.academy");
18+
1319
public static void main(String[] args) {
14-
MovieService movieService = null;
20+
UserService userService = (UserService) injector.getInstance(UserService.class);
21+
User user = new User();
22+
user.setEmail("username@.com");
23+
user.setPassword("password1111");
24+
userService.add(user);
1525

26+
MovieService movieService
27+
= (MovieService) injector.getInstance(MovieService.class);
1628
Movie fastAndFurious = new Movie("Fast and Furious");
1729
fastAndFurious.setDescription("An action film about street racing, heists, and spies.");
1830
movieService.add(fastAndFurious);
@@ -27,7 +39,8 @@ public static void main(String[] args) {
2739
secondCinemaHall.setCapacity(200);
2840
secondCinemaHall.setDescription("second hall with capacity 200");
2941

30-
CinemaHallService cinemaHallService = null;
42+
CinemaHallService cinemaHallService
43+
= (CinemaHallService) injector.getInstance(CinemaHallService.class);
3144
cinemaHallService.add(firstCinemaHall);
3245
cinemaHallService.add(secondCinemaHall);
3346

@@ -44,7 +57,8 @@ public static void main(String[] args) {
4457
yesterdayMovieSession.setMovie(fastAndFurious);
4558
yesterdayMovieSession.setShowTime(LocalDateTime.now().minusDays(1L));
4659

47-
MovieSessionService movieSessionService = null;
60+
MovieSessionService movieSessionService
61+
= (MovieSessionService) injector.getInstance(MovieSessionService.class);
4862
movieSessionService.add(tomorrowMovieSession);
4963
movieSessionService.add(yesterdayMovieSession);
5064

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package mate.academy.dao;
2+
3+
import java.util.Optional;
4+
import mate.academy.model.User;
5+
6+
public interface UserDao {
7+
User add(User user);
8+
9+
Optional<User> findByEmail(String email);
10+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package mate.academy.dao.impl;
2+
3+
import java.util.Optional;
4+
import mate.academy.dao.UserDao;
5+
import mate.academy.exception.DataProcessingException;
6+
import mate.academy.lib.Dao;
7+
import mate.academy.model.User;
8+
import mate.academy.util.HibernateUtil;
9+
import org.hibernate.Session;
10+
import org.hibernate.Transaction;
11+
12+
@Dao
13+
public class UserDaoImpl implements UserDao {
14+
15+
@Override
16+
public User add(User user) {
17+
Transaction transaction = null;
18+
Session session = null;
19+
try {
20+
session = HibernateUtil.getSessionFactory().openSession();
21+
transaction = session.beginTransaction();
22+
session.persist(user);
23+
transaction.commit();
24+
return user;
25+
} catch (Exception e) {
26+
if (transaction != null) {
27+
transaction.rollback();
28+
}
29+
throw new DataProcessingException("Can not insert user " + user, e);
30+
} finally {
31+
if (session != null) {
32+
session.close();
33+
}
34+
}
35+
}
36+
37+
@Override
38+
public Optional<User> findByEmail(String email) {
39+
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
40+
return session.createQuery("from User u where u.email = :email", User.class)
41+
.setParameter("email", email)
42+
.uniqueResultOptional();
43+
} catch (Exception e) {
44+
throw new DataProcessingException("Can't get a user by email " + email, e);
45+
}
46+
}
47+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package mate.academy.exception;
2+
3+
public class AuthenticationException extends Exception {
4+
public AuthenticationException(String message) {
5+
super(message);
6+
}
7+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package mate.academy.exception;
2+
3+
public class RegistrationException extends Exception {
4+
public RegistrationException(String message) {
5+
super(message);
6+
}
7+
8+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package mate.academy.model;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.GeneratedValue;
5+
import jakarta.persistence.GenerationType;
6+
import jakarta.persistence.Id;
7+
import jakarta.persistence.Table;
8+
9+
@Entity
10+
@Table(name = "users")
11+
public class User {
12+
@Id
13+
@GeneratedValue(strategy = GenerationType.IDENTITY)
14+
private Long id;
15+
private String email;
16+
private String password;
17+
private byte[] salt;
18+
19+
public User() {
20+
}
21+
22+
public Long getId() {
23+
return id;
24+
}
25+
26+
public void setId(Long id) {
27+
this.id = id;
28+
}
29+
30+
public String getEmail() {
31+
return email;
32+
}
33+
34+
public void setEmail(String email) {
35+
this.email = email;
36+
}
37+
38+
public String getPassword() {
39+
return password;
40+
}
41+
42+
public void setPassword(String password) {
43+
this.password = password;
44+
}
45+
46+
public byte[] getSalt() {
47+
return salt;
48+
}
49+
50+
public void setSalt(byte[] salt) {
51+
this.salt = salt;
52+
}
53+
54+
@Override
55+
public String toString() {
56+
return "User{"
57+
+ "id=" + id
58+
+ ", email='" + email + '\''
59+
+ ", password='" + password + '\''
60+
+ '}';
61+
}
62+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package mate.academy.security;
2+
3+
import mate.academy.exception.AuthenticationException;
4+
import mate.academy.exception.RegistrationException;
5+
import mate.academy.model.User;
6+
7+
public interface AuthenticationService {
8+
User login(String email, String password) throws AuthenticationException;
9+
10+
User register(String email, String password) throws RegistrationException;
11+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package mate.academy.security.impl;
2+
3+
import java.util.Optional;
4+
import mate.academy.exception.AuthenticationException;
5+
import mate.academy.exception.RegistrationException;
6+
import mate.academy.lib.Inject;
7+
import mate.academy.model.User;
8+
import mate.academy.security.AuthenticationService;
9+
import mate.academy.service.UserService;
10+
import mate.academy.util.HashUtil;
11+
12+
public class AuthenticationServiceImpl implements AuthenticationService {
13+
private final UserService userService;
14+
15+
@Inject
16+
public AuthenticationServiceImpl(UserService userService) {
17+
this.userService = userService;
18+
}
19+
20+
@Override
21+
public User login(String email, String password) throws AuthenticationException {
22+
Optional<User> userOptional = userService.findByEmail(email);
23+
if (userOptional.isEmpty()) {
24+
throw new AuthenticationException("Incorrect email or password");
25+
}
26+
User user = userOptional.get();
27+
String hashedPassword = HashUtil.hashPassword(password, user.getSalt());
28+
if (!hashedPassword.equals(user.getPassword())) {
29+
throw new AuthenticationException("Incorrect email or password");
30+
}
31+
return user;
32+
}
33+
34+
@Override
35+
public User register(String email, String password) throws RegistrationException {
36+
if (userService.findByEmail(email).isPresent()) {
37+
throw new RegistrationException("Email already in use");
38+
}
39+
User user = new User();
40+
user.setEmail(email);
41+
user.setPassword(password);
42+
return userService.add(user);
43+
}
44+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package mate.academy.service;
2+
3+
import java.util.Optional;
4+
import mate.academy.model.User;
5+
6+
public interface UserService {
7+
User add(User user);
8+
9+
Optional<User> findByEmail(String email);
10+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package mate.academy.service.impl;
2+
3+
import java.util.Optional;
4+
import mate.academy.dao.UserDao;
5+
import mate.academy.lib.Inject;
6+
import mate.academy.lib.Service;
7+
import mate.academy.model.User;
8+
import mate.academy.service.UserService;
9+
import mate.academy.util.HashUtil;
10+
11+
@Service
12+
public class UserServiceImpl implements UserService {
13+
@Inject
14+
private UserDao userDao;
15+
16+
public UserServiceImpl(UserDao userDao) {
17+
this.userDao = userDao;
18+
}
19+
20+
public UserServiceImpl() {
21+
}
22+
23+
@Override
24+
public User add(User user) {
25+
user.setSalt(HashUtil.getSalt());
26+
user.setPassword(HashUtil.hashPassword(user.getPassword(), user.getSalt()));
27+
return userDao.add(user);
28+
}
29+
30+
@Override
31+
public Optional<User> findByEmail(String email) {
32+
return userDao.findByEmail(email);
33+
}
34+
}

0 commit comments

Comments
 (0)