Index: src/main/java/com/db/finki/www/build_board/controller/thread_controller/TopicController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/thread_controller/TopicController.java	(revision 9515211f9f15b0c4e37a5046b6c904ad2eb0804e)
+++ src/main/java/com/db/finki/www/build_board/controller/thread_controller/TopicController.java	(revision 229783a40924bb7e553248775b05532d0f3e1588)
@@ -1,4 +1,6 @@
 package com.db.finki.www.build_board.controller.thread_controller;
 
+import com.db.finki.www.build_board.entity.entity_enum.Status;
+import com.db.finki.www.build_board.entity.thread.Project;
 import com.db.finki.www.build_board.entity.user_type.BBUser;
 import com.db.finki.www.build_board.entity.thread.Topic;
@@ -14,4 +16,5 @@
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+import org.springframework.web.servlet.view.RedirectView;
 
 @Controller
@@ -115,3 +118,47 @@
     }
 
+    @GetMapping("{id}/reports")
+    //TODO: check if moderators
+    public String getReports(@PathVariable(name = "id") long topicId, Model model,
+            @RequestParam(required = false) Status status,
+            @RequestParam(required = false, name = "checkSearchLatest") String isSearForLatestActive
+
+                            ){
+       Topic t = topicService.getById(topicId);
+
+       model.addAttribute("topic", t);
+       model.addAttribute("reports", reportService.getByStatusAndProjectAndLatest(status,
+                       (int) topicId, isSearForLatestActive));
+
+       model.addAttribute("status", Status.values());
+       model.addAttribute("isSearForLatestActive", isSearForLatestActive);
+
+       return "show-reports";
+    }
+
+    @PostMapping("{id}/reports/{req-id}/accept")
+    public RedirectView acceptRequest(
+            @PathVariable(name = "req-id") Integer reqId,
+            @PathVariable(name = "id") long topicId,
+            @RequestParam(name = "feedback-desc") String feedbackDesc,
+            @SessionAttribute @P("user") BBUser user
+                                     ) {
+        reportService.accept(reqId, feedbackDesc, user);
+        return new RedirectView(
+                String.format("/topics/%s", topicId)
+        );
+    }
+
+    @PostMapping("{id}/reports/{req-id}/deny")
+    public RedirectView denyRequest(
+            @PathVariable(name = "req-id") Integer reqId,
+            @PathVariable(name = "id") long topicId,
+            @RequestParam(name = "feedback-desc") String feedbackDesc,
+            @SessionAttribute @P("user") BBUser user
+                                   ) {
+        reportService.deny(reqId, feedbackDesc, user);
+        return new RedirectView(
+                String.format("/topics/{id}/reports", topicId)
+        );
+    }
 }
Index: src/main/java/com/db/finki/www/build_board/entity/thread/Topic.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/thread/Topic.java	(revision 9515211f9f15b0c4e37a5046b6c904ad2eb0804e)
+++ src/main/java/com/db/finki/www/build_board/entity/thread/Topic.java	(revision 229783a40924bb7e553248775b05532d0f3e1588)
@@ -31,3 +31,4 @@
     }
 
+    //TODO: add moderator
 }
Index: src/main/java/com/db/finki/www/build_board/repository/ReportRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/ReportRepository.java	(revision 9515211f9f15b0c4e37a5046b6c904ad2eb0804e)
+++ src/main/java/com/db/finki/www/build_board/repository/ReportRepository.java	(revision 229783a40924bb7e553248775b05532d0f3e1588)
@@ -1,7 +1,28 @@
 package com.db.finki.www.build_board.repository;
 
+import com.db.finki.www.build_board.entity.request.ProjectRequests;
 import com.db.finki.www.build_board.entity.request.Report;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
 
 public interface ReportRepository extends JpaRepository<Report, Long> {
+    @Query(value = """
+            select *
+            from report r 
+            join submission s 
+            on s.id = r.id
+            where (:latest is null or (s.created_by,s.created_at) IN ( select created_by,max(created_at) from submission r  group by created_by)) 
+                        and r.thread_id =:topicId
+                        and (:status is null or s.status=:status)
+            """,
+            nativeQuery = true
+    )
+    List<Report> getLatestRequestByTopicAndStatus(
+            @Param("topicId") Integer topicId,
+            @Param("status") String status,
+            @Param("latest") String forLatest
+                                                            );
 }
