Index: src/main/java/com/wediscussmovies/project/model/Discussion.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/Discussion.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/model/Discussion.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -9,4 +9,5 @@
 @Data
 @Entity
+@Table (name="discussions")
 public class Discussion {
     @Id
@@ -35,6 +36,31 @@
     private Date date;
 
+    @Column(name = "type", nullable = false)
+    private DiscussionType type;
     @OneToMany
     private List<Reply> replies;
+
+    public Discussion() {
+    }
+
+    public Discussion(String title, String text, User user, Movie movie, Date valueOf) {
+        this.title = title;
+        this.text = text;
+        this.user = user;
+        this.date = valueOf;
+        this.movie = movie;
+        this.type = DiscussionType.M;
+    }
+
+    public Discussion(String title, String text, User user, Person person, Date valueOf) {
+        this.title = title;
+        this.text = text;
+        this.user = user;
+        this.date = valueOf;
+        this.person = person;
+        this.type = DiscussionType.P;
+    }
+
+
 }
 
Index: src/main/java/com/wediscussmovies/project/model/DiscussionType.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/DiscussionType.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
+++ src/main/java/com/wediscussmovies/project/model/DiscussionType.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -0,0 +1,5 @@
+package com.wediscussmovies.project.model;
+
+public enum DiscussionType {
+    M,P
+}
Index: src/main/java/com/wediscussmovies/project/model/Genre.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/Genre.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/model/Genre.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -3,11 +3,9 @@
 import lombok.Data;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
+import javax.persistence.*;
 
 @Data
