Index: src/main/java/com/db/finki/www/build_board/config/BeanConfig.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/config/BeanConfig.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/config/BeanConfig.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -2,5 +2,4 @@
 
 import com.db.finki.www.build_board.service.AuthenticationSuccessHandlerImpl;
-import com.db.finki.www.build_board.service.threads.impl.FileUploadService;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
Index: src/main/java/com/db/finki/www/build_board/config/WebConfig.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/config/WebConfig.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/config/WebConfig.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -1,5 +1,5 @@
 package com.db.finki.www.build_board.config;
 
-import com.db.finki.www.build_board.service.threads.impl.FileUploadService;
+import com.db.finki.www.build_board.service.util.FileUploadService;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
Index: src/main/java/com/db/finki/www/build_board/controller/home_pages/HomePageController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/home_pages/HomePageController.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/controller/home_pages/HomePageController.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -4,6 +4,5 @@
 import com.db.finki.www.build_board.service.BBUserDetailsService;
 import com.db.finki.www.build_board.service.search.SearchService;
-import com.db.finki.www.build_board.service.threads.itfs.TagService;
-import org.springframework.security.core.context.SecurityContextHolder;
+import com.db.finki.www.build_board.service.thread.itfs.TagService;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
Index: src/main/java/com/db/finki/www/build_board/controller/home_pages/UserProfileController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/home_pages/UserProfileController.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/controller/home_pages/UserProfileController.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -1,7 +1,9 @@
 package com.db.finki.www.build_board.controller.home_pages;
 
+import com.db.finki.www.build_board.entity.enums.Status;
 import com.db.finki.www.build_board.entity.user_types.BBUser;
 import com.db.finki.www.build_board.service.BBUserDetailsService;
-import com.db.finki.www.build_board.service.threads.impl.FileUploadService;
+import com.db.finki.www.build_board.service.request.ProjectRequestService;
+import com.db.finki.www.build_board.service.util.FileUploadService;
 import jakarta.servlet.http.HttpSession;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -23,8 +25,10 @@
     private final BBUserDetailsService userService;
     private final FileUploadService fileUploadService;
+    private final ProjectRequestService projectRequestService;
 
-    public UserProfileController(BBUserDetailsService userService, FileUploadService fileUploadService) {
+    public UserProfileController(BBUserDetailsService userService, FileUploadService fileUploadService, ProjectRequestService projectRequestService) {
         this.userService = userService;
         this.fileUploadService = fileUploadService;
+        this.projectRequestService = projectRequestService;
     }
    
@@ -38,4 +42,17 @@
             return "redirect:/";
         }
+    }
+
+    @GetMapping("/project-requests")
+    public String getProjectRequestsPage(
+            @PathVariable String username,
+            Model model,
+            @RequestParam(required = false) Status status
+    ) {
+        BBUser forUser = (BBUser) userService.loadUserByUsername(username);
+        model.addAttribute("user", forUser);
+        model.addAttribute("requests", projectRequestService.getByStatusAndUser(status,forUser));
+        model.addAttribute("status", Status.values());
+        return "project_pages/requests/show-user-requests";
     }
 
Index: src/main/java/com/db/finki/www/build_board/controller/thread_controllers/DiscussionController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/thread_controllers/DiscussionController.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/controller/thread_controllers/DiscussionController.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -2,5 +2,5 @@
 
 import com.db.finki.www.build_board.entity.user_types.BBUser;
-import com.db.finki.www.build_board.service.threads.impl.DiscussionService;
+import com.db.finki.www.build_board.service.thread.impl.DiscussionService;
 import jakarta.servlet.http.HttpSession;
 import org.springframework.security.access.prepost.PreAuthorize;
Index: src/main/java/com/db/finki/www/build_board/controller/thread_controllers/ProjectController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/thread_controllers/ProjectController.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/controller/thread_controllers/ProjectController.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -3,7 +3,7 @@
 import com.db.finki.www.build_board.entity.threads.Project;
 import com.db.finki.www.build_board.entity.user_types.BBUser;
-import com.db.finki.www.build_board.service.threads.impl.ProjectService;
-import com.db.finki.www.build_board.service.threads.impl.TagServiceImpl;
-import com.db.finki.www.build_board.service.threads.itfs.TagService;
+import com.db.finki.www.build_board.service.thread.impl.ProjectService;
+import com.db.finki.www.build_board.service.thread.impl.TagServiceImpl;
+import com.db.finki.www.build_board.service.thread.itfs.TagService;
 import org.hibernate.Hibernate;
 import org.springframework.security.access.prepost.PreAuthorize;
Index: src/main/java/com/db/finki/www/build_board/controller/thread_controllers/TagController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/thread_controllers/TagController.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/controller/thread_controllers/TagController.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -3,7 +3,7 @@
 import com.db.finki.www.build_board.entity.threads.Project;
 import com.db.finki.www.build_board.entity.threads.Topic;
-import com.db.finki.www.build_board.service.threads.impl.ProjectService;
-import com.db.finki.www.build_board.service.threads.itfs.TagService;
-import com.db.finki.www.build_board.service.threads.itfs.TopicService;
+import com.db.finki.www.build_board.service.thread.impl.ProjectService;
+import com.db.finki.www.build_board.service.thread.itfs.TagService;
+import com.db.finki.www.build_board.service.thread.itfs.TopicService;
 import jakarta.servlet.http.HttpSession;
 import org.springframework.security.access.prepost.PreAuthorize;
Index: src/main/java/com/db/finki/www/build_board/controller/thread_controllers/TopicController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/thread_controllers/TopicController.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/controller/thread_controllers/TopicController.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -3,8 +3,8 @@
 import com.db.finki.www.build_board.entity.user_types.BBUser;
 import com.db.finki.www.build_board.entity.threads.Topic;
-import com.db.finki.www.build_board.service.threads.impl.DiscussionService;
-import com.db.finki.www.build_board.service.threads.impl.ThreadService;
-import com.db.finki.www.build_board.service.threads.itfs.TagService;
-import com.db.finki.www.build_board.service.threads.itfs.TopicService;
+import com.db.finki.www.build_board.service.thread.impl.DiscussionService;
+import com.db.finki.www.build_board.service.util.ThreadService;
+import com.db.finki.www.build_board.service.thread.itfs.TagService;
+import com.db.finki.www.build_board.service.thread.itfs.TopicService;
 import jakarta.servlet.http.HttpSession;
 import org.springframework.security.access.prepost.PreAuthorize;
Index: src/main/java/com/db/finki/www/build_board/controller/thread_controllers/requests/ProjectRequestController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/thread_controllers/requests/ProjectRequestController.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/controller/thread_controllers/requests/ProjectRequestController.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -1,5 +1,10 @@
 package com.db.finki.www.build_board.controller.thread_controllers.requests;
 
+import com.db.finki.www.build_board.entity.enums.Status;
 import com.db.finki.www.build_board.entity.threads.Project;
+import com.db.finki.www.build_board.entity.user_types.BBUser;
+import com.db.finki.www.build_board.service.request.ProjectRequestService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.parameters.P;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -8,28 +13,59 @@
 
 @Controller
