Index: docs/todo.txt
===================================================================
--- docs/todo.txt	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ docs/todo.txt	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,1 @@
+description na project
Index: src/main/java/com/db/finki/www/build_board/controller/HomePageController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/HomePageController.java	(revision 677a272c7bee18583dc6df16de74ebcb32b65696)
+++ src/main/java/com/db/finki/www/build_board/controller/HomePageController.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -1,6 +1,5 @@
 package com.db.finki.www.build_board.controller;
 
-import com.db.finki.www.build_board.service.threads.ThreadsWithTittleService;
-import com.db.finki.www.build_board.service.threads.TopicsService;
+import com.db.finki.www.build_board.service.threads.NamedThreadService;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -11,13 +10,13 @@
 @RequestMapping("/")
 public class HomePageController {
-    private final ThreadsWithTittleService threadsWithTittleService;
+    private final NamedThreadService namedThreadService;
 
-    public HomePageController(ThreadsWithTittleService threadsWithTittleService) {
-        this.threadsWithTittleService = threadsWithTittleService;
+    public HomePageController(NamedThreadService namedThreadService) {
+        this.namedThreadService = namedThreadService;
     }
 
     @GetMapping
     public String homePage(Model model) {
-        model.addAttribute("threads",threadsWithTittleService.findAll());
+        model.addAttribute("threads", namedThreadService.findAll());
         return "home";
     }
Index: src/main/java/com/db/finki/www/build_board/controller/TopicController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/TopicController.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ src/main/java/com/db/finki/www/build_board/controller/TopicController.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,33 @@
+package com.db.finki.www.build_board.controller;
+
+import com.db.finki.www.build_board.entity.BBUser;
+import com.db.finki.www.build_board.service.threads.TopicService;
+import jakarta.servlet.http.HttpSession;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+@Controller
+@RequestMapping("/topic")
+public class TopicController {
+
+    private final TopicService topicService;
+
+    public TopicController(TopicService topicService) {
+        this.topicService = topicService;
+    }
+
+    @GetMapping("/create")
+    public String getCreateTopicPage() {
+        return "create-topic";
+    }
+    @GetMapping("/{topic-name}")
+    public String showTopic(@PathVariable(name = "topic-name") String topicName) {
+        return "show-topic";
+    }
+    @PostMapping("/add")
+    public String createTopic(@RequestParam String title, @RequestParam String description, HttpSession session) {
+        BBUser user = (BBUser) session.getAttribute("user");
+        topicService.create(title, description, user);
+        return "redirect:/";
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/entity/BBUser.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/BBUser.java	(revision 677a272c7bee18583dc6df16de74ebcb32b65696)
+++ src/main/java/com/db/finki/www/build_board/entity/BBUser.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -15,4 +15,5 @@
 @Table(name = "users")
 @Getter @Setter
+@Inheritance(strategy = InheritanceType.JOINED)
 public class BBUser implements UserDetails, Serializable {
 
Index: src/main/java/com/db/finki/www/build_board/entity/Moderator.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/Moderator.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ src/main/java/com/db/finki/www/build_board/entity/Moderator.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,10 @@
+package com.db.finki.www.build_board.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name = "moderator")
+public class Moderator extends BBUser {
+
+}
Index: src/main/java/com/db/finki/www/build_board/entity/threads/BBThread.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/threads/BBThread.java	(revision 677a272c7bee18583dc6df16de74ebcb32b65696)
+++ src/main/java/com/db/finki/www/build_board/entity/threads/BBThread.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -3,10 +3,9 @@
 import com.db.finki.www.build_board.entity.BBUser;
 import jakarta.persistence.*;
-import lombok.Data;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
 
-import java.math.BigInteger;
+import java.util.List;
 
 @Entity
@@ -19,12 +18,32 @@
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Integer id;
+    protected Integer id;
 
-    private String content;
+    protected String content;
 
     @ManyToOne
     @JoinColumn(name="user_id")
-    private BBUser user;
+    protected BBUser user;
+
+    @ManyToMany
+    @JoinTable(
+            name = "tag_threads",
+            joinColumns = @JoinColumn(name = "thread_id"),
+            inverseJoinColumns = @JoinColumn(name = "tag_name")
+    )
+    protected List<Tag> tags;
 
     public Integer getId() {return id;}
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public void setTags(List<Tag> tags) {
+        this.tags = tags;
+    }
+
+    public void setUser(BBUser user) {
+        this.user = user;
+    }
 }
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 e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ src/main/java/com/db/finki/www/build_board/entity/threads/Project.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,25 @@
+package com.db.finki.www.build_board.entity.threads;
+
+import com.db.finki.www.build_board.entity.threads.interfaces.NamedThread;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name = "project_thread")
+public class Project extends BBThread implements NamedThread {
+
+    private String title;
+    @Column(name = "repo_url")
+    private String repoUrl;
+
+    @Override
+    public String getTitle() {
+        return title;
+    }
+
+    @Override
+    public String getTypeName() {
+        return "project";
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/entity/threads/Tag.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/threads/Tag.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ src/main/java/com/db/finki/www/build_board/entity/threads/Tag.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,18 @@
+package com.db.finki.www.build_board.entity.threads;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.Table;
+
+import java.util.List;
+
+@Entity
+@Table(name = "tag")
+public class Tag {
+    @Id
+    String name;
+
+    @ManyToMany(mappedBy = "tags")
+    private List<BBThread> threads;
+}
Index: src/main/java/com/db/finki/www/build_board/entity/threads/Topic.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/threads/Topic.java	(revision 677a272c7bee18583dc6df16de74ebcb32b65696)
+++ src/main/java/com/db/finki/www/build_board/entity/threads/Topic.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -1,5 +1,5 @@
 package com.db.finki.www.build_board.entity.threads;
 
-import com.db.finki.www.build_board.entity.threads.interfaces.ThreadsWithTittle;
+import com.db.finki.www.build_board.entity.threads.interfaces.NamedThread;
 import jakarta.persistence.Entity;
 import jakarta.persistence.JoinColumn;
@@ -7,16 +7,16 @@
 import jakarta.persistence.Table;
 import lombok.Data;
+import lombok.Getter;
 import lombok.NoArgsConstructor;
+import lombok.Setter;
 import org.hibernate.annotations.JdbcTypeCode;
 import org.hibernate.type.SqlTypes;
 
-import java.math.BigInteger;
 import java.util.Map;
 
 @Entity
-@Data
 @NoArgsConstructor
 @Table(name = "topic_thread")
-public class Topic extends BBThread implements ThreadsWithTittle {
+public class Topic extends BBThread implements NamedThread {
 
     private String title;
@@ -35,3 +35,4 @@
     @Override
     public String getTitle() {return this.title;}
+    public void setTitle(String title) {this.title = title;}
 }
Index: src/main/java/com/db/finki/www/build_board/entity/threads/interfaces/NamedThread.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/threads/interfaces/NamedThread.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ src/main/java/com/db/finki/www/build_board/entity/threads/interfaces/NamedThread.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,7 @@
+package com.db.finki.www.build_board.entity.threads.interfaces;
+
+public interface NamedThread {
+    String getTitle();
+    String getTypeName();
+    Integer getId();
+}
Index: c/main/java/com/db/finki/www/build_board/entity/threads/interfaces/ThreadsWithTittle.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/threads/interfaces/ThreadsWithTittle.java	(revision 677a272c7bee18583dc6df16de74ebcb32b65696)
+++ 	(revision )
@@ -1,9 +1,0 @@
-package com.db.finki.www.build_board.entity.threads.interfaces;
-
-import java.math.BigInteger;
-
-public interface ThreadsWithTittle {
-    String getTitle();
-    String getTypeName();
-    Integer getId();
-}
Index: src/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 677a272c7bee18583dc6df16de74ebcb32b65696)
+++ src/main/java/com/db/finki/www/build_board/repository/threads/BBThreadRepository.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -3,5 +3,7 @@
 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> {
 }
Index: src/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 e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ src/main/java/com/db/finki/www/build_board/repository/threads/ProjectRepository.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,10 @@
+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.stereotype.Repository;
+
+@Repository
+public interface ProjectRepository extends JpaRepository<Project, Long> {
+
+}
Index: src/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 677a272c7bee18583dc6df16de74ebcb32b65696)
+++ src/main/java/com/db/finki/www/build_board/repository/threads/TopicRepository.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -3,5 +3,7 @@
 import com.db.finki.www.build_board.entity.threads.Topic;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public interface TopicRepository extends JpaRepository<Topic,Long> {
 }
Index: src/main/java/com/db/finki/www/build_board/service/threads/NamedThreadService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/NamedThreadService.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ src/main/java/com/db/finki/www/build_board/service/threads/NamedThreadService.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,24 @@
+package com.db.finki.www.build_board.service.threads;
+
+import com.db.finki.www.build_board.entity.threads.interfaces.NamedThread;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+
+@Service
+public class NamedThreadService {
+    //TODO: Add project support also
+     private final TopicServiceImpl topicsService;
+
+    public NamedThreadService(TopicServiceImpl topicsService) {
+        this.topicsService = topicsService;
+    }
+
+    public List<NamedThread> findAll(){
+        List<NamedThread> results = (List<NamedThread>) (List<?>) topicsService.getAll();
+
+        Collections.shuffle(results);
+        return results;
+    }
+}
Index: c/main/java/com/db/finki/www/build_board/service/threads/ThreadsWithTittleService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/ThreadsWithTittleService.java	(revision 677a272c7bee18583dc6df16de74ebcb32b65696)
+++ 	(revision )
@@ -1,24 +1,0 @@
-package com.db.finki.www.build_board.service.threads;
-
-import com.db.finki.www.build_board.entity.threads.interfaces.ThreadsWithTittle;
-import org.springframework.stereotype.Service;
-
-import java.util.Collections;
-import java.util.List;
-
-@Service
-public class ThreadsWithTittleService {
-    //TODO: Add project support also
-     private final TopicsService topicsService;
-
-    public ThreadsWithTittleService(TopicsService topicsService) {
-        this.topicsService = topicsService;
-    }
-
-    public List<ThreadsWithTittle> findAll(){
-        List<ThreadsWithTittle> results = (List<ThreadsWithTittle>) (List<?>) topicsService.findAll();
-
-        Collections.shuffle(results);
-        return results;
-    }
-}
Index: src/main/java/com/db/finki/www/build_board/service/threads/TopicService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/TopicService.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ src/main/java/com/db/finki/www/build_board/service/threads/TopicService.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,11 @@
+package com.db.finki.www.build_board.service.threads;
+
+import com.db.finki.www.build_board.entity.BBUser;
+import com.db.finki.www.build_board.entity.threads.Topic;
+
+import java.util.List;
+
+public interface TopicService {
+    void create(String title, String description, BBUser user);
+    List<Topic> getAll();
+}
Index: src/main/java/com/db/finki/www/build_board/service/threads/TopicServiceImpl.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/TopicServiceImpl.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ src/main/java/com/db/finki/www/build_board/service/threads/TopicServiceImpl.java	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,32 @@
+package com.db.finki.www.build_board.service.threads;
+
+import com.db.finki.www.build_board.entity.BBUser;
+import com.db.finki.www.build_board.entity.threads.Topic;
+import com.db.finki.www.build_board.repository.threads.TopicRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class TopicServiceImpl implements TopicService {
+    private final TopicRepository topicRepository;
+
+    public TopicServiceImpl(TopicRepository topicRepository) {
+        this.topicRepository = topicRepository;
+    }
+
+
+    @Override
+    public void create(String title, String description, BBUser user) {
+        Topic topic = new Topic();
+        topic.setTitle(title);
+        topic.setContent(description);
+        topic.setUser(user);
+        topicRepository.save(topic);
+    }
+
+    @Override
+    public List<Topic> getAll() {
+        return topicRepository.findAll();
+    }
+}
Index: c/main/java/com/db/finki/www/build_board/service/threads/TopicsService.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/threads/TopicsService.java	(revision 677a272c7bee18583dc6df16de74ebcb32b65696)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package com.db.finki.www.build_board.service.threads;
-
-import com.db.finki.www.build_board.entity.threads.BBThread;
-import com.db.finki.www.build_board.entity.threads.Topic;
-import com.db.finki.www.build_board.repository.threads.TopicRepository;
-import org.springframework.stereotype.Service;
-import org.springframework.data.util.Pair;
-import java.util.List;
-
-@Service
-public class TopicsService {
-    private final TopicRepository topicRepository;
-
-    public TopicsService(TopicRepository topicRepository) {
-        this.topicRepository = topicRepository;
-    }
-
-    public List<Topic> findAll() {
-        return topicRepository.findAll();
-    }
-
-}
Index: src/main/resources/templates/create-topic.html
===================================================================
--- src/main/resources/templates/create-topic.html	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ src/main/resources/templates/create-topic.html	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+
+<main>
+  <form action="/topic/add" method="post">
+    <label>
+      Title <input type="text" name="title" required>
+    </label>
+    <label>
+      Description <input type="text" name="description" required>
+    </label>
+    <button type="submit">Submit</button>
+  </form>
+</main>
+</body>
+</html>
Index: src/main/resources/templates/home.html
===================================================================
--- src/main/resources/templates/home.html	(revision 677a272c7bee18583dc6df16de74ebcb32b65696)
+++ src/main/resources/templates/home.html	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -2,26 +2,43 @@
 <html lang="en"
       xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:th="http://www.thymeleaf.org"
->
+      xmlns:th="http://www.thymeleaf.org">
 <head>
     <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Home Page</title>
     <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
 </head>
 <body>
-<nav>
-    <div th:if="${session.user != null}">
-        <p th:text="${session.user.getUsername()}">uasdasd</p>
+<nav class="navbar navbar-expand-lg navbar-light bg-light shadow-sm">
+    <div class="container">
+        <a class="navbar-brand" href="/">Forum App</a>
+        <div th:if="${session.user != null}" class="d-flex align-items-center">
+            <span class="me-2" th:text="${session.user.getUsername()}">Username</span>
+            <a href="/logout" class="btn btn-outline-primary btn-sm">Log out</a>
+        </div>
+        <a href="/login" class="btn btn-primary btn-sm ms-auto" th:if="${session.user == null}">Log in</a>
     </div>
-    <a href="/login">Log in</a>
 </nav>
-<main>
-    <ol>
-        <li th:each="thread:${threads}">
-            <a th:href="@{/{type}/{id} (type=${thread.getTypeName()},id=${thread.getId()})}"
-               th:text="${thread.getTitle()}"></a>
-        </li>
-    </ol>
+
+<main class="container mt-4">
+    <div class="d-flex justify-content-between align-items-center mb-3">
+        <h1 class="h4">Threads</h1>
+        <a href="/topic/create" class="btn btn-success btn-sm">Create Topic</a>
+    </div>
+    <div class="list-group">
+        <div class="list-group-item" th:each="thread : ${threads}">
+            <div class="d-flex w-100 justify-content-between">
+                <h5 class="mb-1">
+                    <a th:href="@{/{type}/{id} (type=${thread.getTypeName()},id=${thread.getId()})}"
+                       th:text="${thread.getTitle()}" class="text-decoration-none"></a>
+                </h5>
+<!--                <small th:text="${thread.getFormattedDate()}">Date</small>-->
+            </div>
+<!--            <p class="mb-1 text-muted" th:text="${thread.getDescription()}">Thread description here...</p>-->
+<!--            <small th:text="${thread.getAuthor()}">Posted by Author</small>-->
+        </div>
+    </div>
 </main>
+
 <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
 </body>
Index: src/main/resources/templates/show-topic.html
===================================================================
--- src/main/resources/templates/show-topic.html	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
+++ src/main/resources/templates/show-topic.html	(revision e27f1b322a71855c28c17e0082eb42c667e9ad2f)
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Topic</title>
+</head>
+<body>
+
+</body>
+</html>