-@Entity(name="genres")
+@Entity
+@Table(name="genres")
 public class Genre {
     @Id
Index: src/main/java/com/wediscussmovies/project/model/Movie.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/Movie.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/model/Movie.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -8,5 +8,6 @@
 import java.util.List;
 @Data
-@Entity(name="movies")
+@Entity
+@Table (name="movies")
 public class Movie {
     @Id
@@ -61,4 +62,7 @@
     public static Comparator<Movie> comparatorTitle = Comparator.comparing(Movie::getTitle);
 
+    public Movie() {
+    }
+
     public Movie(String title, String description, String image_url, Date airing_date, float imdb_rating, Person director, List<Person> actors, List<Genre> genres) {
         Title = title;
Index: src/main/java/com/wediscussmovies/project/model/PasswordEncoder.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/PasswordEncoder.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
+++ src/main/java/com/wediscussmovies/project/model/PasswordEncoder.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -0,0 +1,36 @@
+package com.wediscussmovies.project.model;
+
+
+import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class PasswordEncoder {
+    public static byte[] getSHA(String input) throws NoSuchAlgorithmException
+    {
+        MessageDigest md = MessageDigest.getInstance("SHA-512");
+
+        return md.digest(input.getBytes(StandardCharsets.UTF_8));
+    }
+
+    public static String toHexString(byte[] hash)
+    {
+        BigInteger number = new BigInteger(1, hash);
+
+        StringBuilder hexString = new StringBuilder(number.toString(16));
+
+        while (hexString.length() < 32)
+        {
+            hexString.insert(0, '0');
+        }
+
+        return hexString.toString();
+    }
+
+    public static String getEncodedPasswordString(String password) throws NoSuchAlgorithmException {
+        return toHexString(getSHA(password));
+    }
+
+}
+
Index: src/main/java/com/wediscussmovies/project/model/Person.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/Person.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/model/Person.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -5,8 +5,10 @@
 import javax.persistence.*;
 import java.sql.Date;
+import java.util.Comparator;
 import java.util.List;
 
 @Data
-@Entity(name="persons")
+@Entity
+@Table(name="persons")
 public class Person {
     @Id
@@ -34,4 +36,18 @@
     @ManyToMany
     private List<Movie> acts_in;
+
+    public Person(String name, String surname, PersonType personType, Date date_of_birth, String image_url, String description) {
+        this.name = name;
+        this.surname = surname;
+        this.personType = personType;
+        this.date_of_birth = date_of_birth;
+        this.image_url = image_url;
+        this.description = description;
+    }
+
+    public Person() {
+    }
+
+    public static Comparator<Person> personComparatorByNameSurname = Comparator.comparing(Person::getName).thenComparing(Person::getSurname);
 }
 
Index: src/main/java/com/wediscussmovies/project/model/Reply.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/Reply.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/model/Reply.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -5,7 +5,9 @@
 import javax.persistence.*;
 import java.sql.Date;
+import java.util.Optional;
 
 @Data
-@Entity(name="replies")
+@Entity
+@Table(name="replies")
 public class Reply {
     @Id
@@ -27,4 +29,11 @@
     @Column(name= "text", length = 1000, nullable = false)
     private String text;
+
+    public Reply(Discussion discussion, User user, Date date, String text) {
+        this.discussion = discussion;
+        this.user = user;
+        this.date = date;
+        this.text = text;
+    }
 }
 
Index: src/main/java/com/wediscussmovies/project/model/User.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/User.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/model/User.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -7,5 +7,6 @@
 
 @Data
-@Entity(name="users")
+@Entity
+@Table(name="users")
 public class User {
     @Id
@@ -36,4 +37,14 @@
     private List<Genre> likes_genres;
 
+    public User(String username, String name, String surname, String email, String password) {
+        this.username = username;
+        this.name = name;
+        this.surname = surname;
+        this.email = email;
+        this.password = password;
+    }
+
+    public User() {
+    }
 }
 
Index: src/main/java/com/wediscussmovies/project/model/exception/InvalidUserCredentialsException.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/exception/InvalidUserCredentialsException.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
+++ src/main/java/com/wediscussmovies/project/model/exception/InvalidUserCredentialsException.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -0,0 +1,7 @@
+package com.wediscussmovies.project.model.exception;
+
+public class InvalidUserCredentialsException extends RuntimeException{
+    public InvalidUserCredentialsException(String username) {
+        super("The user with the username {" + username +"} cannot be authenticated.");
+    }
+}
Index: src/main/java/com/wediscussmovies/project/model/exception/PasswordsDontMatchException.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/exception/PasswordsDontMatchException.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
+++ src/main/java/com/wediscussmovies/project/model/exception/PasswordsDontMatchException.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -0,0 +1,7 @@
+package com.wediscussmovies.project.model.exception;
+
+public class PasswordsDontMatchException extends RuntimeException{
+    public PasswordsDontMatchException() {
+        super("The passwords you provided did not match.");
+    }
+}
Index: src/main/java/com/wediscussmovies/project/model/exception/UserWithEmailAlreadyExists.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/exception/UserWithEmailAlreadyExists.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
+++ src/main/java/com/wediscussmovies/project/model/exception/UserWithEmailAlreadyExists.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -0,0 +1,7 @@
+package com.wediscussmovies.project.model.exception;
+
+public class UserWithEmailAlreadyExists extends RuntimeException{
+    public UserWithEmailAlreadyExists(String email) {
+        super("User with the email {" + email +"} is already registered");
+    }
+}
Index: src/main/java/com/wediscussmovies/project/model/exception/UserWithUsernameAlreadyExists.java
===================================================================
--- src/main/java/com/wediscussmovies/project/model/exception/UserWithUsernameAlreadyExists.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
+++ src/main/java/com/wediscussmovies/project/model/exception/UserWithUsernameAlreadyExists.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -0,0 +1,7 @@
+package com.wediscussmovies.project.model.exception;
+
+public class UserWithUsernameAlreadyExists extends RuntimeException{
+    public UserWithUsernameAlreadyExists(String username) {
+        super("User with the username " + username + " is already registered");
+    }
+}
Index: src/main/java/com/wediscussmovies/project/repository/DiscussionRepository.java
===================================================================
--- src/main/java/com/wediscussmovies/project/repository/DiscussionRepository.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/repository/DiscussionRepository.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -5,5 +5,8 @@
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface DiscussionRepository extends JpaRepository<Discussion, Integer> {
+    public List<Discussion> findAllByTitleLike(String title);
 }
Index: src/main/java/com/wediscussmovies/project/repository/PersonRepository.java
===================================================================
--- src/main/java/com/wediscussmovies/project/repository/PersonRepository.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/repository/PersonRepository.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -13,4 +13,6 @@
 public interface PersonRepository extends JpaRepository<Person, Integer> {
     public List<Person> findAllByPersonType(PersonType type);
+    public List<Person> findAllByPersonTypeAndNameLike(PersonType type, String name);
+    public List<Person> findAllByPersonTypeAndSurnameLike(PersonType type, String surname);
     public Optional<Person> findPersonByPerson_idAndPersonType(Integer id, PersonType type);
 }
Index: src/main/java/com/wediscussmovies/project/repository/UserRepository.java
===================================================================
--- src/main/java/com/wediscussmovies/project/repository/UserRepository.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/repository/UserRepository.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -5,5 +5,12 @@
 import org.springframework.stereotype.Repository;
 
+import java.util.EnumMap;
+import java.util.Optional;
+
 @Repository
 public interface UserRepository extends JpaRepository<User, Integer> {
+    public Optional<User> findByEmailAndPassword(String email, String password);
+    public Optional<User> findByUsernameAndPassword(String email, String password);
+    public Optional<User> findByUsername(String username);
+    public Optional<User> findByEmail(String email);
 }
Index: src/main/java/com/wediscussmovies/project/service/DiscussionService.java
===================================================================
--- src/main/java/com/wediscussmovies/project/service/DiscussionService.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/service/DiscussionService.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -1,4 +1,13 @@
 package com.wediscussmovies.project.service;
 
+import com.wediscussmovies.project.model.Discussion;
+
+import java.util.List;
+import java.util.Optional;
+
 public interface DiscussionService {
+    List<Discussion> listAll();
+    List<Discussion> listAllByTitle(String title);
+    Optional<Discussion> findById(Integer id);
+    void save(Discussion discussion);
 }
Index: src/main/java/com/wediscussmovies/project/service/PersonService.java
===================================================================
--- src/main/java/com/wediscussmovies/project/service/PersonService.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/service/PersonService.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -9,5 +9,12 @@
     public List<Person> findAllDirectors();
     public List<Person> findAllActors();
+    Optional<Person> findById(Integer person_id);
     Optional<Person> findActorById(Integer id);
     Optional<Person> findDirectorById(Integer id);
+    boolean save(Person person);
+    List<Person> findActorsByNameLike(String name);
+    List<Person> findActorsBySurnameLike(String surname);
+    List<Person> findDirectorsByNameLike(String name);
+    List<Person> findDirectorsBySurnameLike(String surname);
+
 }
Index: src/main/java/com/wediscussmovies/project/service/ReplyService.java
===================================================================
--- src/main/java/com/wediscussmovies/project/service/ReplyService.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/service/ReplyService.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -1,4 +1,11 @@
 package com.wediscussmovies.project.service;
 
+import com.wediscussmovies.project.model.Reply;
+
+import java.util.Optional;
+
 public interface ReplyService {
+    public Reply save(Reply r);
+    public void delete(Reply r);
+    Optional<Reply> findById(Integer id);
 }
Index: src/main/java/com/wediscussmovies/project/service/UserService.java
===================================================================
--- src/main/java/com/wediscussmovies/project/service/UserService.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/service/UserService.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -1,4 +1,11 @@
 package com.wediscussmovies.project.service;
 
+import com.wediscussmovies.project.model.User;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Optional;
+
 public interface UserService {
+    public Optional<User> login(String email, String password);
+    public Optional<User> register(HttpServletRequest request, String email, String password, String confirmPassword, String username, String name, String surname);
 }
Index: src/main/java/com/wediscussmovies/project/service/impl/DiscussionServiceImpl.java
===================================================================
--- src/main/java/com/wediscussmovies/project/service/impl/DiscussionServiceImpl.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
+++ src/main/java/com/wediscussmovies/project/service/impl/DiscussionServiceImpl.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -0,0 +1,38 @@
+package com.wediscussmovies.project.service.impl;
+
+import com.wediscussmovies.project.model.Discussion;
+import com.wediscussmovies.project.repository.DiscussionRepository;
+import com.wediscussmovies.project.service.DiscussionService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class DiscussionServiceImpl implements DiscussionService {
+    private final DiscussionRepository discussionRepository;
+
+    public DiscussionServiceImpl(DiscussionRepository discussionRepository) {
+        this.discussionRepository = discussionRepository;
+    }
+
+    @Override
+    public List<Discussion> listAll() {
+        return discussionRepository.findAll();
+    }
+
+    @Override
+    public void save(Discussion discussion) {
+        discussionRepository.save(discussion);
+    }
+
+    @Override
+    public Optional<Discussion> findById(Integer id) {
+        return discussionRepository.findById(id);
+    }
+
+    @Override
+    public List<Discussion> listAllByTitle(String title) {
+        return discussionRepository.findAllByTitleLike("%"+title+"%");
+    }
+}
Index: src/main/java/com/wediscussmovies/project/service/impl/PersonServiceImpl.java
===================================================================
--- src/main/java/com/wediscussmovies/project/service/impl/PersonServiceImpl.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/service/impl/PersonServiceImpl.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -28,4 +28,8 @@
     }
 
+    @Override
+    public Optional<Person> findById(Integer person_id) {
+        return personRepository.findById(person_id);
+    }
 
     @Override
@@ -38,3 +42,31 @@
         return personRepository.findAllByPersonType(PersonType.A);
     }
