Index: pom.xml
===================================================================
--- pom.xml	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ pom.xml	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -34,4 +34,8 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
         <dependency>
Index: src/main/java/mk/ukim/finki/db/distributorapp/config/CustomUserDetailsService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/config/CustomUserDetailsService.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/java/mk/ukim/finki/db/distributorapp/config/CustomUserDetailsService.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,29 @@
+package mk.ukim.finki.db.distributorapp.config;
+
+import mk.ukim.finki.db.distributorapp.model.Users;
+import mk.ukim.finki.db.distributorapp.repository.UsersRepository;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CustomUserDetailsService implements UserDetailsService {
+
+    private final UsersRepository usersRepository;
+
+    public CustomUserDetailsService(UsersRepository usersRepository) {
+        this.usersRepository = usersRepository;
+    }
+
+    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+        Users user = this.usersRepository.findUserByUserEmailIgnoreCase(username).get();
+
+        if (user == null) {
+            throw new UsernameNotFoundException(username);
+        }
+
+        return user;
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/config/SecurityConfig.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/config/SecurityConfig.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/java/mk/ukim/finki/db/distributorapp/config/SecurityConfig.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,43 @@
+package mk.ukim.finki.db.distributorapp.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configurers.LogoutConfigurer;
+import org.springframework.security.web.SecurityFilterChain;
+
+@Configuration
+@EnableWebSecurity
+public class SecurityConfig {
+
+    private final CustomUserDetailsService userDetailsService;
+
+    public SecurityConfig(CustomUserDetailsService userDetailsService) {
+        this.userDetailsService = userDetailsService;
+    }
+
+    @Bean
+    public DaoAuthenticationProvider authenticationProvider() {
+        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
+        authProvider.setUserDetailsService(userDetailsService);
+        return authProvider;
+    }
+
+    @Bean
+    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+        http
+                .authorizeHttpRequests(authorize -> authorize
+                        .requestMatchers("/login","/register").permitAll()
+                        .anyRequest().authenticated()
+                )
+                .formLogin(form -> form
+                        .loginPage("/login")
+                        .permitAll()
+                )
+                .logout(LogoutConfigurer::permitAll);
+
+        return http.build();
+    }
+}
Index: c/main/java/mk/ukim/finki/db/distributorapp/encryption/PassEncryption.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/encryption/PassEncryption.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,58 +1,0 @@
-package mk.ukim.finki.db.distributorapp.encryption;
-
-import org.springframework.stereotype.Component;
-
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.spec.PBEKeySpec;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.spec.InvalidKeySpecException;
-import java.util.Arrays;
-import java.util.Base64;
-import java.util.Random;
-
-@Component
-public class PassEncryption {
-    private static final Random random = new SecureRandom();
-    private static final String characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-    private static final int iterations = 20000;
-    private static final int keyLength = 256;
-
-    public static String genSaltValue(int length) {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < length; i++) {
-            sb.append(characters.charAt(random.nextInt(characters.length())));
-        }
-
-        return new String(sb);
-    }
-
-    public static byte[] hash(char[] password, byte[] salt) {
-        PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, keyLength);
-        Arrays.fill(password, Character.MIN_VALUE);
-        try {
-            SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
-            return skf.generateSecret(spec).getEncoded();
-        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
-            throw new AssertionError("Error while hashing a password: " + e.getMessage(), e);
-        } finally {
-            spec.clearPassword();
-        }
-    }
-
-    public static String generateSecurePassword(String password, String salt){
-        String res = null;
-        byte[] securePassword = hash(password.toCharArray(),salt.getBytes());
-
-        res = Base64.getEncoder().encodeToString(securePassword);
-        return res;
-    }
-
-    public boolean verifyUserPassword(String providedPassword, String securedPassword, String salt){
-        boolean res = false;
-        String newSecuredPassword = generateSecurePassword(securedPassword,salt);
-        res = newSecuredPassword.equals(securedPassword);
-
-        return res;
-    }
-}
Index: src/main/java/mk/ukim/finki/db/distributorapp/model/Users.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/model/Users.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/model/Users.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -5,4 +5,10 @@
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+import java.util.List;
 
 @Entity
@@ -11,5 +17,5 @@
 @Inheritance(strategy = InheritanceType.JOINED)
 @Data
-public class Users {
+public abstract class Users implements UserDetails {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -43,13 +49,37 @@
     private City city;
 
-    public Users(String name, String surname, String safePass, String email, String mobile, String saltValue, Boolean active, String image) {
-        this.user_name = name;
-        this.user_surname = surname;
-        this.user_password = safePass;
-        this.user_email = email;
-        this.user_mobile = mobile;
-        this.user_salt = saltValue;
-        this.user_active = active;
-        this.user_image = image;
+    @Override
+    public String getUsername() {
+        return user_email;
+    }
+
+    @Override
+    public String getPassword() {
+        return user_password;
+    }
+
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        return List.of(new SimpleGrantedAuthority("ROLE_"+this.getClass().getSimpleName()));
+    }
+
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
     }
 }