Index: src/main/java/com/db/finki/www/build_board/service/ReportService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/ReportService.java	(revision 9515211f9f15b0c4e37a5046b6c904ad2eb0804e)
+++ src/main/java/com/db/finki/www/build_board/service/ReportService.java	(revision 229783a40924bb7e553248775b05532d0f3e1588)
@@ -1,11 +1,20 @@
 package com.db.finki.www.build_board.service;
 
+import com.db.finki.www.build_board.entity.entity_enum.FeedbackFor;
+import com.db.finki.www.build_board.entity.entity_enum.Status;
+import com.db.finki.www.build_board.entity.request.ProjectRequests;
 import com.db.finki.www.build_board.entity.request.Report;
+import com.db.finki.www.build_board.entity.thread.Project;
 import com.db.finki.www.build_board.entity.thread.Topic;
 import com.db.finki.www.build_board.entity.user_type.BBUser;
 import com.db.finki.www.build_board.repository.ReportRepository;
+import com.db.finki.www.build_board.service.request.FeedbackService;
 import com.db.finki.www.build_board.service.thread.itf.TopicService;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
 
 @Service
@@ -14,18 +23,62 @@
     private final TopicService topicService;
     private final UserDetailsService userDetailsService;
+    private final FeedbackService feedbackService;
 
-    public ReportService(ReportRepository reportRepository, TopicService topicService, UserDetailsService userDetailsService) {this.reportRepository = reportRepository;
+    public ReportService(
+            ReportRepository reportRepository, TopicService topicService,
+            UserDetailsService userDetailsService, FeedbackService feedbackService
+                        ) {
+        this.reportRepository = reportRepository;
         this.topicService = topicService;
         this.userDetailsService = userDetailsService;
+        this.feedbackService = feedbackService;
     }
 
-    public void createReport(long topicId,String reason, BBUser creator, String reportingUsername)
-    {
+    public void createReport(
+            long topicId, String reason, BBUser creator,
+            String reportingUsername
+                            ) {
         Topic topic = topicService.getById(topicId);
         BBUser reportedUser = (BBUser) userDetailsService.loadUserByUsername(reportingUsername);
 
         reportRepository.save(
-                new Report(topic,creator, reason, reportedUser)
+                new Report(topic,
+                        creator,
+                        reason,
+                        reportedUser)
                              );
     }
+
+    public List<Report> getByStatusAndProjectAndLatest(
+            Status status, Integer topicId,
+            String isLatest
+                                                      ) {
+        return reportRepository.getLatestRequestByTopicAndStatus(
+                topicId,
+                status == null ? null : status.name(),
+                isLatest
+                                                                );
+    }
+
+    @Transactional
+    void accept(){
+        //TODO: add vo blacklisted user
+    }
+
+    @Transactional
+    public void deny(long reqId, String feedbackDesc, BBUser creator) {
+        Report report =
+                reportRepository
+                        .findById(reqId)
+                        .orElseThrow(() -> new RuntimeException("The " +
+                                "report doesn't exist"));
+        report.setStatus(Status.DENIED);
+
+        feedbackService.create(
+                feedbackDesc,
+                creator,
+                FeedbackFor.R,
+                report);
+        reportRepository.save(report);
+    }
 }
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 9515211f9f15b0c4e37a5046b6c904ad2eb0804e)
+++ src/main/java/com/db/finki/www/build_board/service/request/ProjectRequestService.java	(revision 229783a40924bb7e553248775b05532d0f3e1588)
@@ -31,4 +31,5 @@
     }
 