+
+    @Override
+    public boolean save(Person person) {
+        Person p = personRepository.save(person);
+        if(p != null)
+            return true;
+        return false;
+    }
+
+    @Override
+    public List<Person> findActorsByNameLike(String name) {
+        return personRepository.findAllByPersonTypeAndNameLike(PersonType.A, name);
+    }
+
+    @Override
+    public List<Person> findActorsBySurnameLike(String surname) {
+        return personRepository.findAllByPersonTypeAndSurnameLike(PersonType.A, surname);
+    }
+
+    @Override
+    public List<Person> findDirectorsByNameLike(String name) {
+        return personRepository.findAllByPersonTypeAndNameLike(PersonType.D, name);
+    }
+
+    @Override
+    public List<Person> findDirectorsBySurnameLike(String surname) {
+        return personRepository.findAllByPersonTypeAndSurnameLike(PersonType.D, surname);
+    }
 }
Index: src/main/java/com/wediscussmovies/project/service/impl/ReplyServiceImpl.java
===================================================================
--- src/main/java/com/wediscussmovies/project/service/impl/ReplyServiceImpl.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
+++ src/main/java/com/wediscussmovies/project/service/impl/ReplyServiceImpl.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -0,0 +1,32 @@
+package com.wediscussmovies.project.service.impl;
+
+import com.wediscussmovies.project.model.Reply;
+import com.wediscussmovies.project.repository.ReplyRepository;
+import com.wediscussmovies.project.service.ReplyService;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+
+@Service
+public class ReplyServiceImpl implements ReplyService {
+    private final ReplyRepository replyRepository;
+
+    public ReplyServiceImpl(ReplyRepository replyRepository) {
+        this.replyRepository = replyRepository;
+    }
+
+    @Override
+    public Optional<Reply> findById(Integer id) {
+        return replyRepository.findById(id);
+    }
+
+    @Override
+    public void delete(Reply r) {
+        replyRepository.delete(r);
+    }
+
+    @Override
+    public Reply save(Reply r) {
+        return replyRepository.save(r);
+    }
+}
Index: src/main/java/com/wediscussmovies/project/service/impl/UserServiceImpl.java
===================================================================
--- src/main/java/com/wediscussmovies/project/service/impl/UserServiceImpl.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
+++ src/main/java/com/wediscussmovies/project/service/impl/UserServiceImpl.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -0,0 +1,59 @@
+package com.wediscussmovies.project.service.impl;
+
+import com.wediscussmovies.project.model.User;
+import com.wediscussmovies.project.model.exception.PasswordsDontMatchException;
+import com.wediscussmovies.project.model.exception.UserWithEmailAlreadyExists;
+import com.wediscussmovies.project.model.exception.UserWithUsernameAlreadyExists;
+import com.wediscussmovies.project.repository.UserRepository;
+import com.wediscussmovies.project.service.UserService;
+import org.springframework.http.HttpRequest;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Optional;
+
+@Service
+public class UserServiceImpl implements UserService {
+    private final UserRepository userRepository;
+
+    public UserServiceImpl(UserRepository userRepository) {
+        this.userRepository = userRepository;
+    }
+
+    @Override
+    public Optional<User> login(String email, String password) {
+        Optional<User> userEmail = userRepository.findByEmailAndPassword(email, password);
+        Optional<User> userUsername = userRepository.findByUsernameAndPassword(email, password);
+        if(userEmail.isPresent())
+            return userEmail;
+        else if(userUsername.isPresent())
+            return userUsername;
+        else
+            return Optional.empty();
+    }
+
+    @Override
+    public Optional<User> register(HttpServletRequest request, String email, String password, String confirmPassword,
+                                   String username, String name, String surname) {
+        if(email == null || email.isEmpty() || password == null || password.isEmpty() ||
+                confirmPassword == null || confirmPassword.isEmpty() || username == null || username.isEmpty() ||
+                name == null || name.isEmpty() || surname == null || surname.isEmpty()) {
+            request.getSession().setAttribute("error", "Not all of the fields had a value in them, check again.");
+            return Optional.empty();
+        }
+            if(userRepository.findByUsername(username).isPresent()){
+            request.getSession().setAttribute("error", new UserWithUsernameAlreadyExists(username).getMessage());
+            return Optional.empty();
+        }
+        if(userRepository.findByEmail(email).isPresent()){
+            request.getSession().setAttribute("error", new UserWithEmailAlreadyExists(email).getMessage());
+            return Optional.empty();
+        }
+        if(!password.equals(confirmPassword)){
+            request.getSession().setAttribute("error", new PasswordsDontMatchException().getMessage());
+            return Optional.empty();
+        }
+        User user = new User(email, username, password, name, surname);
+        return Optional.of(userRepository.save(user));
+    }
+}
Index: src/main/java/com/wediscussmovies/project/web/controller/DiscussionsController.java
===================================================================
--- src/main/java/com/wediscussmovies/project/web/controller/DiscussionsController.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/web/controller/DiscussionsController.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -1,7 +1,143 @@
 package com.wediscussmovies.project.web.controller;
 