Index: src/main/java/mk/ukim/finki/db/distributorapp/repository/ArticleRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/repository/ArticleRepository.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/repository/ArticleRepository.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -16,5 +16,6 @@
     @Query(
             nativeQuery = true,
-            value = "select * " +
+            value = "set search_path = \"IND0_185022\"; " +
+                    "select * " +
                     "from article"
     )
@@ -22,5 +23,6 @@
 
     @Query(
-            value = "select * " +
+            value = "set search_path = \"IND0_185022\"; " +
+                    "select * " +
                     "from article a " +
                     "where a.art_name like :name",
@@ -31,5 +33,6 @@
     @Query(
             nativeQuery = true,
-            value = "select * " +
+            value = "set search_path = \"IND0_185022\"; " +
+                    "select * " +
                     "from article a " +
                     "where a.art_id=:id"
@@ -41,5 +44,6 @@
     @Query(
             nativeQuery = true,
-            value = ""
+            value = "set search_path = \"IND0_185022\"; " +
+                    ""
     )
     Optional<Article> create(String name, Integer weight, Long ctg_id, Long man_id);
@@ -49,5 +53,6 @@
     @Query(
             nativeQuery = true,
-            value = ""
+            value = "set search_path = \"IND0_185022\"; " +
+                    ""
     )
     Optional<Article> edit(Long id, String name, Integer weight, Long ctg_id, Long man_id);
@@ -57,6 +62,7 @@
     @Query(
             nativeQuery = true,
-            value = ""
+            value = "set search_path = \"IND0_185022\"; " +
+                    ""
     )
-    void delete();
+    void delete(Long id);
 }
Index: src/main/java/mk/ukim/finki/db/distributorapp/repository/ArticleUnitRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/repository/ArticleUnitRepository.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/repository/ArticleUnitRepository.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -16,5 +16,6 @@
     @Query(
             nativeQuery = true,
-            value = ""
+            value = "set search_path = \"IND0_185022\"; " +
+                    ""
     )
     List<Article_Unit> listAll();
@@ -22,5 +23,6 @@
     @Query(
             nativeQuery = true,
-            value = ""
+            value = "set search_path = \"IND0_185022\"; " +
+                    ""
     )
     List<Article_Unit> findAllByName(@NonNull @Param("name") String name);
@@ -28,8 +30,14 @@
     @Query(
             nativeQuery = true,
-            value = ""
+            value = "set search_path = \"IND0_185022\"; " +
+                    ""
     )
     Optional<Article_Unit> findById(@NonNull @Param("id") Long id);
 
+    @Query(
+            nativeQuery = true,
+            value = "set search_path = \"IND0_185022\"; " +
+                    ""
+    )
     List<Article_Unit> findAllByWarehouse(Integer wh_id);
 
@@ -38,5 +46,6 @@
     @Query(
             nativeQuery = true,
-            value = ""
+            value = "set search_path = \"IND0_185022\"; " +
+                    ""
     )
     Optional<Article_Unit> create(
@@ -55,5 +64,6 @@
     @Query(
             nativeQuery = true,
-            value = ""
+            value = "set search_path = \"IND0_185022\"; " +
+                    ""
     )
     Optional<Article_Unit> edit(
@@ -73,6 +83,7 @@
     @Query(
             nativeQuery = true,
-            value = ""
+            value = "set search_path = \"IND0_185022\"; " +
+                    ""
     )
-    void delete();
+    void delete(Long id);
 }
Index: src/main/java/mk/ukim/finki/db/distributorapp/repository/CityRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/repository/CityRepository.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/repository/CityRepository.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -37,5 +37,5 @@
                     "where c.city_name like :name"
     )
-    Optional<City> findByName(@Param("name") String name);
+    List<City> findByName(@Param("name") String name);
 
     @Modifying
@@ -43,7 +43,8 @@
     @Query(
             nativeQuery = true,
-            value = ""
+            value = "set search_path  = \"IND0_185022\"; " +
+                    "insert into city(city_name) values (:name)"
     )
-    Optional<City> create(String name);
+    Optional<City> create(@Param("name") String name);
 
     @Modifying
@@ -51,5 +52,6 @@
     @Query(
             nativeQuery = true,
-            value = ""
+            value = "set search_path  = \"IND0_185022\"; " +
+                    ""
     )
     Optional<City> edit(Long id, String name);
Index: src/main/java/mk/ukim/finki/db/distributorapp/repository/UsersRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/repository/UsersRepository.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/repository/UsersRepository.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -38,5 +38,5 @@
     )
     Users create(String name, String surname, String password, String email,
-                 String mobile, String salt, Boolean active, String image);
+                 String mobile, String salt, Boolean active, String image, Long city_id);
 
     @Modifying
