Index: backend/controllers/forumController.js
===================================================================
--- backend/controllers/forumController.js	(revision 43c183dd0490ed95bda427b670563fedba06e26a)
+++ backend/controllers/forumController.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -1,15 +1,16 @@
-const prisma = require('../lib/prisma');
-const ForumPost = require('../models/ForumPost');
-const Comment = require('../models/Comment');
-const filter = require('leo-profanity');
-const mkProfanity = require('../filters/macedonianProfanity');
+const prisma = require("../lib/prisma");
+const ForumPost = require("../models/ForumPost");
+const Comment = require("../models/Comment");
+const filter = require("leo-profanity");
+const mkProfanity = require("../filters/macedonianProfanity");
 filter.add(mkProfanity);
-const safeWords = require('../filters/safeWords');
-const { analyzePostContent } = require('../ai/processRequestAi');
-const { createReviewPost } = require('./reviewController');
-const verifyModeratorStatus = require('../services/checkModeratorStatus');
+const safeWords = require("../filters/safeWords");
+const { analyzePostContent } = require("../ai/processRequestAi");
+const { createReviewPost } = require("./reviewController");
+const verifyModeratorStatus = require("../services/checkModeratorStatus");
 
 const createForumPost = async (req, res) => {
   const { title, content, authorId, authorName } = req.body;
+  console.log(title);
 
   try {
@@ -29,18 +30,31 @@
 
       if (isProfane) {
-        console.log('Profanity detected!');
+        console.log("Profanity detected!");
         return res.status(400).json({
-          error: 'Content contains inappropriate language',
+          error: "Content contains inappropriate language",
         });
       } else if (filter.check(post.content)) {
-        console.log('Profanity detected in content!');
+        console.log("Profanity detected in content!");
         return res.status(400).json({
-          error: 'Content contains inappropriate language',
+          error: "Content contains inappropriate language",
         });
       } else if (post.content.length > 200) {
-        createReviewPost(req, res);
-        return res.status(401).json({
-          error: 'Content is too long. Wait for moderator approval',
-        });
+        try {
+          // Await the helper function
+          await createReviewPost(req);
+
+          return res.status(202).json({
+            message:
+              "Content is too long. Your post has been submitted for moderator approval.",
+          });
+        } catch (reviewError) {
+          // If submitPostForReview throws an error
+          console.error("Error submitting post for review:", reviewError);
+          return res.status(500).json({
+            error:
+              reviewError.message ||
+              "Failed to submit post for review due to an internal error.",
+          });
+        }
       } else if (
         !(
@@ -52,14 +66,14 @@
         try {
           const aiResponse = await analyzePostContent(post.title, post.content);
-          if (aiResponse.aiResponse === 'INAPPROPRIATE') {
-            console.log('AI analysis says INAPPROPRIATE:', aiResponse.reason);
+          if (aiResponse.aiResponse === "INAPPROPRIATE") {
+            console.log("AI analysis says INAPPROPRIATE:", aiResponse.reason);
             return res.status(400).json({
-              error: 'Content is not appropriate for the forum',
+              error: "Content is not appropriate for the forum",
             });
           }
         } catch (error) {
-          console.error('AI analysis error:', error);
+          console.error("AI analysis error:", error);
           return res.status(500).json({
-            error: 'AI analysis failed, please try again later',
+            error: "AI analysis failed, please try again later",
           });
         }
@@ -78,15 +92,15 @@
 
       res.status(201).json({
-        message: 'Forum post created successfully',
+        message: "Forum post created successfully",
         post: savedPost,
       });
     } else {
       return res.status(403).json({
-        error: 'You have reached your post limit for today',
-      });
-    }
-  } catch (err) {
-    console.error('Server error:', err);
-    res.status(500).json({ error: 'Internal server error' });
+        error: "You have reached your post limit for today",
+      });
+    }
+  } catch (err) {
+    console.error("Server error:", err);
+    res.status(500).json({ error: "Internal server error" });
   }
 };
@@ -135,10 +149,10 @@
 
     res.status(201).json({
-      message: 'Approved post published successfully',
+      message: "Approved post published successfully",
       post: savedPost,
     });
   } catch (err) {
-    console.error('Server error:', err);
-    res.status(500).json({ error: 'Internal server error' });
+    console.error("Server error:", err);
+    res.status(500).json({ error: "Internal server error" });
   }
 };
@@ -154,5 +168,5 @@
       take: limit,
       orderBy: {
-        date_created: 'desc',
+        date_created: "desc",
       },
     });
@@ -172,6 +186,6 @@
     res.status(200).json(forumPosts);
   } catch (err) {
-    console.error('Server error:', err);
-    res.status(500).json({ error: 'Internal server error' });
+    console.error("Server error:", err);
+    res.status(500).json({ error: "Internal server error" });
   }
 };
@@ -190,5 +204,5 @@
 
     if (!post) {
-      return res.status(404).json({ error: 'Forum post not found' });
+      return res.status(404).json({ error: "Forum post not found" });
     }
 
@@ -201,5 +215,5 @@
     if (!hasPermission) {
       return res.status(403).json({
-        error: 'You do not have permission to delete this post',
+        error: "You do not have permission to delete this post",
       });
     }
@@ -207,9 +221,9 @@
     res.status(204).send();
   } catch (err) {
-    if (err.code === 'P2025') {
-      return res.status(404).json({ error: 'Forum post not found' });
-    }
-    console.error('Server error:', err);
-    res.status(500).json({ error: 'Internal server error' });
+    if (err.code === "P2025") {
+      return res.status(404).json({ error: "Forum post not found" });
+    }
+    console.error("Server error:", err);
+    res.status(500).json({ error: "Internal server error" });
   }
 };
@@ -221,5 +235,5 @@
   if (!post_id || !content || !authorId || !authorName) {
     return res.status(400).json({
-      error: 'post_id, content, authorId, and authorName are required',
+      error: "post_id, content, authorId, and authorName are required",
     });
   }
@@ -233,7 +247,7 @@
     const profane = filter.check(comment.content);
     if (profane) {
-      console.log('not safe words or profanity detected!');
+      console.log("not safe words or profanity detected!");
       return res.status(400).json({
-        error: 'Content contains inappropriate language or is not on topic',
+        error: "Content contains inappropriate language or is not on topic",
       });
     }
@@ -255,10 +269,10 @@
 
     res.status(201).json({
-      message: 'Comment created successfully',
+      message: "Comment created successfully",
       comment: savedComment,
     });
   } catch (err) {
-    console.error('Server error:', err);
-    res.status(500).json({ error: 'Internal server error' });
+    console.error("Server error:", err);
+    res.status(500).json({ error: "Internal server error" });
   }
 };
@@ -266,9 +280,9 @@
 const getComments = async (req, res) => {
   const postId = req.query.post_id;
-  console.log('Fetching comments for post_id:', postId);
+  console.log("Fetching comments for post_id:", postId);
   if (!postId) {
     return res
       .status(400)
-      .json({ error: 'post_id query parameter is required' });
+      .json({ error: "post_id query parameter is required" });
   }
 
@@ -279,5 +293,5 @@
       },
       orderBy: {
-        dateCreated: 'desc',
+        dateCreated: "desc",
       },
     });
@@ -296,6 +310,6 @@
     res.status(200).json(comments);
   } catch (err) {
-    console.error('Server error:', err);
-    res.status(500).json({ error: 'Internal server error' });
+    console.error("Server error:", err);
+    res.status(500).json({ error: "Internal server error" });
   }
 };
@@ -312,5 +326,5 @@
 
     if (!comment) {
-      return res.status(404).json({ error: 'Comment not found' });
+      return res.status(404).json({ error: "Comment not found" });
     }
     const user = await prisma.users.findUnique({
@@ -320,5 +334,5 @@
     if (comment.author_id !== userId && !(user && user.isModerator)) {
       return res.status(403).json({
-        error: 'You do not have permission to delete this comment',
+        error: "You do not have permission to delete this comment",
       });
     }
@@ -339,9 +353,9 @@
     res.status(204).send();
   } catch (err) {
-    if (err.code === 'P2025') {
-      return res.status(404).json({ error: 'Comment not found' });
-    }
-    console.error('Server error:', err);
-    res.status(500).json({ error: 'Internal server error' });
+    if (err.code === "P2025") {
+      return res.status(404).json({ error: "Comment not found" });
+    }
+    console.error("Server error:", err);
+    res.status(500).json({ error: "Internal server error" });
   }
 };