-@RequestMapping("/project/{pr-title}/requests")
+@RequestMapping("/project/{pr-title}/request")
 public class ProjectRequestController {
+
+    private final ProjectRequestService projectRequestService;
+
+    public ProjectRequestController(ProjectRequestService projectService) {
+        this.projectRequestService = projectService;
+    }
 
     @GetMapping("")
     public String getRequestPage(
             Model model,
-            @PathVariable(name = "pr-title") Project project
+            @PathVariable(name = "pr-title") Project project,
+            @RequestParam(required = false) Status status
     ) {
-        model.addAttribute("requests", project.getRequests());
+        model.addAttribute("project", project);
+        model.addAttribute("requests", projectRequestService.getByStatusAndProject(status,project));
+        model.addAttribute("status", Status.values());
         return "project_pages/requests/show-requests";
     }
 
     @PostMapping("/{req-id}/accept")
-    public RedirectView acceptRequest(@PathVariable(name = "req-id") Integer reqId, @PathVariable(name = "pr-title") String projectTitle){
+    @PreAuthorize("#project.getUser().getId()==#user.getId()")
+    public RedirectView acceptRequest(@PathVariable(name = "req-id") Integer reqId,
+                                      @PathVariable(name = "pr-title") @P("project") Project project,
+                                      @RequestParam(name = "feedback-desc") String feedbackDesc,
+                                      @SessionAttribute @P("user") BBUser user
+    ) {
+        projectRequestService.accept(feedbackDesc,user,reqId);
         return new RedirectView(
-                String.format("/project/%s/requests", projectTitle)
+                String.format("/project/%s/request", project.getTitle())
         );
     }
 
     @PostMapping("/{req-id}/deny")
-    public RedirectView denyRequest(@PathVariable(name = "req-id") Integer reqId, @PathVariable(name = "pr-title") String projectTitle){
+    @PreAuthorize("#project.getUser().getId()==#user.getId()")
+    public RedirectView denyRequest(@PathVariable(name = "req-id") Integer reqId,
+                                    @PathVariable(name = "pr-title") @P("project") Project project,
+                                    @RequestParam(name = "feedback-desc") String feedbackDesc,
+                                    @SessionAttribute @P("user") BBUser user
+    ) {
+        projectRequestService.deny(reqId, feedbackDesc, user);
         return new RedirectView(
-                String.format("/project/%s/requests", projectTitle)
+                String.format("/project/%s/request", project.getTitle())
         );
     }
+
+    @PostMapping("/create")
+    public RedirectView createRequestToJoin(
+            @PathVariable(name = "pr-title") Project project,
+            @RequestParam(name = "reason-desc") String reason,
+            @SessionAttribute BBUser user
+    ){
+        projectRequestService.createRequestFor(project,reason,user);
+        return new RedirectView("/project/"+project.getTitle());
+    }
 }
Index: src/main/java/com/db/finki/www/build_board/controller/utils/LikesController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/utils/LikesController.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/controller/utils/LikesController.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -2,5 +2,5 @@
 
 import com.db.finki.www.build_board.entity.user_types.BBUser;
-import com.db.finki.www.build_board.service.threads.impl.ThreadService;
+import com.db.finki.www.build_board.service.util.ThreadService;
 import jakarta.servlet.http.HttpSession;
 import org.springframework.stereotype.Controller;
Index: src/main/java/com/db/finki/www/build_board/controller/utils/SearchController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/utils/SearchController.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/controller/utils/SearchController.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -2,5 +2,5 @@
 
 import com.db.finki.www.build_board.service.search.SearchService;
-import com.db.finki.www.build_board.service.threads.itfs.TopicService;
+import com.db.finki.www.build_board.service.thread.itfs.TopicService;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
Index: src/main/java/com/db/finki/www/build_board/converters/ProjectConverter.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/converters/ProjectConverter.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/converters/ProjectConverter.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -2,5 +2,5 @@
 
 import com.db.finki.www.build_board.entity.threads.Project;
-import com.db.finki.www.build_board.service.threads.impl.ProjectService;
+import com.db.finki.www.build_board.service.thread.impl.ProjectService;
 import lombok.NonNull;
 import org.springframework.core.convert.converter.Converter;
Index: c/main/java/com/db/finki/www/build_board/entity/Status.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/Status.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.db.finki.www.build_board.entity;
-
-public enum Status {
-    ACCEPTED,
-    DENIED,
-    PENDING
-}
Index: src/main/java/com/db/finki/www/build_board/entity/enums/FeedbackFor.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/enums/FeedbackFor.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/entity/enums/FeedbackFor.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,6 @@
+package com.db.finki.www.build_board.entity.enums;
+
+public enum FeedbackFor {
+    R, //report
+    P //project-request
+}
Index: src/main/java/com/db/finki/www/build_board/entity/enums/Status.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/enums/Status.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/entity/enums/Status.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,7 @@
+package com.db.finki.www.build_board.entity.enums;
+
+public enum Status {
+    ACCEPTED,
+    DENIED,
+    PENDING
+}
Index: src/main/java/com/db/finki/www/build_board/entity/requests/Feedback.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/requests/Feedback.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/entity/requests/Feedback.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,38 @@
+package com.db.finki.www.build_board.entity.requests;
+
+import com.db.finki.www.build_board.entity.enums.FeedbackFor;
+import com.db.finki.www.build_board.entity.user_types.BBUser;
+import jakarta.persistence.*;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+@Entity
+@Getter
+@Setter
+@NoArgsConstructor
+public class Feedback {
+    @Id
+    @Column(name = "submission_id")
+    Integer id;
+
+    private String description;
+
+    @Enumerated(EnumType.STRING)
+    private FeedbackFor submissionType;
+
+    @ManyToOne
+    @JoinColumn(name = "created_by")
+    private BBUser creator;
+
+    private LocalDateTime createdAt;
+
+    public Feedback(FeedbackFor submissionType, BBUser creator, String description, Integer reqId) {
+        setDescription(description);
+        setSubmissionType(submissionType);
+        setCreator(creator);
+        setId(reqId);
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/entity/requests/ProjectRequests.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/requests/ProjectRequests.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/entity/requests/ProjectRequests.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -18,16 +18,27 @@
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "project_req_gen")
     @SequenceGenerator(name = "project_req_gen", sequenceName = "project_request_id_seq", initialValue = 1, allocationSize = 1)
-    private Integer id;
+    private int id;
     private String description;
 
     @ManyToOne
     @JoinColumn(name = "project_id")
-    Project project;
+    private Project project;
 
     @ManyToOne
     @JoinColumn(name = "user_id")
-    BBUser creator;
+    private BBUser creator;
 
     @Enumerated(EnumType.STRING)
     private Status status;
+
+    @OneToOne(cascade = { CascadeType.PERSIST })
+    @JoinColumn(name = "submission_id")
+    private Feedback feedback;
+
+    public ProjectRequests(Project project, BBUser creator, String description) {
+        setDescription(description);
+        setCreator(creator);
+        setProject(project);
+        setStatus(Status.PENDING);
+    }
 }
Index: src/main/java/com/db/finki/www/build_board/entity/threads/Project.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/threads/Project.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/entity/threads/Project.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -40,5 +40,5 @@
     private List<Topic> topics = new ArrayList<>();
 
-    @ManyToMany
+    @ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
     @JoinTable(
             name ="developer_associated_with_project",
@@ -46,5 +46,5 @@
             inverseJoinColumns = @JoinColumn(name = "developer_id")
     )
-    private Set<Developer> developers = new HashSet<>();
+    private Set<BBUser> developers = new HashSet<>();
 
     @OneToMany(mappedBy = "project")
Index: src/main/java/com/db/finki/www/build_board/entity/user_types/BBUser.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/user_types/BBUser.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/entity/user_types/BBUser.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -2,5 +2,5 @@
 
 import com.db.finki.www.build_board.entity.threads.BBThread;
-import com.db.finki.www.build_board.service.threads.impl.FileUploadService;
+import com.db.finki.www.build_board.service.util.FileUploadService;
 import jakarta.persistence.*;
 import lombok.Getter;
Index: src/main/java/com/db/finki/www/build_board/repository/request/FeedbackRepo.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/request/FeedbackRepo.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/repository/request/FeedbackRepo.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,9 @@
+package com.db.finki.www.build_board.repository.request;
+
+import com.db.finki.www.build_board.entity.requests.Feedback;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface FeedbackRepo extends JpaRepository<Feedback, Long> {
+}
Index: src/main/java/com/db/finki/www/build_board/repository/request/ProjectRequestRepo.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/request/ProjectRequestRepo.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/repository/request/ProjectRequestRepo.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,22 @@
+package com.db.finki.www.build_board.repository.request;
+
+import com.db.finki.www.build_board.entity.enums.Status;
+import com.db.finki.www.build_board.entity.requests.ProjectRequests;
+import com.db.finki.www.build_board.entity.threads.Project;
+import com.db.finki.www.build_board.entity.user_types.BBUser;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ProjectRequestRepo extends JpaRepository<ProjectRequests,Long> {
+    List<ProjectRequests> findByStatus(Status status);
+    List<ProjectRequests> findByStatusAndCreator(Status status, BBUser forUser);
+    List<ProjectRequests> findByCreator(BBUser forUser);
+
+    List<ProjectRequests> findByProject(Project project);
+
+    List<ProjectRequests> findByStatusAndProject(Status status, Project project);
+}
Index: src/main/java/com/db/finki/www/build_board/repository/thread/BBThreadRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/thread/BBThreadRepository.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/repository/thread/BBThreadRepository.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,10 @@
+package com.db.finki.www.build_board.repository.thread;
+
+import com.db.finki.www.build_board.entity.threads.BBThread;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface BBThreadRepository extends JpaRepository<BBThread, Long> {
+    BBThread findById(long id);
+}
Index: src/main/java/com/db/finki/www/build_board/repository/thread/DiscussionRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/thread/DiscussionRepository.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/repository/thread/DiscussionRepository.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,11 @@
+package com.db.finki.www.build_board.repository.thread;
+
+import com.db.finki.www.build_board.entity.threads.discussion_threads.Discussion;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface DiscussionRepository extends JpaRepository<Discussion,Long> {
+
+    Discussion findDiscussionById(int discussionId);
+}
Index: src/main/java/com/db/finki/www/build_board/repository/thread/ProjectRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/thread/ProjectRepository.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/repository/thread/ProjectRepository.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,12 @@
+package com.db.finki.www.build_board.repository.thread;
+
+import com.db.finki.www.build_board.entity.threads.Project;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ProjectRepository extends JpaRepository<Project, Long>, JpaSpecificationExecutor<Project> {
+    Project findByTitleStartingWith(String title);
+    void deleteByTitle(String title);
+}
Index: src/main/java/com/db/finki/www/build_board/repository/thread/TagRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/thread/TagRepository.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/repository/thread/TagRepository.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,12 @@
+package com.db.finki.www.build_board.repository.thread;
+
+import com.db.finki.www.build_board.entity.threads.Tag;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface TagRepository extends JpaRepository<Tag, Long> {
+    Optional<Tag> findByName(String name);
+}
Index: src/main/java/com/db/finki/www/build_board/repository/thread/TopicRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/thread/TopicRepository.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/repository/thread/TopicRepository.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,14 @@
+package com.db.finki.www.build_board.repository.thread;
+
+import com.db.finki.www.build_board.entity.threads.Topic;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+
+@Repository
+public interface TopicRepository extends JpaRepository<Topic,Long>, JpaSpecificationExecutor<Topic> {
+    Topic findByTitle(String title);
+    void deleteByTitle(String title);
+    Topic findById(long id);;
+}
Index: src/main/java/com/db/finki/www/build_board/repository/thread/VDiscussRepo.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/thread/VDiscussRepo.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/repository/thread/VDiscussRepo.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,13 @@
+package com.db.finki.www.build_board.repository.thread;
+
+import com.db.finki.www.build_board.entity.threads.discussion_threads.VDiscussion;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface VDiscussRepo extends JpaRepository<VDiscussion,Long> {
+    List<VDiscussion> findVDiscussionByParentTopicId(Integer topicId);
+    VDiscussion findVDiscussionByDiscussionId(Integer discussionId);
+}
Index: c/main/java/com/db/finki/www/build_board/repository/threads/BBThreadRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/threads/BBThreadRepository.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,10 +1,0 @@
-package com.db.finki.www.build_board.repository.threads;
-
-import com.db.finki.www.build_board.entity.threads.BBThread;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface BBThreadRepository extends JpaRepository<BBThread, Long> {
-    BBThread findById(long id);
-}
Index: c/main/java/com/db/finki/www/build_board/repository/threads/DiscussionRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/threads/DiscussionRepository.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,11 +1,0 @@
-package com.db.finki.www.build_board.repository.threads;
-
-import com.db.finki.www.build_board.entity.threads.discussion_threads.Discussion;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface DiscussionRepository extends JpaRepository<Discussion,Long> {
-
-    Discussion findDiscussionById(int discussionId);
-}
Index: c/main/java/com/db/finki/www/build_board/repository/threads/ProjectRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/threads/ProjectRepository.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package com.db.finki.www.build_board.repository.threads;
-
-import com.db.finki.www.build_board.entity.threads.Project;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface ProjectRepository extends JpaRepository<Project, Long>, JpaSpecificationExecutor<Project> {
-    Project findByTitleStartingWith(String title);
-    void deleteByTitle(String title);
-}
Index: c/main/java/com/db/finki/www/build_board/repository/threads/TagRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/threads/TagRepository.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package com.db.finki.www.build_board.repository.threads;
-
-import com.db.finki.www.build_board.entity.threads.Tag;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-import java.util.Optional;
-
-@Repository
-public interface TagRepository extends JpaRepository<Tag, Long> {
-    Optional<Tag> findByName(String name);
-}
Index: c/main/java/com/db/finki/www/build_board/repository/threads/TopicRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/threads/TopicRepository.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package com.db.finki.www.build_board.repository.threads;
-
-import com.db.finki.www.build_board.entity.threads.Topic;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.stereotype.Repository;
-
-
-@Repository
-public interface TopicRepository extends JpaRepository<Topic,Long>, JpaSpecificationExecutor<Topic> {
-    Topic findByTitle(String title);
-    void deleteByTitle(String title);
-    Topic findById(long id);;
-}
Index: c/main/java/com/db/finki/www/build_board/repository/threads/VDiscussRepo.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/threads/VDiscussRepo.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package com.db.finki.www.build_board.repository.threads;
-
-import com.db.finki.www.build_board.entity.threads.discussion_threads.VDiscussion;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public interface VDiscussRepo extends JpaRepository<VDiscussion,Long> {
-    List<VDiscussion> findVDiscussionByParentTopicId(Integer topicId);
-    VDiscussion findVDiscussionByDiscussionId(Integer discussionId);
-}
Index: src/main/java/com/db/finki/www/build_board/service/AuthenticationSuccessHandlerImpl.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/AuthenticationSuccessHandlerImpl.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/service/AuthenticationSuccessHandlerImpl.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -2,5 +2,4 @@
 
 import com.db.finki.www.build_board.entity.user_types.BBUser;
-import com.db.finki.www.build_board.service.threads.impl.FileUploadService;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.http.HttpServletRequest;
Index: src/main/java/com/db/finki/www/build_board/service/request/FeedbackService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/request/FeedbackService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/service/request/FeedbackService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,18 @@
+package com.db.finki.www.build_board.service.request;
+
+import com.db.finki.www.build_board.entity.enums.FeedbackFor;
+import com.db.finki.www.build_board.entity.requests.Feedback;
+import com.db.finki.www.build_board.entity.user_types.BBUser;
+import com.db.finki.www.build_board.repository.request.FeedbackRepo;
+import org.springframework.stereotype.Service;
+
+@Service
+public class FeedbackService {
+    private final FeedbackRepo feedbackRepo;
+
+    public FeedbackService(FeedbackRepo feedbackRepo) {this.feedbackRepo = feedbackRepo;}
+
+    public Feedback create(String description, BBUser creator, FeedbackFor feedbackFor, Integer reqId){
+        return feedbackRepo.save(new Feedback(feedbackFor, creator, description,reqId));
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/service/request/ProjectRequestService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/request/ProjectRequestService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/service/request/ProjectRequestService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,58 @@
+package com.db.finki.www.build_board.service.request;
+
+import com.db.finki.www.build_board.entity.enums.FeedbackFor;
+import com.db.finki.www.build_board.entity.enums.Status;
+import com.db.finki.www.build_board.entity.requests.ProjectRequests;
+import com.db.finki.www.build_board.entity.threads.Project;
+import com.db.finki.www.build_board.entity.user_types.BBUser;
+import com.db.finki.www.build_board.repository.request.ProjectRequestRepo;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+@Service
+public class ProjectRequestService {
+    private final ProjectRequestRepo prReqRepo;
+    private final FeedbackService feedbackService;
+
+    public ProjectRequestService(ProjectRequestRepo prReqRepo, FeedbackService feedbackService) {
+        this.prReqRepo = prReqRepo;
+        this.feedbackService = feedbackService;
+    }
+
+    private ProjectRequests getRequestById(Integer id) {
+        return prReqRepo.findById((long)id).get() ;
+    }
+
+    public void deny(Integer reqId,String desc,BBUser creator){
+        ProjectRequests prReq = getRequestById(reqId);
+        prReq.setStatus(Status.DENIED);
+        prReq.setFeedback(feedbackService.create(desc,creator,FeedbackFor.P,reqId));
+        prReqRepo.save(prReq);
+    }
+
+    public void accept(String desc,BBUser creator,Integer reqId) {
+        ProjectRequests prReq = getRequestById(reqId);
+        prReq.setStatus(Status.ACCEPTED);
+        prReq.setFeedback(feedbackService.create(desc,creator,FeedbackFor.P,reqId));
+        prReq.getProject().getDevelopers().add(prReq.getCreator());
+        prReqRepo.save(prReq);
+    }
+
+    public List<ProjectRequests> getByStatusAndProject(Status status,Project project) {
+        if(status == null){
+            return prReqRepo.findByProject(project);
+        }
+        return prReqRepo.findByStatusAndProject(status,project);
+    }
+
+    public List<ProjectRequests> getByStatusAndUser(Status status, BBUser forUser) {
+        if(status == null){
+            return prReqRepo.findByCreator(forUser);
+        }
+        return prReqRepo.findByStatusAndCreator(status,forUser);
+    }
+
+    public ProjectRequests createRequestFor(Project project, String reason, BBUser creator) {
+        return prReqRepo.save(new ProjectRequests(project,creator,reason));
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/service/search/FilterMap.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/search/FilterMap.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/service/search/FilterMap.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -35,5 +35,4 @@
             return spec.or(filterMap.get("title").apply(param)).or(filterMap.get("content").apply(param));
         });
-
     }
 
Index: src/main/java/com/db/finki/www/build_board/service/search/SearchServiceImpl.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/search/SearchServiceImpl.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/java/com/db/finki/www/build_board/service/search/SearchServiceImpl.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -1,11 +1,10 @@
 package com.db.finki.www.build_board.service.search;
 
-import com.db.finki.www.build_board.entity.threads.BBThread;
 import com.db.finki.www.build_board.entity.threads.Project;
 import com.db.finki.www.build_board.entity.threads.Topic;
 import com.db.finki.www.build_board.entity.threads.interfaces.NamedThread;
-import com.db.finki.www.build_board.repository.threads.ProjectRepository;
-import com.db.finki.www.build_board.repository.threads.TopicRepository;
-import com.db.finki.www.build_board.service.threads.impl.NamedThreadService;
+import com.db.finki.www.build_board.repository.thread.ProjectRepository;
+import com.db.finki.www.build_board.repository.thread.TopicRepository;
+import com.db.finki.www.build_board.service.util.NamedThreadService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.jpa.domain.Specification;
Index: src/main/java/com/db/finki/www/build_board/service/thread/impl/DiscussionService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/thread/impl/DiscussionService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/service/thread/impl/DiscussionService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,64 @@
+package com.db.finki.www.build_board.service.threads.impl;
+
+import com.db.finki.www.build_board.entity.threads.BBThread;
+import com.db.finki.www.build_board.entity.threads.discussion_threads.Discussion;
+import com.db.finki.www.build_board.entity.threads.discussion_threads.VDiscussion;
+import com.db.finki.www.build_board.entity.user_types.BBUser;
+import com.db.finki.www.build_board.repository.thread.BBThreadRepository;
+import com.db.finki.www.build_board.repository.thread.DiscussionRepository;
+import com.db.finki.www.build_board.repository.thread.VDiscussRepo;
+import jakarta.transaction.Transactional;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+@Service
+public class DiscussionService {
+    private final VDiscussRepo vDiscussRepo;
+    private final DiscussionRepository discussionRepository;
+    private final BBThreadRepository threadRepository;
+
+    public DiscussionService(VDiscussRepo vDiscussRepo, DiscussionRepository discussionRepository, BBThreadRepository threadRepository) {
+        this.vDiscussRepo = vDiscussRepo;
+        this.discussionRepository = discussionRepository;
+        this.threadRepository = threadRepository;
+    }
+
+    public List<VDiscussion> findByTopic(int topicId){
+        return vDiscussRepo.findVDiscussionByParentTopicId(topicId);
+    }
+
+    public VDiscussion findVDiscussionById(int discussionId){
+        return vDiscussRepo.findVDiscussionByDiscussionId(discussionId);
+    }
+    public Discussion findDiscussionById(int discussionId){
+        return discussionRepository.findDiscussionById(discussionId);
+    }
+
+    public List<VDiscussion> findAll(){
+        return vDiscussRepo.findAll();
+    }
+
+    @Transactional
+    public Discussion create(String content, int parentId, BBUser user){
+
+        BBThread parent = threadRepository.findById(parentId);
+
+        Discussion reply = new Discussion();
+        reply.setContent(content);
+        reply.setUser(user);
+        reply.setParent(parent);
+
+        return discussionRepository.save(reply);
+    }
+
+    public Discussion edit(int replyId, String content) {
+        Discussion reply = discussionRepository.findDiscussionById(replyId);
+        reply.setContent(content);
+        return discussionRepository.save(reply);
+    }
+
+    public void delete(int threadId) {
+        Discussion d = discussionRepository.findDiscussionById(threadId);
+        discussionRepository.delete(d);
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/service/thread/impl/ProjectService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/thread/impl/ProjectService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/service/thread/impl/ProjectService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,81 @@
+package com.db.finki.www.build_board.service.thread.impl;
+
+import java.util.List;
+
+import com.db.finki.www.build_board.entity.threads.Tag;
+import com.db.finki.www.build_board.entity.threads.Topic;
+import com.db.finki.www.build_board.entity.user_types.BBUser;
+import com.db.finki.www.build_board.entity.threads.Project;
+import com.db.finki.www.build_board.repository.thread.ProjectRepository;
+import com.db.finki.www.build_board.service.BBUserDetailsService;
+import com.db.finki.www.build_board.service.thread.itfs.TagService;
+import com.db.finki.www.build_board.service.thread.itfs.TopicService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ProjectService {
+    private final ProjectRepository projectRepository;
+    private final TopicService topicService;
+    private final TagService tagService;
+    private final BBUserDetailsService userDetailsService;
+
+    public ProjectService(ProjectRepository projectRepository, TopicServiceImpl topicService, TagServiceImpl tagService, BBUserDetailsService userDetailsService) {
+        this.projectRepository = projectRepository;
+        this.topicService = topicService;
+        this.tagService = tagService;
+        this.userDetailsService = userDetailsService;
+    }
+
+    public List<Project> getAll(){
+        return projectRepository.findAll();
+    }
+
+    public void create(String title, String repoUrl, String description, BBUser user) {
+        projectRepository.save(
+                new Project(title, repoUrl, description, user)
+        );
+    }
+
+    public Project findByTitle(String title) {
+        return projectRepository.findByTitleStartingWith(title);
+    }
+
+    public void addToProjecNewTopic(Project project, String title, String description, String username) {
+        BBUser user = ((BBUser) userDetailsService.loadUserByUsername(username));
+        Topic topic = topicService.create(title, description, user);
+        topic.setParent(project);
+        project.getTopics().add(topic);
+        projectRepository.save(project);
+    }
+
+    public void addTagToProject(Project project, String tagName) {
+        Tag tag = null ;
+        try{
+            tag=tagService.findByName(tagName);
+        }catch (IllegalArgumentException ignore){
+             tag=tagService.create(tagName);
+        }
+        project.getTags().add(tag);
+        projectRepository.save(project);
+    }
+
+    public Project updateProject(Project project, String repoUrl, String description, String newTitle) {
+        project.setRepoUrl(repoUrl);
+        project.setDescription(description);
+        project.setTitle(newTitle);
+        return projectRepository.save(project);
+    }
+
+    public Project findById(Long id) {
+        return projectRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Project not found"));
+    }
+
+    public void delete(Project project) {
+        projectRepository.delete(project);
+    }
+
+    public void removeTagFromProject(Project project, String tagName) {
+        project.getTags().remove(tagService.findByName(tagName));
+        projectRepository.save(project);
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/service/thread/impl/TagServiceImpl.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/thread/impl/TagServiceImpl.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/service/thread/impl/TagServiceImpl.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,37 @@
+package com.db.finki.www.build_board.service.threads.impl;
+
+import com.db.finki.www.build_board.entity.threads.Tag;
+import com.db.finki.www.build_board.entity.threads.Topic;
+import com.db.finki.www.build_board.repository.thread.TagRepository;
+import com.db.finki.www.build_board.service.thread.itfs.TagService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class TagServiceImpl implements TagService {
+    private final TagRepository tagRepository;
+
+    public TagServiceImpl(TagRepository tagRepository) {
+        this.tagRepository = tagRepository;
+    }
+
+    @Override
+    public Tag findByName(String name) {
+        return tagRepository.findByName(name).orElseThrow(() -> new IllegalArgumentException("Tag not found"));
+    }
+
+    @Override
+    public List<Tag> findAll() {
+        return tagRepository.findAll();
+    }
+
+    public Tag create(String tagName) {
+        return tagRepository.save(new Tag(tagName));
+    }
+
+    @Override
+    public List<Tag> findAllNotUsed(Topic t) {
+        return tagRepository.findAll().stream().filter(tag -> !t.getTags().contains(tag)).toList();
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/service/thread/impl/TopicServiceImpl.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/thread/impl/TopicServiceImpl.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/service/thread/impl/TopicServiceImpl.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,93 @@
+package com.db.finki.www.build_board.service.thread.impl;
+
+import com.db.finki.www.build_board.entity.user_types.BBUser;
+import com.db.finki.www.build_board.entity.threads.Tag;
+import com.db.finki.www.build_board.entity.threads.Topic;
+import com.db.finki.www.build_board.repository.thread.TagRepository;
+import com.db.finki.www.build_board.repository.thread.TopicRepository;
+import com.db.finki.www.build_board.service.thread.itfs.TopicService;
+import jakarta.transaction.Transactional;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class TopicServiceImpl implements TopicService {
+    private final TopicRepository topicRepository;
+    private final TagRepository tagRepository;
+
+    public TopicServiceImpl(TopicRepository topicRepository, TagRepository tagRepository) {
+        this.topicRepository = topicRepository;
+        this.tagRepository = tagRepository;
+    }
+
+
+    @Override
+    public Topic create(String title, String description, BBUser user) {
+        Topic topic = new Topic();
+        topic.setTitle(title);
+        topic.setContent(description);
+        topic.setUser(user);
+        return topicRepository.save(topic);
+    }
+
+    @Override
+    public List<Topic> getAll() {
+        return topicRepository.findAll();
+    }
+
+    @Override
+    public Topic getByTitle(String title) {
+        return topicRepository.findByTitle(title);
+    }
+
+    @Override
+    public void deleteTopicById(Long id) {
+        topicRepository.deleteById(id);
+    }
+
+    @Override
+    public void deleteTopicByTitle(String title) {
+        topicRepository.deleteByTitle(title);
+    }
+
+    @Override
+    public Topic getById(Long id) {
+        return topicRepository.findById(id).orElse(null);
+    }
+
+    @Override
+    @Transactional
+    public void addTagToTopic(Topic topic, String tagName) {
+        tagRepository.findByName(tagName).ifPresentOrElse(tag -> {
+            topic.getTags().add(tag);
+            tag.getThreads().add(topic);
+            topicRepository.save(topic);
+            tagRepository.save(tag);
+        },() -> {
+            Tag tag = new Tag(tagName);
+            tagRepository.save(tag);
+            topic.getTags().add(tag);
+            tag.getThreads().add(topic);
+            topicRepository.save(topic);
+        });
+    }
+
+    @Override
+    public Topic save(long id, String title, String description) {
+        Topic t = getById(id);
+        t.setTitle(title);
+        t.setContent(description);
+        return topicRepository.save(t);
+    }
+
+    @Override
+    @Transactional
+    public Topic deleteTagFromTopic(long id, String tagName) {
+        Topic t = getById(id);
+        boolean removed = t.getTags().remove(new Tag(tagName));
+        if(!removed) throw new IllegalArgumentException("Tag not found");
+        return topicRepository.save(t);
+    }
+
+}
Index: src/main/java/com/db/finki/www/build_board/service/thread/itfs/TagService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/thread/itfs/TagService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/service/thread/itfs/TagService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,13 @@
+package com.db.finki.www.build_board.service.thread.itfs;
+
+import com.db.finki.www.build_board.entity.threads.Tag;
+import com.db.finki.www.build_board.entity.threads.Topic;
+
+import java.util.List;
+
+public interface TagService {
+    Tag findByName(String name);
+    List<Tag> findAll();
+    List<Tag> findAllNotUsed(Topic t);
+    Tag create(String name);
+}
Index: src/main/java/com/db/finki/www/build_board/service/thread/itfs/TopicService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/thread/itfs/TopicService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/service/thread/itfs/TopicService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,17 @@
+package com.db.finki.www.build_board.service.thread.itfs;
+
+import com.db.finki.www.build_board.entity.user_types.BBUser;
+import com.db.finki.www.build_board.entity.threads.Topic;
+
+import java.util.List;
+public interface TopicService {
+    Topic create(String title, String description, BBUser user);
+    List<Topic> getAll();
+    Topic getByTitle(String title);
+    void deleteTopicById(Long id);
+    void deleteTopicByTitle(String title);
+    Topic getById(Long id);
+    void addTagToTopic(Topic topic, String tagName);
+    Topic save(long id, String title, String description);
+    Topic deleteTagFromTopic(long id, String tagName);
+}
Index: c/main/java/com/db/finki/www/build_board/service/threads/impl/DiscussionService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/impl/DiscussionService.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,64 +1,0 @@
-package com.db.finki.www.build_board.service.threads.impl;
-
-import com.db.finki.www.build_board.entity.threads.BBThread;
-import com.db.finki.www.build_board.entity.threads.discussion_threads.Discussion;
-import com.db.finki.www.build_board.entity.threads.discussion_threads.VDiscussion;
-import com.db.finki.www.build_board.entity.user_types.BBUser;
-import com.db.finki.www.build_board.repository.threads.BBThreadRepository;
-import com.db.finki.www.build_board.repository.threads.DiscussionRepository;
-import com.db.finki.www.build_board.repository.threads.VDiscussRepo;
-import jakarta.transaction.Transactional;
-import org.springframework.stereotype.Service;
-import java.util.List;
-
-@Service
-public class DiscussionService {
-    private final VDiscussRepo vDiscussRepo;
-    private final DiscussionRepository discussionRepository;
-    private final BBThreadRepository threadRepository;
-
-    public DiscussionService(VDiscussRepo vDiscussRepo, DiscussionRepository discussionRepository, BBThreadRepository threadRepository) {
-        this.vDiscussRepo = vDiscussRepo;
-        this.discussionRepository = discussionRepository;
-        this.threadRepository = threadRepository;
-    }
-
-    public List<VDiscussion> findByTopic(int topicId){
-        return vDiscussRepo.findVDiscussionByParentTopicId(topicId);
-    }
-
-    public VDiscussion findVDiscussionById(int discussionId){
-        return vDiscussRepo.findVDiscussionByDiscussionId(discussionId);
-    }
-    public Discussion findDiscussionById(int discussionId){
-        return discussionRepository.findDiscussionById(discussionId);
-    }
-
-    public List<VDiscussion> findAll(){
-        return vDiscussRepo.findAll();
-    }
-
-    @Transactional
-    public Discussion create(String content, int parentId, BBUser user){
-
-        BBThread parent = threadRepository.findById(parentId);
-
-        Discussion reply = new Discussion();
-        reply.setContent(content);
-        reply.setUser(user);
-        reply.setParent(parent);
-
-        return discussionRepository.save(reply);
-    }
-
-    public Discussion edit(int replyId, String content) {
-        Discussion reply = discussionRepository.findDiscussionById(replyId);
-        reply.setContent(content);
-        return discussionRepository.save(reply);
-    }
-
-    public void delete(int threadId) {
-        Discussion d = discussionRepository.findDiscussionById(threadId);
-        discussionRepository.delete(d);
-    }
-}
Index: c/main/java/com/db/finki/www/build_board/service/threads/impl/FileUploadService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/impl/FileUploadService.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,56 +1,0 @@
-package com.db.finki.www.build_board.service.threads.impl;
-
-
-import jakarta.annotation.PostConstruct;
-import org.apache.tomcat.util.http.fileupload.FileUploadException;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-@Service
-public class FileUploadService {
-
-    public static String USER_AVATAR_DIR = System.getProperty("user.dir") + File.separator + "/uploads/user-avatars";
-    public static long MAX_FILE_SIZE = 5 * 1024 * 1024;
-
-    public void uploadAvatar(MultipartFile file, long userId) throws IOException {
-        System.out.println(USER_AVATAR_DIR);
-
-        if(file.isEmpty()){
-            throw new FileUploadException("File is empty");
-        }
-
-        String contentType = file.getContentType();
-        if (!contentType.startsWith("image/")) {
-            throw new IOException("Only image files are allowed.");
-        }
-
-        if (file.getSize() > MAX_FILE_SIZE) {
-            throw new IOException("File size exceeds the limit.");
-        }
-
-
-        String fileName = "avatar-" + userId;
-        File saveFile = new File(USER_AVATAR_DIR + File.separator + fileName);
-
-        if (saveFile.exists()) {
-            saveFile.delete();
-        }
-
-        file.transferTo(saveFile);
-    }
-
-    @PostConstruct
-    public void initDirectories(){
-        File directory = new File(USER_AVATAR_DIR);
-        if (!directory.exists()) {
-            directory.mkdirs();
-        }
-    }
-
-}
Index: c/main/java/com/db/finki/www/build_board/service/threads/impl/NamedThreadService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/impl/NamedThreadService.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,24 +1,0 @@
-package com.db.finki.www.build_board.service.threads.impl;
-
-import com.db.finki.www.build_board.entity.threads.interfaces.NamedThread;
-import com.db.finki.www.build_board.service.threads.itfs.TopicService;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-public class NamedThreadService {
-    private final TopicService topicService;
-    private final ProjectService projectService;
-
-    public NamedThreadService(TopicServiceImpl topicService, ProjectService projectService) {
-        this.topicService = topicService;
-        this.projectService = projectService;
-    }
-
-    public List<NamedThread> findAll(){
-        List<NamedThread> results = (List<NamedThread>) (List<?>) topicService.getAll();
-        results.addAll((List<NamedThread>)(List<?>) projectService.getAll());
-        return results;
-    }
-}
Index: c/main/java/com/db/finki/www/build_board/service/threads/impl/ProjectService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/impl/ProjectService.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,82 +1,0 @@
-package com.db.finki.www.build_board.service.threads.impl;
-
-import java.util.List;
-
-import com.db.finki.www.build_board.entity.threads.BBThread;
-import com.db.finki.www.build_board.entity.threads.Tag;
-import com.db.finki.www.build_board.entity.threads.Topic;
-import com.db.finki.www.build_board.entity.user_types.BBUser;
-import com.db.finki.www.build_board.entity.threads.Project;
-import com.db.finki.www.build_board.repository.threads.ProjectRepository;
-import com.db.finki.www.build_board.service.BBUserDetailsService;
-import com.db.finki.www.build_board.service.threads.itfs.TagService;
-import com.db.finki.www.build_board.service.threads.itfs.TopicService;
-import org.springframework.stereotype.Service;
-
-@Service
-public class ProjectService {
-    private final ProjectRepository projectRepository;
-    private final TopicService topicService;
-    private final TagService tagService;
-    private final BBUserDetailsService userDetailsService;
-
-    public ProjectService(ProjectRepository projectRepository, TopicServiceImpl topicService, TagServiceImpl tagService, BBUserDetailsService userDetailsService) {
-        this.projectRepository = projectRepository;
-        this.topicService = topicService;
-        this.tagService = tagService;
-        this.userDetailsService = userDetailsService;
-    }
-
-    public List<Project> getAll(){
-        return projectRepository.findAll();
-    }
-
-    public void create(String title, String repoUrl, String description, BBUser user) {
-        projectRepository.save(
-                new Project(title, repoUrl, description, user)
-        );
-    }
-
-    public Project findByTitle(String title) {
-        return projectRepository.findByTitleStartingWith(title);
-    }
-
-    public void addToProjecNewTopic(Project project, String title, String description, String username) {
-        BBUser user = ((BBUser) userDetailsService.loadUserByUsername(username));
-        Topic topic = topicService.create(title, description, user);
-        topic.setParent(project);
-        project.getTopics().add(topic);
-        projectRepository.save(project);
-    }
-
-    public void addTagToProject(Project project, String tagName) {
-        Tag tag = null ;
-        try{
-            tag=tagService.findByName(tagName);
-        }catch (IllegalArgumentException ignore){
-             tag=tagService.create(tagName);
-        }
-        project.getTags().add(tag);
-        projectRepository.save(project);
-    }
-
-    public Project updateProject(Project project, String repoUrl, String description, String newTitle) {
-        project.setRepoUrl(repoUrl);
-        project.setDescription(description);
-        project.setTitle(newTitle);
-        return projectRepository.save(project);
-    }
-
-    public Project findById(Long id) {
-        return projectRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Project not found"));
-    }
-
-    public void delete(Project project) {
-        projectRepository.delete(project);
-    }
-
-    public void removeTagFromProject(Project project, String tagName) {
-        project.getTags().remove(tagService.findByName(tagName));
-        projectRepository.save(project);
-    }
-}
Index: c/main/java/com/db/finki/www/build_board/service/threads/impl/TagServiceImpl.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/impl/TagServiceImpl.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,37 +1,0 @@
-package com.db.finki.www.build_board.service.threads.impl;
-
-import com.db.finki.www.build_board.entity.threads.Tag;
-import com.db.finki.www.build_board.entity.threads.Topic;
-import com.db.finki.www.build_board.repository.threads.TagRepository;
-import com.db.finki.www.build_board.service.threads.itfs.TagService;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-public class TagServiceImpl implements TagService {
-    private final TagRepository tagRepository;
-
-    public TagServiceImpl(TagRepository tagRepository) {
-        this.tagRepository = tagRepository;
-    }
-
-    @Override
-    public Tag findByName(String name) {
-        return tagRepository.findByName(name).orElseThrow(() -> new IllegalArgumentException("Tag not found"));
-    }
-
-    @Override
-    public List<Tag> findAll() {
-        return tagRepository.findAll();
-    }
-
-    public Tag create(String tagName) {
-        return tagRepository.save(new Tag(tagName));
-    }
-
-    @Override
-    public List<Tag> findAllNotUsed(Topic t) {
-        return tagRepository.findAll().stream().filter(tag -> !t.getTags().contains(tag)).toList();
-    }
-}
Index: c/main/java/com/db/finki/www/build_board/service/threads/impl/ThreadService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/impl/ThreadService.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,36 +1,0 @@
-package com.db.finki.www.build_board.service.threads.impl;
-
-import com.db.finki.www.build_board.entity.threads.BBThread;
-import com.db.finki.www.build_board.entity.user_types.BBUser;
-import com.db.finki.www.build_board.repository.UserRepository;
-import com.db.finki.www.build_board.repository.threads.BBThreadRepository;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Set;
-
-@Service
-public class ThreadService {
-    private final BBThreadRepository bbThreadRepository;
-    private final UserRepository userRepository;
-
-    public ThreadService(BBThreadRepository bbThreadRepository, UserRepository userRepository) {
-        this.bbThreadRepository = bbThreadRepository;
-        this.userRepository = userRepository;
-    }
-
-    public void rate(int threadId, int userId,boolean like){
-        BBThread thread = bbThreadRepository.findById(threadId);
-        BBUser user = userRepository.findById(userId);
-        if(like){
-            Set<BBUser> users = thread.getLikes();
-            if(!users.contains(user)){
-                thread.getLikes().add(user);
-            }
-
-        } else {
-            thread.getLikes().remove(user);
-        }
-        bbThreadRepository.save(thread);
-    }
-}
Index: c/main/java/com/db/finki/www/build_board/service/threads/impl/TopicServiceImpl.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/impl/TopicServiceImpl.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,93 +1,0 @@
-package com.db.finki.www.build_board.service.threads.impl;
-
-import com.db.finki.www.build_board.entity.user_types.BBUser;
-import com.db.finki.www.build_board.entity.threads.Tag;
-import com.db.finki.www.build_board.entity.threads.Topic;
-import com.db.finki.www.build_board.repository.threads.TagRepository;
-import com.db.finki.www.build_board.repository.threads.TopicRepository;
-import com.db.finki.www.build_board.service.threads.itfs.TopicService;
-import jakarta.transaction.Transactional;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-public class TopicServiceImpl implements TopicService {
-    private final TopicRepository topicRepository;
-    private final TagRepository tagRepository;
-
-    public TopicServiceImpl(TopicRepository topicRepository, TagRepository tagRepository) {
-        this.topicRepository = topicRepository;
-        this.tagRepository = tagRepository;
-    }
-
-
-    @Override
-    public Topic create(String title, String description, BBUser user) {
-        Topic topic = new Topic();
-        topic.setTitle(title);
-        topic.setContent(description);
-        topic.setUser(user);
-        return topicRepository.save(topic);
-    }
-
-    @Override
-    public List<Topic> getAll() {
-        return topicRepository.findAll();
-    }
-
-    @Override
-    public Topic getByTitle(String title) {
-        return topicRepository.findByTitle(title);
-    }
-
-    @Override
-    public void deleteTopicById(Long id) {
-        topicRepository.deleteById(id);
-    }
-
-    @Override
-    public void deleteTopicByTitle(String title) {
-        topicRepository.deleteByTitle(title);
-    }
-
-    @Override
-    public Topic getById(Long id) {
-        return topicRepository.findById(id).orElse(null);
-    }
-
-    @Override
-    @Transactional
-    public void addTagToTopic(Topic topic, String tagName) {
-        tagRepository.findByName(tagName).ifPresentOrElse(tag -> {
-            topic.getTags().add(tag);
-            tag.getThreads().add(topic);
-            topicRepository.save(topic);
-            tagRepository.save(tag);
-        },() -> {
-            Tag tag = new Tag(tagName);
-            tagRepository.save(tag);
-            topic.getTags().add(tag);
-            tag.getThreads().add(topic);
-            topicRepository.save(topic);
-        });
-    }
-
-    @Override
-    public Topic save(long id, String title, String description) {
-        Topic t = getById(id);
-        t.setTitle(title);
-        t.setContent(description);
-        return topicRepository.save(t);
-    }
-
-    @Override
-    @Transactional
-    public Topic deleteTagFromTopic(long id, String tagName) {
-        Topic t = getById(id);
-        boolean removed = t.getTags().remove(new Tag(tagName));
-        if(!removed) throw new IllegalArgumentException("Tag not found");
-        return topicRepository.save(t);
-    }
-
-}
Index: c/main/java/com/db/finki/www/build_board/service/threads/itfs/TagService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/itfs/TagService.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package com.db.finki.www.build_board.service.threads.itfs;
-
-import com.db.finki.www.build_board.entity.threads.Tag;
-import com.db.finki.www.build_board.entity.threads.Topic;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-public interface TagService {
-    Tag findByName(String name);
-    List<Tag> findAll();
-    List<Tag> findAllNotUsed(Topic t);
-    Tag create(String name);
-}
Index: c/main/java/com/db/finki/www/build_board/service/threads/itfs/TopicService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/itfs/TopicService.java	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ 	(revision )
@@ -1,17 +1,0 @@
-package com.db.finki.www.build_board.service.threads.itfs;
-
-import com.db.finki.www.build_board.entity.user_types.BBUser;
-import com.db.finki.www.build_board.entity.threads.Topic;
-
-import java.util.List;
-public interface TopicService {
-    Topic create(String title, String description, BBUser user);
-    List<Topic> getAll();
-    Topic getByTitle(String title);
-    void deleteTopicById(Long id);
-    void deleteTopicByTitle(String title);
-    Topic getById(Long id);
-    void addTagToTopic(Topic topic, String tagName);
-    Topic save(long id, String title, String description);
-    Topic deleteTagFromTopic(long id, String tagName);
-}
Index: src/main/java/com/db/finki/www/build_board/service/util/FileUploadService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/util/FileUploadService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/service/util/FileUploadService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,53 @@
+package com.db.finki.www.build_board.service.util;
+
+
+import jakarta.annotation.PostConstruct;
+import org.apache.tomcat.util.http.fileupload.FileUploadException;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+
+@Service
+public class FileUploadService {
+
+    public static String USER_AVATAR_DIR = System.getProperty("user.dir") + File.separator + "/uploads/user-avatars";
+    public static long MAX_FILE_SIZE = 5 * 1024 * 1024;
+
+    public void uploadAvatar(MultipartFile file, long userId) throws IOException {
+        System.out.println(USER_AVATAR_DIR);
+
+        if(file.isEmpty()){
+            throw new FileUploadException("File is empty");
+        }
+
+        String contentType = file.getContentType();
+        if (!contentType.startsWith("image/")) {
+            throw new IOException("Only image files are allowed.");
+        }
+
+        if (file.getSize() > MAX_FILE_SIZE) {
+            throw new IOException("File size exceeds the limit.");
+        }
+
+
+        String fileName = "avatar-" + userId;
+        File saveFile = new File(USER_AVATAR_DIR + File.separator + fileName);
+
+        if (saveFile.exists()) {
+            saveFile.delete();
+        }
+
+        file.transferTo(saveFile);
+    }
+
+    @PostConstruct
+    public void initDirectories(){
+        File directory = new File(USER_AVATAR_DIR);
+        if (!directory.exists()) {
+            directory.mkdirs();
+        }
+    }
+
+}
Index: src/main/java/com/db/finki/www/build_board/service/util/NamedThreadService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/util/NamedThreadService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/service/util/NamedThreadService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,26 @@
+package com.db.finki.www.build_board.service.util;
+
+import com.db.finki.www.build_board.entity.threads.interfaces.NamedThread;
+import com.db.finki.www.build_board.service.thread.impl.ProjectService;
+import com.db.finki.www.build_board.service.thread.impl.TopicServiceImpl;
+import com.db.finki.www.build_board.service.thread.itfs.TopicService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class NamedThreadService {
+    private final TopicService topicService;
+    private final ProjectService projectService;
+
+    public NamedThreadService(TopicServiceImpl topicService, ProjectService projectService) {
+        this.topicService = topicService;
+        this.projectService = projectService;
+    }
+
+    public List<NamedThread> findAll(){
+        List<NamedThread> results = (List<NamedThread>) (List<?>) topicService.getAll();
+        results.addAll((List<NamedThread>)(List<?>) projectService.getAll());
+        return results;
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/service/util/ThreadService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/util/ThreadService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/java/com/db/finki/www/build_board/service/util/ThreadService.java	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,35 @@
+package com.db.finki.www.build_board.service.util;
+
+import com.db.finki.www.build_board.entity.threads.BBThread;
+import com.db.finki.www.build_board.entity.user_types.BBUser;
+import com.db.finki.www.build_board.repository.UserRepository;
+import com.db.finki.www.build_board.repository.thread.BBThreadRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.Set;
+
+@Service
+public class ThreadService {
+    private final BBThreadRepository bbThreadRepository;
+    private final UserRepository userRepository;
+
+    public ThreadService(BBThreadRepository bbThreadRepository, UserRepository userRepository) {
+        this.bbThreadRepository = bbThreadRepository;
+        this.userRepository = userRepository;
+    }
+
+    public void rate(int threadId, int userId,boolean like){
+        BBThread thread = bbThreadRepository.findById(threadId);
+        BBUser user = userRepository.findById(userId);
+        if(like){
+            Set<BBUser> users = thread.getLikes();
+            if(!users.contains(user)){
+                thread.getLikes().add(user);
+            }
+
+        } else {
+            thread.getLikes().remove(user);
+        }
+        bbThreadRepository.save(thread);
+    }
+}
Index: src/main/resources/db/migration/V1__init_ddl.sql
===================================================================
--- src/main/resources/db/migration/V1__init_ddl.sql	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/resources/db/migration/V1__init_ddl.sql	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -180,17 +180,16 @@
 );
 
-CREATE TYPE status AS ENUM ('ACCEPTED', 'DENIED', 'PENDING');
+-- CREATE TYPE status AS ENUM ('ACCEPTED', 'DENIED', 'PENDING');
 CREATE TABLE project_request
 (
     id          SERIAL PRIMARY KEY,
     description VARCHAR(200),
-    status      status                     NOT NULL,
+    status      varchar(32)                NOT NULL DEFAULT 'PENDING',
     user_id     INT REFERENCES users (id)  ON DELETE CASCADE NOT NULL ,
     project_id  INT REFERENCES thread (id) ON DELETE CASCADE NOT NULL,
     created_at timestamp default now(),
-    submission_id int references submission(id)
-);
-
--- todo trigger pred kreiranje project request ili report ke kreirat submission
+    submission_id int references submission(id) ON DELETE CASCADE
+);
+
 
 create table feedback (
@@ -199,6 +198,5 @@
     created_by int references users(id),
     created_at timestamp default now(),
-    submission_id int references submission(id)
-
+    submission_id int PRIMARY KEY references submission(id) on delete cascade
 );
 
@@ -208,9 +206,9 @@
     created_at  TIMESTAMP default now(),
     description VARCHAR(200) NOT NULL,
-    status      status,
+    status      varchar(32) default 'PENDING',
     thread_id   INT REFERENCES thread (id) on delete cascade,
     for_user_id INT REFERENCES users (id) on delete cascade,
     by_user_id  INT REFERENCES users (id) on delete cascade,
-    submission_id int references submission(id),
+    submission_id int references submission(id) on delete cascade,
     PRIMARY KEY (id, thread_id, for_user_id, by_user_id)
 );
@@ -436,4 +434,40 @@
 $$;
 
+
+create or replace function fn_add_sub_pr_request()
+    returns trigger
+    language plpgsql
+as
+$$
+BEGIN
+    insert into submission default values returning id into NEW.submission_id;
+    return new;
+END;
+$$
+;
+create or replace function fn_add_report()
+    returns trigger
+    language plpgsql
+as
+$$
+BEGIN
+    insert into submission default values returning id into NEW.id;
+    return new;
+END;
+$$
+;
+
+create or replace function fn_add_dev_if_not_exist()
+returns trigger
+language plpgsql
+as $$
+    BEGIN
+        IF NOT check_if_user_exists_in('developer','id',new.developer_id::text) THEN
+            INSERT INTO developer values (NEW.developer_id);
+        end if;
+        RETURN new;
+    end;
+    $$;
+
 -------------------------- TRIGGERS ----------------------
 CREATE OR REPLACE TRIGGER tr_check_topic_name
@@ -471,2 +505,18 @@
 execute function fn_remove_not_active_developer();
 
+create or replace trigger tr_add_sub_pr_request
+    before insert
+    on project_request
+    for each row
+execute FUNCTION fn_add_sub_pr_request();
+
+create or replace trigger tr_add_report
+    before insert on report
+    for each row
+execute function fn_add_report();
+
+create or replace trigger tr_add_dev_if_not_exist
+before insert on developer_associated_with_project
+    for each row
+    execute function fn_add_dev_if_not_exist();
+
Index: src/main/resources/static/js/modal_utils.js
===================================================================
--- src/main/resources/static/js/modal_utils.js	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/resources/static/js/modal_utils.js	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,10 @@
+const modalConts = []
+document.addEventListener("keydown", ev => {
+    if (ev.key !== 'Escape') return null;
+    modalConts.forEach(cont => {
+        if (cont.classList.contains("show")) {
+            const close = cont.querySelector(".btn-close")
+            close.click()
+        }
+    })
+})
Index: src/main/resources/templates/fragments/user_fields.html
===================================================================
--- src/main/resources/templates/fragments/user_fields.html	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/resources/templates/fragments/user_fields.html	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -1,5 +1,5 @@
 <form th:with="borderStyle=${canEdit ? 'border-secondary rounded' : 'border-0 pe-none'}" method="post"
-       class="d-flex gap-2 flex-grow-1 flex-column gap-2 list-group-flush " th:action="${url}"
-       th:fragment="user_fields(url)">
+       class="d-flex gap-2 flex-grow-1 flex-column gap-2 list-group-flush " th:action="@{/{username}/profile/change(username=${username})}"
+       th:fragment="user_fields(username)">
        <h5>Personal Details</h5>
        <label class="fw-bold ">Username:
@@ -27,4 +27,5 @@
        <input type="hidden" name="cur_user_username"
               th:value="${session.user == null} ? '' : ${session.user.getUsername()}">
+       <a th:href="@{/{username}/project-requests(username=${username})}">View project requests</a>
        <button th:if="${canEdit}" class="btn btn-success btn-sm w-50 align-self-center">Save changes
        </button>
Index: src/main/resources/templates/home_pages/profile.html
===================================================================
--- src/main/resources/templates/home_pages/profile.html	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/resources/templates/home_pages/profile.html	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -40,5 +40,5 @@
                 <!-- User Details -->
                 <div
-                    th:replace="fragments/user_fields :: user_fields(url=@{/{username}/profile/change(username=${user.getUsername()})})">
+                    th:replace="fragments/user_fields :: user_fields(username=${user.getUsername()})">
                 </div>
                 <!--            <form method="post"-->
Index: src/main/resources/templates/project_pages/members.html
===================================================================
--- src/main/resources/templates/project_pages/members.html	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/resources/templates/project_pages/members.html	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -67,12 +67,5 @@
 <main class="d-flex justify-content-center align-content-center ">
     <div class="list-group w-75">
-        <!--    <div class="list-group-item" th:with="creator=${project.getUser()}">-->
-        <!--      <img th:src="${creator.getAvatarUrl()}">-->
-        <!--      <h5 class="mb-1 d-flex">-->
-        <!--        <a th:href="@{/{username}/profile (username=${creator.getName()})}"-->
-        <!--           th:text="${creator.getName()}" class="text-decoration-none"></a>-->
-        <!--      </h5>-->
-        <!--      <h5>Creator</h5>-->
-        <!--    </div>-->
+
         <div class="list-group-item d-flex gap-2 justify-content-between align-items-center ps-4 pe-4"
              th:each="member : ${project.getDevelopers()}">
@@ -87,5 +80,6 @@
                 </h5>
             </div>
-            <h5 class="fw-lighter fst-italic">Developer</h5>
+            <h5 th:if="${member.getId() != project.getUser().getId()}" class="fw-lighter fst-italic">Developer</h5>
+            <h5 th:if="${member.getId() == project.getUser().getId()}" class="fw-lighter fst-italic">Creator</h5>
         </div>
     </div>
Index: src/main/resources/templates/project_pages/requests/show-requests.html
===================================================================
--- src/main/resources/templates/project_pages/requests/show-requests.html	(revision 4945bed9aa80ddc0b25965359c2643627bc4411e)
+++ src/main/resources/templates/project_pages/requests/show-requests.html	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -10,10 +10,33 @@
     <div th:replace="/home_pages/home :: navigation"></div>
 </header>
+<section class="d-flex mt-3 flex-column w-100 align-items-center mt-5">
+    <form method="get" th:action="@{/project/{pr-title}/request(pr-title=${project.getTitle()})}"
+          class="d-flex flex-row gap-2 align-items-center"
+          style="width:fit-content">
+        <label for="status-query">Filter by status:</label>
+        <select id="status-query" name="status" class="form-select form-select-sm w-auto">
+            <option
+                    th:each="st:${status}"
+                    th:text="${st}"
+                    th:value="${st}"
+            ></option>
+            <option value="">All</option>
+        </select>
+        <button class="btn btn-primary">Search</button>
+    </form>
+</section>
 <main class="d-flex justify-content-center mt-5 align-items-center flex-column ">
     <div class="card shadow-sm mb-4 w-75"
-         th:each="req:${requests}"
-         th:if="${req.getStatus().name()=='PENDING'}">
-        <div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
+         th:each="req:${requests}">
+        <div class="card-header  text-white d-flex justify-content-between align-items-center"
+             th:with="st=${req.getStatus()}"
+             th:classappend="${st.name() == 'PENDING' ? 'bg-warning' : (st.name() == 'DENIED' ? 'bg-danger' : 'bg-info')}"
+        >
             <h3 th:text="${req.getCreator().getUsername()}">Creator of request</h3>
+            <h3 class="fs-6 ">
+                <span>Status:</span>
+                <span
+                        th:text="${#strings.capitalize(req.getStatus().name().toLowerCase())}"></span>
+            </h3>
         </div>
         <div class="d-flex flex-column gap-3 justify-content-between card-body">
@@ -23,19 +46,109 @@
             </div>
         </div>
-        <div class="card-footer d-flex flex-row gap-3">
-            <form>
-                <button
-                        class="btn btn-success btn-sm"
-                >Accept</button>
-            </form>
-            <form>
-                <button
-                        class="btn btn-danger btn-sm"
-                >Deny</button>
-            </form>
+        <div th:if="${req.getStatus().name().equals('PENDING') && session.user != null && session.user.getId() == project.getUser().getId()}"
+             class="card-footer d-flex flex-row gap-3">
+            <button type="button" class="btn btn-success accept-btn footer-btn"
+                    th:attr="data-pr-title=${project.getTitle()}, data-req-id=${req.getId()}"
+                    data-bs-toggle="modal"
+                    data-bs-target="#modal"
+            >
+                Accept
+            </button>
+            <button type="button" class="btn btn-secondary deny-btn footer-btn"
+                    th:attr="data-pr-title=${project.getTitle()}, data-req-id=${req.getId()}"
+                    data-bs-toggle="modal"
+                    data-bs-target="#modal"
+            >
+                Deny
+            </button>
         </div>
+        <div class="card-footer" th:if="${!req.getStatus().name().equals('PENDING')}">
+            <button type="button"
+                    class="btn-feedback-open btn btn-success">View feedback
+            </button>
+            <div th:with="feed=${req.getFeedback()}"
+                 class="feedback d-flex flex-column gap-2 invisible" style="height: 0">
+                <h5>Feedback</h5>
+                <p th:text="${feed!=null ? feed.getDescription() : ''}"></p>
+                <p>
+                    <span>Submitted at</span>
+                    <span th:text="${feed != null ?  feed.getCreatedAt() : ''}"></span>
+                <div class="w-100 d-flex justify-content-end">
+                    <button type="button" class="btn-feedback-close btn-danger btn">Close</button>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="modal fade"
+         id="modal"
+         data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel"
+         aria-hidden="true"
+    >
+        <form method="post" id="modal-form">
+            <div class="modal-dialog">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h1 class="modal-title fs-5" id="staticBackdropLabel2">Feedback</h1>
+                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+                    </div>
+                    <div class="modal-body d-flex flex-column gap-2">
+                        <label>Description</label>
+                        <textarea id="feedback-desc2"
+                                  style="height: 20vh"
+                                  class="w-100 border border-rounded"
+                                  name="feedback-desc"></textarea>
+                    </div>
+                    <div class="modal-footer">
+                        <button class="btn btn-success">Submit</button>
+                    </div>
+                </div>
+            </div>
+        </form>
     </div>
 </main>
 <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
+<script src="/js/modal_utils.js"></script>
+<script>
+    document.querySelectorAll(".modal").forEach(modal => modalConts.push(modal))
+    const formModal = document.querySelector("#modal-form")
+    document.addEventListener("click", ev => {
+        console.log(ev.target.type)
+        if (ev.target == null || ev.target.type !== 'button') return;
+        if (ev.target.classList.contains("footer-btn")) {
+            const btn = ev.target
+            const projectTitle = btn.dataset.prTitle
+            const reqId = btn.dataset.reqId
+            if (btn.classList.contains("accept-btn")) {
+                formModal.action = `/project/${projectTitle}/request/${reqId}/accept`
+            } else {
+                formModal.action = `/project/${projectTitle}/request/${reqId}/deny`
+            }
+        } else if (ev.target.classList.contains("btn-feedback-open")) {
+            const btn = ev.target
+            const feedbackCont = btn.nextElementSibling
+
+            btn.classList.add('invisible')
+            btn.style.width = '0'
+            btn.style.height = '0'
+
+            feedbackCont.style.height = 'max-content';
+            feedbackCont.classList.remove('invisible')
+
+        } else if (ev.target.classList.contains("btn-feedback-close")) {
+            const closeBtn = ev.target
+            const feedbackCont = closeBtn.parentElement.parentElement
+            const btn = feedbackCont.previousElementSibling
+
+            console.log(feedbackCont)
+
+            btn.classList.remove('invisible')
+            btn.style.width = 'max-content'
+            btn.style.height = 'max-content'
+
+            feedbackCont.style.height = '0';
+            feedbackCont.classList.add('invisible')
+        }
+    })
+</script>
 </body>
 </html>
Index: src/main/resources/templates/project_pages/requests/show-user-requests.html
===================================================================
--- src/main/resources/templates/project_pages/requests/show-user-requests.html	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
+++ src/main/resources/templates/project_pages/requests/show-user-requests.html	(revision 07d4d536b1c590c1f0ccadfee8d541baae1ce9bc)
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Users Requests</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<header>
+    <div th:replace="/home_pages/home :: navigation"></div>
+</header>
+<section class="d-flex mt-3 flex-column w-100 align-items-center mt-5">
+    <form method="get" th:action="@{/{username}/requests(pr-title=${user.getUsername()})}"
+          class="d-flex flex-row gap-2 align-items-center"
+          style="width:fit-content">
+        <label for="status-query">Filter by status:</label>
+        <select id="status-query" name="status" class="form-select form-select-sm w-auto">
+            <option
+                    th:each="st:${status}"
+                    th:text="${st}"
+                    th:value="${st}"
+            ></option>
+            <option value="">All</option>
+        </select>
+        <button class="btn btn-primary">Search</button>
+    </form>
+</section>
+<main class="d-flex justify-content-center mt-5 align-items-center flex-column ">
+    <div class="card shadow-sm mb-4 w-75"
+         th:each="req:${requests}">
+        <div class="card-header  text-white d-flex justify-content-between align-items-center"
+             th:with="st=${req.getStatus()}"
+             th:classappend="${st.name() == 'PENDING' ? 'bg-warning' : (st.name() == 'DENIED' ? 'bg-danger' : 'bg-info')}"
+        >
+            <h3 th:text="${req.getCreator().getUsername()}">Creator of request</h3>
+            <h3 class="fs-6 ">
+                <span>Status:</span>
+                <span
+                        th:text="${#strings.capitalize(req.getStatus().name().toLowerCase())}"></span>
+            </h3>
+        </div>
+        <div class="d-flex flex-column gap-3 justify-content-between card-body">
+            <div>
+                <h4>Description</h4>
+                <p th:text="${req.getDescription()}">Description of the project goes here.</p>
+            </div>
+        </div>
+        <div class="card-footer" th:if="${!req.getStatus().name().equals('PENDING')}">
+            <button type="button"
+                    class="btn-feedback-open btn btn-success">View feedback
+            </button>
+            <div th:with="feed=${req.getFeedback()}"
+                 class="feedback d-flex flex-column gap-2 invisible" style="height: 0">
+                <h5>Feedback</h5>
+                <p th:text="${feed!=null ? feed.getDescription() : ''}"></p>
+                <p>
+                    <span>Submitted at</span>
+                    <span th:text="${feed != null ?  feed.getCreatedAt() : ''}"></span>
+                <div class="w-100 d-flex justify-content-end">
+                    <button type="button" class="btn-feedback-close btn-danger btn">Close</button>
+                </div>
+            </div>
+        </div>
+    </div>
+</main>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
+<script src="/js/modal_utils.js"></script>
+<script>
+    document.querySelectorAll(".modal").forEach(modal => modalConts.push(modal))
+    const formModal = document.querySelector("#modal-form")
+    document.addEventListener("click", ev => {
+        console.log(ev.target.type)
+        if (ev.target == null || ev.target.type !== 'button') return;
+        if (ev.target.classList.contains("btn-feedback-open")) {
+            const btn = ev.target
+            const feedbackCont = btn.nextElementSibling
+
+            btn.classList.add('invisible')
+            btn.style.width = '0'
+            btn.style.height = '0'
+
+            feedbackCont.style.height = 'max-content';
+            feedbackCont.classList.remove('invisible')
+
+        } else if (ev.target.classList.contains("btn-feedback-close")) {
+            const closeBtn = ev.target
+            const feedbackCont = closeBtn.parentElement.parentElement
+            const btn = feedbackCont.previousElementSibling
+
+            console.log(feedbackCont)
+
+            btn.classList.remove('invisible')
+            btn.style.width = 'max-content'
+            btn.style.height = 'max-content'
+
+            feedbackCont.style.height = '0';
+            feedbackCont.classList.add('invisible')
+        }
+    })
+</script>
+</body>
+</html>
