Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/config/JwtAuthFilter.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/config/JwtAuthFilter.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/config/JwtAuthFilter.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -44,8 +44,4 @@
                 token.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
 
-//                SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
-//                securityContext.setAuthentication(token);
-//                SecurityContextHolder.setContext(securityContext);
-
                 SecurityContextHolder.getContext().setAuthentication(token);
             }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/config/SecurityConfiguration.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/config/SecurityConfiguration.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/config/SecurityConfiguration.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -2,5 +2,4 @@
 
 import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.Role;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -25,5 +24,4 @@
 
     private final JwtAuthFilter jwtAuthFilter;
-    //private final UserService userService;
     private final UserDetailsService userDetailsService;
 
@@ -31,9 +29,7 @@
     public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
         http.csrf(AbstractHttpConfigurer::disable)
-                .authorizeHttpRequests(request -> request.requestMatchers("/api/auth/**")
-                        .permitAll()
-                        .requestMatchers("/api/admin").hasAnyAuthority(Role.ROLE_ADMIN.name())
-                        .requestMatchers("/api/job-seeker").hasAnyAuthority(Role.ROLE_JOBSEEKER.name())
-                        .requestMatchers("/api/recruiter").hasAnyAuthority(Role.ROLE_RECRUITER.name())
+                .authorizeHttpRequests(request -> request
+                        .requestMatchers("/api/job-advertisements/all","/api/job-advertisements/view/**","/api/recruiter/info/**", "/api/auth/**").permitAll()
+                        //.requestMatchers("/api/job-advertisements/**").hasAnyAuthority(Role.ROLE_RECRUITER.name())
                         .anyRequest().authenticated())
                 .sessionManagement(manager -> manager.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/AdminController.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/AdminController.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/AdminController.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -2,6 +2,4 @@
 
 import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -12,8 +10,3 @@
 public class AdminController {
 
-
-    @GetMapping
-    public ResponseEntity<String> sayHello() {
-        return ResponseEntity.ok("Hi Admin");
-    }
 }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/AuthController.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/AuthController.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/AuthController.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -12,8 +12,8 @@
 import org.springframework.web.bind.annotation.*;
 
-@CrossOrigin(origins = "*")
 @RestController
 @RequestMapping("/api/auth")
 @AllArgsConstructor
+@CrossOrigin(origins = "*")
 public class AuthController {
 
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/JobAdvertisementController.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/JobAdvertisementController.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/JobAdvertisementController.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,58 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.controllers;
+
+
+import lombok.AllArgsConstructor;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdvertisementDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.JobAdvertisement;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.JobAdvertisementService;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/job-advertisements")
+@AllArgsConstructor
+@CrossOrigin(origins = "*")
+public class JobAdvertisementController {
+
+    private final JobAdvertisementService jobAdvertisementService;
+
+    @PostMapping("/add")
+    public ResponseEntity<?> addJobAdvertisement(@RequestBody JobAdvertisementDTO jobAdvertisementDTO) {
+        JobAdDetailsDTO jobAdDetailsDTO = jobAdvertisementService.addJobAdvertisement(jobAdvertisementDTO);
+        return new ResponseEntity<>(jobAdDetailsDTO, HttpStatus.OK);
+    }
+
+    @PutMapping("/edit/{id}")
+    public ResponseEntity<?> editJobAdvertisement(@PathVariable Long id, @RequestBody JobAdvertisementDTO JobAdvertisementDTO) {
+        JobAdDetailsDTO jobAdDetailsDTO = jobAdvertisementService.editJobAdvertisement(id, JobAdvertisementDTO);
+        return new ResponseEntity<>(jobAdDetailsDTO, HttpStatus.OK);
+    }
+
+    @DeleteMapping("/delete/{id}")
+    public ResponseEntity<?> deleteJobAdvertisement(@PathVariable Long id) {
+        jobAdvertisementService.deleteJobAdvertisement(id);
+        return new ResponseEntity<>("Job Advertisement with id: "+ id + "deleted.", HttpStatus.OK);
+    }
+
+    @GetMapping("/recruiter/{id}")
+    public ResponseEntity<?> findALlJobAdvertisementsByRecruiterId(@PathVariable Long id) {
+        List<JobAdDetailsDTO> jobAdDetailsDTOS = jobAdvertisementService.findAllJobAdvertisementsByRecruiterId(id);
+        return new ResponseEntity<>(jobAdDetailsDTOS, HttpStatus.OK);
+    }
+
+    @GetMapping("/all")
+    public ResponseEntity<?> findAllJobAdvertisements() {
+        List<JobAdDetailsDTO> jobAdDetailsDTOS = jobAdvertisementService.findAllJobAdvertisements();
+        return new ResponseEntity<>(jobAdDetailsDTOS, HttpStatus.OK);
+    }
+
+    @GetMapping("/view/{id}")
+    public ResponseEntity<?> findJobAdvertisementById(@PathVariable Long id) {
+        JobAdDetailsDTO jobAdDetailsDTO = jobAdvertisementService.findJobAdvertisementById(id);
+        return new ResponseEntity<>(jobAdDetailsDTO, HttpStatus.OK);
+    }
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/JobSeekerController.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/JobSeekerController.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/JobSeekerController.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -2,5 +2,6 @@
 
 
-import lombok.RequiredArgsConstructor;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -8,5 +9,6 @@
 @RestController
 @RequestMapping("/api/job-seeker")
-@RequiredArgsConstructor
+@AllArgsConstructor
+@CrossOrigin(origins = "*")
 public class JobSeekerController {
 }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/RecruiterController.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/RecruiterController.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/RecruiterController.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -1,18 +1,23 @@
 package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.controllers;
 
-import lombok.RequiredArgsConstructor;
+import lombok.AllArgsConstructor;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO.RecruiterDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.RecruiterService;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 @RestController
 @RequestMapping("/api/recruiter")
-@RequiredArgsConstructor
+@AllArgsConstructor
+@CrossOrigin(origins = "*")
 public class RecruiterController {
 
-    @GetMapping
-    public ResponseEntity<String> sayHello() {
-        return ResponseEntity.ok("Hi Recruiter");
+    private final RecruiterService recruiterService;
+
+    @GetMapping("/info/{id}")
+    public ResponseEntity<?> getRecruiterDetailsById(@PathVariable("id") Long id) {
+        RecruiterDetailsDTO recruiterDetailsDTO = recruiterService.getRecruiterDetailsById(id);
+        return new ResponseEntity<>(recruiterDetailsDTO, HttpStatus.OK);
     }
 }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/enumerations/EmploymentStatus.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/enumerations/EmploymentStatus.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/enumerations/EmploymentStatus.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,5 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations;
+
+public enum EmploymentStatus {
+    FULL_TIME, PART_TIME
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/enumerations/JobType.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/enumerations/JobType.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/enumerations/JobType.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,5 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations;
+
+public enum JobType {
+    JOB, INTERNSHIP
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/DTO/JobAdDetailsDTO.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/DTO/JobAdDetailsDTO.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/DTO/JobAdDetailsDTO.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,21 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class JobAdDetailsDTO {
+    private String recruiterName;
+    private Long recruiterId;
+    private final Long id;
+    private String title;
+    private String description;
+    private String industry;
+    private int startingSalary;
+    private String postedOn;
+    private String activeUntil;
+    private boolean isActive;
+    private String jobType;
+    private String employmentStatus;
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/DTO/JobAdvertisementDTO.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/DTO/JobAdvertisementDTO.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/DTO/JobAdvertisementDTO.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,21 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class JobAdvertisementDTO {
+    private String email;
+    private String title;
+    private String description;
+    private String industry;
+    private int startingSalary;
+    private String activeUntil;
+    private String jobType;
+    private String employmentStatus;
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/JobAdvertisement.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/JobAdvertisement.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/JobAdvertisement.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,79 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements;
+
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.EmploymentStatus;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.JobType;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.User;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Entity
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@Table(name = "job_advertisements")
+public class JobAdvertisement {
+
+    public JobAdvertisement(User recruiter, String title, String description, String industry, int startingSalary, LocalDate activeUntil, JobType jobType, EmploymentStatus employmentStatus) {
+        this.recruiter = recruiter;
+        this.title = title;
+        this.description = description;
+        this.industry = industry;
+        this.startingSalary = startingSalary;
+        this.postedOn = LocalDateTime.now();
+        this.activeUntil = activeUntil;
+        this.isActive = true;
+        this.jobType = jobType;
+        this.employmentStatus = employmentStatus;
+    }
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @ManyToOne
+    private User recruiter;
+
+    private String title;
+    private String description;
+    private String industry;
+    private int startingSalary;
+    private LocalDateTime postedOn;
+    private LocalDate activeUntil;
+    private boolean isActive;
+
+    @Enumerated(EnumType.STRING)
+    JobType jobType;
+
+    @Enumerated(EnumType.STRING)
+    EmploymentStatus employmentStatus;
+
+    public boolean isJobAdActive() {
+        LocalDate date = LocalDate.now();
+        return date.isBefore(activeUntil);
+    }
+
+    public static JobAdDetailsDTO mapToJobAdDetailsDTO(JobAdvertisement jobAdvertisement) {
+
+        return new JobAdDetailsDTO(
+                jobAdvertisement.getRecruiter().getName(),
+                jobAdvertisement.getRecruiter().getId(),
+                jobAdvertisement.getId(),
+                jobAdvertisement.getTitle(),
+                jobAdvertisement.getDescription(),
+                jobAdvertisement.getIndustry(),
+                jobAdvertisement.getStartingSalary(),
+                jobAdvertisement.getPostedOn().toString(),
+                jobAdvertisement.getActiveUntil().toString(),
+                jobAdvertisement.isJobAdActive(),
+                jobAdvertisement.getJobType().name(),
+                jobAdvertisement.getEmploymentStatus().name()
+        );
+    }
+
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/Admin.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/Admin.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/Admin.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -4,20 +4,19 @@
 import jakarta.persistence.Table;
 import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
 @Entity
-//@Data
-//@NoArgsConstructor
-//@AllArgsConstructor
-//@Builder
+@Data
+@NoArgsConstructor
 @Table(name = "admins")
 public class Admin extends User {
+
+//    private String name;
+//    private String surname;
+
     @Override
     public String getName() {
         return "Admin";
     }
-//    private String name;
-//    private String surname;
 }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/DTO/JwtAuthResponse.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/DTO/JwtAuthResponse.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/DTO/JwtAuthResponse.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -10,4 +10,5 @@
 @NoArgsConstructor
 public class JwtAuthResponse {
+    private Long id;
     private String email;
     private String name;
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/DTO/RecruiterDetailsDTO.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/DTO/RecruiterDetailsDTO.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/DTO/RecruiterDetailsDTO.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,15 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RecruiterDetailsDTO {
+    private String email;
+    private String companyName;
+    private String companyDescription;
+    private String phoneNumber;
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/JobSeeker.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/JobSeeker.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/JobSeeker.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -5,5 +5,4 @@
 import jakarta.persistence.Table;
 import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -14,5 +13,4 @@
 @NoArgsConstructor
 @AllArgsConstructor
-@Builder
 @Table(name = "job_seekers")
 public class JobSeeker extends User {
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/User.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/User.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/User.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -15,9 +15,9 @@
 
 @Entity
-@Inheritance(strategy = InheritanceType.JOINED)
-@Table(name = "users")
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
+@Inheritance(strategy = InheritanceType.JOINED)
+@Table(name = "users")
 public abstract class User implements UserDetails {
 
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/mappers/JobSeekerMapper.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/mappers/JobSeekerMapper.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/mappers/JobSeekerMapper.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -26,4 +26,3 @@
     }
 
-
 }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/mappers/RecruiterMapper.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/mappers/RecruiterMapper.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/users/mappers/RecruiterMapper.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -2,4 +2,5 @@
 
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO.RecruiterDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO.RecruiterDetailsDTO;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.Recruiter;
 
@@ -11,4 +12,13 @@
                 recruiter.getPassword(),
                 recruiter.getCompanyName(),
+                recruiter.getPhoneNumber()
+        );
+    }
+
+    public static RecruiterDetailsDTO mapToRecruiterDetailsDTO(Recruiter recruiter) {
+        return new RecruiterDetailsDTO(
+                recruiter.getEmail(),
+                recruiter.getCompanyName(),
+                recruiter.getCompanyDescription(),
                 recruiter.getPhoneNumber()
         );
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/JobAdvertisementRepository.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/JobAdvertisementRepository.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/JobAdvertisementRepository.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,11 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories;
+
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.JobAdvertisement;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface JobAdvertisementRepository extends JpaRepository<JobAdvertisement, Long> {
+    List<JobAdvertisement> findAllByRecruiterId(Long id);
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/RecruiterRepository.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/RecruiterRepository.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/RecruiterRepository.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -2,6 +2,8 @@
 
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.Recruiter;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.mappers.RecruiterMapper;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 public interface RecruiterRepository extends JpaRepository<Recruiter, Long> {
+    Recruiter findRecruiterByEmail(String email);
 }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/AuthServiceImpl.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/AuthServiceImpl.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/AuthServiceImpl.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -31,5 +31,4 @@
     private final JwtService jwtService;
 
-
     @Override
     public User signUpJobSeeker(JobSeeker jobSeeker) {
@@ -50,5 +49,5 @@
         String refreshJwt = jwtService.generateRefreshToken(new HashMap<>(), user);
 
-        return new JwtAuthResponse(user.getEmail(), user.getName(), user.getRole().name(), jwt, refreshJwt);
+        return new JwtAuthResponse(user.getId(), user.getEmail(), user.getName(), user.getRole().name(), jwt, refreshJwt);
     }
     
@@ -59,5 +58,5 @@
             String jwt = jwtService.generateToken(user);
 
-            return new JwtAuthResponse(user.getEmail(), user.getName(), user.getRole().name(), jwt, refreshTokenRequest.getToken());
+            return new JwtAuthResponse(user.getId(), user.getEmail(), user.getName(), user.getRole().name(), jwt, refreshTokenRequest.getToken());
         }
         return null;
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/JobAdvertisementServiceImpl.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/JobAdvertisementServiceImpl.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/JobAdvertisementServiceImpl.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,102 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.EmploymentStatus;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.JobType;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdvertisementDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.JobAdvertisement;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.User;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.JobAdvertisementRepository;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.UserRepository;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.JobAdvertisementService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class JobAdvertisementServiceImpl implements JobAdvertisementService {
+    private final UserRepository userRepository;
+    private final JobAdvertisementRepository jobAdvertisementRepository;
+
+    @Override
+    public JobAdDetailsDTO addJobAdvertisement(JobAdvertisementDTO jobAdvertisementDTO) {
+        User recruiter = userRepository.findByEmail(jobAdvertisementDTO.getEmail()).orElseThrow(() -> new IllegalArgumentException("User not found"));
+        JobAdvertisement jobAdvertisement = new JobAdvertisement(
+                recruiter,
+                jobAdvertisementDTO.getTitle(),
+                jobAdvertisementDTO.getDescription(),
+                jobAdvertisementDTO.getIndustry(),
+                jobAdvertisementDTO.getStartingSalary(),
+                LocalDate.parse(jobAdvertisementDTO.getActiveUntil()),
+                JobType.valueOf(jobAdvertisementDTO.getJobType()),
+                EmploymentStatus.valueOf(jobAdvertisementDTO.getEmploymentStatus())
+                );
+        jobAdvertisementRepository.save(jobAdvertisement);
+        return JobAdvertisement.mapToJobAdDetailsDTO(jobAdvertisement);
+    }
+
+    @Override
+    public JobAdDetailsDTO editJobAdvertisement(Long id, JobAdvertisementDTO jobAdvertisementDTO) {
+        JobAdvertisement jobAdvertisement = jobAdvertisementRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Job Advertisement not found"));
+        jobAdvertisement.setTitle(jobAdvertisementDTO.getTitle());
+        jobAdvertisement.setDescription(jobAdvertisementDTO.getDescription());
+        jobAdvertisement.setIndustry(jobAdvertisementDTO.getIndustry());
+        jobAdvertisement.setStartingSalary(jobAdvertisementDTO.getStartingSalary());
+        jobAdvertisement.setActiveUntil(LocalDate.parse(jobAdvertisementDTO.getActiveUntil()));
+        jobAdvertisement.setActive(jobAdvertisement.isJobAdActive());
+        jobAdvertisement.setJobType(JobType.valueOf(jobAdvertisementDTO.getJobType()));
+        jobAdvertisement.setEmploymentStatus(EmploymentStatus.valueOf(jobAdvertisementDTO.getEmploymentStatus()));
+        jobAdvertisementRepository.save(jobAdvertisement);
+        return JobAdvertisement.mapToJobAdDetailsDTO(jobAdvertisement);
+    }
+
+    @Override
+    public void deleteJobAdvertisement(Long jobAdvertisementId) {
+        jobAdvertisementRepository.deleteById(jobAdvertisementId);
+    }
+
+    @Override
+    public List<JobAdDetailsDTO> findAllJobAdvertisements() {
+        List<JobAdvertisement> jobAdvertisementList = jobAdvertisementRepository.findAll();
+        jobAdvertisementList.forEach(jobAdvertisement -> {
+            if (!jobAdvertisement.isJobAdActive() && jobAdvertisement.isActive()) {
+                jobAdvertisement.setActive(false);
+                jobAdvertisementRepository.save(jobAdvertisement);
+            } else if (jobAdvertisement.isJobAdActive() && !jobAdvertisement.isActive()) {
+                jobAdvertisement.setActive(true);
+                jobAdvertisementRepository.save(jobAdvertisement);
+            }
+        });
+
+        return jobAdvertisementList.stream()
+                .map(JobAdvertisement::mapToJobAdDetailsDTO)
+                .toList();
+    }
+
+    @Override
+    public List<JobAdDetailsDTO> findAllJobAdvertisementsByRecruiterId(Long recruiterId) {
+        List<JobAdvertisement> jobAdvertisementList = jobAdvertisementRepository.findAllByRecruiterId(recruiterId);
+//        jobAdvertisementList.forEach(jobAdvertisement -> {
+//            if (!jobAdvertisement.isJobAdActive() && jobAdvertisement.isActive()) {
+//                jobAdvertisement.setActive(false);
+//                jobAdvertisementRepository.save(jobAdvertisement);
+//            } else if (jobAdvertisement.isJobAdActive() && !jobAdvertisement.isActive()) {
+//                jobAdvertisement.setActive(true);
+//                jobAdvertisementRepository.save(jobAdvertisement);
+//            }
+//        });
+
+        return jobAdvertisementList.stream()
+                .map(JobAdvertisement::mapToJobAdDetailsDTO)
+                .toList();
+    }
+    @Override
+    public JobAdDetailsDTO findJobAdvertisementById(Long id) {
+        JobAdvertisement jobAdvertisement = jobAdvertisementRepository.findById(id).orElse(null);
+        return JobAdvertisement.mapToJobAdDetailsDTO(jobAdvertisement);
+    }
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/JwtServiceImpl.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/JwtServiceImpl.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/JwtServiceImpl.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -41,8 +41,4 @@
     }
 
-    public String extractUsername(String token) {
-        return extractClaim(token, Claims::getSubject);
-    }
-
     private Claims extractAllClaims(String token) {
         return Jwts.parserBuilder().setSigningKey(getSigninKey()).build().parseClaimsJws(token).getBody();
@@ -54,4 +50,10 @@
     }
 
+    @Override
+    public String extractUsername(String token) {
+        return extractClaim(token, Claims::getSubject);
+    }
+
+    @Override
     public boolean isTokenValid(String token, UserDetails userDetails) {
         final String username = extractUsername(token);
@@ -59,6 +61,6 @@
     }
 
-
-    private boolean isTokenExpired(String token) {
+    @Override
+    public boolean isTokenExpired(String token) {
         return extractClaim(token, Claims::getExpiration).before(new Date());
     }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/RecruiterServiceImpl.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/RecruiterServiceImpl.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/RecruiterServiceImpl.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,22 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO.RecruiterDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.Recruiter;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.mappers.RecruiterMapper;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.RecruiterRepository;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.RecruiterService;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class RecruiterServiceImpl implements RecruiterService {
+
+    private final RecruiterRepository recruiterRepository;
+
+    @Override
+    public RecruiterDetailsDTO getRecruiterDetailsById(Long recruiterId) {
+        Recruiter recruiter = recruiterRepository.findById(recruiterId).orElse(null);
+        return RecruiterMapper.mapToRecruiterDetailsDTO(recruiter);
+    }
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/UserServiceImpl.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/UserServiceImpl.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/UserServiceImpl.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -1,64 +1,11 @@
 package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.impl;
 
-import lombok.AllArgsConstructor;
-import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.JobSeekerRepository;
-import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.RecruiterRepository;
-import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.UserRepository;
-import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.JwtService;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.crypto.password.PasswordEncoder;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.UserService;
 
 @Service
-@AllArgsConstructor
+@RequiredArgsConstructor
+public class UserServiceImpl implements UserService {
 
-public class UserServiceImpl  {
-    private final UserRepository userRepository;
-    private final RecruiterRepository recruiterRepository;
-    private final JobSeekerRepository jobSeekerRepository;
-    private final PasswordEncoder passwordEncoder;
-    private final AuthenticationManager authenticationManager;
-    private final JwtService jwtService;
-
-
-//    @Override
-//    public User registerJobSeeker(JobSeeker jobSeeker) {
-//        jobSeeker.setPassword(passwordEncoder.encode(jobSeeker.getPassword()));
-//        return jobSeekerRepository.save(jobSeeker);
-//    }
-//
-//    @Override
-//    public User registerRecruiter(Recruiter recruiter) {
-//        recruiter.setPassword(passwordEncoder.encode(recruiter.getPassword()));
-//        return recruiterRepository.save(recruiter);
-//    }
-//
-//    @Override
-//    public JwtAuthenticationResponse login(JwtAuthenticationRequest jwtAuthenticationRequest) {
-//        authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(jwtAuthenticationRequest.getEmail(), jwtAuthenticationRequest.getPassword()));
-//
-//        var user = userRepository.findByEmail(jwtAuthenticationRequest.getEmail()).orElseThrow(() -> new IllegalArgumentException("Email or password is incorrect"));
-//        var jwt = jwtService.generateToken(user);
-//        var refreshToken = jwtService.generateRefreshToken(new HashMap<>(), user);
-//
-//        JwtAuthenticationResponse jwtAuthenticationResponse = new JwtAuthenticationResponse();
-//        jwtAuthenticationResponse.setToken(jwt);
-//        jwtAuthenticationResponse.setRefreshToken(refreshToken);
-//        return jwtAuthenticationResponse;
-//    }
-//
-//    @Override
-//    public JwtAuthenticationResponse refreshToken(RefreshTokenRequest refreshTokenRequest) {
-//        String userEmail = jwtService.extractUsername(refreshTokenRequest.getToken());
-//        User user = userRepository.findByEmail(userEmail).orElseThrow();
-//        if(jwtService.isTokenValid(refreshTokenRequest.getToken(), user)) {
-//            var jwt = jwtService.generateToken(user);
-//
-//            JwtAuthenticationResponse jwtAuthenticationResponse = new JwtAuthenticationResponse();
-//            jwtAuthenticationResponse.setToken(jwt);
-//            jwtAuthenticationResponse.setRefreshToken(refreshTokenRequest.getToken());
-//            return jwtAuthenticationResponse;
-//        }
-//        return null;
-//    }
 }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/JobAdvertisementService.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/JobAdvertisementService.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/JobAdvertisementService.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,20 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef;
+
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdvertisementDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.JobAdvertisement;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface JobAdvertisementService {
+    JobAdDetailsDTO addJobAdvertisement(JobAdvertisementDTO jobAdvertisementDTO);
+    JobAdDetailsDTO editJobAdvertisement(Long id, JobAdvertisementDTO jobAdvertisementDTO);
+    void deleteJobAdvertisement(Long jobAdvertisementId);
+
+    List<JobAdDetailsDTO> findAllJobAdvertisements();
+    List<JobAdDetailsDTO> findAllJobAdvertisementsByRecruiterId(Long recruiterId);
+    JobAdDetailsDTO findJobAdvertisementById(Long id);
+
+
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/JwtService.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/JwtService.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/JwtService.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -6,9 +6,9 @@
 
 public interface JwtService {
-
     String generateToken(UserDetails userDetails);
+    String generateRefreshToken(Map<String, Object> extraClaims, UserDetails userDetails);
     String extractUsername(String token);
     boolean isTokenValid(String token, UserDetails userDetails);
-    String generateRefreshToken(Map<String, Object> extraClaims, UserDetails userDetails);
+    boolean isTokenExpired(String token);
 
 }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/RecruiterService.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/RecruiterService.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/RecruiterService.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,8 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef;
+
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO.RecruiterDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.Recruiter;
+
+public interface RecruiterService {
+    RecruiterDetailsDTO getRecruiterDetailsById(Long recruiterId);
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/UserService.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/UserService.java	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/UserService.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -1,15 +1,7 @@
 package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef;
 
-import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO.SignInDTO;
-import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO.JwtAuthResponse;
-import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO.RefreshTokenRequest;
-import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.JobSeeker;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.Recruiter;
-import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.User;
 
 public interface UserService {
-    User registerJobSeeker(JobSeeker jobSeeker);
-    User registerRecruiter(Recruiter recruiter);
-    JwtAuthResponse login(SignInDTO signInDTO);
-    JwtAuthResponse refreshToken(RefreshTokenRequest refreshTokenRequest);
+
 }
Index: jobvista-frontend/.idea/codeStyles/codeStyleConfig.xml
===================================================================
--- jobvista-frontend/.idea/codeStyles/codeStyleConfig.xml	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/.idea/codeStyles/codeStyleConfig.xml	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+  <state>
+    <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
+  </state>
+</component>
Index: jobvista-frontend/package-lock.json
===================================================================
--- jobvista-frontend/package-lock.json	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/package-lock.json	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -21,9 +21,12 @@
         "react": "^18.3.1",
         "react-dom": "^18.3.1",
+        "react-hook-form": "^7.51.4",
         "react-jwt": "^1.2.1",
         "react-redux": "^9.1.2",
+        "react-responsive-modal": "^6.4.2",
         "react-router": "^6.23.0",
         "react-router-dom": "^6.23.0",
         "react-scripts": "5.0.1",
+        "react-select": "^5.8.0",
         "redux": "^5.0.1",
         "redux-thunk": "^3.1.0",
@@ -2036,4 +2039,23 @@
       "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
     },
+    "node_modules/@bedrock-layout/use-forwarded-ref": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/@bedrock-layout/use-forwarded-ref/-/use-forwarded-ref-1.6.1.tgz",
+      "integrity": "sha512-GD9A9AFLzFNjr7k6fgerSqxfwDWl+wsPS11PErOKe1zkVz0y7RGC9gzlOiX/JrgpyB3NFHWIuGtoOQqifJQQpw==",
+      "dependencies": {
+        "@bedrock-layout/use-stateful-ref": "^1.4.1"
+      },
+      "peerDependencies": {
+        "react": "^16.8 || ^17 || ^18"
+      }
+    },
+    "node_modules/@bedrock-layout/use-stateful-ref": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@bedrock-layout/use-stateful-ref/-/use-stateful-ref-1.4.1.tgz",
+      "integrity": "sha512-4eKO2KdQEXcR5LI4QcxqlJykJUDQJWDeWYAukIn6sRQYoabcfI5kDl61PUi6FR6o8VFgQ8IEP7HleKqWlSe8SQ==",
+      "peerDependencies": {
+        "react": "^16.8 || ^17 || ^18"
+      }
+    },
     "node_modules/@csstools/normalize.css": {
       "version": "12.1.1",
@@ -6319,4 +6341,9 @@
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
     },
+    "node_modules/body-scroll-lock": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz",
+      "integrity": "sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg=="
+    },
     "node_modules/bonjour-service": {
       "version": "1.2.1",
@@ -6599,4 +6626,9 @@
       "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz",
       "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q=="
+    },
+    "node_modules/classnames": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+      "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
     },
     "node_modules/clean-css": {
@@ -13177,4 +13209,9 @@
         "node": ">= 4.0.0"
       }
+    },
+    "node_modules/memoize-one": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
+      "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
     },
     "node_modules/merge-descriptors": {
@@ -15706,5 +15743,4 @@
       "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.4.tgz",
       "integrity": "sha512-V14i8SEkh+V1gs6YtD0hdHYnoL4tp/HX/A45wWQN15CYr9bFRmmRdYStSO5L65lCCZRF+kYiSKhm9alqbcdiVA==",
-      "peer": true,
       "engines": {
         "node": ">=12.22.0"
@@ -15765,4 +15801,21 @@
       "engines": {
         "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-responsive-modal": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/react-responsive-modal/-/react-responsive-modal-6.4.2.tgz",
+      "integrity": "sha512-ARjGEKE5Gu5CSvyA8U9ARVbtK4SMAtdXsjtzwtxRlQIHC99RQTnOUctLpl7+/sp1Kg1OJZ6yqvp6ivd4TBueEw==",
+      "dependencies": {
+        "@bedrock-layout/use-forwarded-ref": "^1.3.1",
+        "body-scroll-lock": "^3.1.5",
+        "classnames": "^2.3.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/pradel"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17 || ^18",
+        "react-dom": "^16.8.0 || ^17 || ^18"
       }
     },
@@ -15869,4 +15922,24 @@
       }
     },
+    "node_modules/react-select": {
+      "version": "5.8.0",
+      "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz",
+      "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==",
+      "dependencies": {
+        "@babel/runtime": "^7.12.0",
+        "@emotion/cache": "^11.4.0",
+        "@emotion/react": "^11.8.1",
+        "@floating-ui/dom": "^1.0.1",
+        "@types/react-transition-group": "^4.4.0",
+        "memoize-one": "^6.0.0",
+        "prop-types": "^15.6.0",
+        "react-transition-group": "^4.3.0",
+        "use-isomorphic-layout-effect": "^1.1.2"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
     "node_modules/react-transition-group": {
       "version": "4.4.5",
@@ -18060,4 +18133,17 @@
         "querystringify": "^2.1.1",
         "requires-port": "^1.0.0"
+      }
+    },
+    "node_modules/use-isomorphic-layout-effect": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz",
+      "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
       }
     },
Index: jobvista-frontend/package.json
===================================================================
--- jobvista-frontend/package.json	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/package.json	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -16,9 +16,12 @@
     "react": "^18.3.1",
     "react-dom": "^18.3.1",
+    "react-hook-form": "^7.51.4",
     "react-jwt": "^1.2.1",
     "react-redux": "^9.1.2",
+    "react-responsive-modal": "^6.4.2",
     "react-router": "^6.23.0",
     "react-router-dom": "^6.23.0",
     "react-scripts": "5.0.1",
+    "react-select": "^5.8.0",
     "redux": "^5.0.1",
     "redux-thunk": "^3.1.0",
Index: jobvista-frontend/public/index.html
===================================================================
--- jobvista-frontend/public/index.html	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/public/index.html	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -16,5 +16,5 @@
       user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
     -->
-    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
+<!--    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />-->
     <!--
       Notice the use of %PUBLIC_URL% in the tags above.
@@ -27,5 +27,9 @@
     -->
 
+    <!--    ICONS-->
     <link rel="preconnect" href="https://fonts.gstatic.com">
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" />
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" />
     <title>Job Vista</title>
   </head>
Index: jobvista-frontend/src/App.css
===================================================================
--- jobvista-frontend/src/App.css	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/App.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -5,10 +5,5 @@
   background-color: rgb(243, 242, 241);
   height: 100vh;
-}
-
-.card {
-  border: 1px solid black;
-  border-radius: 5px;
-  padding: 10px;
+  overflow-y: auto;
 }
 
@@ -35,5 +30,140 @@
 }
 
+.container {
+  width: 80% !important;
+  max-width: 1500px !important;
+}
+
 
 /*font-family: 'Ubuntu', sans-serif;*/
 /*font-family: 'Cairo', sans-serif;*/
+
+.react-responsive-modal-overlay {
+  backdrop-filter: blur(2px);
+}
+
+/*CARDS*/
+
+.col {
+  height: 280px !important;
+}
+
+.custom-card {
+  //border: 1px solid lightgray;
+  border-radius: 8px;
+  background-color: white;
+  transition: all 0.3s ease;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+  transform: translate(0, 0);
+  height: 260px;
+}
+
+.custom-card:hover {
+  transform: translate(0, 8px);
+  box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
+}
+
+.custom-card .card-head {
+  padding: 25px;
+  padding-bottom: 0 !important;
+}
+
+.custom-card .card-head .job-type {
+  font-size: 12px !important;
+  margin-left: 6px !important;
+  position: relative;
+  bottom: 3px;
+}
+
+.custom-card .card-head .expired {
+  font-size: 12px !important;
+  margin-left: 8px !important;
+  position: relative;
+  bottom: 3px;
+}
+
+.custom-card .card-head .card-management-btns {
+  float: right;
+  scale: 130%;
+  display: flex;
+  gap: 5px;
+  transition: 0.2s;
+}
+.custom-card .card-head .card-management-btns i:hover {
+  opacity: 0.5;
+  cursor: pointer;
+}
+
+.custom-card .card-body {
+  padding: 25px;
+  padding-top: 15px !important;
+  height: 100%;
+}
+.custom-card .card-body span{
+  font-size: 15px;
+}
+
+.custom-card .card-body .card-title {
+  margin-top: 10px;
+}
+
+
+.custom-card .card-body .card-title h5 {
+  display: inline;
+}
+
+
+.custom-card .card-body .hourly-salary {
+  margin-bottom: 30px;
+  display: inline;
+}
+
+.custom-card .card-body .card-info {
+  color: gray;
+  margin: 13px 0;
+}
+
+.custom-card .card-body .aligned {
+  display: flex;
+  justify-content: center;
+  gap: 8px;
+  text-align: center;
+  margin-top: 25px;
+  position: relative;
+
+}
+
+.custom-card .card-body .aligned a {
+  text-decoration: none;
+}
+
+
+.card-button {
+  border: 0;
+  border-radius: 8px;
+  width: 45%;
+  background-color: rgba(207, 235, 255, 1);
+  //background-size: 200% auto;
+  //background-image: linear-gradient(to right, #a1c4fd 0%, aliceblue 61%, #a1c4fd 100%);
+  color: black;
+  font-weight: bold;
+  padding: 5px 10px;
+  transition: 0.2s;
+}
+
+.card-button:only-child {
+  width: 70%;
+}
+.card-button:not(.disabled):hover{
+  background-color: rgb(187, 215, 235);
+  //background-position: right center;
+  color: black;
+}
+
+.disabled {
+  cursor: default !important;
+  opacity: 0.6;
+}
+
+
+
Index: jobvista-frontend/src/auth/RoutesConfig.js
===================================================================
--- jobvista-frontend/src/auth/RoutesConfig.js	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/auth/RoutesConfig.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -5,4 +5,6 @@
 import {SignUpRecruiterForm} from "../views/auth/SignUpRecruiterForm";
 import {SignUpJobSeekerForm} from "../views/auth/SignUpJobSeekerForm";
+import {JobAdvertisements} from "../views/job_advertisements/JobAdvertisements";
+import {JobAdDetails} from "../views/job_advertisements/JobAdDetails";
 export const RoutesConfig = () => {
 
@@ -13,4 +15,7 @@
                 <Route path="/signup/recruiter" element={<SignUpRecruiterForm/>}></Route>
                 <Route path="/signup/job-seeker" element={<SignUpJobSeekerForm/>}></Route>
+                <Route path="/my-job-advertisements" element={<JobAdvertisements/>}></Route>
+                <Route path="/job-advertisements/view/:id" element={<JobAdDetails/>}></Route>
+                <Route path="/my-job-advertisements/view/:id" element={<JobAdDetails/>}></Route>
             </Routes>
     )
Index: jobvista-frontend/src/enumerations/EmploymentStatus.js
===================================================================
--- jobvista-frontend/src/enumerations/EmploymentStatus.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/enumerations/EmploymentStatus.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,4 @@
+export default {
+    FULL_TIME: 'Full-time',
+    PART_TIME: 'Part-time',
+};
Index: jobvista-frontend/src/enumerations/JobType.js
===================================================================
--- jobvista-frontend/src/enumerations/JobType.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/enumerations/JobType.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,4 @@
+export default {
+    JOB: 'JOB',
+    INTERNSHIP: 'INTERNSHIP',
+};
Index: jobvista-frontend/src/redux/actionTypes.js
===================================================================
--- jobvista-frontend/src/redux/actionTypes.js	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/redux/actionTypes.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -4,2 +4,8 @@
 export const UPDATE_TOKEN = "UPDATE_TOKEN"
 export const CURRENT_USER = "CURRENT_USER"
+
+export const ADD_JOB_ADVERTISEMENT = "ADD_JOB_ADVERTISEMENT"
+export const EDIT_JOB_ADVERTISEMENT = "EDIT_JOB_ADVERTISEMENT"
+export const DELETE_JOB_ADVERTISEMENT = "DELETE_JOB_ADVERTISEMENT"
+export const FETCH_JOB_ADVERTISEMENTS = "FETCH_JOB_ADVERTISEMENTS"
+export const FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER = "FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER"
Index: jobvista-frontend/src/redux/actions/authActions.js
===================================================================
--- jobvista-frontend/src/redux/actions/authActions.js	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/redux/actions/authActions.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -43,6 +43,7 @@
                 const response = jwtResponse.data;
                 const token = response.token;
-                //const refreshToken = response.refreshToken; // Corrected typo
+                //const refreshToken = response.refreshToken;
                 const user = {
+                    id: response.id,
                     email: response.email,
                     name: response.name,
Index: jobvista-frontend/src/redux/actions/jobAdvertisementActions.js
===================================================================
--- jobvista-frontend/src/redux/actions/jobAdvertisementActions.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/redux/actions/jobAdvertisementActions.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,102 @@
+import axios from "../../axios/axiosInstance";
+import {
+    ADD_JOB_ADVERTISEMENT,
+    CURRENT_USER, DELETE_JOB_ADVERTISEMENT, EDIT_JOB_ADVERTISEMENT,
+    FETCH_JOB_ADVERTISEMENTS,
+    FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER
+} from "../actionTypes";
+
+export const JobAdvertisementActions = {
+    addJobAdvertisement: (jobAdvertisement, callback) => {
+        return dispatch => {
+            axios.post("/job-advertisements/add", jobAdvertisement)
+                .then(response => {
+                    dispatch({
+                        type: ADD_JOB_ADVERTISEMENT,
+                        jobAdvertisement: response.data
+                    })
+                    callback(true, response)
+                }).catch((error) => {
+                callback(false, error)
+            })
+        }
+    },
+    editJobAdvertisement: (jobAdvertisement, id, callback) => {
+        return dispatch => {
+            axios.put("/job-advertisements/edit/" + id, jobAdvertisement)
+                .then(response => {
+                    dispatch({
+                        type: EDIT_JOB_ADVERTISEMENT,
+                        jobAdvertisement: response.data
+                    })
+                    callback(true, response)
+                }).catch((error) => {
+                callback(false, error)
+            })
+        }
+    },
+    deleteJobAdvertisement: (id, callback) => {
+        return dispatch => {
+            axios.delete("/job-advertisements/delete/" + id)
+                .then(response => {
+                    dispatch({
+                        type: DELETE_JOB_ADVERTISEMENT,
+                        id: id
+                    })
+                    callback(true)
+                }).catch(error => {
+                callback(false, error)
+            })
+
+        }
+    },
+    fetchJobAdvertisementById: (id, callback) => {
+        axios.get("/job-advertisements/view/" + id)
+            .then(response => {
+                callback(true, response)
+            }).catch(error => {
+                callback(false, error)
+            })
+    },
+
+    fetchJobAdvertisements: (callback) => {
+        return dispatch => {
+            axios.get("/job-advertisements/all")
+                .then(response => {
+                    dispatch({
+                        type: FETCH_JOB_ADVERTISEMENTS,
+                        jobAdvertisements: response.data,
+                    })
+                    callback(true, response)
+                }).catch((error) => {
+                callback(false, error)
+            })
+        }
+    },
+
+    fetchJobAdvertisementsByRecruiter: (id, callback) => {
+        return dispatch => {
+            let currentUser = JSON.parse(localStorage.getItem(CURRENT_USER));
+            axios.get("/job-advertisements/recruiter/" + currentUser.id)
+                .then(response => {
+                    dispatch({
+                        type: FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER,
+                        jobAdvertisementsByRecruiter: response.data,
+                    })
+                    callback(true, response)
+                }).catch((error) => {
+                console.log("ERROR")
+                callback(false, error)
+            })
+        }
+    },
+
+    fetchRecruiterDetailsById: (id, callback) => {
+        axios.get("/recruiter/info/" + id)
+            .then(response => {
+                callback(true, response)
+            }).catch(error => {
+            callback(false, error)
+        })
+    }
+}
Index: jobvista-frontend/src/redux/reducers/authReducer.js
===================================================================
--- jobvista-frontend/src/redux/reducers/authReducer.js	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/redux/reducers/authReducer.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -21,5 +21,5 @@
         case UPDATE_TOKEN:
             let token = action.payload;
-            let currentUser = null
+            let currentUser = "";
             if(!isExpired(token)) {
                 localStorage.setItem(AUTH_TOKEN, token);
@@ -37,11 +37,10 @@
             };
         case SIGN_OUT:
-            console.log("BRISAM")
             localStorage.removeItem(CURRENT_USER);
             localStorage.removeItem(AUTH_TOKEN);
             return {
                 ...state,
-                currentUser: null,
-                token: null
+                currentUser: "",
+                token: "",
             }
 
Index: jobvista-frontend/src/redux/reducers/jobAdvertisementReducer.js
===================================================================
--- jobvista-frontend/src/redux/reducers/jobAdvertisementReducer.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/redux/reducers/jobAdvertisementReducer.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,63 @@
+import {
+    ADD_JOB_ADVERTISEMENT,
+    CURRENT_USER, DELETE_JOB_ADVERTISEMENT, EDIT_JOB_ADVERTISEMENT,
+    FETCH_JOB_ADVERTISEMENTS,
+    FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER
+} from "../actionTypes";
+import {sortElementsByDateCreated} from "../../utils/utils";
+import {useSelector} from "react-redux";
+
+const initialState = {
+    jobAdvertisements: [],
+    jobAdvertisementsByRecruiter: []
+}
+
+let currentUser = JSON.parse(localStorage.getItem(CURRENT_USER))
+export const JobAdvertisementReducer = (state = initialState, action) => {
+    let jobAdvertisements;
+    let jobAdvertisementsByRecruiter;
+    switch (action.type) {
+        case ADD_JOB_ADVERTISEMENT:
+
+            return {
+                ...state,
+                jobAdvertisements: sortElementsByDateCreated([...state.jobAdvertisements, action.jobAdvertisement]),
+                jobAdvertisementsByRecruiter: sortElementsByDateCreated([...state.jobAdvertisementsByRecruiter, action.jobAdvertisement])
+            }
+        case EDIT_JOB_ADVERTISEMENT:
+            jobAdvertisements = state.jobAdvertisements.filter(jobAd => jobAd.id !== action.jobAdvertisement.id)
+            jobAdvertisementsByRecruiter = state.jobAdvertisementsByRecruiter.filter(jobAd => jobAd.id !== action.jobAdvertisement.id)
+
+            return {
+                jobAdvertisements: sortElementsByDateCreated([...jobAdvertisements, action.jobAdvertisement]),
+                jobAdvertisementsByRecruiter: sortElementsByDateCreated([...jobAdvertisementsByRecruiter, action.jobAdvertisement])
+            }
+        case DELETE_JOB_ADVERTISEMENT:
+            jobAdvertisements = state.jobAdvertisements.filter(jobAd => jobAd.id !== action.id)
+            jobAdvertisementsByRecruiter = state.jobAdvertisementsByRecruiter.filter(jobAd => jobAd.id !== action.id)
+
+            return {
+                jobAdvertisements: sortElementsByDateCreated([...jobAdvertisements]),
+                jobAdvertisementsByRecruiter: sortElementsByDateCreated([...jobAdvertisementsByRecruiter])
+            }
+
+        case FETCH_JOB_ADVERTISEMENTS:
+            return {
+                ...state,
+                jobAdvertisements: sortElementsByDateCreated(action.jobAdvertisements)
+            }
+
+        case FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER:
+            return {
+                ...state,
+                jobAdvertisementsByRecruiter: sortElementsByDateCreated(action.jobAdvertisementsByRecruiter)
+            }
+
+        default:
+            return {
+                ...state,
+            };
+    }
+}
+
+export default JobAdvertisementReducer
Index: jobvista-frontend/src/redux/store.js
===================================================================
--- jobvista-frontend/src/redux/store.js	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/redux/store.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -2,5 +2,5 @@
 import { combineReducers } from 'redux';
 import authReducer from "./reducers/authReducer";
-import { thunk } from 'redux-thunk';
+import jobAdReducer from "./reducers/jobAdvertisementReducer";
 
 // const rootReducer = combineReducers({
@@ -15,5 +15,6 @@
 export const store = configureStore({
     reducer: {
-        auth: authReducer
+        auth: authReducer,
+        jobAd: jobAdReducer
     },
 });
Index: jobvista-frontend/src/utils/utils.js
===================================================================
--- jobvista-frontend/src/utils/utils.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/utils/utils.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,40 @@
+
+
+export const sortElementsByDateCreated = (array) => {
+    return array.slice().sort((a, b) => {
+        return new Date(b.postedAt).getTime() - new Date(a.postedAt).getTime()
+    });
+}
+
+export const formatRelativeTime = (dateString) => {
+    const date = new Date(dateString);
+    const now = new Date();
+    const diffTime = now - date;
+
+    // Define time intervals in milliseconds
+    const minute = 60 * 1000;
+    const hour = minute * 60;
+    const day = hour * 24;
+    const week = day * 7;
+    const month = day * 30;
+
+    // Calculate the relative time
+    if (diffTime < minute) {
+        return 'just now';
+    } else if (diffTime < hour) {
+        const minutes = Math.floor(diffTime / minute);
+        return `${minutes} ${minutes === 1 ? 'min' : 'min'} ago`;
+    } else if (diffTime < day) {
+        const hours = Math.floor(diffTime / hour);
+        return `${hours} ${hours === 1 ? 'hour' : 'hours'} ago`;
+    } else if (diffTime < week) {
+        const days = Math.floor(diffTime / day);
+        return `${days} ${days === 1 ? 'day' : 'days'} ago`;
+    } else if (diffTime < month) {
+        const weeks = Math.floor(diffTime / week);
+        return `${weeks} ${weeks === 1 ? 'week' : 'weeks'} ago`;
+    } else {
+        const months = Math.floor(diffTime / month);
+        return `${months} ${months === 1 ? 'month' : 'months'} ago`;
+    }
+}
Index: jobvista-frontend/src/views/auth/SignInForm.js
===================================================================
--- jobvista-frontend/src/views/auth/SignInForm.js	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/views/auth/SignInForm.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -70,5 +70,5 @@
                             <div className="d-grid mb-3">
                                 <button
-                                    className="btn btn-lg btn-primary text-uppercase fw-bold mb-2"
+                                    className="btn btn-lg auth-primary-btn text-uppercase fw-bold mb-2"
                                     type="submit">Sign in
                                 </button>
@@ -85,8 +85,8 @@
                         <div className="row">
                             <div className="col-md-6">
-                                <Link to="/signup/recruiter" className="btn btn-outline-primary text-uppercase fw-bold mb-2 w-100">SIGN UP AS RECRUITER</Link>
+                                <Link to="/signup/recruiter" className="btn auth-secondary-btn text-uppercase fw-bold mb-2 w-100">SIGN UP AS RECRUITER</Link>
                             </div>
                             <div className="col-md-6">
-                                <Link to="/signup/job-seeker" className="btn btn-outline-primary text-uppercase fw-bold mb-2 w-100">SIGN UP AS JOB SEEKER</Link>
+                                <Link to="/signup/job-seeker" className="btn auth-secondary-btn text-uppercase fw-bold mb-2 w-100">SIGN UP AS JOB SEEKER</Link>
                             </div>
                         </div>
Index: jobvista-frontend/src/views/auth/SignUpJobSeekerForm.js
===================================================================
--- jobvista-frontend/src/views/auth/SignUpJobSeekerForm.js	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/views/auth/SignUpJobSeekerForm.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -83,5 +83,5 @@
                             <div className="d-grid mb-3">
                                 <button
-                                    className="btn btn-lg btn-primary text-uppercase fw-bold mb-2"
+                                    className="btn btn-lg auth-primary-btn text-uppercase fw-bold mb-2"
                                     type="submit">Submit
                                 </button>
Index: jobvista-frontend/src/views/auth/SignUpRecruiterForm.js
===================================================================
--- jobvista-frontend/src/views/auth/SignUpRecruiterForm.js	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/views/auth/SignUpRecruiterForm.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -80,5 +80,5 @@
                             <div className="d-grid mb-3">
                                 <button
-                                    className="btn btn-lg btn-primary text-uppercase fw-bold mb-2"
+                                    className="btn btn-lg auth-primary-btn text-uppercase fw-bold mb-2"
                                     type="submit">Submit
                                 </button>
Index: jobvista-frontend/src/views/auth/auth.css
===================================================================
--- jobvista-frontend/src/views/auth/auth.css	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/views/auth/auth.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -3,2 +3,26 @@
     padding: 5px 5px;
 }
+
+.form-container {
+    margin-bottom: 80px;
+}
+
+.auth-primary-btn{
+    background-color: rgba(1,38,90,0.80);
+    //background-color: #a1c4fd ;
+    color: white;
+}
+.auth-primary-btn:hover {
+    background-color: rgba(1,38,90,1);
+    color: white;
+}
+
+.auth-secondary-btn {
+    border: 2px solid rgba(1,38,90,0.7);
+    color: midnightblue;
+}
+
+.auth-secondary-btn:hover {
+    background-color: rgba(1,38,90,0.8);
+    color: white;
+}
Index: jobvista-frontend/src/views/dashboard/Dashboard.css
===================================================================
--- jobvista-frontend/src/views/dashboard/Dashboard.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/dashboard/Dashboard.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,46 @@
+
+.head-dashboard-box {
+    height: 10%;
+    width: 100%;
+    background-color: #fff;
+    border-radius: 12px;
+    padding: 15px 20px;
+    margin-bottom: 20px;
+    margin-top: 30px;
+    height: auto;
+}
+
+
+.head-dashboard-box .head-component {
+    display: inline;
+}
+
+
+.head-dashboard-box .search-container {
+    position: relative;
+    float: left;
+}
+.head-dashboard-box .search-container .search-input {
+    width: 400px;
+    display: inline;
+    padding: 5px 30px;
+    border-radius: 10px;
+    margin-right: 15px;
+}
+
+.search-container .search-input:focus {
+    outline-color: #6367ef;
+}
+
+.search-container i {
+    left: 10px;
+    position: absolute;
+    top: 10px;
+}
+
+.item {
+    width: 35%;
+    display: inline-block;
+    margin-left: 10px;
+    float: right;
+}
Index: jobvista-frontend/src/views/dashboard/Dashboard.js
===================================================================
--- jobvista-frontend/src/views/dashboard/Dashboard.js	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/views/dashboard/Dashboard.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -1,28 +1,133 @@
+import "./Dashboard.css"
+
+import {useDispatch, useSelector} from "react-redux";
+import {useEffect, useState} from "react";
+import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
+import {formatRelativeTime, sortElementsByDateCreated} from "../../utils/utils";
+import {dataRangeOptions, industryOptions, industryOptionsFilter, sortOptions} from "../selectOptions";
+import Select from "react-select";
+import Roles from "../../enumerations/Roles";
+import {Link} from "react-router-dom";
+import JobType from "../../enumerations/JobType";
+
 export const Dashboard = () => {
+
+    const dispatch = useDispatch();
+
+    const [jobAdvertisements, setJobAdvertisements] = useState([]);
+    let jobAdvertisementsState = useSelector(state => state.jobAd.jobAdvertisements)
+    const auth = useSelector(state => state.auth.currentUser);
+
+    const [role, setRole] = useState("");
+    const [sortOrder, setSortOrder] = useState("newest");
+    const [selectedDateRange, setSelectedDateRange] = useState("all");
+    const [searchTerm, setSearchTerm] = useState("");
+    const [dispatched, setDispatched] = useState(false)
+
+    useEffect(() => {
+        if (auth) {
+            setRole(auth.role);
+        }
+    }, [auth]);
+
+    useEffect(() => {
+        if(!dispatched && jobAdvertisementsState.length == 0) {
+            dispatch(JobAdvertisementActions.fetchJobAdvertisements((success, response) => {
+                if (success && response.data.length > 0) {
+                    setJobAdvertisements(sortElementsByDateCreated(response.data))
+                }
+                setDispatched(true)
+                console.log("Fetch all job advertisements GET")
+                console.log(response.data)
+            }))
+
+        } else {
+            setJobAdvertisements(jobAdvertisementsState)
+            console.log("Fetch all job advertisements STATE")
+        }
+    }, [])
 
 
     return (
         <div className="container">
-            <div className="row justify-content">
-                <div className="col-md-4">
-                    <div className="card">
-                        <h5 className="card-title">Job Listing Name</h5>
-                        <p>Job Listing Data</p>
+            <div className="head-dashboard-box">
+                <div className="row">
+                    <div className="col-md-3">
+                        <div className="search-container head-component">
+                            <i className="fa-solid fa-magnifying-glass blue-colored"></i>
+                            <input
+                                className="search-input"
+                                type="text"
+                                placeholder="Search job advertisement by title..."
+                                //value={searchTerm}
+                                //onChange={event => setSearchTerm(event.target.value)}
+                            />
+                        </div>
                     </div>
-                </div>
-                <div className="col-md-4">
-                    <div className="card">
-                        <h5 className="card-title">Job Listing Name</h5>
-                        <p>Job Listing Data</p>
-                    </div>
-                </div>
-                <div className="col-md-4">
-                    <div className="card">
-                        <h5 className="card-title">Job Listing Name</h5>
-                        <p>Job Listing Data</p>
+                    <div className="col-md-9">
+                        <div className="sort-section item">
+                            <Select
+                                defaultValue={{value: "all", label: "All industries"}}
+                                //value={sortOrder.value}
+                                //onChange ={option => setSortOrder(option.value)}
+                                options={industryOptionsFilter}
+                                className="sort-range sort"
+                            />
+                        </div>
+                        <div className="sort-section item">
+                            <Select
+                                defaultValue={{value: "newest", label: "Date (Newest First)"}}
+                                //value={sortOrder.value}
+                                //onChange ={option => setSortOrder(option.value)}
+                                options = {sortOptions}
+                                className="sort-range sort"
+                            />
+                        </div>
+                        <div className="date-range-section item">
+                            <Select
+                                defaultValue={{value: "all", label: "Lifetime"}}
+                                //value={selectedDateRange.value}
+                                //onChange={option => setSelectedDateRange(option.value)}
+                                options={dataRangeOptions}
+                                className="date-range sort"
+                            />
+                        </div>
                     </div>
                 </div>
             </div>
+            <div className="row row-cols-1 row-cols-md-4 g-4">
 
+                {jobAdvertisements &&
+                    jobAdvertisements.map((jobAd, index) => (
+                        <div key={index} className="col">
+                            <div className="custom-card">
+                                <div className="card-head">
+                                    <span className="hourly-salary"><b>${jobAd.startingSalary}/hr</b></span>
+                                    <span className="job-type"> {jobAd.jobType===JobType.JOB ? "Job" : "Internship"}</span>
+                                    {!jobAd.active && <span className="expired">Expired</span>}
+                                </div>
+                                <div className="card-body">
+                                    <h5 className="card-title">{jobAd.title}</h5>
+                                    <span>{jobAd.industry} • <span style={{color: "black", fontWeight: "bold"}}>{formatRelativeTime(jobAd.postedOn)}</span></span>
+                                    <div className="card-info">
+                                        <span><i className="fa-solid fa-building" style={{color: "#000000"}}></i> Company: <span style={{color: "black", fontWeight: "bold"}}>{jobAd.recruiterName}</span></span> <br/>
+                                    </div>
+
+                                    <div className="aligned">
+                                        <Link to={`/job-advertisements/view/${jobAd.id}`} className="card-button">Read more</Link>
+                                        {role===Roles.JOBSEEKER &&
+                                            <>
+                                                {jobAd.active && <button className="card-button">Apply now</button> }
+                                                {!jobAd.active && <button className="card-button disabled">Apply now</button> }
+                                            </>
+                                        }
+                                    </div>
+
+                                </div>
+                            </div>
+                        </div>
+                    ))}
+
+            </div>
         </div>
     )
Index: jobvista-frontend/src/views/job_advertisements/AddJobAdModal.js
===================================================================
--- jobvista-frontend/src/views/job_advertisements/AddJobAdModal.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/AddJobAdModal.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,145 @@
+import React, {useState} from "react";
+import "./Form.css";
+
+import 'react-responsive-modal/styles.css';
+import {Modal} from 'react-responsive-modal';
+import Select from "react-select";
+
+//Validation
+import * as yup from "yup";
+import {yupResolver} from "@hookform/resolvers/yup";
+import {Controller, useForm} from "react-hook-form";
+
+
+import {employmentStatusOptions, industryOptions, jobTypeOptions} from "../selectOptions";
+import {useDispatch, useSelector} from "react-redux";
+import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
+
+
+export const AddJobAdModal = () => {
+    const [modal, setModal] = useState(false);
+    const dispatch = useDispatch();
+    const auth = useSelector(state => state.auth.currentUser)
+    const toggleModal = () => {
+        setModal(!modal);
+    };
+
+    const schema = yup.object().shape({
+        title: yup.string().required("Please enter a title"),
+        description: yup.string().required("Please enter a description"),
+        industry: yup.mixed().required("Select industry"),
+        startingSalary: yup.number().required("Please enter the starting salary"),
+        jobType: yup.mixed().required("Select job type"),
+        employmentStatus: yup.mixed().required("Select employment status"),
+    })
+
+    const {register, handleSubmit, control, formState: {errors}} = useForm({
+        resolver: yupResolver(schema),
+    });
+
+    const addJobAdvertisement = async (values) => {
+        //const description = values.description.replace(/\n/g, "\\n");
+        try {
+            dispatch(JobAdvertisementActions.addJobAdvertisement(
+                {
+                    email: auth.email,
+                    title: values.title,
+                    description: values.description,
+                    industry: values.industry.value,
+                    startingSalary: values.startingSalary,
+                    activeUntil: values.date,
+                    jobType: values.jobType.value,
+                    employmentStatus: values.employmentStatus.value,
+                }, (success, response) => {
+                    if(success) {
+                        console.log("Job Advertisement added")
+                        toggleModal()
+                    }
+                }
+            ))
+        } catch (err) {
+            console.error(err)
+        }
+    }
+    let minimumDate = new Date();
+    minimumDate.setDate(minimumDate.getDate() + 1);
+
+    return (<div className="modal-wrap">
+            <button onClick={toggleModal} className="btn-open-modal">POST ADVERTISEMENT</button>
+            <Modal open={modal} onClose={toggleModal} center classNames="job-advertisement-modal">
+                <div className="head-modal">
+                    <h3>Post Job Advertisement</h3>
+                    <i className="fa-solid fa-x btn-close-modal" onClick={toggleModal}></i>
+                </div>
+
+                <div className="modal-content">
+                    <form onSubmit={handleSubmit(addJobAdvertisement)}>
+                        <div className="row">
+                            <div className="col-md-7">
+
+                                <label className="label">Job title:</label>
+                                <input type="text" {...register("title")}/>
+                                <p style={{color: "red"}}>{errors.title?.message}</p>
+
+                                <label className="label">Job description:</label>
+                                <textarea type="text" placeholder="Describe the job position and all the requirements"
+                                          className="description-textarea" {...register("description")}/>
+                                <p style={{color: "red"}}>{errors.description?.message}</p>
+                            </div>
+
+                            <div className="col-md-5">
+                                <label className="label">Hourly rate:</label>
+                                <input {...register("startingSalary")}/>
+                                <p style={{color: "red"}}>{errors.startingSalary?.message}</p>
+
+                                <label className="label">Industry:</label>
+                                <Controller
+                                    name="industry"
+                                    control={control}
+                                    render={({ field })  => (<Select
+                                            {...field}
+                                            options={industryOptions}
+                                        />)}
+                                />
+                                <p style={{color: "red"}}>{errors.industry?.message}</p>
+
+                                <label className="label">Job type:</label>
+                                <Controller
+                                    name="jobType"
+                                    control={control}
+                                    render={({ field }) => (<Select
+                                            {...field}
+                                            options={jobTypeOptions}
+                                        />)}
+                                />
+                                <p style={{color: "red"}}>{errors.jobType?.message}</p>
+
+                                <label className="label">Employment status</label>
+                                <Controller
+                                    name="employmentStatus"
+                                    control={control}
+                                    render={({ field }) => (<Select
+                                            {...field}
+                                            options={employmentStatusOptions}
+                                        />)}
+                                />
+                                <p style={{color: "red"}}>{errors.employmentStatus?.message}</p>
+
+                                <label htmlFor="start">Active until:</label>
+                                <input type="date" defaultValue={minimumDate.toLocaleDateString('en-CA')}
+                                       min={minimumDate.toLocaleDateString('en-CA')} onChange={(event) => console.log(event.target.value)}
+                                       {...register("date")}/>
+
+
+                            </div>
+                        </div>
+
+                        <div className="aligned">
+                            <button className="submit-btn"> Submit</button>
+                        </div>
+
+                    </form>
+                </div>
+            </Modal>
+        </div>)
+}
Index: jobvista-frontend/src/views/job_advertisements/DeleteJobAdModal.js
===================================================================
--- jobvista-frontend/src/views/job_advertisements/DeleteJobAdModal.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/DeleteJobAdModal.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,59 @@
+import React, {useState} from "react";
+import "./Form.css";
+
+import 'react-responsive-modal/styles.css';
+import {Modal} from 'react-responsive-modal';
+import Select from "react-select";
+
+//Validation
+import * as yup from "yup";
+import {yupResolver} from "@hookform/resolvers/yup";
+import {Controller, useForm} from "react-hook-form";
+
+
+import {employmentStatusOptions, industryOptions, jobTypeOptions} from "../selectOptions";
+import {useDispatch, useSelector} from "react-redux";
+import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
+
+
+export const DeleteJobAdModal = (jobAd) => {
+    const [modal, setModal] = useState(false);
+    const dispatch = useDispatch();
+    const auth = useSelector(state => state.auth.currentUser)
+    const toggleModal = () => {
+        setModal(!modal);
+    };
+
+    const addJobAdvertisement = async () => {
+        try {
+            dispatch(JobAdvertisementActions.deleteJobAdvertisement(jobAd.props.id, (success, response) => {
+                if (success) {
+                    console.log("Job Advertisement deleted")
+                    toggleModal()
+                }
+            }))
+        } catch (err) {
+            console.error(err)
+        }
+    }
+
+    return (<div className="modal-wrap">
+        <i className="fa-solid fa-trash trash-delete-btn" onClick={toggleModal}></i>
+        <Modal open={modal} onClose={toggleModal} center classNames="job-advertisement-modal">
+            <i className="fa-solid fa-x btn-close-modal" style={{color: "black"}} onClick={toggleModal}></i>
+            <div className="modal-delete-content">
+                <div className="row modal-delete-content-inside">
+                    <div className="col-md-1"><i className="fa-regular fa-circle-xmark x-icon"></i></div>
+                    <div className="col-md-11 modal-delete-text">
+                        <h4>Are you sure?</h4>
+                        <p>Do you really want to delete this advertisement? This process cannot be undone.</p>
+                    </div>
+                </div>
+                <div className="modal-delete-buttons">
+                    <button className="cancel-btn" onClick={toggleModal}>Cancel</button>
+                    <button className="delete-btn" onClick={addJobAdvertisement}> Delete</button>
+                </div>
+            </div>
+        </Modal>
+    </div>)
+}
Index: jobvista-frontend/src/views/job_advertisements/EditJobAdModal.js
===================================================================
--- jobvista-frontend/src/views/job_advertisements/EditJobAdModal.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/EditJobAdModal.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,161 @@
+import React, {useEffect, useState} from "react";
+import "./Form.css";
+
+import 'react-responsive-modal/styles.css';
+import {Modal} from 'react-responsive-modal';
+import Select from "react-select";
+
+//Validation
+import * as yup from "yup";
+import {yupResolver} from "@hookform/resolvers/yup";
+import {Controller, useForm} from "react-hook-form";
+
+
+import {employmentStatusOptions, industryOptions, jobTypeOptions} from "../selectOptions";
+import {useDispatch, useSelector} from "react-redux";
+import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
+
+
+export const EditJobAdModal = (jobAd) => {
+    const [modal, setModal] = useState(false);
+    const dispatch = useDispatch();
+    const auth = useSelector(state => state.auth.currentUser)
+    const toggleModal = () => {
+        setModal(!modal);
+    };
+
+    const schema = yup.object().shape({
+        title: yup.string().required("Please enter a title"),
+        description: yup.string().required("Please enter a description"),
+        industry: yup.mixed().required("Select industry"),
+        startingSalary: yup.number().required("Please enter the starting salary"),
+        jobType: yup.mixed().required("Select job type"),
+        employmentStatus: yup.mixed().required("Select employment status"),
+    })
+
+    const {register, handleSubmit, control, formState: {errors}} = useForm({
+        resolver: yupResolver(schema),
+    });
+    const editJobAdvertisement = async (values) => {
+        try {
+            dispatch(JobAdvertisementActions.editJobAdvertisement(
+                {
+                    email: auth.email,
+                    title: values.title,
+                    description: values.description,
+                    industry: values.industry.value,
+                    startingSalary: values.startingSalary,
+                    activeUntil: values.date,
+                    jobType: values.jobType.value,
+                    employmentStatus: values.employmentStatus.value,
+                }, jobAd.props.id, (success, response) => {
+                    if(success) {
+                        console.log("Job Advertisement edited")
+                        toggleModal()
+                    }
+                }
+            ))
+        } catch (err) {
+            console.error(err)
+        }
+    }
+
+    let minimumDate = new Date();
+    minimumDate.setDate(minimumDate.getDate() + 1);
+
+    return (<div className="modal-wrap">
+
+        <i className="fa-solid fa-pen-to-square pen-edit-btn" onClick={() => {
+            // setSelectedRecord(record);
+                toggleModal()
+        }}></i>
+        <Modal open={modal} onClose={toggleModal} center classNames="job-advertisement-modal">
+            <div className="head-modal">
+                <h3>Edit Job Advertisement</h3>
+                <i className="fa-solid fa-x btn-close-modal" onClick={toggleModal}></i>
+            </div>
+
+            <div className="modal-content">
+                <form onSubmit={handleSubmit(editJobAdvertisement)}>
+                    <div className="row">
+                        <div className="col-md-7">
+                            <label className="label">Job title:</label>
+                            <input type="text" defaultValue={jobAd.props.title} {...register("title")}/>
+                            <p style={{color: "red"}}>{errors.title?.message}</p>
+
+                            <label className="label">Job description:</label>
+                            <textarea type="text" defaultValue={jobAd.props.description} placeholder="Describe the job position and all the requirements"
+                                      className="description-textarea" {...register("description")}/>
+                            <p style={{color: "red"}}>{errors.description?.message}</p>
+                        </div>
+
+                        <div className="col-md-5">
+                            <label className="label">Hourly rate:</label>
+                            <input defaultValue={jobAd.props.startingSalary} {...register("startingSalary")}/>
+                            <p style={{color: "red"}}>{errors.startingSalary?.message}</p>
+
+                            <label className="label">Industry:</label>
+                            <Controller
+                                name="industry"
+                                control={control}
+                                defaultValue={{
+                                    label: jobAd.props.industry,
+                                    value: jobAd.props.industry
+                                }}
+                                render={({ field })  => (<Select
+                                    {...field}
+                                    options={industryOptions}
+                                />)}
+                            />
+                            <p style={{color: "red"}}>{errors.industry?.message}</p>
+
+                            <label className="label">Job type:</label>
+                            <Controller
+                                name="jobType"
+                                control={control}
+                                defaultValue={{
+                                    value: jobAd.props.jobType,
+                                    label: jobAd.props.jobType==="JOB" ? "Job" : "Internship"
+                                }}
+                                render={({ field }) => (
+                                    <Select
+                                    {...field}
+                                    options={jobTypeOptions}
+                                />)}
+                            />
+                            <p style={{color: "red"}}>{errors.jobType?.message}</p>
+
+                            <label className="label">Employment status</label>
+                            <Controller
+                                name="employmentStatus"
+                                control={control}
+                                defaultValue={{
+                                    value: jobAd.props.employmentStatus,
+                                    label: jobAd.props.employmentStatus==="FULL_TIME" ? "Full time" : "Part time"
+                                }}
+                                render={({ field }) => (
+                                    <Select
+                                    {...field}
+                                    options={employmentStatusOptions}
+                                />)}
+                            />
+                            <p style={{color: "red"}}>{errors.employmentStatus?.message}</p>
+
+                            <label htmlFor="start">Active until:</label>
+                            <input type="date" defaultValue={new Date(jobAd.props.activeUntil).toLocaleDateString('en-CA')}
+                                   min={minimumDate.toLocaleDateString('en-CA')} onChange={(event) => console.log(event.target.value)}
+                                   {...register("date")}/>
+
+
+                        </div>
+                    </div>
+
+                    <div className="aligned">
+                        <button className="submit-btn"> Submit</button>
+                    </div>
+
+                </form>
+            </div>
+        </Modal>
+    </div>)
+}
Index: jobvista-frontend/src/views/job_advertisements/Form.css
===================================================================
--- jobvista-frontend/src/views/job_advertisements/Form.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/Form.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,166 @@
+
+.modal-wrap {
+    display: inline;
+}
+.btn-open-modal {
+    font-size: 18px;
+    border-radius: 10px;
+    padding: 5px 10px;
+    background-color: #06367a;
+    border: none;
+    color: #fff;
+    font-weight: 600;
+    float: right;
+    margin-left: 10px;
+}
+
+.btn-close-modal {
+    position: absolute;
+    top: 15px;
+    right: 15px;
+    padding: 5px 7px;
+    cursor: pointer;
+}
+
+.react-responsive-modal-modal {
+    background: #f1f1f1;
+    border-radius: 10px;
+    width: 1300px !important;
+    //min-width: 300px;
+    height: auto;
+    padding: 0 !important;
+    overflow-y: hidden;
+}
+
+.react-responsive-modal-closeButton {
+   display: none !important;
+}
+
+.react-responsive-modal-modal .head-modal {
+    border-top-left-radius: 10px;
+    border-top-right-radius: 10px;
+    background-color: rgba(1,38,90,0.9);
+    background-size: cover;
+    padding: 14px 48px;
+    color: white;
+}
+
+.react-responsive-modal-modal .head-modal h3 {
+    text-transform: uppercase;
+    font-weight: bold;
+    display: inline;
+}
+
+
+.react-responsive-modal-modal .modal-content {
+    /*line-height: 1.4;*/
+    padding: 30px 48px;
+    /*height: 100%;*/
+    border: 0;
+}
+
+.react-responsive-modal-modal .modal-content form .aligned {
+    text-align: center;
+}
+
+
+.react-responsive-modal-modal .modal-content form .label {
+    display: block;
+}
+
+input {
+    display: block;
+    padding: 5px 10px;
+    width: 100%;
+    border-radius: 3px;
+    border: 1px solid lightgrey;
+}
+
+textarea {
+    width: 100%;
+    resize: none;
+    border-radius: 3px;
+    border: 1px solid lightgrey;
+    padding: 5px 10px;
+}
+
+.description-textarea {
+    height: 285px;
+
+}
+
+input:focus, textarea:focus {
+    outline-color: cornflowerblue;
+}
+
+.submit-btn {
+    position: relative;
+    padding: 5px 20px;
+    border-radius: 5px;
+    border: none;
+    color: white;
+    text-transform: uppercase;
+    font-weight: bold;
+    width: 30%;
+    /*clip-path: polygon(100% 0, 100% 75%, 95% 100%, 0 100%, 0 0);*/
+    background: linear-gradient(to right, #06367a, #06367a);
+    margin-top: 15px;
+}
+
+.category-option {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+}
+
+/* DELETE MODAL */
+
+.modal-delete-buttons {
+    display: flex;
+    justify-content: flex-end;
+    gap: 10px;
+    margin-top: 25px;
+}
+
+.modal-delete-content {
+    padding: 20px 25px;
+}
+
+.modal-delete-content-inside {
+    display: flex;
+    align-items: center;
+}
+
+.modal-delete-text {
+    padding-left: 35px;
+
+}
+
+.modal-delete-text p {
+    margin: 0;
+}
+
+
+.cancel-btn, .delete-btn {
+    display: inline;
+    border: none;
+    padding: 5px 25px 5px 25px;
+    border-radius: 7px;
+}
+
+.delete-btn {
+    background-color: red;
+    color: white;
+}
+
+.x-icon {
+    transform: scale(3.3) !important;
+    color: #D93936 !important;
+    padding: 0 15px !important;
+    /*margin-top: 20px !important;*/
+}
+
+
+
+
+
Index: jobvista-frontend/src/views/job_advertisements/JobAdDetails.css
===================================================================
--- jobvista-frontend/src/views/job_advertisements/JobAdDetails.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/JobAdDetails.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,66 @@
+
+/*font-family: 'Ubuntu', sans-serif;*/
+/*font-family: 'Cairo', sans-serif;*/
+/*font-family: 'Poppins', sans-serif;*/
+
+* {
+    //font-family: Poppins, sans-serif;
+}
+
+.details-wrap {
+    width: 100%;
+    //height: auto;
+    height: 80vh;
+    overflow-y: auto;
+    background-color: #fff;
+    border-radius: 12px;
+    padding: 15px 20px;
+    margin-bottom: 20px;
+    margin-top: 30px;
+}
+
+.details-wrap .details-head-info {
+    font-size: 18px;
+}
+
+.job-type, .expired {
+    font-size: 16px;
+    padding: 3px 8px;
+    border-radius: 5px;
+    font-family: Poppins;
+   position: relative;
+    bottom: 5px;
+    margin-left: 13px;
+}
+
+.expired {
+    background-color: transparent;
+    border: 1px solid indianred;
+    color: indianred;
+    font-weight: 600;
+}
+
+.job-type {
+    background-color: indianred;
+    color: white;
+}
+
+.title {
+    //display: inline-flex;
+    //justify-items: start;
+    display: block;
+}
+
+.title h2, .title span {
+    display: inline-block;
+}
+
+.apply:not(.expired) {
+    width: 20% !important;
+    background-size: 200% auto;
+
+}
+.apply:not(.expired):hover {
+    width: 20% !important;
+    background-position: right center;
+}
Index: jobvista-frontend/src/views/job_advertisements/JobAdDetails.js
===================================================================
--- jobvista-frontend/src/views/job_advertisements/JobAdDetails.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/JobAdDetails.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,95 @@
+import "./JobAdDetails.css"
+import {useEffect, useState} from "react";
+import {useDispatch, useSelector} from "react-redux";
+import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
+import {useParams} from "react-router";
+import Roles from "../../enumerations/Roles";
+import JobType from "../../enumerations/JobType";
+import EmploymentStatus from "../../enumerations/EmploymentStatus";
+import {formatRelativeTime} from "../../utils/utils";
+import {AddJobAdModal} from "./AddJobAdModal";
+
+
+export const JobAdDetails = () => {
+    const dispatch = useDispatch();
+    const [jobAd, setJobAd] = useState("")
+    const [recruiterDetails, setRecruiterDetails] = useState("");
+    const [role, setRole] = useState("")
+    const {id} = useParams();
+    const auth = useSelector(state => state.auth.currentUser);
+
+    useEffect(() => {
+        setRole(auth.role)
+    }, [auth])
+
+
+    useEffect(() => {
+        JobAdvertisementActions.fetchJobAdvertisementById(id, (success, response) => {
+            if (success) {
+                setJobAd(response.data)
+                JobAdvertisementActions.fetchRecruiterDetailsById(response.data.recruiterId, (successAgain, responseAgain) => {
+                    if(successAgain) {
+                        setRecruiterDetails(responseAgain.data)
+                    }
+                })
+            }
+        });
+    }, [])
+    return (<div className="container">
+        <div className="row">
+            <div className="col-md-9">
+                <div className="details-wrap">
+
+                    <div className="title">
+                        <h2>{jobAd.title} </h2>
+                        <span className="job-type"> {jobAd.jobType===JobType.JOB ? "Job" : "Internship"}</span>
+                        {!jobAd.active && <span className="expired">Expired</span>}
+                    </div>
+
+                    <p className="details-head-info">
+                        <span><b>{jobAd.recruiterName}</b></span> • <span>{jobAd.industry}</span> • <span>{formatRelativeTime(jobAd.postedOn)}</span>
+                    </p>
+
+                    <p><i className="fa-solid fa-money-check-dollar"></i> <span>Hourly rate: ${jobAd.startingSalary}</span></p>
+                    <p><i className="fa-solid fa-briefcase"></i> Employment status: {jobAd.employmentStatus===EmploymentStatus.FULL_TIME ? "Full-time" : "Part-time"}</p>
+                    <p><i className="fa-solid fa-calendar-days"></i> Active until: {new Date(jobAd.activeUntil).toLocaleString('default', { day: 'numeric', month: 'long',  year: 'numeric' })}</p>
+
+                    <h4>About the job</h4>
+                    {jobAd.description && (
+                        <p dangerouslySetInnerHTML={{ __html: jobAd.description.replace(/\n/g, "<br>") }}></p>
+                    )}
+
+
+                    {role===Roles.JOBSEEKER &&
+                        <>
+                            {jobAd.active && <button className="card-button apply">Apply now</button> }
+                            {!jobAd.active && <button className="card-button apply disabled">Apply now</button> }
+                        </>
+                    }
+
+                </div>
+            </div>
+            <div className="col-md-3">
+                <div className="details-wrap">
+                    <h3>{jobAd.recruiterName}</h3>
+
+                    {/*TO DO - AFTER IMPLEMENTING FORM FOR UPDATING PERSONAL INFO*/}
+                    <h4>About the company</h4>
+                    <p>As a pioneering Swiss software company, we provide innovative IT products and tailored digital solutions. We bring decades of experience in designing, developing, and implementing highly scalable, secure, and user-centric software.
+                        <br/><br/>
+                        Working across the banking, payment, mobility, health, and publishing industries, we are experts at delivering seamless and secure user journeys within these privacy-driven environments. Our business-critical applications are designed to overcome complexity and drive growth.
+                        <br/><br/>
+                        We are based in Zurich, Switzerland, and have offices elsewhere in Europe, Asia, and the Middle East. Founded in 1996, we are a business of 800 experts, enabling our clients to create value with trusted software..
+                    </p>
+                    <p><span><i className="fa-solid fa-envelope"></i> {recruiterDetails.email}</span> • <span>
+                <i className="fa-solid fa-phone"></i> {recruiterDetails.phoneNumber}</span>
+                    </p>
+                </div>
+            </div>
+
+        </div>
+
+
+
+    </div>)
+}
Index: jobvista-frontend/src/views/job_advertisements/JobAdvertisements.css
===================================================================
--- jobvista-frontend/src/views/job_advertisements/JobAdvertisements.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/JobAdvertisements.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,45 @@
+.head-job-advertisements-box {
+    height: 10%;
+    width: 100%;
+    background-color: #fff;
+    border-radius: 12px;
+    padding: 15px 20px;
+    margin-bottom: 20px;
+    margin-top: 30px;
+    height: auto;
+}
+
+
+.head-job-advertisements-box .head-component {
+    display: inline;
+}
+
+
+.head-job-advertisements-box .search-container {
+    position: relative;
+    float: left;
+}
+.head-job-advertisements-box .search-container .search-input {
+    width: 400px;
+    display: inline;
+    padding: 5px 30px;
+    border-radius: 10px;
+    margin-right: 15px;
+}
+
+.search-container .search-input:focus {
+    outline-color: #6367ef;
+}
+
+.search-container i {
+    left: 10px;
+    position: absolute;
+    top: 10px;
+}
+
+.item {
+    width: 25%;
+    display: inline-block;
+    margin-left: 10px;
+    float: right;
+}
Index: jobvista-frontend/src/views/job_advertisements/JobAdvertisements.js
===================================================================
--- jobvista-frontend/src/views/job_advertisements/JobAdvertisements.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/JobAdvertisements.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,125 @@
+import {AddJobAdModal} from "./AddJobAdModal";
+
+import "./JobAdvertisements.css"
+import {useDispatch, useSelector} from "react-redux";
+import {useEffect, useState} from "react";
+import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
+import {formatRelativeTime, sortElementsByDateCreated} from "../../utils/utils";
+import {dataRangeOptions, industryOptions, sortOptions} from "../selectOptions";
+import Select from "react-select";
+import {DeleteJobAdModal} from "./DeleteJobAdModal";
+import {EditJobAdModal} from "./EditJobAdModal";
+import {Link} from "react-router-dom";
+import JobType from "../../enumerations/JobType";
+
+export const JobAdvertisements = () => {
+
+    const dispatch = useDispatch();
+    const [jobAdvertisementsByRecruiter, setJobAdvertisementsByRecruiter] = useState([]);
+    const auth = useSelector(state => (state.auth.currentUser))
+    let jobAdvertisementsByRecruiterState = useSelector(state => (state.jobAd.jobAdvertisementsByRecruiter))
+
+    const [role, setRole] = useState("");
+    const [sortOrder, setSortOrder] = useState("newest");
+    const [selectedDateRange, setSelectedDateRange] = useState("all");
+    const [searchTerm, setSearchTerm] = useState("");
+    const [dispatched, setDispatched] = useState(false)
+
+
+    useEffect(() => {
+        if (auth) {
+            setRole(auth.role);
+        }
+    }, [auth]);
+
+    useEffect(() => {
+        if (!dispatched && jobAdvertisementsByRecruiterState.length === 0) {
+            dispatch(JobAdvertisementActions.fetchJobAdvertisementsByRecruiter("deleteThis", (success, response) => {
+                if (success && response.data.length > 0) {
+                    setJobAdvertisementsByRecruiter(sortElementsByDateCreated(response.data))
+                }
+                console.log("Fetch job advertisements by recruiter GET")
+            }))
+            setDispatched(true);
+
+        } else {
+            setJobAdvertisementsByRecruiter(jobAdvertisementsByRecruiterState)
+            console.log("Fetch job advertisements by recruiter STATE")
+        }
+    }, [jobAdvertisementsByRecruiterState])
+
+    return (
+        <div className="container">
+            <div className="head-job-advertisements-box">
+                <div className="row">
+                    <div className="col-md-3">
+                        <div className="search-container head-component">
+                            <i className="fa-solid fa-magnifying-glass blue-colored"></i>
+                            <input
+                                className="search-input"
+                                type="text"
+                                placeholder="Search job advertisement by title..."
+                                //value={searchTerm}
+                                //onChange={event => setSearchTerm(event.target.value)}
+                            />
+                        </div>
+                    </div>
+                    <div className="col-md-9">
+
+                        <AddJobAdModal/>
+                        <div className="sort-section item">
+                            <Select
+                                defaultValue={{value: "newest", label: "Date (Newest First)"}}
+                                //value={sortOrder.value}
+                                //onChange ={option => setSortOrder(option.value)}
+                                options={sortOptions}
+                                className="sort-range sort"
+                            />
+                        </div>
+                        <div className="date-range-section item">
+                            <Select
+                                defaultValue={{value: "all", label: "Lifetime"}}
+                                //value={selectedDateRange.value}
+                                //onChange={option => setSelectedDateRange(option.value)}
+                                options={dataRangeOptions}
+                                className="date-range sort"
+                            />
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div className="row row-cols-1 row-cols-md-4 g-4">
+
+                {jobAdvertisementsByRecruiter &&
+                    jobAdvertisementsByRecruiter.map((jobAd, index) => (
+                        <div key={index} className="col">
+                            <div className="custom-card">
+                                <div className="card-head">
+                                    <span className="hourly-salary"><b>${jobAd.startingSalary}/hr</b></span>
+                                    <span className="job-type"> {jobAd.jobType===JobType.JOB ? "Job" : "Internship"}</span>
+                                    {!jobAd.active && <span className="expired">Expired</span>}
+                                    <div className="card-management-btns">
+                                        <DeleteJobAdModal props={jobAd}/>
+                                        <EditJobAdModal props={jobAd}/>
+                                    </div>
+                                </div>
+                                <div className="card-body">
+                                    <h5 className="card-title">{jobAd.title}</h5>
+                                    <span>{jobAd.industry} • <span style={{color: "black", fontWeight: "bold"}}>{formatRelativeTime(jobAd.postedOn)}</span></span>
+                                    <div className="card-info">
+                                        <span><i className="fa-solid fa-building" style={{color: "#000000"}}></i> Company: <span style={{color: "black", fontWeight: "bold"}}>{jobAd.recruiterName}</span></span> <br/>
+                                    </div>
+
+                                    <div className="aligned">
+                                        <Link to={`/my-job-advertisements/view/${jobAd.id}`} className="card-button solo">View applications</Link>
+                                    </div>
+
+                                </div>
+                            </div>
+                        </div>
+                    ))}
+
+            </div>
+        </div>
+    )
+}
Index: jobvista-frontend/src/views/selectOptions.js
===================================================================
--- jobvista-frontend/src/views/selectOptions.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/selectOptions.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -0,0 +1,64 @@
+export const industryOptions = [
+    { value: "Information Technology", label: "Information Technology" },
+    { value: "Finance", label: "Finance" },
+    { value: "Healthcare", label: "Healthcare" },
+    { value: "Education", label: "Education" },
+    { value: "Engineering", label: "Engineering" },
+    { value: "Retail", label: "Retail" },
+    { value: "Hospitality", label: "Hospitality" },
+    { value: "Manufacturing", label: "Manufacturing" },
+    { value: "Construction", label: "Construction" },
+    { value: "Marketing", label: "Marketing" },
+    { value: "Media", label: "Media" },
+    { value: "Telecommunications", label: "Telecommunications" },
+    { value: "Transportation", label: "Transportation" },
+    { value: "Government", label: "Government" },
+    { value: "Consulting", label: "Consulting" }
+];
+
+export const industryOptionsFilter = [
+    { value: "all", label: "All industries" },
+    { value: "Information Technology", label: "Information Technology" },
+    { value: "Finance", label: "Finance" },
+    { value: "Healthcare", label: "Healthcare" },
+    { value: "Education", label: "Education" },
+    { value: "Engineering", label: "Engineering" },
+    { value: "Retail", label: "Retail" },
+    { value: "Hospitality", label: "Hospitality" },
+    { value: "Manufacturing", label: "Manufacturing" },
+    { value: "Construction", label: "Construction" },
+    { value: "Marketing", label: "Marketing" },
+    { value: "Media", label: "Media" },
+    { value: "Telecommunications", label: "Telecommunications" },
+    { value: "Transportation", label: "Transportation" },
+    { value: "Government", label: "Government" },
+    { value: "Consulting", label: "Consulting" }
+];
+
+export const jobTypeOptions = [
+    {value: "JOB", label: "Job"},
+    {value: "INTERNSHIP", label: "Internship"},
+]
+
+export const employmentStatusOptions = [
+    {value: "FULL_TIME", label: "Full time"},
+    {value: "PART_TIME", label: "Part time"}
+]
+
+export const dataRangeOptions = [
+    {value: "all", label: "Lifetime"},
+    {value: "7days", label: "Last 7 days"},
+    {value: "30days", label: "Last 30 days"},
+    {value: "90days", label: "Last 90 days"},
+    {value: "12months", label: "Last 12 months"},
+    {value: "today", label: "Today"},
+    {value: "thisMonth", label: "This month"},
+    {value: "12months", label: "This year"},
+]
+
+export const sortOptions = [
+    { value: "newest", label: "Date (Newest First)" },
+    { value: "oldest", label: "Date (Oldest First)" },
+    { value: "highest", label: "Salary (High to Low)" },
+    { value: "lowest", label: "Salary (Low to High)" },
+]
Index: jobvista-frontend/src/views/static/Header.js
===================================================================
--- jobvista-frontend/src/views/static/Header.js	(revision d8b6c91094bd4c748b347d914a3c4c3745d51587)
+++ jobvista-frontend/src/views/static/Header.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
@@ -5,12 +5,14 @@
 import {AuthActions} from "../../redux/actions/authActions";
 import Roles from "../../enumerations/Roles";
+import {useNavigate} from "react-router";
 
-export const Header = () => {
+export const Header = (props) => {
 
     const auth = useSelector(state => state.auth.currentUser);
     const dispatch = useDispatch();
+    const navigator = useNavigate();
 
-    const [role, setRole] = useState(null);
-    const [username, setUsername] = useState(null);
+    const [role, setRole] = useState("");
+    const [username, setUsername] = useState("");
 
     const signOut = () => {
@@ -20,5 +22,4 @@
 
     useEffect(() => {
-
         if (auth) {
             setRole(auth.role);
@@ -34,9 +35,9 @@
                 <div className="collapse navbar-collapse" id="navbarSupportedContent">
                     <ul className="navbar-nav me-auto mb-2 mb-lg-0">
-                        <NavLink to="/" className="nav-item nav-link" activeClassName="active">Home</NavLink>
+                        <NavLink to="/" className="nav-item nav-link">Home</NavLink>
                         {role==Roles.JOBSEEKER &&
                             <>
-                                <NavLink to="/applications" className="nav-item nav-link" activeClassName="active">Applications</NavLink>
-                                <NavLink to="/favoritejobs" className="nav-item nav-link" activeClassName="active">Saved</NavLink>
+                                <NavLink to="/applications" className="nav-item nav-link" >Applications</NavLink>
+                                <NavLink to="/favoritejobs" className="nav-item nav-link" >Saved</NavLink>
                             </>
 
@@ -44,6 +45,6 @@
                         {role==Roles.RECRUITER &&
                             <>
-                                <NavLink to="/jobadvertisements" className="nav-item nav-link" activeClassName="active">Job Advertisements</NavLink>
-                                <NavLink to="/favoritejobs" className="nav-item nav-link" activeClassName="active">Saved</NavLink>
+                                <NavLink to="/my-job-advertisements" className="nav-item nav-link" >Job Advertisements</NavLink>
+                                <NavLink to="/favoritejobs" className="nav-item nav-link" >Saved</NavLink>
                             </>
                         }
@@ -61,8 +62,8 @@
 
 
-                            <Link onClick={signOut} className="btn btn-outline-secondary">Log out</Link>
+                            <Link onClick={signOut} className="btn auth-secondary-btn">Log out</Link>
                         </> :
                         <>
-                            <Link to="/signin" className="btn btn-outline-secondary">Sign in</Link>
+                            <Link to="/signin" className="btn auth-secondary-btn">Sign in</Link>
                         </>
                     }