Index: backend/controllers/reviewController.js
===================================================================
--- backend/controllers/reviewController.js	(revision 43c183dd0490ed95bda427b670563fedba06e26a)
+++ backend/controllers/reviewController.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -1,11 +1,11 @@
-const prisma = require('../lib/prisma');
-const ForumPost = require('../models/ForumPost');
-const ForumController = require('./forumController');
-const filter = require('leo-profanity');
-const safeWords = require('../filters/safeWords');
-const verifyModeratorStatus = require('../services/checkModeratorStatus');
+const prisma = require("../lib/prisma");
+const ForumPost = require("../models/ForumPost");
+const ForumController = require("./forumController");
+const filter = require("leo-profanity");
+const safeWords = require("../filters/safeWords");
+const verifyModeratorStatus = require("../services/checkModeratorStatus");
 const createReviewPost = async (req, res) => {
   const { title, content, authorId, authorName } = req.body;
-
+  console.log(title);
   try {
     const post = new ForumPost({
@@ -23,6 +23,6 @@
     });
   } catch (err) {
-    console.error('Server error:', err);
-    res.status(500).json({ error: 'Internal server error' });
+    console.error("Server error:", err);
+    res.status(500).json({ error: "Internal server error" });
   }
 };
@@ -30,5 +30,5 @@
 const getReviewPosts = async (req, res) => {
   try {
-    console.log('Fetching to be reviewed posts');
+    console.log("Fetching to be reviewed posts");
     const page = parseInt(req.query.page) || 0;
     const limit = parseInt(req.query.limit) || 5;
@@ -37,7 +37,7 @@
     const hasModeratorStatus = await verifyModeratorStatus(userId);
     if (!hasModeratorStatus) {
-      console.log('Access denied: User is not a moderator');
+      console.log("Access denied: User is not a moderator");
       return res.status(403).json({
-        error: 'Access denied. Only moderators can access review posts.',
+        error: "Access denied. Only moderators can access review posts.",
       });
     }
@@ -47,9 +47,9 @@
         take: limit,
         orderBy: {
-          created_at: 'desc',
+          created_at: "desc",
         },
       });
 
-      console.log('Found review posts:', posts.length);
+      console.log("Found review posts:", posts.length);
 
       const forumPosts = posts.map(
@@ -65,14 +65,14 @@
       );
 
-      console.log('Formatted posts:', forumPosts.length);
+      console.log("Formatted posts:", forumPosts.length);
 
       res.status(200).json(forumPosts);
     } catch (dbError) {
-      console.error('Database query error:', dbError);
-      res.status(500).json({ error: 'Error fetching posts from database' });
+      console.error("Database query error:", dbError);
+      res.status(500).json({ error: "Error fetching posts from database" });
     }
   } catch (err) {
-    console.error('Server error:', err);
-    res.status(500).json({ error: 'Internal server error' });
+    console.error("Server error:", err);
+    res.status(500).json({ error: "Internal server error" });
   }
 };
@@ -83,7 +83,7 @@
   const hasModeratorStatus = await verifyModeratorStatus(userId);
   if (!hasModeratorStatus) {
-    console.log('Access denied: User is not a moderator');
+    console.log("Access denied: User is not a moderator");
     return res.status(403).json({
-      error: 'Access denied. Only moderators can access review posts.',
+      error: "Access denied. Only moderators can access review posts.",
     });
   }
@@ -97,9 +97,9 @@
   } catch (err) {
     // Prisma throws when record not found
-    if (err.code === 'P2025') {
-      return res.status(404).json({ error: 'Forum post not found' });
+    if (err.code === "P2025") {
+      return res.status(404).json({ error: "Forum post not found" });
     }
-    console.error('Server error:', err);
-    res.status(500).json({ error: 'Internal server error' });
+    console.error("Server error:", err);
+    res.status(500).json({ error: "Internal server error" });
   }
 };
@@ -107,5 +107,5 @@
 const approveReviewPost = async (req, res) => {
   try {
-    console.log('Approving review post', req.params.id);
+    console.log("Approving review post", req.params.id);
     const { id } = req.params;
     const userId = req.query.userId;
@@ -114,7 +114,7 @@
 
     if (!hasModeratorStatus) {
-      console.log('Access denied: User is not a moderator');
+      console.log("Access denied: User is not a moderator");
       return res.status(403).json({
-        error: 'Access denied. Only moderators can access review posts.',
+        error: "Access denied. Only moderators can access review posts.",
       });
     }
@@ -125,5 +125,5 @@
 
     if (!postToApprove) {
-      return res.status(404).json({ error: 'Post not found' });
+      return res.status(404).json({ error: "Post not found" });
     }
 
@@ -142,10 +142,10 @@
 
     res.status(200).json({
-      message: 'Post approved and published successfully',
+      message: "Post approved and published successfully",
       post: newForumPost,
     });
   } catch (err) {
-    console.error('Error approving post:', err);
-    res.status(500).json({ error: 'Failed to approve post' });
+    console.error("Error approving post:", err);
+    res.status(500).json({ error: "Failed to approve post" });
   }
 };
Index: client/package-lock.json
===================================================================
--- client/package-lock.json	(revision 43c183dd0490ed95bda427b670563fedba06e26a)
+++ client/package-lock.json	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -11,4 +11,5 @@
         "@supabase/supabase-js": "^2.50.0",
         "@tailwindcss/vite": "^4.1.4",
+        "axios": "^1.10.0",
         "class-variance-authority": "^0.7.1",
         "clsx": "^2.1.1",
@@ -1794,4 +1795,21 @@
       "license": "Python-2.0"
     },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "license": "MIT"
+    },
+    "node_modules/axios": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
+      "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
+      "license": "MIT",
+      "dependencies": {
+        "follow-redirects": "^1.15.6",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
     "node_modules/balanced-match": {
       "version": "1.0.2",
@@ -1861,4 +1879,17 @@
       }
     },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/callsites": {
       "version": "3.1.0",
@@ -1968,4 +1999,16 @@
       "license": "MIT"
     },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "license": "MIT",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
     "node_modules/concat-map": {
       "version": "0.0.1",
@@ -2055,4 +2098,13 @@
       "dev": true,
       "license": "MIT"
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.0"
+      }
     },
     "node_modules/detect-libc": {
@@ -2065,4 +2117,18 @@
       }
     },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/electron-to-chromium": {
       "version": "1.5.139",
@@ -2083,4 +2149,49 @@
       "engines": {
         "node": ">=10.13.0"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
@@ -2435,4 +2546,40 @@
       "license": "ISC"
     },
+    "node_modules/follow-redirects": {
+      "version": "1.15.9",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
+      "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
+      "license": "MIT",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "es-set-tostringtag": "^2.1.0",
+        "hasown": "^2.0.2",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/formdata-polyfill": {
       "version": "4.0.10",
@@ -2461,4 +2608,13 @@
       }
     },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/gensync": {
       "version": "1.0.0-beta.2",
@@ -2471,4 +2627,41 @@
       }
     },
+    "node_modules/get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/glob-parent": {
       "version": "6.0.2",
@@ -2495,4 +2688,16 @@
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
@@ -2511,4 +2716,43 @@
       "engines": {
         "node": ">=8"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "license": "MIT",
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
@@ -2960,4 +3204,34 @@
       "peerDependencies": {
         "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
       }
     },
@@ -3243,4 +3517,10 @@
         "node": "^18.17.0 || >=20.5.0"
       }