+import com.wediscussmovies.project.model.*;
+import com.wediscussmovies.project.service.DiscussionService;
+import com.wediscussmovies.project.service.MovieService;
+import com.wediscussmovies.project.service.PersonService;
+import com.wediscussmovies.project.service.ReplyService;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.sql.Date;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Optional;
 
 @Controller
+@RequestMapping("/discussions")
 public class DiscussionsController {
+    private final DiscussionService discussionService;
+    private final ReplyService replyService;
+    private final MovieService movieService;
+    private final PersonService personService;
+    public DiscussionsController(DiscussionService discussionService, ReplyService replyService, MovieService movieService, PersonService personService) {
+        this.discussionService = discussionService;
+        this.replyService = replyService;
+        this.movieService = movieService;
+        this.personService = personService;
+    }
+
+    @GetMapping("/")
+    public String getDiscussions(@RequestParam(required = false) String titleSearch,
+                                    Model model){
+        List<Discussion> discussions = discussionService.listAll();
+        if(titleSearch != null && !titleSearch.isEmpty()){
+            discussions = discussionService.listAllByTitle(titleSearch);
+        }
+        model.addAttribute("discussions", discussions);
+        model.addAttribute("contentTemplate", "discussionsList");
+        return "template";
+    }
+
+    @GetMapping("/{id}")
+    public String getDiscussion(
+            @PathVariable Integer id,
+            Model model){
+        Optional<Discussion> discussion = discussionService.findById(id);
+        if(discussion.isEmpty())
+            return "redirect:/discussions";
+        model.addAttribute("discussion", discussion);
+        model.addAttribute("contentTemplate", "discussionsDiscussion");
+        return "template";
+    }
+
+    @GetMapping("/{id}/reply")
+    public String getReplyToDiscussion(
+            @PathVariable Integer id,
+            Model model){
+        Optional<Discussion> discussion = discussionService.findById(id);
+        if(discussion.isEmpty())
+            return "redirect:/discussions";
+        model.addAttribute("discussion", discussion);
+        model.addAttribute("contentTemplate", "discussionsReply");
+        return "template";
+    }
+    @PostMapping("/{id}/reply/confirm")
+    public String getReplyToDiscussionConfirm(
+            @PathVariable Integer id,
+            @RequestParam String text,
+            HttpServletRequest request){
+        Optional<Discussion> discussion = discussionService.findById(id);
+        User user = (User) request.getSession().getAttribute("user");
+        if(user == null){
+            return "redirect:/login";
+        }
+        Date date = Date.valueOf(LocalDate.now());
+        if(discussion.isEmpty())
+            return "redirect:/discussions";
+        Reply reply = new Reply(discussion.get(), user, date, text);
+        replyService.save(reply);
+        return "redirect:/discussions/"+id;
+    }
+
+    @GetMapping("/movies/add/{id}")
+    public String getAddDiscussionForMovie(Model model,
+                                           @PathVariable Integer id,
+                                           HttpServletRequest request){
+        model.addAttribute("contentTemplate", "discussionsAdd");
+        request.setAttribute("movieId", id);
+        return "template";
+    }
+
+    @PostMapping("/movies/add/confirm")
+    public String getAddDiscussionMovieConfirm(Model model,
+                                               HttpServletRequest request,
+                                               @RequestParam String title,
+                                               @RequestParam String text){
+        User user = (User) request.getSession().getAttribute("user");
+        if(user == null){
+            return "redirect:/login";
+        }
+        Integer movie_id = (Integer) request.getSession().getAttribute("movieId");
+        request.getSession().setAttribute("movieId", null);
+        Optional<Movie> movieOp = movieService.findById(movie_id);
+        if(movieOp.isEmpty())
+            return "redirect:/movies";
+        Discussion discussion = new Discussion(title, text, user, movieOp.get(), Date.valueOf(LocalDate.now()));
+        discussionService.save(discussion);
+        return "redirect:/discussions";
+    }
+
+
+    @GetMapping("/persons/add/{id}")
+    public String getAddDiscussionForPerson(Model model,
+                                           @PathVariable Integer id,
+                                           HttpServletRequest request){
+        model.addAttribute("contentTemplate", "discussionsAdd");
+        request.setAttribute("personId", id);
+        return "template";
+    }
+
+    @PostMapping("/persons/add/confirm")
+    public String getAddDiscussionForPersonConfirm(Model model,
+                                               HttpServletRequest request,
+                                               @RequestParam String title,
+                                               @RequestParam String text){
+        User user = (User) request.getSession().getAttribute("user");
+        if(user == null){
+            return "redirect:/login";
+        }
+        Integer person_id = (Integer) request.getSession().getAttribute("personId");
+        Optional<Person> personOp = personService.findById(person_id);
+        request.getSession().setAttribute("personId", null);
+        if(personOp.isEmpty())
+            return "redirect:/discussions";
+        Discussion discussion = new Discussion(title, text, user, personOp.get(), Date.valueOf(LocalDate.now()));
+        discussionService.save(discussion);
+        return "redirect:/discussions";
+    }
+
+
 }