Index: src/main/java/mk/ukim/finki/db/distributorapp/security/PassEncryption.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/security/PassEncryption.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/java/mk/ukim/finki/db/distributorapp/security/PassEncryption.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,58 @@
+package mk.ukim.finki.db.distributorapp.security;
+
+import org.springframework.stereotype.Component;
+
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Random;
+
+@Component
+public class PassEncryption {
+    private static final Random random = new SecureRandom();
+    private static final String characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+    private static final int iterations = 20000;
+    private static final int keyLength = 256;
+
+    public static String genSaltValue(int length) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < length; i++) {
+            sb.append(characters.charAt(random.nextInt(characters.length())));
+        }
+
+        return new String(sb);
+    }
+
+    public static byte[] hash(char[] password, byte[] salt) {
+        PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, keyLength);
+        Arrays.fill(password, Character.MIN_VALUE);
+        try {
+            SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
+            return skf.generateSecret(spec).getEncoded();
+        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
+            throw new AssertionError("Error while hashing a password: " + e.getMessage(), e);
+        } finally {
+            spec.clearPassword();
+        }
+    }
+
+    public static String generateSecurePassword(String password, String salt){
+        String res = null;
+        byte[] securePassword = hash(password.toCharArray(),salt.getBytes());
+
+        res = Base64.getEncoder().encodeToString(securePassword);
+        return res;
+    }
+
+    public boolean verifyUserPassword(String providedPassword, String securedPassword, String salt){
+        boolean res = false;
+        String newSecuredPassword = generateSecurePassword(securedPassword,salt);
+        res = newSecuredPassword.equals(securedPassword);
+
+        return res;
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/security/PassEncryptionAdapter.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/security/PassEncryptionAdapter.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/java/mk/ukim/finki/db/distributorapp/security/PassEncryptionAdapter.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,30 @@
+//package mk.ukim.finki.db.distributorapp.security;
+//
+//import org.springframework.security.crypto.password.PasswordEncoder;
+//
+//public class PassEncryptionAdapter implements PasswordEncoder {
+//
+//    private final PassEncryption passEncryption;
+//
+//    public PassEncryptionAdapter(PassEncryption passEncryption) {
+//        this.passEncryption = passEncryption;
+//    }
+//
+//    @Override
+//    public String encode(CharSequence rawPassword) {
+//        String salt = this.passEncryption.
+//    }
+//
+//    @Override
+//    public boolean matches(CharSequence rawPassword, String encodedPassword) {
+//        String[] parts = encodedPassword.split(":");
+//        if(parts.length!=2){
+//            return false;
+//        }
+//
+//        String salt = parts[0];
+//        String storedPass = parts[1];
+//
+//        return passEncryption.verifyUserPassword(rawPassword.toString(),storedPass,salt);
+//    }
+//}
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/ArticleService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/ArticleService.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/ArticleService.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -12,9 +12,9 @@
     List<Article> getAllArticles();
 
-    Optional<Article> findById(long id);
+    Optional<Article> findById(Long id);
 
     List<Article> findAllByName(String name);
 
-    void deleteById(long id);
+    void deleteById(Long id);
 
     Optional<Article>editById(Article article);
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/CityService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/CityService.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/CityService.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -12,10 +12,10 @@
     Optional<City> getCityById(Long id);
 
-    Optional<City> createCity(String name);
+    Optional<City> create(String name);
 
-    Optional<City> updateCity(Long id, String name);
+    Optional<City> edit(Long id, String name);
 
     void delete(Long id);
 
-    Optional<City> searchCities(String text);
+    List<City> searchCities(String text);
 }
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/UsersService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/UsersService.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/UsersService.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -1,10 +1,13 @@
 package mk.ukim.finki.db.distributorapp.service;
 
+import mk.ukim.finki.db.distributorapp.model.City;
 import mk.ukim.finki.db.distributorapp.model.Users;
 import org.springframework.http.ResponseEntity;
 
+import java.util.Optional;
+
 public interface UsersService {
     Users register (String name, String surname, String email,
-                    String password, String mobile, String image);
+                    String password, String mobile, String image, City city);
 
     ResponseEntity<?> confirmEmail (String confirmationToken);
@@ -13,3 +16,5 @@
 
     String getUserSalt(String username);
+
+    Optional<Users> getUserByEmail(String email);
 }
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ArticleServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ArticleServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ArticleServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -6,8 +6,10 @@
 import mk.ukim.finki.db.distributorapp.repository.ArticleRepository;
 import mk.ukim.finki.db.distributorapp.service.ArticleService;