+    },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "license": "MIT"
     },
     "node_modules/punycode": {
Index: client/package.json
===================================================================
--- client/package.json	(revision 43c183dd0490ed95bda427b670563fedba06e26a)
+++ client/package.json	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -14,4 +14,5 @@
     "@supabase/supabase-js": "^2.50.0",
     "@tailwindcss/vite": "^4.1.4",
+    "axios": "^1.10.0",
     "class-variance-authority": "^0.7.1",
     "clsx": "^2.1.1",
Index: client/src/CreatePost/CreatePost.jsx
===================================================================
--- client/src/CreatePost/CreatePost.jsx	(revision 43c183dd0490ed95bda427b670563fedba06e26a)
+++ client/src/CreatePost/CreatePost.jsx	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -1,25 +1,26 @@
-import React, { useState } from 'react';
-import { useNavigate } from 'react-router-dom';
-import { useEffect } from 'react';
+import React, { useState } from "react";
+import { useNavigate } from "react-router-dom";
+import { useEffect } from "react";
+import { createForumPost } from "@/services/forumService";
 
 const CreatePost = () => {
-  const [title, setTitle] = useState('');
-  const [content, setContent] = useState('');
-  const [error, setError] = useState('');
+  const [title, setTitle] = useState("");
+  const [content, setContent] = useState("");
+  const [error, setError] = useState("");
   const [isSubmitting, setIsSubmitting] = useState(false);
   const [redirectNeeded, setRedirectNeeded] = useState(false);
-  const [modal, setModal] = useState({ isOpen: false, message: '', type: '' });
+  const [modal, setModal] = useState({ isOpen: false, message: "", type: "" });
   const navigate = useNavigate();
 
-  const showModal = (message, type = 'info') => {
+  const showModal = (message, type = "info") => {
     setModal({ isOpen: true, message, type });
   };
 
   const closeModal = () => {
-    setModal({ isOpen: false, message: '', type: '' });
-    if (modal.type === 'success' || modal.type === 'pending') {
-      navigate('/dashboard/forum');
-    } else if (modal.type === 'auth') {
-      navigate('/login');
+    setModal({ isOpen: false, message: "", type: "" });
+    if (modal.type === "success" || modal.type === "pending") {
+      navigate("/dashboard/forum");
+    } else if (modal.type === "auth") {
+      navigate("/login");
     }
   };
@@ -27,51 +28,52 @@
   const handleSubmit = async (e) => {
     e.preventDefault();
-    setError('');
+    // setError('');
     setIsSubmitting(true);
-    const user = JSON.parse(localStorage.getItem('user'));
+    const user = JSON.parse(localStorage.getItem("user"));
 
     if (!user || !user.id || !user.name) {
-      showModal('You must be logged in to create a post.', 'auth');
+      showModal("You must be logged in to create a post.", "auth");
       setIsSubmitting(false);
       return;
     }
-    const token = localStorage.getItem('jwt');
 
     try {
-      const response = await fetch('/forum/posts', {
-        method: 'POST',
-        headers: {
-          'Content-Type': 'application/json',
-          Authorization: `Bearer ${token}`,
-        },
-        body: JSON.stringify({
-          title,
-          content,
-          authorId: user.id,
-          authorName: user.username,
-        }),
-      });
-
-      if (response.status === 204) {
-        showModal('Post created successfully!', 'success');
-        return;
+      const postData = {
+        title,
+        content,
+        authorId: user.id,
+        authorName: user.username,
+      };
+      const res = await createForumPost(postData);
+      if (res.message.includes("moderator approval")) {
+        showModal(res.message, "pending");
+      } else {
+        showModal("Post created successfully!", "success");
       }
-      if (response.status === 401) {
-        showModal(
-          'Content is too long. Your post has been submitted for moderator approval.',
-          'pending'
-        );
-        return;
+    } catch (error) {
+      console.error("Error creating post:", error);
+      if (error.response) {
+        if (
+          error.response.status === 202 &&
+          error.response.data?.message?.includes("moderator approval")
+        ) {
+          showModal(
+            error.response.data.message ||
+              "Content is too long. Your post has been submitted for moderator approval.",
+            "pending"
+          );
+        } else if (error.response.status === 401) {
+          showModal("Authentication failed. Please log in again.", "auth");
+        } else {
+          showModal(
+            error.response.data?.error ||
+              error.response.data?.message ||
+              `Error: ${error.message}`,
+            "error"
+          );
+        }
+      } else {
+        showModal(`An unexpected error occurred: ${error.message}`, "error");
       }
-
-      const data = await response.json();
-      if (!response.ok) {
-        throw new Error(data.error || `HTTP error! status: ${response.status}`);
-      }
-
-      showModal('Post created successfully!', 'success');
-    } catch (error) {
-      console.error('Error creating post:', error);
-      setError(error.message);
     } finally {
       setIsSubmitting(false);
@@ -82,5 +84,5 @@
     <div
       data-theme="luxury"
-      className="h-screen overflow-y-auto bg-base-100 p-6"
+      className="h-screen overflo y-auto bg-base-100 p-6"
     >
       <div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 w-full">
@@ -90,5 +92,5 @@
           </h2>
           <button
-            onClick={() => navigate('/dashboard/forum')}
+            onClick={() => navigate("/dashboard/forum")}
             className="btn btn-outline gap-2"
           >
@@ -214,14 +216,8 @@
             </div>
 
-            {error && (
-              <div className="text-red-500 text-  mt-4">
-                <span>{error}</span>
-              </div>
-            )}
-
             <div className="card-actions justify-end mt-8">
               <button
                 type="button"
-                onClick={() => navigate('/dashboard/forum')}
+                onClick={() => navigate("/dashboard/forum")}
                 className="btn btn-ghost btn-lg"
                 disabled={isSubmitting}
@@ -231,8 +227,15 @@
               <button
                 type="submit"
-                className="btn border-amber-400 btn-lg"
+                className="btn border-amber-400 btn-lg" // Consider btn-primary or similar for consistency
                 disabled={isSubmitting}
               >
-                {isSubmitting ? 'Publishing...' : 'Publish Post'}
+                {isSubmitting ? (
+                  <>
+                    <span className="loading loading-spinner loading-sm mr-2"></span>
+                    Publishing...
+                  </>
+                ) : (
+                  "Publish Post"
+                )}
               </button>
             </div>
@@ -242,8 +245,8 @@
 
       {/* Modal */}
-      <div className={`modal ${modal.isOpen ? 'modal-open' : ''}`}>
+      <div className={`modal ${modal.isOpen ? "modal-open" : ""}`}>
         <div className="modal-box">
           <div className="flex items-center gap-3 mb-4">
-            {modal.type === 'success' && (
+            {modal.type === "success" && (
               <div className="w-8 h-8 rounded-full bg-success flex items-center justify-center">
                 <svg
@@ -262,5 +265,5 @@
               </div>
             )}
-            {modal.type === 'pending' && (
+            {modal.type === "pending" && (
               <div className="w-8 h-8 rounded-full bg-warning flex items-center justify-center">
                 <svg
@@ -279,5 +282,6 @@
               </div>
             )}
-            {modal.type === 'auth' && (
+            {/* Added 'error' type for modal icon */}
+            {(modal.type === "auth" || modal.type === "error") && (
               <div className="w-8 h-8 rounded-full bg-error flex items-center justify-center">
                 <svg
@@ -287,17 +291,28 @@
                   viewBox="0 0 24 24"
                 >
-                  <path
-                    strokeLinecap="round"
-                    strokeLinejoin="round"
-                    strokeWidth="2"
-                    d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"
-                  ></path>
+                  {modal.type === "auth" ? (
+                    <path
+                      strokeLinecap="round"
+                      strokeLinejoin="round"
+                      strokeWidth="2"
+                      d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"
+                    ></path>
+                  ) : (
+                    <path
+                      strokeLinecap="round"
+                      strokeLinejoin="round"
+                      strokeWidth="2"
+                      d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
+                    /> // Generic error icon
+                  )}
                 </svg>
               </div>
             )}
             <h3 className="font-bold text-lg">
-              {modal.type === 'success' && 'Success!'}
-              {modal.type === 'pending' && 'Pending Approval'}
-              {modal.type === 'auth' && 'Authentication Required'}
+              {modal.type === "success" && "Success!"}
+              {modal.type === "pending" && "Pending Approval"}
+              {modal.type === "auth" && "Authentication Required"}
+              {modal.type === "error" && "Error"}{" "}
+              {/* Title for generic error */}
             </h3>
           </div>
Index: client/src/Dashboard/components/Forum.jsx
===================================================================
--- client/src/Dashboard/components/Forum.jsx	(revision 43c183dd0490ed95bda427b670563fedba06e26a)
+++ client/src/Dashboard/components/Forum.jsx	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -1,7 +1,8 @@
-import React, { useState, useEffect } from 'react';
-import { useNavigate } from 'react-router-dom';
-import commentIcon from '../../assets/images/comment.svg';
-import trashIcon from '../../assets/images/delete.svg'; // Add this import
-import Navbar from './Navbar';
+import React, { useState, useEffect } from "react";
+import { useNavigate } from "react-router-dom";
+import commentIcon from "../../assets/images/comment.svg";
+import trashIcon from "../../assets/images/delete.svg"; // Add this import
+import Navbar from "./Navbar";
+import { getForumPosts, deleteForumPost } from "@/services/forumService";
 const Forum = () => {
   const navigate = useNavigate();
@@ -12,5 +13,5 @@
   const [loadingMore, setLoadingMore] = useState(false);
   const postsPerPage = 5;
-  const user = JSON.parse(localStorage.getItem('user'));
+  const user = JSON.parse(localStorage.getItem("user"));
 
   useEffect(() => {
@@ -19,6 +20,4 @@
 
   const fetchPosts = async () => {
-    const token = localStorage.getItem('jwt');
-    console.log(token);
     try {
       if (page === 0) {
@@ -27,17 +26,6 @@
         setLoadingMore(true);
       }
-      
-      const response = await fetch(
-        `/forum/posts?page=${page}&limit=${postsPerPage}`,
-        {
-          headers: {
-            Authorization: `Bearer ${token}`,
-          },
-        }
-      );
-      if (!response.ok) {
-        throw new Error(`HTTP error! status: ${response.status}`);
-      }
-      const data = await response.json();
+
+      const data = await getForumPosts(page, postsPerPage);
       if (page === 0) {
         setPosts(data);
@@ -49,5 +37,5 @@
       }
     } catch (error) {
-      console.error('Error fetching forum posts:', error);
+      console.error("Error fetching forum posts:", error);
     } finally {
       setLoading(false);
@@ -57,23 +45,12 @@
 
   const handleDeletePost = async (postId) => {
-    const token = localStorage.getItem('jwt');
     try {
-      const response = await fetch(`/forum/posts/${postId}`, {
-        method: 'DELETE',
-        headers: {
-          'Content-Type': 'application/json',
-          Authorization: `Bearer ${token}`,
-        },
-      });
-      if (!response.ok) {
-        throw new Error(`HTTP error! status: ${response.status}`);
-      }
+      await deleteForumPost(postId);
       setPosts((prevPosts) => prevPosts.filter((post) => post.id !== postId));
-      console.log('Post deleted successfully');
+      console.log("Post deleted successfully");
     } catch (error) {
-      console.error('Error deleting post:', error);
+      console.error("Error deleting post:", error);
     }
   };
-
   const handleLoadMore = () => {
     setPage((prevPage) => prevPage + 1);
@@ -89,5 +66,5 @@
         <div className="flex-1 ml-8 mb-6">
           <h1 className="text-4xl font-bold mb-10">Forum Posts</h1>
-          
+
           {loading ? (
             <div className="flex justify-center items-center h-64">
@@ -111,5 +88,5 @@
                           if (
                             window.confirm(
-                              'Are you sure you want to delete this post?'
+                              "Are you sure you want to delete this post?"
                             )
                           ) {
@@ -126,5 +103,5 @@
                         className="text-3xl font-semibold mb-2 cursor-pointer hover:underline"
                         onClick={() => {
-                          console.log('Post clicked:', post);
+                          console.log("Post clicked:", post);
                           navigate(`/dashboard/forum-detail/${post.id}`, {
                             state: { post },
@@ -137,10 +114,10 @@
 
                     <p className="text-m text-gray-500">
-                      By {post.authorName},{' '}
-                      <span>{post.dateCreated.split('T')[0]}</span>
+                      By {post.authorName},{" "}
+                      <span>{post.dateCreated.split("T")[0]}</span>
                     </p>
                     <p className="mt-2 text-gray-400 text-xl">
                       {post.content && post.content.length > 300
-                        ? post.content.slice(0, 300) + '...'
+                        ? post.content.slice(0, 300) + "..."
                         : post.content}
                     </p>
@@ -166,7 +143,9 @@
               {hasMore && (
                 <div className="flex justify-center mt-6">
-                  <button 
-                    onClick={handleLoadMore} 
-                    className={`btn btn-outline mb-6 ${loadingMore ? 'btn-disabled' : ''}`}
+                  <button
+                    onClick={handleLoadMore}
+                    className={`btn btn-outline mb-6 ${
+                      loadingMore ? "btn-disabled" : ""
+                    }`}
                     disabled={loadingMore}
                   >
@@ -177,5 +156,5 @@
                       </>
                     ) : (
-                      'Load More'
+                      "Load More"
                     )}
                   </button>
@@ -191,5 +170,5 @@
             <button
               onClick={() => {
-                navigate('/dashboard/create-post');
+                navigate("/dashboard/create-post");
               }}
               className="cursor-pointer px-6 py-3 bg-yellow-500 text-black rounded hover:bg-yellow-600"
Index: client/src/Dashboard/components/ForumPostDetail.jsx
===================================================================
--- client/src/Dashboard/components/ForumPostDetail.jsx	(revision 43c183dd0490ed95bda427b670563fedba06e26a)
+++ client/src/Dashboard/components/ForumPostDetail.jsx	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -1,6 +1,12 @@
-import React, { useEffect, useState } from 'react';
-import trashIcon from '../../assets/images/delete.svg';
-import Navbar from './Navbar';
-import { useParams, useNavigate, useLocation } from 'react-router-dom';
+import React, { useEffect, useState } from "react";
+import trashIcon from "../../assets/images/delete.svg";
+import Navbar from "./Navbar";
+import { useParams, useNavigate, useLocation } from "react-router-dom";
+import {
+  getCommentsForPost,
+  createComment,
+  deleteComment,
+} from "@/services/forumService";
+import { useCallback } from "react";
 
 const ForumPostDetail = () => {
@@ -8,92 +14,72 @@
   const [loading, setLoading] = useState(true);
   const [error, setError] = useState(null);
-  const [commentText, setCommentText] = useState('');
+  const [commentText, setCommentText] = useState("");
   const location = useLocation();
   const statePost = useState(location.state?.post || {});
   const post = statePost[0];
   const [posting, setPosting] = useState(false);
-  const user = JSON.parse(localStorage.getItem('user'));
+  const user = JSON.parse(localStorage.getItem("user"));
   const navigate = useNavigate();
   const { postId } = useParams();
-  const token = localStorage.getItem('jwt');
-
-  useEffect(() => {
+
+  const fetchComments = useCallback(async () => {
     if (!postId) return;
     setLoading(true);
     setError(null);
-    fetch(`/forum/comments?post_id=${postId}`, {
-      headers: {
-        'Content-Type': 'application/json',
-        Authorization: `Bearer ${token}`,
-      },
-    })
-      .then((res) => {
-        if (!res.ok) throw new Error('Failed to fetch comments');
-        return res.json();
-      })
-      .then((data) => {
-        setComments(data);
-        setLoading(false);
-      })
-      .catch((err) => {
-        setError(err.message);
-        setLoading(false);
-      });
+    try {
+      const data = await getCommentsForPost(postId);
+      setComments(data);
+    } catch (err) {
+      setError(err.message || "Failed to fetch comments");
+      console.error("Error fetching comments:", err);
+    } finally {
+      setLoading(false);
+    }
   }, [postId]);
+
+  useEffect(() => {
+    if (!post && postId) {
+      console.warn(
+        "Post details not available from location state. Consider fetching post by ID."
+      );
+    }
+  }, [post, postId]);
+
+  useEffect(() => {
+    fetchComments();
+  }, [fetchComments]);
+
   const handleDeleteComment = async (commentId) => {
     try {
-      const response = await fetch(`/forum/comments/${commentId}`, {
-        method: 'DELETE',
-        headers: {
-          'Content-Type': 'application/json',
-          Authorization: `Bearer ${token}`,
-        },
-      });
-      if (!response.ok) {
-        throw new Error(`HTTP error! status: ${response.status}`);
-      }
-      // Remove the deleted post from the state
+      await deleteComment(commentId);
       setComments((prevComments) =>
         prevComments.filter((comment) => comment.id !== commentId)
       );
-      console.log('Post deleted successfully');
+      console.log("Comment deleted successfully");
     } catch (error) {
-      console.error('Error deleting post:', error);
+      console.error("Error deleting comment:", error);
+      setError(error.message || "Failed to delete comment");
     }
   };
-  const handleSubmit = async (e) => {
+
+  const handleSubmitComment = async (e) => {
     e.preventDefault();
-    if (!commentText.trim()) return;
+    if (!commentText.trim() || !user || !postId) return;
     setPosting(true);
     setError(null);
-    const user = JSON.parse(localStorage.getItem('user'));
 
     try {
-      const response = await fetch('/forum/comments', {
-        method: 'POST',
-        headers: {
-          'Content-Type': 'application/json',
-          Authorization: `Bearer ${token}`,
-        },
-        body: JSON.stringify({
-          post_id: postId,
-          content: commentText,
-          authorId: user.id,
-          authorName: user.username,
-        }),
-      });
-      if (!response.ok) {
-        const errData = await response.json();
-        throw new Error(errData.error || 'Failed to post comment');
-      }
-      setCommentText('');
-      // Refresh comments
-      fetch(`/forum/comments?post_id=${post.id}`, {
-        headers: { Authorization: `Bearer ${token}` },
-      })
-        .then((res) => res.json())
-        .then((data) => setComments(data));
+      const commentData = {
+        post_id: postId,
+        content: commentText,
+        authorId: user.id,
+        authorName: user.username,
+      };
+      await createComment(commentData);
+      setCommentText("");
+      fetchComments();
     } catch (err) {
-      setError(err.message);
+      setError(err.message || "Failed to post comment");
+      console.error("Error posting comment:", err);
     } finally {
       setPosting(false);
@@ -113,5 +99,5 @@
           <button
             className="btn btn-ghost mb-4"
-            onClick={() => navigate('/dashboard/forum')}
+            onClick={() => navigate("/dashboard/forum")}
           >
             ← Back to Forum
@@ -133,5 +119,5 @@
 
           <div className="card bg-base-100 shadow-lg p-6 mb-8">
-            <form className="mt-6" onSubmit={handleSubmit}>
+            <form className="mt-6" onSubmit={handleSubmitComment}>
               <h3 className="text-2xl font-semibold mb-4">
                 Comments ({comments.length})
@@ -151,5 +137,5 @@
                   disabled={posting || !commentText.trim()}
                 >
-                  {posting ? 'Posting...' : 'Post Comment'}
+                  {posting ? "Posting..." : "Post Comment"}
                 </button>
               </div>
@@ -182,9 +168,9 @@
                                   if (
                                     window.confirm(
-                                      'Are you sure you want to delete this comment?'
+                                      "Are you sure you want to delete this comment?"
                                     )
                                   ) {
                                     // Call your delete comment function here
-                                    console.log('Delete comment:', comment.id);
+                                    console.log("Delete comment:", comment.id);
                                   }
                                   handleDeleteComment(comment.id);
@@ -204,5 +190,5 @@
                               {comment.dateCreated
                                 ? new Date(comment.dateCreated).toLocaleString()
-                                : ''}
+                                : ""}
                             </span>
                           </div>
Index: client/src/Dashboard/components/ManagePosts.jsx
===================================================================
--- client/src/Dashboard/components/ManagePosts.jsx	(revision 43c183dd0490ed95bda427b670563fedba06e26a)
+++ client/src/Dashboard/components/ManagePosts.jsx	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -1,7 +1,13 @@
-import React, { useState, useEffect } from 'react';
-import { useNavigate } from 'react-router-dom';
-import doneAll from '../../assets/images/done-all.svg';
-import trashIcon from '../../assets/images/delete.svg'; // Add this import
-import Navbar from './Navbar';
+import React, { useState, useEffect } from "react";
+import { useNavigate } from "react-router-dom";
+import doneAll from "../../assets/images/done-all.svg";
+import trashIcon from "../../assets/images/delete.svg"; // Add this import
+import Navbar from "./Navbar";
+import { useCallback } from "react";
+import {
+  getReviewPosts,
+  deleteReviewPost,
+  approveReviewPost,
+} from "@/services/reviewService";
 
 const ManagePosts = () => {
@@ -12,8 +18,11 @@
   const [loading, setLoading] = useState(true);
   const [loadingMore, setLoadingMore] = useState(false);
+  const [error, setError] = useState(null);
+  const postsPerPage = 5;
+  const user = JSON.parse(localStorage.getItem("user"));
   const [modal, setModal] = useState({
     isOpen: false,
-    message: '',
-    type: '',
+    message: "",
+    type: "",
     postId: null,
     post: null,
@@ -22,6 +31,6 @@
     setModal({
       isOpen: false,
-      message: '',
-      type: '',
+      message: "",
+      type: "",
       postId: null,
       post: null,
@@ -30,106 +39,112 @@
 
   const confirmAction = () => {
-    if (modal.type === 'delete' && modal.postId) {
+    if (modal.type === "delete" && modal.postId) {
       handleDeletePost(modal.postId);
-    } else if (modal.type === 'approve' && modal.post) {
+    } else if (modal.type === "approve" && modal.post) {
       handleApprovePost(modal.post);
     }
     closeModal();
   };
-  const postsPerPage = 5;
-  const user = JSON.parse(localStorage.getItem('user'));
-  const token = localStorage.getItem('jwt');
+  const fetchPostsData = useCallback(async () => {
+    // Renamed to avoid conflict with posts state variable
+    if (!user || !user.id) {
+      setError("User not found. Please log in.");
+      setLoading(false);
+      setLoadingMore(false);
+      return;
+    }
+
+    if (page === 0) {
+      setLoading(true);
+    } else {
+      setLoadingMore(true);
+    }
+    setError(null);
+
+    try {
+      const data = await getReviewPosts(page, postsPerPage, user.id);
+      console.log("Fetched posts data:", data);
+
+      setPosts((prevPosts) => (page === 0 ? data : [...prevPosts, ...data]));
+      setHasMore(data.length === postsPerPage);
+    } catch (err) {
+      console.error("Error fetching review posts:", err);
+      setError(
+        err.response?.data?.message ||
+          err.message ||
+          "Failed to fetch posts for review."
+      );
+    } finally {
+      setLoading(false);
+      setLoadingMore(false);
+    }
+  }, [page, user?.id]);
   useEffect(() => {
-    fetchPosts();
+    fetchPostsData();
   }, [page]);
 
-  const fetchPosts = async () => {
+  const handleDeletePost = async (postId) => {
+    if (!user || !user.id) {
+      console.error("User ID not found for delete operation");
+      setError("Action cannot be performed without user authentication.");
+      return;
+    }
     try {
-      if (page === 0) {
-        setLoading(true);
-      } else {
-        setLoadingMore(true);
-      }
-
-      const response = await fetch(
-        `/review/posts?page=${page}&limit=${postsPerPage}&userId=${user.id}`,
-        {
-          headers: {
-            Authorization: `Bearer ${token}`,
-          },
-        }
+      await deleteReviewPost(postId, user.id);
+      setPosts((prevPosts) => prevPosts.filter((post) => post.id !== postId));
+      console.log("Post deleted successfully from review queue");
+    } catch (err) {
+      console.error("Error deleting review post:", err);
+      setError(
+        err.response?.data?.message || err.message || "Failed to delete post."
       );
-      console.log('Response status:', response.status);
-
-      if (!response.ok) {
-        throw new Error(`HTTP error! status: ${response.status}`);
-      }
-
-      const data = await response.json();
-      console.log('Fetched posts data:', data);
-
-      if (page === 0) {
-        setPosts(data);
-      } else {
-        setPosts((prevPosts) => [...prevPosts, ...data]);
-      }
-
-      if (data.length < postsPerPage) {
-        setHasMore(false);
-      }
-    } catch (error) {
-      console.error('Error fetching forum posts:', error);
-    }
-  };
-
-  const handleDeletePost = async (postId) => {
+    }
+  };
+
+  const handleApprovePost = async (postToApprove) => {
+    if (!user || !user.id || !postToApprove) {
+      console.error("User ID or post data not found for approve operation");
+      setError("Action cannot be performed without user or post data.");
+      return;
+    }
     try {
-      const response = await fetch(
-        `/review/posts/${postId}?userId=${user.id}`,
-        {
-          method: 'DELETE',
-          headers: {
-            'Content-Type': 'application/json',
-            Authorization: `Bearer ${token}`,
-          },
-        }
+      const postDataForApproval = {
+        authorId: postToApprove.authorId,
+        authorName: postToApprove.authorName,
+        title: postToApprove.title,
+        content: postToApprove.content,
+      };
+
+      await approveReviewPost(postToApprove.id, postDataForApproval, user.id);
+      setPosts((prevPosts) =>
+        prevPosts.filter((p) => p.id !== postToApprove.id)
       );
-      if (!response.ok) {
-        throw new Error(`HTTP error! status: ${response.status}`);
-      }
-      setPosts((prevPosts) => prevPosts.filter((post) => post.id !== postId));
-      console.log('Post deleted successfully');
-    } catch (error) {
-      console.error('Error deleting post:', error);
-    }
-  };
-
-  const handleApprovePost = async (post) => {
-    try {
-      const response = await fetch(
-        `/review/posts/${post.id}?userId=${user.id}`,
-        {
-          method: 'POST',
-          headers: {
-            'Content-Type': 'application/json',
-            Authorization: `Bearer ${token}`,
-          },
-          body: JSON.stringify({
-            authorId: user.id,
-            authorName: user.name,
-            title: post.title,
-            content: post.content,
-          }),
-        }
+      console.log("Post approved successfully");
+    } catch (err) {
+      console.error("Error approving post:", err);
+      setError(
+        err.response?.data?.message || err.message || "Failed to approve post."
       );
-      if (!response.ok) {
-        throw new Error(`HTTP error! status: ${response.status}`);
-      }
-      setPosts((prevPosts) =>
-        prevPosts.filter((postce) => postce.id !== post.id)
-      );
-      console.log('Post approved successfully');
-    } catch (error) {
-      console.error('Error approving post:', error);
+      // Optionally show an error modal/toast
+    }
+  };
+  const openConfirmationModal = (type, item) => {
+    // item can be postId (string) for delete, or post (object) for approve
+    if (type === "delete") {
+      setModal({
+        isOpen: true,
+        message: "Are you sure you want to delete this post permanently?",
+        type: "delete",
+        postId: item,
+        post: null,
+      });
+    } else if (type === "approve") {
+      setModal({
+        isOpen: true,
+        message: "Are you sure you want to approve this post?",
+        type: "approve",
+        postId: item.id, // Store postId for consistency if needed, but 'post' object is key
+        post: item,
+      });
     }
   };
@@ -144,89 +159,120 @@
       className="dashboard h-screen flex bg-base-100 overflow-none"
     >
-      <Navbar></Navbar>
-      <div className="flex flex-col md:flex-row gap-6 p-6 h-full overflow-y-auto w-full">
-        <div className="flex-1 ml-8">
-          <h1 className="text-4xl font-bold mb-10">Posts that need approval</h1>
-          <div className="space-y-4" w-300>
+      <Navbar />
+      <div className="flex flex-col w-full h-full overflow-y-auto p-6">
+        <div className="flex-1 md:ml-8">
+          <h1 className="text-4xl font-bold mb-10">Posts to be reviewed:</h1>
+          {error && (
+            <div className="alert alert-error shadow-lg mb-4">
+              <div>
+                <svg
+                  xmlns="http://www.w3.org/2000/svg"
+                  className="stroke-current flex-shrink-0 h-6 w-6"
+                  fill="none"
+                  viewBox="0 0 24 24"
+                >
+                  <path
+                    strokeLinecap="round"
+                    strokeLinejoin="round"
+                    strokeWidth="2"
+                    d="M10 14l2-2m0 0l2-2m-2 2l-2 2m2-2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"
+                  />
+                </svg>
+                <span>{error}</span>
+                <button
+                  className="btn btn-xs btn-ghost"
+                  onClick={() => setError(null)}
+                >
+                  Clear
+                </button>
+              </div>
+            </div>
+          )}
+          {posts.length === 0 && !loading && !loadingMore && !error && (
+            <div className="text-center text-gray-500 py-10">
+              No posts currently awaiting approval.
+            </div>
+          )}
+          <div className="space-y-4">
             {posts.map((post) => (
               <div
                 key={post.id}
-                className="p-4 border rounded-lg shadow-sm hover:shadow-md transition  relative"
+                className="p-6 border border-base-300 bg-base-200 rounded-lg shadow-sm hover:shadow-md transition relative"
               >
-                <button
-                  className=" absolute top-2 right-20 p-1.5 cursor-pointer rounded-full hover:bg-gray-600 transition-colors"
-                  onClick={(e) => {
-                    e.stopPropagation();
-
-                    if (
-                      window.confirm(
-                        'Are you sure you want to approve this post?'
-                      )
-                    ) {
-                      handleApprovePost(post);
-                    }
-                  }}
-                >
-                  <img src={doneAll} alt="Approve" className="w-10 h-10" />
-                </button>
-                <button
-                  className=" absolute top-2 right-8 p-1.5 cursor-pointer rounded-full hover:bg-gray-600 transition-colors"
-                  onClick={(e) => {
-                    e.stopPropagation();
-                    if (
-                      window.confirm(
-                        'Are you sure you want to delete this post?'
-                      )
-                    ) {
-                      handleDeletePost(post.id);
-                    }
-                  }}
-                >
-                  <img src={trashIcon} alt="Delete" className="w-10 h-10" />
-                </button>
-
-                <div className="flex items-center gap-4 mt-2">
-                  <h2
-                    className="text-3xl font-semibold mb-2 cursor-pointer hover:underline"
-                    onClick={() => {
-                      console.log('Post clicked:', post);
-                      navigate(`/dashboard/forum-detail/${post.id}`, {
-                        state: { post },
-                      });
+                <h1>{post.title}</h1>
+                <div className="absolute top-4 right-4 flex gap-2">
+                  <button
+                    title="Approve Post"
+                    className="btn btn-sm btn-success btn-circle"
+                    onClick={(e) => {
+                      e.stopPropagation();
+                      openConfirmationModal("approve", post);
                     }}
                   >
-                    {post.title}
-                  </h2>
+                    <img src={doneAll} alt="Approve" className="w-5 h-5" />
+                  </button>
+                  <button
+                    title="Delete Post"
+                    className="btn btn-sm btn-error btn-circle"
+                    onClick={(e) => {
+                      e.stopPropagation();
+                      openConfirmationModal("delete", post.id);
+                    }}
+                  >
+                    <img src={trashIcon} alt="Delete" className="w-5 h-5" />
+                  </button>
                 </div>
 
-                <p className="text-m text-gray-500">
-                  By {post.authorName},{' '}
-                  <span>{post.dateCreated.split('T')[0]}</span>
+                <h2
+                  className="text-2xl font-semibold mb-1 cursor-pointer hover:underline text-primary"
+                  onClick={() => {
+                    // For review, direct navigation to detail might not be desired
+                    // unless you have a specific review detail view.
+                    // For now, clicking title does nothing or opens a modal with full content.
+                    console.log("Post title clicked (for review):", post.title);
+                  }}
+                >
+                  {post.title}
+                </h2>
+                <p className="text-sm text-base-content/70 mb-3">
+                  By {post.authorName} on{" "}
+                  <span>
+                    {post.dateCreated
+                      ? new Date(post.dateCreated).toLocaleDateString()
+                      : "N/A"}
+                  </span>
                 </p>
-                <p className="mt-2 text-gray-400 text-xl">
-                  {post.content && post.content.length > 300
-                    ? post.content.slice(0, 300) + '...'
-                    : post.content}
+                <p className="text-base-content/90 whitespace-pre-line break-words">
+                  {post.content}
                 </p>
               </div>
             ))}
           </div>
-          {hasMore && (
+          {hasMore && !loadingMore && (
             <div className="flex justify-center mt-6">
-              <button onClick={handleLoadMore} className="btn btn-outline">
+              <button
+                onClick={handleLoadMore}
+                className="btn btn-primary"
+                disabled={loadingMore}
+              >
                 Load More
               </button>
             </div>
           )}
+          {loadingMore && (
+            <div className="flex justify-center mt-6">
+              <span className="loading loading-spinner loading-md"></span>
+            </div>
+          )}
         </div>
       </div>
 
       {/* Modal */}
-      <div className={`modal ${modal.isOpen ? 'modal-open' : ''}`}>
+      <div className={`modal ${modal.isOpen ? "modal-open" : ""}`}>
         <div className="modal-box">
           <div className="flex items-center gap-3 mb-4">
-            {modal.type === 'approve' && (
+            {modal.type === "approve" && (
               <div className="w-8 h-8 rounded-full bg-success flex items-center justify-center">
-                <svg
+                <svg /* SVG for approve */
                   className="w-5 h-5 text-success-content"
                   fill="none"
@@ -243,7 +289,7 @@
               </div>
             )}
-            {modal.type === 'delete' && (
+            {modal.type === "delete" && (
               <div className="w-8 h-8 rounded-full bg-error flex items-center justify-center">
-                <svg
+                <svg /* SVG for delete */
                   className="w-5 h-5 text-error-content"
                   fill="none"
@@ -261,6 +307,6 @@
             )}
             <h3 className="font-bold text-lg">
-              {modal.type === 'approve' && 'Approve Post'}
-              {modal.type === 'delete' && 'Delete Post'}
+              {modal.type === "approve" && "Confirm Approval"}
+              {modal.type === "delete" && "Confirm Deletion"}
             </h3>
           </div>
@@ -272,9 +318,9 @@
             <button
               className={`btn ${
-                modal.type === 'approve' ? 'btn-success' : 'btn-error'
+                modal.type === "approve" ? "btn-success" : "btn-error"
               }`}
               onClick={confirmAction}
             >
-              {modal.type === 'approve' ? 'Approve' : 'Delete'}
+              {modal.type === "approve" ? "Approve" : "Delete"}
             </button>
           </div>
Index: client/src/Dashboard/components/Task.jsx
===================================================================
--- client/src/Dashboard/components/Task.jsx	(revision 43c183dd0490ed95bda427b670563fedba06e26a)
+++ client/src/Dashboard/components/Task.jsx	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -2,5 +2,9 @@
 import Navbar from "./Navbar";
 import { useNavigate } from "react-router-dom";
-
+import {
+  getTaskForDate,
+  getTestCaseForTask,
+  evaluate,
+} from "@/services/taskService";
 const Task = () => {
   const [showTask, setShowTask] = useState(false);
@@ -23,34 +27,10 @@
 
   async function fetchTaskForToday(date) {
-    console.log("Fetching task for date:", date);
-    console.log(token);
     try {
       const formattedDate = new Date(date).toISOString().split("T")[0];
-
-      const response = await fetch(`/task/${formattedDate}`, {
-        headers: {
-          Accept: "application/json",
-          "Cache-Control": "no-cache",
-
-          Authorization: `Bearer ${token}`,
-        },
-      });
-
-      if (!response.ok) {
-        throw new Error(`HTTP error! status: ${response.status}`);
-      }
-
-      const responseText = await response.text();
-
-      let data;
-      try {
-        data = JSON.parse(responseText);
-      } catch (error) {
-        throw new Error("Failed to parse server response as JSON" + error);
-      }
+      const data = await getTaskForDate(formattedDate);
 
       if (Array.isArray(data) && data.length > 0) {
         const taskData = data[0];
-        console.log("Processing task data:", taskData);
         let processedTitle = taskData.title
           .split("-")
@@ -65,5 +45,4 @@
         });
       } else {
-        console.error("No tasks found for the date");
         setTask({
           title: "No Challenge Available",
@@ -94,18 +73,5 @@
   async function fetchTestCaseForToday(id) {
     try {
-      const response = await fetch(`/task/${id}/test-case`, {
-        headers: {
-          Accept: "application/json",
-          "Cache-Control": "no-cache",
-          Authorization: `Bearer ${token}`,
-        },
-      });
-
-      if (!response.ok) {
-        throw new Error(`HTTP error! status: ${response.status}`);
-      }
-
-      const data = await response.json();
-      console.log("Test case data:", data);
+      const data = await getTestCaseForTask(id);
 
       if (data && data.input) {
@@ -141,29 +107,8 @@
 
     try {
-      const response = await fetch(`/task/${task.id}/evaluate`, {
-        method: "POST",
-        headers: {
-          "Content-Type": "application/json",
-          Authorization: `Bearer ${token}`,
-        },
-        body: JSON.stringify({
-          userOutput: document.getElementById("userOutput").value,
-          testCaseId: testCase.id,
-          userId: user.id,
-        }),
-      });
-      const result = await response.json();
-      if (!response.ok) {
-        // Handle HTTP errors (e.g., 400, 404, 500)
-        // The 'result' might contain an error message from the backend
-        console.error("Server error:", result);
-        alert(
-          `Error: ${
-            result.message ||
-            "Failed to evaluate solution. Status: " + response.status
-          }`
-        );
-        return;
-      }
+      const userOutput = document.getElementById("userOutput").value;
+
+      const result = await evaluate(task.id, userOutput, testCase.id, user.id);
+
       if (result.success) {
         setEvalResult(
@@ -177,10 +122,8 @@
         updatedUserFromStorage.solvedDailyChallenge = true;
         updatedUserFromStorage.pointsAwarded = result.scoreAwarded;
+        updatedUserFromStorage.rank = result.rank;
 
         toggleSolvedDailyChallenge(user);
-        updatedUserFromStorage.rank = result.rank;
         localStorage.setItem("user", JSON.stringify(updatedUserFromStorage));
-
-        // navigate('/dashboard/forum');
       } else {
         setEvalResult(
@@ -196,4 +139,5 @@
     } catch (error) {
       console.error("Error evaluating solution:", error);
+      alert("Something went wrong. Try again later.");
     } finally {
       setIsSubmitting(false);
Index: client/src/LogIn/LogIn.jsx
===================================================================
--- client/src/LogIn/LogIn.jsx	(revision 43c183dd0490ed95bda427b670563fedba06e26a)
+++ client/src/LogIn/LogIn.jsx	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -1,11 +1,11 @@
-import React, { useState } from 'react';
-import { Link, useNavigate } from 'react-router-dom';
-import { supabase } from '../contexts/AuthContext';
-
+import React, { useState } from "react";
+import { Link, useNavigate } from "react-router-dom";
+import { supabase } from "../contexts/AuthContext";
+import { loginUser } from "@/services/registerLoginService";
 const Login = () => {
-  const [email, setEmail] = useState('');
-  const [password, setPassword] = useState('');
+  const [email, setEmail] = useState("");
+  const [password, setPassword] = useState("");
   const [showPassword, setShowPassword] = useState(false);
-  const [error, setError] = useState('');
+  const [error, setError] = useState("");
   const [loading, setLoading] = useState(false);
   const navigate = useNavigate();
@@ -17,42 +17,49 @@
   const handleSubmit = async (e) => {
     e.preventDefault();
-    setError('');
+    setError("");
     setLoading(true);
 
     try {
-      const { data: authData, error: authError } =
+      const { data: supabaseAuthData, error: supabaseAuthError } =
         await supabase.auth.signInWithPassword({
           email,
           password,
         });
-      localStorage.setItem('jwt', authData.session?.access_token);
-      if (authError) {
-        setError(authError.message);
+
+      if (supabaseAuthError) {
+        setError(supabaseAuthError.message);
+        setLoading(false);
         return;
       }
-      const response = await fetch('/api/login', {
-        method: 'POST',
-        headers: {
-          'Content-Type': 'application/json',
-        },
-        body: JSON.stringify({ email, password }),
-      });
 
-      const data = await response.json();
+      if (!supabaseAuthData.session?.access_token) {
+        setError("Failed to retrieve session token from Supabase.");
+        setLoading(false);
+        return;
+      }
 
-      if (data.success) {
-        localStorage.setItem('user', JSON.stringify(data.user));
+      localStorage.setItem("jwt", supabaseAuthData.session.access_token);
+      const backendLoginData = await loginUser({ email, password });
 
-        navigate('/dashboard');
+      if (backendLoginData.success) {
+        localStorage.setItem("user", JSON.stringify(backendLoginData.user));
+        navigate("/dashboard");
       } else {
-        setError(data.message || 'Login failed');
+        localStorage.removeItem("jwt");
+        setError(backendLoginData.message || "Login failed on backend.");
       }
     } catch (err) {
-      setError('An error occurred during login.');
+      console.error("Login error caught in component:", err);
+      if (err.response && err.response.data && err.response.data.message) {
+        setError(err.response.data.message);
+      } else if (err.message) {
+        setError(err.message);
+      } else {
+        setError("An unexpected error occurred during login.");
+      }
     } finally {
       setLoading(false);
     }
   };
-
   return (
     <div
@@ -89,5 +96,5 @@
             <input
               id="password"
-              type={showPassword ? 'text' : 'password'}
+              type={showPassword ? "text" : "password"}
               className="input input-lg w-full pr-14"
               placeholder="Password"
@@ -155,5 +162,5 @@
             </span>
           ) : (
-            'Log in'
+            "Log in"
           )}
         </button>
Index: client/src/Register/Register.jsx
===================================================================
--- client/src/Register/Register.jsx	(revision 43c183dd0490ed95bda427b670563fedba06e26a)
+++ client/src/Register/Register.jsx	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -1,9 +1,10 @@
-import React from 'react';
-import { Link, useNavigate } from 'react-router-dom';
-import { useState } from 'react';
-import { supabase } from '../contexts/AuthContext';
+import React from "react";
+import { Link, useNavigate } from "react-router-dom";
+import { useState } from "react";
+import { supabase } from "../contexts/AuthContext";
+import { registerUser } from "@/services/registerLoginService";
 
 const Register = () => {
-  const [error, setError] = React.useState('');
+  const [error, setError] = React.useState("");
   const nav = useNavigate();
   const [showPassword, setShowPassword] = useState({
@@ -21,12 +22,12 @@
 
   const [formData, setFormData] = useState({
-    username: '',
-    email: '',
-    password: '',
-    confirmPassword: '',
-    name: '',
+    username: "",
+    email: "",
+    password: "",
+    confirmPassword: "",
+    name: "",
   });
   function validateEmail(email) {
-    return email.endsWith('@students.finki.ukim.mk');
+    return email.endsWith("@students.finki.ukim.mk");
   }
   const handleInputChange = (e) => {
@@ -39,95 +40,151 @@
   const handleSubmit = async (e) => {
     e.preventDefault();
-    setLoading(true); // Start loader
-    setError('');
+    setLoading(true);
+    setError("");
+
+    if (!validateEmail(formData.email)) {
+      setError("Email must end with @students.finki.ukim.mk");
+      setLoading(false);
+      return;
+    }
+    if (formData.username === "") {
+      setError("Must enter username");
+      setLoading(false);
+      return;
+    }
+    if (formData.name === "") {
+      setError("Name is required");
+      setLoading(false);
+      return;
+    }
+    if (formData.password === "") {
+      setError("Password is required");
+      setLoading(false);
+      return;
+    }
+    if (formData.confirmPassword === "") {
+      setError("Please confirm your password");
+      setLoading(false);
+      return;
+    }
+    if (formData.password !== formData.confirmPassword) {
+      setError("Passwords do not match");
+      setLoading(false);
+      return;
+    }
+    if (formData.password.length < 8) {
+      setError("Password must be at least 8 characters long");
+      setLoading(false);
+      return;
+    }
+    if (!/[A-Z]/.test(formData.password)) {
+      setError("Password must contain at least one uppercase letter");
+      setLoading(false);
+      return;
+    }
+    if (!/[0-9]/.test(formData.password)) {
+      setError("Password must contain at least one number");
+      setLoading(false);
+      return;
+    }
+
     try {
-      if (!validateEmail(formData.email)) {
-        setError('Email must end with @students.finki.ukim.mk');
-        setLoading(false);
-        return;
+      const userData = {
+        username: formData.username,
+        email: formData.email,
+        password: formData.password,
+        name: formData.name,
+      };
+
+      const data = await registerUser(userData);
+      let registrationAttemptError = "";
+
+      if (data.success) {
+        localStorage.setItem("user", JSON.stringify(data.user));
+        try {
+          const { data: authData, error: supabaseError } =
+            await supabase.auth.signInWithPassword({
+              email: formData.email,
+              password: formData.password,
+            });
+
+          if (supabaseError) {
+            console.error(
+              "Supabase sign-in error after registration:",
+              supabaseError
+            );
+            registrationAttemptError =
+              "Registration successful, but Supabase session could not be started. Please try logging in.";
+            setError(registrationAttemptError);
+          } else if (authData.session?.access_token) {
+            localStorage.setItem("jwt", authData.session.access_token);
+          } else {
+            console.warn(
+              "Supabase session or access token missing after sign-in."
+            );
+            registrationAttemptError =
+              "Registration successful, but session token is missing. Please try logging in.";
+            setError(registrationAttemptError);
+          }
+        } catch (supabaseCatchError) {
+          console.error("Supabase auth error (caught):", supabaseCatchError);
+          registrationAttemptError =
+            "Registration successful, but an error occurred starting your session. Please try logging in.";
+          setError(registrationAttemptError);
+        }
+
+        if (registrationAttemptError === "") {
+          nav("/dashboard");
+        }
+      } else {
+        console.error("Registration failed (backend):", data.message);
+        let backendErrorMessage =
+          data.message || "Registration failed. Please try again.";
+        if (
+          data.message &&
+          data.message.toLowerCase().includes("username already in use")
+        ) {
+          backendErrorMessage = "Username already in use";
+        } else if (
+          data.message &&
+          (data.message
+            .toLowerCase()
+            .includes("email address already registered") ||
+            data.message.toLowerCase().includes("email already in use"))
+        ) {
+          backendErrorMessage = "Email already in use";
+        }
+        setError(backendErrorMessage);
       }
-      if (formData.username === '') {
-        setError('Must enter username');
-        setLoading(false);
-        return;
-      }
-      if (formData.password === '') {
-        setError('Password is required');
-        setLoading(false);
-        return;
-      }
-      if (formData.confirmPassword === '') {
-        setError('Please confirm your password');
-        setLoading(false);
-        return;
-      }
-      if (formData.password !== formData.confirmPassword) {
-        setError('Passwords do not match');
-        setLoading(false);
-        return;
-      }
-      if (formData.password.length < 8) {
-        setError('Password must be at least 8 characters long');
-        setLoading(false);
-        return;
-      }
-      if (!/[A-Z]/.test(formData.password)) {
-        setError('Password must contain at least one uppercase letter');
-        setLoading(false);
-        return;
-      }
-      if (!/[0-9]/.test(formData.password)) {
-        setError('Password must contain at least one number');
-        setLoading(false);
-        return;
-      }
-      const response = await fetch('/api/register', {
-        method: 'POST',
-        headers: {
-          'Content-Type': 'application/json',
-        },
-        body: JSON.stringify({
-          username: formData.username,
-          email: formData.email,
-          password: formData.password,
-          name: formData.name,
-        }),
-      });
-
-      const data = await response.json();
-
-      if (data.success) {
-        localStorage.setItem('user', JSON.stringify(data.user));
-        try {
-          const { data: authData } = await supabase.auth.signInWithPassword({
-            email: formData.email,
-            password: formData.password,
-          });
-          localStorage.setItem(
-            'jwt',
-            JSON.stringify(authData.session?.access_token)
-          );
-        } catch (supabaseError) {
-          console.error('Supabase auth error:', supabaseError);
-        }
-        nav('/dashboard');
-      } else {
-        console.error('Registration failed:', data.message);
-        if (data.message === 'Username already in use') {
-          setError('Username already in use');
+    } catch (apiError) {
+      console.error("Registration API error:", apiError);
+      let apiErrorMessage =
+        "Registration failed due to a network or server error. Please try again.";
+      if (
+        apiError.response &&
+        apiError.response.data &&
+        apiError.response.data.message
+      ) {
+        apiErrorMessage = apiError.response.data.message;
+        if (
+          apiError.response.data.message
+            .toLowerCase()
+            .includes("username already in use")
+        ) {
+          apiErrorMessage = "Username already in use";
         } else if (
-          data.message.includes('Email address already registered') ||
-          data.message.includes('email address has already been registered')
+          apiError.response.data.message
+            .toLowerCase()
+            .includes("email address already registered") ||
+          apiError.response.data.message
+            .toLowerCase()
+            .includes("email already in use")
         ) {
-          setError('Email already in use');
-        } else {
-          setError(data.message || 'Registration failed');
+          apiErrorMessage = "Email already in use";
         }
       }
-    } catch (error) {
-      console.error('Registration error:', error);
-      setError('Registration failed');
+      setError(apiErrorMessage);
     } finally {
-      setLoading(false); // Stop loader
+      setLoading(false);
     }
   };
@@ -200,5 +257,5 @@
                 id="password"
                 name="password"
-                type={showPassword.password ? 'text' : 'password'}
+                type={showPassword.password ? "text" : "password"}
                 className="input input-lg w-full pr-14"
                 placeholder="Password"
@@ -211,5 +268,5 @@
                 type="button"
                 className="absolute top-0 right-0 h-full px-3 flex items-center z-10"
-                onClick={() => togglePasswordVisibility('password')}
+                onClick={() => togglePasswordVisibility("password")}
                 tabIndex="-1"
                 disabled={loading}
@@ -262,5 +319,5 @@
               <input
                 id="confirmPassword"
-                type={showPassword.confirmPassword ? 'text' : 'password'}
+                type={showPassword.confirmPassword ? "text" : "password"}
                 name="confirmPassword"
                 value={formData.confirmPassword}
@@ -273,5 +330,5 @@
                 type="button"
                 className="absolute top-0 right-0 h-full px-3 flex items-center z-10"
-                onClick={() => togglePasswordVisibility('confirmPassword')}
+                onClick={() => togglePasswordVisibility("confirmPassword")}
                 tabIndex="-1"
                 disabled={loading}
Index: client/src/services/apiClient.js
===================================================================
--- client/src/services/apiClient.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
+++ client/src/services/apiClient.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -0,0 +1,39 @@
+import axios from "axios";
+
+const apiClient = axios.create({
+  headers: {
+    "Content-Type": "application/json",
+  },
+});
+
+apiClient.interceptors.request.use(
+  (config) => {
+    const token = localStorage.getItem("jwt");
+    if (token) {
+      config.headers["Authorization"] = `Bearer ${token}`;
+    }
+    return config;
+  },
+  (error) => {
+    return Promise.reject(error);
+  }
+);
+
+apiClient.interceptors.response.use(
+  (response) => {
+    return response.data;
+  },
+  (error) => {
+    console.error(
+      `API call failed: ${error.message} for URL ${error.config?.url}`,
+      {
+        status: error.response?.status,
+        responseData: error.response?.data,
+        requestData: error.config?.data,
+      }
+    );
+    return Promise.reject(error);
+  }
+);
+
+export default apiClient;
Index: client/src/services/forumService.js
===================================================================
--- client/src/services/forumService.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
+++ client/src/services/forumService.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -0,0 +1,24 @@
+import apiClient from "./apiClient";
+
+export const getForumPosts = (page, limit) => {
+  return apiClient.get(`/forum/posts?page=${page}&limit=${limit}`);
+};
+
+export const deleteForumPost = (postId) => {
+  return apiClient.delete(`/forum/posts/${postId}`);
+};
+export const createForumPost = (postData) => {
+  return apiClient.post("/forum/posts", postData);
+};
+
+//Comment functions
+
+export const getCommentsForPost = (postId) => {
+  return apiClient.get(`/forum/comments?post_id=${postId}`);
+};
+export const createComment = (commentData) => {
+  return apiClient.post("/forum/comments", commentData);
+};
+export const deleteComment = (commentId) => {
+  return apiClient.delete(`/forum/comments/${commentId}`);
+};
Index: client/src/services/registerLoginService.js
===================================================================
--- client/src/services/registerLoginService.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
+++ client/src/services/registerLoginService.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -0,0 +1,21 @@
+import apiClient from "./apiClient";
+
+export const registerUser = async (userData) => {
+  try {
+    const response = await apiClient.post("api/register", userData);
+    return response;
+  } catch (error) {
+    console.error("Error during user registration:", error);
+    throw error;
+  }
+};
+
+export const loginUser = async (credentials) => {
+  try {
+    const response = await apiClient.post("api/login", credentials);
+    return response;
+  } catch (error) {
+    console.error("Error during user login:", error);
+    throw error;
+  }
+};
Index: client/src/services/reviewService.js
===================================================================
--- client/src/services/reviewService.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
+++ client/src/services/reviewService.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -0,0 +1,16 @@
+import apiClient from "./apiClient";
+
+export const getReviewPosts = async (page, limit, userId) => {
+  return await apiClient.get(
+    `/review/posts?page=${page}&limit=${limit}&userId=${userId}`
+  );
+};
+export const deleteReviewPost = async (postId, userId) => {
+  return await apiClient.delete(`/review/posts/${postId}?userId=${userId}`);
+};
+export const approveReviewPost = async (postId, postData, userId) => {
+  return await apiClient.post(
+    `/review/posts/${postId}?userId=${userId}`,
+    postData
+  );
+};
Index: client/src/services/taskService.js
===================================================================
--- client/src/services/taskService.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
+++ client/src/services/taskService.js	(revision e3021178a63ede5edcf38a17716c15f33e319eba)
@@ -0,0 +1,17 @@
+import apiClient from "./apiClient";
+
+export const getTaskForDate = async (date) => {
+  return await apiClient.get(`/task/${date}`);
+};
+
+export const getTestCaseForTask = async (taskId) => {
+  return await apiClient.get(`/task/${taskId}/test-case`);
+};
+
+export const evaluate = async (taskId, userOutput, testCaseId, userId) => {
+  return await apiClient.post(`/task/${taskId}/evaluate`, {
+    userOutput,
+    testCaseId,
+    userId,
+  });
+};