Index: src/main/java/com/wediscussmovies/project/web/controller/PersonsController.java
===================================================================
--- src/main/java/com/wediscussmovies/project/web/controller/PersonsController.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
+++ src/main/java/com/wediscussmovies/project/web/controller/PersonsController.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -0,0 +1,119 @@
+package com.wediscussmovies.project.web.controller;
+
+import com.wediscussmovies.project.model.Person;
+import com.wediscussmovies.project.model.PersonType;
+import com.wediscussmovies.project.service.PersonService;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.sql.Date;
+import java.util.List;
+
+@Controller
+@RequestMapping(".")
+public class PersonsController {
+    private final PersonService personSerivce;
+
+    public PersonsController(PersonService personSerivce) {
+        this.personSerivce = personSerivce;
+    }
+
+    @GetMapping("/actors")
+    public String getActorsPage(Model model, @RequestParam(required = false) String nameAndSurname){
+        List<Person> actors = personSerivce.findAllActors();
+        if(nameAndSurname != null && !nameAndSurname.isEmpty()){
+            String [] parts = nameAndSurname.split(" ");
+            String name = parts[0];
+            String surname = "";
+            if(parts.length > 1)
+                surname = parts[1];
+            List<Person> actorsByName = personSerivce.findActorsByNameLike("%"+name+"%");
+            if(!surname.isEmpty()){
+                List<Person> actorsBySurname = personSerivce.findActorsBySurnameLike("%"+surname+"%");
+                for(Person p: actorsBySurname){
+                    boolean add = true;
+                    for(Person a: actorsByName){
+                        if(a.getPerson_id() == p.getPerson_id()){
+                            add=false;
+                            break;
+                        }
+                    }
+                    if(!add)
+                        continue;
+                    actorsByName.add(p);
+                }
+            }
+            actors = actorsByName;
+        }
+        actors.sort(Person.personComparatorByNameSurname);
+        model.addAttribute("actors", actors);
+        model.addAttribute("contentTemplate", "actorsList");
+        return "template";
+    }
+
+    @GetMapping("/directors")
+    public String getDirectorsPage(Model model, @RequestParam(required = false) String nameAndSurname){
+        List<Person> directors = personSerivce.findAllDirectors();
+        if(nameAndSurname != null && !nameAndSurname.isEmpty()){
+            String [] parts = nameAndSurname.split(" ");
+            String name = parts[0];
+            String surname = "";
+            if(parts.length > 1)
+                surname = parts[1];
+            List<Person> directorsByName = personSerivce.findDirectorsByNameLike("%"+name+"%");
+            if(!surname.isEmpty()){
+                List<Person> directorsBySurname = personSerivce.findDirectorsBySurnameLike("%"+surname+"%");
+                for(Person p: directorsBySurname){
+                    boolean add = true;
+                    for(Person a: directorsByName){
+                        if(a.getPerson_id() == p.getPerson_id()){
+                            add=false;
+                            break;
+                        }
+                    }
+                    if(!add)
+                        continue;
+                    directorsByName.add(p);
+                }
+            }
+            directors = directorsByName;
+        }
+        directors.sort(Person.personComparatorByNameSurname);
+        model.addAttribute("directors", directors);
+        model.addAttribute("contentTemplate", "directorsList");
+        return "template";
+    }
+
+    @GetMapping("/persons/add")
+    public String getPersonsAddPage(Model model){
+        PersonType [] types = PersonType.values();
+        model.addAttribute("types", types);
+        model.addAttribute("contentTemplate", "personsAdd");
+        return "template";
+    }
+
+    @PostMapping("/persons/add/confirm")
+    public String confirmPersonsAdd(
+            @RequestParam String name,
+            @RequestParam String surname,
+            @RequestParam PersonType type,
+            @RequestParam Date date_of_birth,
+            @RequestParam String image_url,
+            @RequestParam String description){
+        Person person = new Person(name, surname, type, date_of_birth, image_url, description);
+        if(personSerivce.save(person)){
+            String toWhere = "actors";
+            if(type == PersonType.D)
+                toWhere = "directors";
+            return "redirect:/"+toWhere;
+        }
+        else{
+            return "redirect:/persons/add";
+        }
+    }
+
+}
Index: src/main/java/com/wediscussmovies/project/web/controller/ReplyController.java
===================================================================
--- src/main/java/com/wediscussmovies/project/web/controller/ReplyController.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
+++ src/main/java/com/wediscussmovies/project/web/controller/ReplyController.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -0,0 +1,41 @@
+package com.wediscussmovies.project.web.controller;
+
+import com.wediscussmovies.project.model.Reply;
+import com.wediscussmovies.project.service.ReplyService;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.Optional;
+
+public class ReplyController {
+    private final ReplyService replyService;
+
+    public ReplyController(ReplyService replyService) {
+        this.replyService = replyService;
+    }
+
+    @GetMapping("/edit/{id}")
+    public String getReplyEdit(@PathVariable Integer id, Model model){
+        Optional<Reply> reply = replyService.findById(id);
+        if(reply.isEmpty())
+            return "redirect:/movies";
+        model.addAttribute("reply", reply.get());
+        model.addAttribute("templateContext", "replyEdit");
+        return "template";
+    }
+
+    @PostMapping("/edit/confirm/{id}")
+    public String getReplyEdit(@PathVariable Integer id, @RequestParam String text){
+        Optional<Reply> replyOp = replyService.findById(id);
+        if(replyOp.isEmpty())
+            return "redirect:/discussions";
+        Reply reply = replyOp.get();
+        replyService.delete(reply);
+        reply.setText(text);
+        replyService.save(reply);
+        return "redirect:/discussions/"+reply.getDiscussion().getDiscussion_id();
+    }
+}
Index: src/main/java/com/wediscussmovies/project/web/controller/UserController.java
===================================================================
--- src/main/java/com/wediscussmovies/project/web/controller/UserController.java	(revision 7a0bf79dedf74d33b1f9bb8ce17b562e420e1fc6)
+++ src/main/java/com/wediscussmovies/project/web/controller/UserController.java	(revision 2a5d6a3d7e82fe6a72290f16b30ecfbbd8df2c98)
@@ -1,7 +1,76 @@
 package com.wediscussmovies.project.web.controller;
 