+import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Optional;
 
+@Service
 public class ArticleServiceImpl implements ArticleService {
     private final ArticleRepository articleRepository;
@@ -23,5 +25,5 @@
 
     @Override
-    public Optional<Article> findById(long id) {
+    public Optional<Article> findById(Long id) {
         return this.articleRepository.findById(id);
     }
@@ -33,5 +35,5 @@
 
     @Override
-    public void deleteById(long id) {
+    public void deleteById(Long id) {
         this.articleRepository.deleteById(id);
     }
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ArticleUnitServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ArticleUnitServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ArticleUnitServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -7,4 +7,5 @@
 import mk.ukim.finki.db.distributorapp.repository.ArticleUnitRepository;
 import mk.ukim.finki.db.distributorapp.service.ArticleUnitService;
+import org.springframework.stereotype.Service;
 
 import java.util.Date;
@@ -12,4 +13,5 @@
 import java.util.Optional;
 
+@Service
 public class ArticleUnitServiceImpl implements ArticleUnitService {
     private final ArticleUnitRepository articleUnitRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/CityServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/CityServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/CityServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -13,5 +13,5 @@
     private final CityRepository cityRepository;
 
-    public CityServiceImpl(CityService cityService, CityRepository cityRepository) {
+    public CityServiceImpl(CityRepository cityRepository) {
         this.cityRepository = cityRepository;
     }
@@ -28,10 +28,10 @@
 
     @Override
-    public Optional<City> createCity(String name) {
+    public Optional<City> create(String name) {
         return this.cityRepository.create(name);
     }
 
     @Override
-    public Optional<City> updateCity(Long id, String name) {
+    public Optional<City> edit(Long id, String name) {
         return this.cityRepository.edit(id, name);
     }
@@ -43,6 +43,6 @@
 
     @Override
-    public Optional<City> searchCities(String text) {
-        return Optional.empty();
+    public List<City> searchCities(String text) {
+        return this.cityRepository.findByName(text);
     }
 }
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/CustomerServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/CustomerServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/CustomerServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -4,4 +4,5 @@
 import mk.ukim.finki.db.distributorapp.repository.CustomerRepository;
 import mk.ukim.finki.db.distributorapp.service.CustomerService;
+import org.springframework.stereotype.Service;
 
 import java.time.LocalTime;
@@ -9,4 +10,5 @@
 import java.util.Optional;
 
+@Service
 public class CustomerServiceImpl implements CustomerService {
 
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/DeliveryServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/DeliveryServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/DeliveryServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -7,4 +7,5 @@
 import mk.ukim.finki.db.distributorapp.service.DeliveryService;
 import mk.ukim.finki.db.distributorapp.model.Driver;
+import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
@@ -13,4 +14,5 @@
 import java.util.Optional;
 
+@Service
 public class DeliveryServiceImpl implements DeliveryService {
     private final DeliveryRepository deliveryRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/DeliveryStatusServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/DeliveryStatusServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/DeliveryStatusServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -4,8 +4,10 @@
 import mk.ukim.finki.db.distributorapp.repository.DeliveryStatusRepository;
 import mk.ukim.finki.db.distributorapp.service.DeliveryStatusService;
+import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Optional;
 
+@Service
 public class DeliveryStatusServiceImpl implements DeliveryStatusService {
     private final DeliveryStatusRepository deliveryStatusRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/DriverServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/DriverServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/DriverServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -5,8 +5,10 @@
 import mk.ukim.finki.db.distributorapp.repository.DriverRepository;
 import mk.ukim.finki.db.distributorapp.service.DriverService;
+import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Optional;
 
+@Service
 public class DriverServiceImpl implements DriverService {
     private final DriverRepository driverRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ManagerServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ManagerServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ManagerServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -5,8 +5,10 @@
 import mk.ukim.finki.db.distributorapp.repository.ManagerRepository;
 import mk.ukim.finki.db.distributorapp.service.ManagerService;
+import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Optional;
 
+@Service
 public class ManagerServiceImpl implements ManagerService {
     private final ManagerRepository managerRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ManufacturerServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ManufacturerServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ManufacturerServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -4,8 +4,10 @@
 import mk.ukim.finki.db.distributorapp.repository.ManufacturerRepository;
 import mk.ukim.finki.db.distributorapp.service.ManufacturerService;
+import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Optional;
 
+@Service
 public class ManufacturerServiceImpl implements ManufacturerService {
     private final ManufacturerRepository manufacturerRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/OrderStatusServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/OrderStatusServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/OrderStatusServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -4,8 +4,10 @@
 import mk.ukim.finki.db.distributorapp.repository.OrderStatusRepository;
 import mk.ukim.finki.db.distributorapp.service.OrderStatusService;
+import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Optional;
 
+@Service
 public class OrderStatusServiceImpl implements OrderStatusService {
     private final OrderStatusRepository orderStatusRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/OrdersServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/OrdersServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/OrdersServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -8,4 +8,5 @@
 import mk.ukim.finki.db.distributorapp.repository.OrdersRepository;
 import mk.ukim.finki.db.distributorapp.service.OrdersService;
+import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
@@ -14,4 +15,5 @@
 import java.util.Optional;
 
+@Service
 public class OrdersServiceImpl implements OrdersService {
     private final OrdersRepository ordersRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/PriceServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/PriceServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/PriceServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -5,4 +5,5 @@
 import mk.ukim.finki.db.distributorapp.repository.PriceRepository;
 import mk.ukim.finki.db.distributorapp.service.PriceService;
+import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -11,4 +12,5 @@
 import java.util.Optional;
 
+@Service
 public class PriceServiceImpl implements PriceService {
     private final PriceRepository priceRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ProFormaServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ProFormaServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ProFormaServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -6,4 +6,5 @@
 import mk.ukim.finki.db.distributorapp.repository.ProFormaRepository;
 import mk.ukim.finki.db.distributorapp.service.ProFormaService;
+import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
@@ -11,4 +12,5 @@
 import java.util.Optional;
 
+@Service
 public class ProFormaServiceImpl implements ProFormaService {
     private final ProFormaRepository proFormaRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ProFormaStatusServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ProFormaStatusServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/ProFormaStatusServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -4,8 +4,10 @@
 import mk.ukim.finki.db.distributorapp.repository.ProFormaStatusRepository;
 import mk.ukim.finki.db.distributorapp.service.ProFormaStatusService;
+import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Optional;
 
+@Service
 public class ProFormaStatusServiceImpl implements ProFormaStatusService {
     private final ProFormaStatusRepository proFormaStatusRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/UsersServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/UsersServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/UsersServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -1,16 +1,19 @@
 package mk.ukim.finki.db.distributorapp.service.impl;
 
-import mk.ukim.finki.db.distributorapp.encryption.PassEncryption;
+import mk.ukim.finki.db.distributorapp.model.City;
 import mk.ukim.finki.db.distributorapp.model.Users;
 import mk.ukim.finki.db.distributorapp.model.exceptions.InvalidArgumentsException;
 import mk.ukim.finki.db.distributorapp.model.exceptions.InvalidUserCredentialsException;
+import mk.ukim.finki.db.distributorapp.repository.ConfirmationTokenRepository;
+import mk.ukim.finki.db.distributorapp.repository.UsersRepository;
 import mk.ukim.finki.db.distributorapp.security.ConfirmationToken;
 import mk.ukim.finki.db.distributorapp.security.EmailService;
-import mk.ukim.finki.db.distributorapp.repository.ConfirmationTokenRepository;
-import mk.ukim.finki.db.distributorapp.repository.UsersRepository;
+import mk.ukim.finki.db.distributorapp.security.PassEncryption;
 import mk.ukim.finki.db.distributorapp.service.UsersService;
 import org.springframework.http.ResponseEntity;
 import org.springframework.mail.SimpleMailMessage;
 import org.springframework.stereotype.Service;
+
+import java.util.Optional;
 
 @Service
@@ -33,4 +36,9 @@
 
     @Override
+    public Optional<Users> getUserByEmail(String email) {
+        return this.usersRepository.findUserByUserEmailIgnoreCase(email);
+    }
+
+    @Override
     public Users login(String username, String password) {
         if (username == null || username.isEmpty() || password == null || password.isEmpty()) {
@@ -44,9 +52,10 @@
 
     @Override
-    public Users register(String name, String surname, String email, String password, String mobile, String image) {
+    public Users register(String name, String surname, String email, String password, String mobile, String image, City city) {
         String saltValue = PassEncryption.genSaltValue(30);
         String safePass = PassEncryption.generateSecurePassword(password, saltValue);
-        Users user = new Users(name,surname,safePass, email, mobile, saltValue, false, image);
-        user.setUser_salt(saltValue);
+
+        this.usersRepository.create(name, surname, safePass, email, mobile, saltValue, false, image, city.getCity_id());
+        Users user = this.usersRepository.findUserByUserEmailIgnoreCase(email).orElseThrow(InvalidUserCredentialsException::new);
 
         ConfirmationToken confirmationToken = new ConfirmationToken(user);
@@ -61,5 +70,5 @@
         emailService.sendEmail(mailMessage);
 
-        return this.usersRepository.create(name, surname, safePass, email, mobile, saltValue, false, image);
+        return user;
     }
 
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/VehicleServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/VehicleServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/VehicleServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -6,4 +6,5 @@
 import mk.ukim.finki.db.distributorapp.repository.VehicleRepository;
 import mk.ukim.finki.db.distributorapp.service.VehicleService;
+import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
@@ -11,4 +12,5 @@
 import java.util.Optional;
 
+@Service
 public class VehicleServiceImpl implements VehicleService {
     private final VehicleRepository vehicleRepository;
Index: src/main/java/mk/ukim/finki/db/distributorapp/service/impl/WarehouseServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/service/impl/WarehouseServiceImpl.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/service/impl/WarehouseServiceImpl.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -5,8 +5,10 @@
 import mk.ukim.finki.db.distributorapp.repository.WarehouseRepository;
 import mk.ukim.finki.db.distributorapp.service.WarehouseService;
+import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Optional;
 
+@Service
 public class WarehouseServiceImpl implements WarehouseService {
     private final WarehouseRepository warehouseRepository;
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/controller/ArticleController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/ArticleController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,29 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.controller;
-
-import mk.ukim.finki.db.distributorapp.model.Article;
-import mk.ukim.finki.db.distributorapp.service.ArticleService;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import java.util.List;
-
-@Controller
-public class ArticleController {
-    private final ArticleService articleService;
-
-    public ArticleController(ArticleService articleService) {
-        this.articleService = articleService;
-    }
-
-    @GetMapping
-    public String getProductPage(@RequestParam(required = false) String error, Model model){
-        if(error != null && !error.isEmpty()){
-            model.addAttribute("hasError", true);
-            model.addAttribute("error", error);
-        }
-
-        List<Article> articles = this.articleService.findAll();
-    }
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/controller/ArticleUnitController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/ArticleUnitController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.controller;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class ArticleUnitController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/controller/CategoryController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/CategoryController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.controller;
-
-import mk.ukim.finki.db.distributorapp.service.CategoryService;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-
-@Controller
-public class CategoryController {
-
-    private final CategoryService categoryService;
-
-    public CategoryController(CategoryService categoryService) {
-        this.categoryService = categoryService;
-    }
-
-    @GetMapping
-    public String getCategoriesPage(Model model){
-        model.addAttribute("bodyContent", "categories");
-        model.addAttribute("categories", categoryService.listCategories());
-        return "master-template";
-    }
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/controller/CityController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/CityController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.controller;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class CityController {
-}
Index: src/main/java/mk/ukim/finki/db/distributorapp/web/controller/CustomerController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/CustomerController.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/java/mk/ukim/finki/db/distributorapp/web/controller/CustomerController.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,17 @@
+package mk.ukim.finki.db.distributorapp.web.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/customer")
+public class CustomerController {
+
+    @GetMapping("/home")
+    public String customerHome(Model model) {
+        model.addAttribute("welcomeMessage", "Welcome Customer!");
+        return "customerHome";
+    }
+}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/controller/DeliveryController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/DeliveryController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.controller;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class DeliveryController {
-}
Index: src/main/java/mk/ukim/finki/db/distributorapp/web/controller/DriverController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/DriverController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/web/controller/DriverController.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -2,6 +2,16 @@
 
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
 
 @Controller
+@RequestMapping("/driver")
 public class DriverController {
+
+    @GetMapping("/home")
+    public String driverHome(Model model) {
+        model.addAttribute("welcomeMessage", "Welcome Driver!");
+        return "driverHome";
+    }
 }
Index: src/main/java/mk/ukim/finki/db/distributorapp/web/controller/HomeController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/HomeController.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/java/mk/ukim/finki/db/distributorapp/web/controller/HomeController.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,39 @@
+package mk.ukim.finki.db.distributorapp.web.controller;
+
+import mk.ukim.finki.db.distributorapp.model.Customer;
+import mk.ukim.finki.db.distributorapp.model.Driver;
+import mk.ukim.finki.db.distributorapp.model.Manager;
+import mk.ukim.finki.db.distributorapp.model.Users;
+import mk.ukim.finki.db.distributorapp.service.UsersService;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+public class HomeController {
+    private final UsersService usersService;
+
+    public HomeController(UsersService usersService) {
+        this.usersService = usersService;
+    }
+
+    @GetMapping
+    public String homePage(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        String username = authentication.getName();
+
+        Users user = usersService.getUserByEmail(username).get();
+
+        if(user instanceof Customer){
+            return "redirect:customer/home";
+        }else if(user instanceof Driver){
+            return "redirect:driver/home";
+        } else if (user instanceof Manager){
+            return "redirect:manager/home";
+        }
+
+        return "home";
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/web/controller/LoginController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/LoginController.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/java/mk/ukim/finki/db/distributorapp/web/controller/LoginController.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,39 @@
+package mk.ukim.finki.db.distributorapp.web.controller;
+
+import jakarta.servlet.http.HttpServletRequest;
+import mk.ukim.finki.db.distributorapp.model.Users;
+import mk.ukim.finki.db.distributorapp.model.exceptions.InvalidUserCredentialsException;
+import mk.ukim.finki.db.distributorapp.service.UsersService;
+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;
+
+@Controller
+@RequestMapping("/login")
+public class LoginController {
+    private final UsersService usersService;
+
+    public LoginController(UsersService usersService) {
+        this.usersService = usersService;
+    }
+
+    @GetMapping
+    public String getLoginPage() {
+        return "login";
+    }
+
+    @PostMapping
+    public String login(HttpServletRequest req, Model model) {
+        Users user = null;
+        try {
+            user = this.usersService.login(req.getParameter("email"), req.getParameter("password"));
+            return "redirect:/home";
+        } catch (InvalidUserCredentialsException e) {
+            model.addAttribute("hasError", true);
+            model.addAttribute("error", e.getMessage());
+            return "login";
+        }
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/web/controller/ManagerController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/ManagerController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ src/main/java/mk/ukim/finki/db/distributorapp/web/controller/ManagerController.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -2,6 +2,16 @@
 
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
 
 @Controller
+@RequestMapping("/manager")
 public class ManagerController {
+
+    @GetMapping("/home")
+    public String managerHome(Model model) {
+        model.addAttribute("welcomeMessage", "Welcome Manager!");
+        return "managerHome";
+    }
 }
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/controller/ManufacturerController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/ManufacturerController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.controller;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class ManufacturerController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/controller/OrdersController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/OrdersController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.controller;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class OrdersController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/controller/PriceController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/PriceController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.controller;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class PriceController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/controller/ProFormaController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/ProFormaController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.controller;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class ProFormaController {
-}
Index: src/main/java/mk/ukim/finki/db/distributorapp/web/controller/RegisterController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/RegisterController.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/java/mk/ukim/finki/db/distributorapp/web/controller/RegisterController.java	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,55 @@
+package mk.ukim.finki.db.distributorapp.web.controller;
+
+import mk.ukim.finki.db.distributorapp.model.City;
+import mk.ukim.finki.db.distributorapp.model.exceptions.InvalidArgumentsException;
+import mk.ukim.finki.db.distributorapp.service.CityService;
+import mk.ukim.finki.db.distributorapp.service.UsersService;
+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;
+
+@Controller
+@RequestMapping("/register")
+public class RegisterController {
+    private final UsersService usersService;
+    private final CityService cityService;
+
+    public RegisterController(UsersService usersService, CityService cityService) {
+        this.usersService = usersService;
+        this.cityService = cityService;
+    }
+
+    @GetMapping
+    public String getRegisterPage(@RequestParam(required = false) String error, Model model) {
+        if (error != null && !error.isEmpty()) {
+            model.addAttribute("hasError", true);
+            model.addAttribute("error", error);
+        }
+
+        model.addAttribute("bodyContent", "register");
+        model.addAttribute("cities", cityService.listCities());
+        return "register";
+    }
+
+    @PostMapping
+    public String register(
+            @RequestParam String email,
+            @RequestParam String password,
+            @RequestParam String repeatedPassword,
+            @RequestParam String name,
+            @RequestParam String surname,
+            @RequestParam String mobile,
+            @RequestParam Long city
+    ) {
+        try {
+            City selectedCity = this.cityService.getCityById(city).get();
+            this.usersService.register(name, surname, email, password, repeatedPassword, mobile, selectedCity);
+            return "redirect:/login";
+        } catch (InvalidArgumentsException exception) {
+            return "redirect:/register?error=" + exception.getMessage();
+        }
+    }
+}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/controller/VehicleController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/VehicleController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.controller;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class VehicleController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/controller/WarehouseController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/controller/WarehouseController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.controller;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class WarehouseController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/ArticleRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/ArticleRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class ArticleRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/ArticleUnitRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/ArticleUnitRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class ArticleUnitRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/CategoryRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/CategoryRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class CategoryRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/CityRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/CityRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class CityRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/CustomerRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/CustomerRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class CustomerRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/DeliveryRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/DeliveryRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class DeliveryRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/DriverRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/DriverRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class DriverRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/ManagerRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/ManagerRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,4 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-public class ManagerRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/ManufacturerRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/ManufacturerRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class ManufacturerRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/OrdersRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/OrdersRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class OrdersRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/PriceRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/PriceRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class PriceRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/ProFormaRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/ProFormaRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class ProFormaRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/UsersRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/UsersRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class UsersRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/VehicleRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/VehicleRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class VehicleRESTController {
-}
Index: c/main/java/mk/ukim/finki/db/distributorapp/web/rest/WarehouseRESTController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/web/rest/WarehouseRESTController.java	(revision 3b23f6a0ec0f0b099b84902857e6e814a117a72e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web.rest;
-
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class WarehouseRESTController {
-}
Index: src/main/resources/templates/customerHome.html
===================================================================
--- src/main/resources/templates/customerHome.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/resources/templates/customerHome.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Customer Home</title>
+</head>
+<body>
+<h1 th:text="${welcomeMessage}"></h1>
+<p>Customer-specific content goes here.</p>
+</body>
+</html>
Index: src/main/resources/templates/driverHome.html
===================================================================
--- src/main/resources/templates/driverHome.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/resources/templates/driverHome.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Driver Home</title>
+</head>
+<body>
+<h1 th:text="${welcomeMessage}"></h1>
+<p>Driver-specific content goes here.</p>
+</body>
+</html>
Index: src/main/resources/templates/home.html
===================================================================
--- src/main/resources/templates/home.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/resources/templates/home.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+
+</body>
+</html>
Index: src/main/resources/templates/login.html
===================================================================
--- src/main/resources/templates/login.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/resources/templates/login.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Login</title>
+</head>
+<body>
+<div class="container">
+    <form class="form-signin mt-xl-5" method="post" th:action="@{/login}">
+        <h2 class="form-signin-heading">Sign in</h2>
+        <p>
+            <label for="email" class="sr-only">Email</label>
+            <input type="email" id="email" class="form-control"
+                   placeholder="Email" required="" autofocus="">
+        </p>
+        <p>
+            <label for="password" class="sr-only">Password</label>
+            <input type="password" id="password" class="form-control"
+                   placeholder="Password" required="" autofocus="">
+        </p>
+
+        <div th:if="${param.error}" th:text="${param.error}" class="text-danger"></div>
+
+        <div class="row">
+            <div class="col-md-3">
+                <button id="submit" class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
+            </div>
+            <div class="col-md-3">
+                <a href="/register" class="btn btn-lg btn-block btn-light">Register here</a>
+            </div>
+        </div>
+    </form>
+</div>
+</body>
+</html>
Index: src/main/resources/templates/managerHome.html
===================================================================
--- src/main/resources/templates/managerHome.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/resources/templates/managerHome.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Manager Home</title>
+</head>
+<body>
+<h1 th:text="${welcomeMessage}"></h1>
+<p>Manager-specific content goes here.</p>
+</body>
+</html>
Index: src/main/resources/templates/register.html
===================================================================
--- src/main/resources/templates/register.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
+++ src/main/resources/templates/register.html	(revision 799c63b93e3f8f543dd2947aee951e1aa8414917)
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Register</title>
+</head>
+<body>
+<div class="container mb-4">
+    <form class="form-signin mt-xl-5" method="post" th:action="@{/register}">
+        <h2 class="form-signin-heading">Register</h2>
+        <p>
+            <label for="email" class="sr-only">Email: </label>
+            <input type="email" id="email" name="email" class="form-control"
+                   placeholder="Email" required="" autofocus="">
+        </p><br><br>
+        <p>
+            <label for="password" class="sr-only">Password: </label>
+            <input type="password" id="password" name="password" class="form-control"
+                   placeholder="Password" required="" autofocus="">
+        </p><br><br>
+        <p>
+            <label for="repeatedPassword" class="sr-only">Repeat Password: </label>
+            <input type="password" id="repeatedPassword" name="repeatPassword" class="form-control"
+                   placeholder="Repeat Password" required="" autofocus="">
+        </p><br><br>
+        <p>
+            <label for="name" class="sr-only">First Name: </label>
+            <input type="text" id="name" name="Name" class="form-control"
+                   placeholder="First Name" required="" autofocus="">
+        </p><br><br>
+        <p>
+            <label for="surname" class="sr-only">Last Name: </label>
+            <input type="text" id="surname" name="Surname" class="form-control"
+                   placeholder="Last Name" required="" autofocus="">
+        </p><br><br>
+        <p>
+            <label for="mobile" class="sr-only">Mobile: </label>
+            <input type="tel" id="mobile" name="Mobile" class="form-control"
+                   placeholder="Mobile" required="" autofocus="">
+        </p><br><br>
+        <p>
+            <label for="profileImage" class="sr-only">Profile Picture: </label>
+            <input type="file" id="profileImage" name="profileImage" accept="image/*">
+        </p><br><br>
+
+        <p>
+            <label for="city" class="sr-only">What city are you from? </label><br><br>
+            <select id="city" name="city" style="width: 300px;">
+                <option value="" disabled selected>Select a city</option>
+                <th:block th:each="city : ${cities}">
+                    <option th:value="${city.getCity_id()}" th:text="${city.getCity_name()}"></option>
+                </th:block>
+            </select>
+        </p>
+
+        <button type="submit">Register</button>
+    </form>
+</div>
+</body>
+</html>