+    @Transactional
     public void deny(Integer reqId, String desc, BBUser creator) {
         ProjectRequests prReq = getRequestById(reqId);
Index: src/main/resources/templates/show-reports.html
===================================================================
--- src/main/resources/templates/show-reports.html	(revision 229783a40924bb7e553248775b05532d0f3e1588)
+++ src/main/resources/templates/show-reports.html	(revision 229783a40924bb7e553248775b05532d0f3e1588)
@@ -0,0 +1,224 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>
+        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="@{/topics/{id}/reports(id=${topic.getId()})}"
+          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=""
+                    selected>
+                All
+            </option>
+        </select>
+        <label>
+            <input type="checkbox"
+                   th:checked="${isSearForLatestActive != null}"
+                   th:value="y"
+                   name="checkSearchLatest">
+            Show
+            only
+            latest
+            request
+        </label>
+        <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:${reports}"
+    >
+        <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="|About ${req.getUser().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>
+                <p th:text="|Submitted on: ${#temporals.format(req.getCreatedAt(), 'dd/MM/yyyy HH:mm')}|"></p>
+                <p>
+                    <span>Created by:</span>
+                    <span class="fw-bold"
+                          th:text="${req.getCreator().getUsername()}">Created by</span>
+                </p>
+            </div>
+            <!--            Tuka moderator -->
+            <!--                        th:attr="data-pr-title=${project.getTitle()}, data-req-id=${req.getId()}"-->
+
+            <div th:if="${req.getStatus().name().equals('PENDING') &&  session.user != null && session.user.getId() == topic.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-topic-id=${req.getTopic().getId()}, data-req-id=${req.getId()}"
+                        data-bs-toggle="modal"
+                        data-bs-target="#modal"
+                >
+                    Accept
+                </button>
+                <button type="button"
+                        class="btn btn-danger deny-btn footer-btn"
+                        th:attr="data-topic-id=${req.getTopic().getId()}, 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('DENIED')}"
+            >
+                <button type="button"
+                        th:if="${req.getStatus().name().equals('DENIED')}"
+                        class="btn-feedback-open btn btn-success">
+                    View
+                    feedback
+                </button>
+                <div th:if="${req.getFeedback()!=null && req.getFeedback().getDescription()!=null}"
+                     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() == null ? '' : feed.getDescription()) }"></p>
+                    <p>
+                        <span>Submitted at:</span>
+                        <span th:text="${feed != null ? #temporals.format(feed.getCreatedAt(), 'dd/MM/yyyy  HH:mm')  : ''}"></span>
+                    <div class="w-100 d-flex justify-content-end">
+                        <button type="button"
+                                class="btn-feedback-close btn-danger btn">
+                            Close
+                        </button>
+                    </div>
+                </div>
+                <p th:if="${req.getFeedback() != null && req.getFeedback().getDescription()==null}"
+                   th:text="|Accepted on: ${#temporals.format(req.getFeedback().getCreatedAt(), 'dd/MM/yyyy  HH:mm')}|"></p>
+            </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>
+    </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 => {
+        if (ev.target == null || ev.target.type !== 'button') return;
+        console.log(ev.target.classList)
+        if (ev.target.classList.contains("footer-btn")) {
+            const btn = ev.target
+            const topicId = btn.dataset.topicId
+            const reqId = btn.dataset.reqId
+            if (btn.classList.contains("deny-btn")) {
+                formModal.action = `/topics/${topicId}/reports/${reqId}/deny`
+            }else if(btn.classList.contains("accept-btn")){
+                formModal.action =`/topics/${topicId}/reports/${reqId}/accept`
+            }
+        } 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/show-topic.html
===================================================================
--- src/main/resources/templates/show-topic.html	(revision 9515211f9f15b0c4e37a5046b6c904ad2eb0804e)
+++ src/main/resources/templates/show-topic.html	(revision 229783a40924bb7e553248775b05532d0f3e1588)
@@ -73,4 +73,9 @@
                     guidelines
                 </button>
+<!--                Moderator check -->
+                <a th:if="${session.user != null}" th:href="@{/topics/{id}/reports(id=${topic.getId()})}"
+                   class="btn btn-info btn-sm">
+                    Show reports
+                </a>
             </div>
         </div>