+import com.wediscussmovies.project.model.User;
+import com.wediscussmovies.project.model.exception.InvalidUserCredentialsException;
+import com.wediscussmovies.project.service.UserService;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Optional;
 
 @Controller
+@RequestMapping("/")
 public class UserController {
+    private final UserService userService;
+
+    public UserController(UserService userService) {
+        this.userService = userService;
+    }
+
+    @GetMapping("/login")
+    public String getLoginPage(){
+       return "login";
+    }
+
+    @PostMapping("/login/confirm")
+    public String confirmLogin(HttpServletRequest request, Model model){
+        Optional<User> user;
+        try{
+            user = this.userService.login(request.getParameter("username"), request.getParameter("password"));
+            request.getSession().setAttribute("user", user);
+            request.getSession().setAttribute("loggedIn",true);
+            return "redirect:/movies";
+        }
+        catch (InvalidUserCredentialsException ex){
+            model.addAttribute("hasError", true);
+            model.addAttribute("error", ex.getMessage());
+            return "login";
+        }
+    }
+
+    @GetMapping("/register")
+    public String getRegisterPage(){
+        return "register";
+    }
+
+    @PostMapping("/login/confirm")
+    public String confirmRegister(HttpServletRequest request,
+                                  @RequestParam String username,
+                                  @RequestParam String email,
+                                  @RequestParam String password,
+                                  @RequestParam String confirmPassword,
+                                  @RequestParam String name,
+                                  @RequestParam String surname){
+        Optional<User> user;
+        user = this.userService.register(request, email, password, confirmPassword, username, name, surname);
+        if(user.isEmpty()){
+            request.setAttribute("hasError", "true");
+        }else{
+            request.setAttribute("hasError", "false");
+        }
+        request.getSession().setAttribute("user", user.get());
+        request.getSession().setAttribute("loggedIn",true);
+        return "redirect:/movies";
+    }
+
+    @GetMapping
+    public String logout(HttpServletRequest request){
+        request.getSession().invalidate();
+        return "redirect:/login";
+    }
 }
