论坛(回复功能),聊天室。后端完善
s
Change-Id: I60b1973a66d31e9284a33838b02ba0aea5f1d6e9
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 58da333..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,26 +0,0 @@
-# Build stage
-#FROM registry.cn-hangzhou.aliyuncs.com/library/maven:3.8.4-openjdk-17 as build
-#WORKDIR /app
-
-FROM maven:3.8.4-openjdk-17 as build
-WORKDIR /app
-
-# Create .m2 directory and copy settings.xml
-#RUN mkdir -p /root/.m2
-#COPY settings.xml /root/.m2/settings.xml
-
-# Cache dependencies
-COPY pom.xml .
-RUN mvn dependency:go-offline -B
-
-# Build application
-COPY src ./src
-RUN mvn clean package -DskipTests
-
-# Production stage
-#FROM registry.cn-hangzhou.aliyuncs.com/library/openjdk:17-slim
-FROM openjdk:17-slim
-WORKDIR /app
-COPY --from=build /app/target/*.jar app.jar
-EXPOSE 8080
-ENTRYPOINT ["java", "-jar", "app.jar"]
\ No newline at end of file
diff --git a/Postman_Collection.JSON b/Postman_Collection.JSON
deleted file mode 100644
index f1ae478..0000000
--- a/Postman_Collection.JSON
+++ /dev/null
@@ -1,453 +0,0 @@
-{
- "info": {
- "name": "PT站分享率功能完整测试",
- "description": "测试PT站的分享率计算、下载权限检查和VIP自动升级功能",
- "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
- },
- "variable": [
- {
- "key": "base_url",
- "value": "http://localhost:8081/api",
- "type": "string"
- },
- {
- "key": "token",
- "value": "",
- "type": "string"
- }
- ],
- "item": [
- {
- "name": "测试场景1: 分享率过低用户",
- "item": [
- {
- "name": "1.1 登录低分享率用户",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "pm.test('登录成功', function () {",
- " pm.expect(pm.response.code).to.equal(200);",
- "});",
- "",
- "if (pm.response.code === 200) {",
- " const response = pm.response.json();",
- " if (response.tokenInfo && response.tokenInfo.tokenValue) {",
- " pm.collectionVariables.set('token', response.tokenInfo.tokenValue);",
- " console.log('Token saved:', response.tokenInfo.tokenValue);",
- " }",
- "}"
- ]
- }
- }
- ],
- "request": {
- "method": "POST",
- "header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- }
- ],
- "body": {
- "mode": "raw",
- "raw": "{\n \"user\": \"你的测试用户名1\",\n \"password\": \"你的密码\"\n}"
- },
- "url": {
- "raw": "{{base_url}}/auth/login",
- "host": ["{{base_url}}"],
- "path": ["auth", "login"]
- }
- }
- },
- {
- "name": "1.2 查看分享率信息",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "pm.test('获取分享率信息成功', function () {",
- " pm.expect(pm.response.code).to.equal(200);",
- "});",
- "",
- "const response = pm.response.json();",
- "console.log('分享率信息:', JSON.stringify(response, null, 2));",
- "",
- "pm.test('分享率过低', function () {",
- " pm.expect(response.shareRatio).to.be.below(0.3);",
- "});",
- "",
- "pm.test('不能下载', function () {",
- " pm.expect(response.canDownload).to.be.false;",
- "});",
- "",
- "pm.test('不是VIP用户', function () {",
- " pm.expect(response.isVip).to.be.false;",
- "});"
- ]
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "sapling-token",
- "value": "{{token}}"
- }
- ],
- "url": {
- "raw": "{{base_url}}/torrent/ratio/info",
- "host": ["{{base_url}}"],
- "path": ["torrent", "ratio", "info"]
- }
- }
- },
- {
- "name": "1.3 尝试下载种子(应该被拒绝)",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "pm.test('下载被拒绝', function () {",
- " pm.expect(pm.response.code).to.equal(403);",
- "});",
- "",
- "const response = pm.response.json();",
- "console.log('下载拒绝信息:', JSON.stringify(response, null, 2));",
- "",
- "pm.test('返回正确的错误信息', function () {",
- " pm.expect(response.error).to.equal('下载权限不足');",
- " pm.expect(response.currentRatio).to.be.below(0.3);",
- " pm.expect(response.requiredRatio).to.equal(0.3);",
- "});"
- ]
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "sapling-token",
- "value": "{{token}}"
- }
- ],
- "url": {
- "raw": "{{base_url}}/torrent/download/1",
- "host": ["{{base_url}}"],
- "path": ["torrent", "download", "1"]
- }
- }
- }
- ]
- },
- {
- "name": "测试场景2: 正常分享率用户",
- "item": [
- {
- "name": "2.1 登录正常用户",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "pm.test('登录成功', function () {",
- " pm.expect(pm.response.code).to.equal(200);",
- "});",
- "",
- "if (pm.response.code === 200) {",
- " const response = pm.response.json();",
- " if (response.tokenInfo && response.tokenInfo.tokenValue) {",
- " pm.collectionVariables.set('token', response.tokenInfo.tokenValue);",
- " }",
- "}"
- ]
- }
- }
- ],
- "request": {
- "method": "POST",
- "header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- }
- ],
- "body": {
- "mode": "raw",
- "raw": "{\n \"user\": \"你的测试用户名2\",\n \"password\": \"你的密码\"\n}"
- },
- "url": {
- "raw": "{{base_url}}/auth/login",
- "host": ["{{base_url}}"],
- "path": ["auth", "login"]
- }
- }
- },
- {
- "name": "2.2 查看分享率信息",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "const response = pm.response.json();",
- "console.log('正常用户分享率信息:', JSON.stringify(response, null, 2));",
- "",
- "pm.test('分享率正常', function () {",
- " pm.expect(response.shareRatio).to.be.at.least(0.3);",
- " pm.expect(response.shareRatio).to.be.below(2.0);",
- "});",
- "",
- "pm.test('可以下载', function () {",
- " pm.expect(response.canDownload).to.be.true;",
- "});",
- "",
- "pm.test('还不是VIP用户', function () {",
- " pm.expect(response.isVip).to.be.false;",
- "});"
- ]
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "sapling-token",
- "value": "{{token}}"
- }
- ],
- "url": {
- "raw": "{{base_url}}/torrent/ratio/info",
- "host": ["{{base_url}}"],
- "path": ["torrent", "ratio", "info"]
- }
- }
- },
- {
- "name": "2.3 下载种子(应该成功)",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "pm.test('下载成功或种子不存在', function () {",
- " // 如果种子存在,应该返回200和二进制数据",
- " // 如果种子不存在,返回404",
- " pm.expect([200, 404]).to.include(pm.response.code);",
- "});",
- "",
- "if (pm.response.code === 200) {",
- " pm.test('返回种子文件', function () {",
- " pm.expect(pm.response.headers.get('Content-Type')).to.equal('application/octet-stream');",
- " });",
- " console.log('种子下载成功');",
- "} else if (pm.response.code === 404) {",
- " console.log('种子不存在,但下载权限检查通过');",
- "}"
- ]
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "sapling-token",
- "value": "{{token}}"
- }
- ],
- "url": {
- "raw": "{{base_url}}/torrent/download/1",
- "host": ["{{base_url}}"],
- "path": ["torrent", "download", "1"]
- }
- }
- }
- ]
- },
- {
- "name": "测试场景3: 高分享率用户自动升级VIP",
- "item": [
- {
- "name": "3.1 登录高分享率用户",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "pm.test('登录成功', function () {",
- " pm.expect(pm.response.code).to.equal(200);",
- "});",
- "",
- "if (pm.response.code === 200) {",
- " const response = pm.response.json();",
- " if (response.tokenInfo && response.tokenInfo.tokenValue) {",
- " pm.collectionVariables.set('token', response.tokenInfo.tokenValue);",
- " }",
- "}"
- ]
- }
- }
- ],
- "request": {
- "method": "POST",
- "header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- }
- ],
- "body": {
- "mode": "raw",
- "raw": "{\n \"user\": \"你的测试用户名3\",\n \"password\": \"你的密码\"\n}"
- },
- "url": {
- "raw": "{{base_url}}/auth/login",
- "host": ["{{base_url}}"],
- "path": ["auth", "login"]
- }
- }
- },
- {
- "name": "3.2 查看升级前分享率信息",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "const response = pm.response.json();",
- "console.log('升级前分享率信息:', JSON.stringify(response, null, 2));",
- "",
- "pm.test('分享率很高', function () {",
- " pm.expect(response.shareRatio).to.be.at.least(2.0);",
- "});",
- "",
- "// 记录升级前状态",
- "pm.collectionVariables.set('beforeUpgradeIsVip', response.isVip);"
- ]
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "sapling-token",
- "value": "{{token}}"
- }
- ],
- "url": {
- "raw": "{{base_url}}/torrent/ratio/info",
- "host": ["{{base_url}}"],
- "path": ["torrent", "ratio", "info"]
- }
- }
- },
- {
- "name": "3.3 触发VIP检查(下载种子)",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "// 这个请求主要是触发ShareRatioService.checkAndUpdateVipStatus",
- "console.log('触发VIP状态检查,响应码:', pm.response.code);"
- ]
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "sapling-token",
- "value": "{{token}}"
- }
- ],
- "url": {
- "raw": "{{base_url}}/torrent/download/1",
- "host": ["{{base_url}}"],
- "path": ["torrent", "download", "1"]
- }
- }
- },
- {
- "name": "3.4 验证VIP升级结果",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "const response = pm.response.json();",
- "console.log('升级后分享率信息:', JSON.stringify(response, null, 2));",
- "",
- "pm.test('已升级为VIP', function () {",
- " pm.expect(response.isVip).to.be.true;",
- "});",
- "",
- "pm.test('VIP用户可以下载', function () {",
- " pm.expect(response.canDownload).to.be.true;",
- "});",
- "",
- "pm.test('用户组显示为VIP', function () {",
- " pm.expect(response.groupName).to.include('VIP');",
- "});"
- ]
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "sapling-token",
- "value": "{{token}}"
- }
- ],
- "url": {
- "raw": "{{base_url}}/torrent/ratio/info",
- "host": ["{{base_url}}"],
- "path": ["torrent", "ratio", "info"]
- }
- }
- }
- ]
- },
- {
- "name": "测试场景4: 数据库验证",
- "item": [
- {
- "name": "4.1 验证数据库中的group_id变化",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "// 这是一个提示性的测试项",
- "// 实际验证需要在数据库中执行SQL查询",
- "console.log('请在数据库中执行以下SQL来验证group_id变化:');",
- "console.log('SELECT id, username, uploaded, downloaded, group_id, ROUND(uploaded/downloaded, 3) as share_ratio FROM users WHERE id IN (1,2,3,4);');"
- ]
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [],
- "url": {
- "raw": "{{base_url}}/auth/status",
- "host": ["{{base_url}}"],
- "path": ["auth", "status"]
- }
- }
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/public/torrents/1ac0431647b6391733d2ad470e307d57d41b6dd2.torrent b/public/torrents/1ac0431647b6391733d2ad470e307d57d41b6dd2.torrent
deleted file mode 100644
index 6fcda4d..0000000
--- a/public/torrents/1ac0431647b6391733d2ad470e307d57d41b6dd2.torrent
+++ /dev/null
Binary files differ
diff --git a/public/torrents/62b376114e5fd75d86696e4f72a9d87e923d08fa.torrent b/public/torrents/62b376114e5fd75d86696e4f72a9d87e923d08fa.torrent
deleted file mode 100644
index 1b3fe60..0000000
--- a/public/torrents/62b376114e5fd75d86696e4f72a9d87e923d08fa.torrent
+++ /dev/null
Binary files differ
diff --git a/public/torrents/86abb21e4d87f2ed8a4735d059555b31209fb588.torrent b/public/torrents/86abb21e4d87f2ed8a4735d059555b31209fb588.torrent
deleted file mode 100644
index bea48e6..0000000
--- a/public/torrents/86abb21e4d87f2ed8a4735d059555b31209fb588.torrent
+++ /dev/null
Binary files differ
diff --git a/public/torrents/ebd068cd030eca8a041f5099bfda374b3a607ca2.torrent b/public/torrents/ebd068cd030eca8a041f5099bfda374b3a607ca2.torrent
deleted file mode 100644
index 98fd81d..0000000
--- a/public/torrents/ebd068cd030eca8a041f5099bfda374b3a607ca2.torrent
+++ /dev/null
Binary files differ
diff --git a/public/torrents/f4ca53495ac5c7222806c4b0264dda2e42e137d5.torrent b/public/torrents/f4ca53495ac5c7222806c4b0264dda2e42e137d5.torrent
deleted file mode 100644
index 64eac95..0000000
--- a/public/torrents/f4ca53495ac5c7222806c4b0264dda2e42e137d5.torrent
+++ /dev/null
@@ -1 +0,0 @@
-d8:announce32:http://172.21.8.94:6969/announce10:created by18:qBittorrent v5.1.013:creation datei1748927545e4:infod6:lengthi102880e4:name31:Weixin Image_20240419002938.jpg12:piece lengthi16384e6:pieces140:þnÃI o
?Ð3ëØDwÌkÅç¼È¦è<ªKÑ 51Çþ¬,hÞ·Ù(_\!À&ªXóæ2-c㧬K[!ÿy6¬©W3®).z9åÔ¨Tü% pêQa:J}9Ð0½Á\N(5
½ZR7K¹°©ÆÆÉÖwÖ7:privatei1ee15:publish-website20:Another Sapling Site9:publisher5:admin13:publisher-url31:http://172.23.192.1:8081/user/2e
\ No newline at end of file
diff --git a/settings.xml b/settings.xml
deleted file mode 100644
index 6dab700..0000000
--- a/settings.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
- <mirrors>
- <mirror>
- <id>aliyunmaven</id>
- <mirrorOf>*</mirrorOf>
- <name>阿里云公共仓库</name>
- <url>https://maven.aliyun.com/repository/public</url>
- </mirror>
- </mirrors>
-</settings>
\ No newline at end of file
diff --git a/src/main/java/com/github/example/pt/autoconfig/SaTokenConfig.java b/src/main/java/com/github/example/pt/autoconfig/SaTokenConfig.java
index 7259e1e..81968f7 100644
--- a/src/main/java/com/github/example/pt/autoconfig/SaTokenConfig.java
+++ b/src/main/java/com/github/example/pt/autoconfig/SaTokenConfig.java
@@ -2,8 +2,10 @@
import cn.dev33.satoken.interceptor.SaInterceptor;
import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
@Override
@@ -14,4 +16,15 @@
.excludePathPatterns("/auth/**")
.excludePathPatterns("/torrent/download/**");
}
+
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**")
+ .allowedOrigins("http://localhost:8080", "http://127.0.0.1:8080")
+ .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
+ .allowedHeaders("*")
+ .allowCredentials(true)
+ .exposedHeaders("sapling-token")
+ .maxAge(3600);
+ }
}
diff --git a/src/main/java/com/github/example/pt/config/SaTokenHandshakeInterceptor.java b/src/main/java/com/github/example/pt/config/SaTokenHandshakeInterceptor.java
index 5826c6d..69b8afd 100644
--- a/src/main/java/com/github/example/pt/config/SaTokenHandshakeInterceptor.java
+++ b/src/main/java/com/github/example/pt/config/SaTokenHandshakeInterceptor.java
@@ -1,6 +1,7 @@
package com.github.example.pt.config;
+import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
@@ -20,7 +21,28 @@
if (request instanceof ServletServerHttpRequest servletRequest) {
HttpServletRequest httpServletRequest = servletRequest.getServletRequest();
+
+ // 优先从请求头获取token
String token = httpServletRequest.getHeader("sapling-token");
+
+ // 如果请求头没有token,尝试从Cookie获取
+ if (token == null || token.trim().isEmpty()) {
+ Cookie[] cookies = httpServletRequest.getCookies();
+ if (cookies != null) {
+ for (Cookie cookie : cookies) {
+ if ("sapling-token".equals(cookie.getName())) {
+ token = cookie.getValue();
+ break;
+ }
+ }
+ }
+ }
+
+ // 如果Cookie也没有token,尝试从URL参数获取
+ if (token == null || token.trim().isEmpty()) {
+ token = httpServletRequest.getParameter("token");
+ }
+
attributes.put("sapling-token", token); // ✅ 存入 sessionAttributes
}
diff --git a/src/main/java/com/github/example/pt/controller/ForumController.java b/src/main/java/com/github/example/pt/controller/ForumController.java
index 3793e4d..1dd485f 100644
--- a/src/main/java/com/github/example/pt/controller/ForumController.java
+++ b/src/main/java/com/github/example/pt/controller/ForumController.java
@@ -1,10 +1,14 @@
package com.github.example.pt.controller;
+import cn.dev33.satoken.stp.StpUtil;
import com.github.example.pt.entity.Forum;
import com.github.example.pt.entity.Topic;
+import com.github.example.pt.entity.User;
import com.github.example.pt.service.ForumService;
+import com.github.example.pt.service.UserService;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@@ -17,6 +21,9 @@
@Autowired
private ForumService forumService;
+ @Autowired
+ private UserService userService;
+
@GetMapping
public List<Forum> getAllForums() {
return forumService.getAllForums();
@@ -45,9 +52,24 @@
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteForum(@PathVariable Long id ) {
+ User user = userService.getUser(StpUtil.getLoginIdAsLong());;
- forumService.deleteForum(id);
- return ResponseEntity.noContent().build();
+
+
+ Forum forum = forumService.getForumById(id).orElseThrow(() -> new RuntimeException("forums not found"));
+ Long forumuserid = forum.getUser().getId();
+ if(user != null ){
+ Long userid = user.getId();
+
+ if (userid.equals(forumuserid)){
+ forumService.deleteForum(id);
+ return ResponseEntity.noContent().build();
+ }
+
+
+ }
+ return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
+
}
diff --git a/src/main/java/com/github/example/pt/controller/PostController.java b/src/main/java/com/github/example/pt/controller/PostController.java
index 898a369..fad36ef 100644
--- a/src/main/java/com/github/example/pt/controller/PostController.java
+++ b/src/main/java/com/github/example/pt/controller/PostController.java
@@ -13,6 +13,7 @@
import org.springframework.web.bind.annotation.*;
import java.util.List;
+import java.util.Map;
@RestController
@RequestMapping("/api/posts")
@@ -27,8 +28,17 @@
@Autowired
private UserService UserService;
+ @GetMapping("/test")
+ public String test() {
+ return "Hello from PostController";
+ }
+
+
@GetMapping("/topic/{topicId}")
public ResponseEntity<List<Post>> getPostsByTopic(@PathVariable Long topicId) {
+
+ System.out.println("topicId: " + topicId + ", exists: " + topicService.getTopicById(topicId).isPresent());
+
return topicService.getTopicById(topicId)
.map(topic -> ResponseEntity.ok(postService.getPostsByTopic(topic)))
.orElse(ResponseEntity.notFound().build());
@@ -47,8 +57,41 @@
}
@PostMapping
- public Post createPost(@RequestBody Post post) {
- return postService.createPost(post);
+
+ public ResponseEntity<Post> createPost(@RequestBody Map<String, Object> request) {
+ try {
+ Long topicId = Long.valueOf(request.get("topicId").toString());
+ String content = request.get("content").toString();
+ Long parentId = request.get("parentId") != null ?
+ Long.valueOf(request.get("parentId").toString()) : null;
+
+ // 获取当前登录用户
+ Long userId = StpUtil.getLoginIdAsLong();
+ User user = UserService.getUser(userId);
+
+ // 获取主题
+ Topic topic = topicService.getTopicById(topicId)
+ .orElseThrow(() -> new RuntimeException("Topic not found"));
+
+ // 创建Post对象
+ Post post = new Post();
+ post.setContent(content);
+ post.setTopic(topic);
+ post.setUser(user);
+
+ // 设置父帖子(如果是回复)
+ if (parentId != null) {
+ Post parentPost = postService.getPostById(parentId)
+ .orElseThrow(() -> new RuntimeException("Parent post not found"));
+ post.setParent(parentPost);
+ }
+
+ Post createdPost = postService.createPost(post);
+ return ResponseEntity.ok(createdPost);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
+ }
}
@PutMapping("/{id}")
diff --git a/src/main/java/com/github/example/pt/controller/TopicController.java b/src/main/java/com/github/example/pt/controller/TopicController.java
index 3b0d5f0..24d1d7a 100644
--- a/src/main/java/com/github/example/pt/controller/TopicController.java
+++ b/src/main/java/com/github/example/pt/controller/TopicController.java
@@ -1,9 +1,12 @@
package com.github.example.pt.controller;
import cn.dev33.satoken.stp.StpUtil;
+import com.github.example.pt.entity.Forum;
+import com.github.example.pt.entity.Post;
import com.github.example.pt.entity.Topic;
import com.github.example.pt.entity.User;
import com.github.example.pt.service.ForumService;
+import com.github.example.pt.service.PostService;
import com.github.example.pt.service.TopicService;
import com.github.example.pt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -12,6 +15,8 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
+import java.util.Map;
+
import java.util.List;
@RestController
@@ -25,6 +30,9 @@
private ForumService forumService;
@Autowired
+ private PostService postService;
+
+ @Autowired
private UserService UserService;
@GetMapping
@@ -47,8 +55,49 @@
}
@PostMapping
- public Topic createTopic(@RequestBody Topic topic) {
- return topicService.createTopic(topic);
+ public ResponseEntity<Topic> createTopic(@RequestBody Map<String, Object> request) {
+ try {
+ // 获取当前登录用户
+ Long userId = StpUtil.getLoginIdAsLong();
+ User user = UserService.getUser(userId);
+
+ // 获取请求参数
+ String title = request.get("title").toString();
+ String content = request.get("content").toString();
+ Long forumId = Long.valueOf(request.get("forumId").toString());
+ Boolean isPinned = (Boolean) request.getOrDefault("isPinned", false);
+ Boolean isLocked = (Boolean) request.getOrDefault("isLocked", false);
+
+ // 获取论坛
+ Forum forum = forumService.getForumById(forumId)
+ .orElseThrow(() -> new RuntimeException("Forum not found"));
+
+ // 创建Topic
+ Topic topic = Topic.builder()
+ .title(title)
+ .forum(forum)
+ .user(user)
+ .isPinned(isPinned)
+ .isLocked(isLocked)
+ .build();
+
+ Topic createdTopic = topicService.createTopic(topic);
+
+ // 创建主帖内容(第一个Post)
+ Post mainPost = Post.builder()
+ .content(content)
+ .topic(createdTopic)
+ .user(user)
+ .parent(null)
+ .build();
+
+ postService.createPost(mainPost);
+
+ return ResponseEntity.ok(createdTopic);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
+ }
}
@PutMapping("/{id}")
diff --git a/src/main/java/com/github/example/pt/controller/auth/AuthController.java b/src/main/java/com/github/example/pt/controller/auth/AuthController.java
index 582dc0b..1a7c2ee 100644
--- a/src/main/java/com/github/example/pt/controller/auth/AuthController.java
+++ b/src/main/java/com/github/example/pt/controller/auth/AuthController.java
@@ -154,78 +154,6 @@
return getUserBasicInformation(user);
}
- /**
- * 带邀请码注册接口
- */
- @PostMapping("/registerWithInvite")
- @Transactional
- public UserSessionResponseDTO registerWithInvite(@RequestBody RegisterRequestDTO register) {
-
- if (StringUtils.isEmpty(register.getEmail())) {
- throw new APIGenericException(MISSING_PARAMETERS, "Email parameter is required");
- }
- if (StringUtils.isEmpty(register.getUsername())) {
- throw new APIGenericException(MISSING_PARAMETERS, "Username parameter is required");
- }
- if (StringUtils.isEmpty(register.getPassword())) {
- throw new APIGenericException(MISSING_PARAMETERS, "Password parameter is required");
- }
- if (StringUtils.isEmpty(register.getInviteCode())) {
- throw new APIGenericException(MISSING_PARAMETERS, "Invite code is required");
- }
- String inviteCode = register.getInviteCode();
- // 检查邀请码是否存在于某个用户的invite_slot字段
- boolean valid = false;
- User inviteUser = null;
- for (User u : (Iterable<User>)userService.getAllUsers()) {
- if (String.valueOf(u.getInviteSlot()).equals(inviteCode)) {
- valid = true;
- inviteUser = u;
- break;
- }
- }
- if (!valid) {
- throw new APIGenericException(AUTHENTICATION_FAILED, "邀请码无效");
- }
- // 使用掉邀请码后,inviteUser的invite_slot置为0,seeding_time减去86400000
- if (inviteUser != null) {
- inviteUser.setInviteSlot(0);
- long newSeedingTime = inviteUser.getSeedingTime() - 86400000L;
- inviteUser.setSeedingTime(Math.max(newSeedingTime, 0));
- userService.save(inviteUser);
- }
- User user = userService.getUserByUsername(register.getUsername());
- if (user != null) {
- throw new APIGenericException(APIErrorCode.USERNAME_ALREADY_IN_USAGE);
- }
- user = userService.getUserByEmail(register.getEmail());
- if (user != null) {
- throw new APIGenericException(APIErrorCode.EMAIL_ALREADY_IN_USAGE);
- }
- user = userService.save(new User(
- 0,
- register.getEmail(),
- PasswordHash.hash(register.getPassword()),
- register.getUsername(),
- userGroupService.getUserGroup(1),
- UUID.randomUUID().toString(),
- Timestamp.from(Instant.now()),
- "uploads/facivon.ico",
- "测试用户",
- "这个用户很懒,还没有个性签名",
- "zh-CN",
- "100mbps",
- "100mbps",
- 0L, 0L, 0L, 0L,
- "未知",
- BigDecimal.ZERO,
- 0,
- 0L,
- UUID.randomUUID().toString(), PrivacyLevel.LOW));
- StpUtil.login(user.getId());
- return getUserBasicInformation(user);
- }
-
@NotNull
private UserSessionResponseDTO getUserBasicInformation(User user) {
SaTokenInfo tokenInfo = null;
diff --git a/src/main/java/com/github/example/pt/controller/auth/dto/request/RegisterRequestDTO.java b/src/main/java/com/github/example/pt/controller/auth/dto/request/RegisterRequestDTO.java
index 8c61a10..3e6ad68 100644
--- a/src/main/java/com/github/example/pt/controller/auth/dto/request/RegisterRequestDTO.java
+++ b/src/main/java/com/github/example/pt/controller/auth/dto/request/RegisterRequestDTO.java
@@ -19,5 +19,4 @@
@NotEmpty
@Email
private String email;
- private String inviteCode;
}
diff --git a/src/main/java/com/github/example/pt/entity/Forum.java b/src/main/java/com/github/example/pt/entity/Forum.java
index 174c3f0..2074ba3 100644
--- a/src/main/java/com/github/example/pt/entity/Forum.java
+++ b/src/main/java/com/github/example/pt/entity/Forum.java
@@ -36,6 +36,10 @@
@Column(name = "sort_order")
private Integer sortOrder;
+ @ManyToOne(optional = false)
+ @JoinColumn(name = "user_id")
+ private User user;
+
@Column(name = "is_locked")
private Boolean isLocked = false;
}
\ No newline at end of file
diff --git a/src/main/java/com/github/example/pt/entity/ForumTag.java b/src/main/java/com/github/example/pt/entity/ForumTag.java
index 5833906..64296ae 100644
--- a/src/main/java/com/github/example/pt/entity/ForumTag.java
+++ b/src/main/java/com/github/example/pt/entity/ForumTag.java
@@ -1,4 +1,5 @@
package com.github.example.pt.entity;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.*;
@@ -23,5 +24,6 @@
private String color;
@ManyToMany(mappedBy = "tags")
+ @JsonIgnore
private Set<Topic> topics;
}
\ No newline at end of file
diff --git a/src/main/java/com/github/example/pt/entity/Post.java b/src/main/java/com/github/example/pt/entity/Post.java
index 8fcfb3c..5687b52 100644
--- a/src/main/java/com/github/example/pt/entity/Post.java
+++ b/src/main/java/com/github/example/pt/entity/Post.java
@@ -1,4 +1,6 @@
package com.github.example.pt.entity;
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*;
import lombok.*;
@@ -40,9 +42,11 @@
@ManyToOne
@JoinColumn(name = "parent_id")
+ @JsonBackReference
private Post parent;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
@OrderBy("createdAt ASC")
+ @JsonManagedReference
private List<Post> replies = new ArrayList<>();
}
diff --git a/src/main/java/com/github/example/pt/service/UserService.java b/src/main/java/com/github/example/pt/service/UserService.java
index de6dd0a..830c717 100644
--- a/src/main/java/com/github/example/pt/service/UserService.java
+++ b/src/main/java/com/github/example/pt/service/UserService.java
@@ -5,10 +5,8 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
-import java.util.List;
import java.util.Optional;
@Service
@@ -56,49 +54,4 @@
public Long getUserCount() {
return repository.count();
}
-
- /**
- * 如果用户seeding_time大于86400000,生成8位数字邀请码并写入invite_slot字段
- * @param userId 用户ID
- * @return 邀请码(8位数字),否则返回null
- */
- public Integer generateInviteCodeIfEligible(long userId) {
- User user = getUser(userId);
- if (user != null && user.getSeedingTime() > 86400000L) {
- int code = (int)(Math.random() * 90000000) + 10000000; // 8位数字
- user.setInviteSlot(code);
- save(user);
- return code;
- }
- return null;
- }
-
- /**
- * 每2小时检查所有用户,满足条件则生成邀请码
- */
- @Scheduled(fixedRate = 2 * 60 * 60 * 1000) // 每2小时
- public void checkAndGenerateInviteCodesForAllUsers() {
- List<User> users = (List<User>) repository.findAll();
- for (User user : users) {
- if (user.getSeedingTime() > 86400000L) {
- int inviteSlot = user.getInviteSlot();
- String inviteStr = String.valueOf(inviteSlot);
- if (inviteSlot == 0) {
- int code = (int)(Math.random() * 90000000) + 10000000;
- user.setInviteSlot(code);
- save(user);
- } else if (inviteStr.length() == 8) {
- // 已有8位邀请码,跳过
- continue;
- }
- }
- }
- }
-
- /**
- * 获取所有用户
- */
- public Iterable<User> getAllUsers() {
- return repository.findAll();
- }
}
diff --git a/src/main/resources/application-db.yml b/src/main/resources/application-db.yml
index 62f90f9..faf9438 100644
--- a/src/main/resources/application-db.yml
+++ b/src/main/resources/application-db.yml
@@ -10,4 +10,4 @@
database-platform: org.hibernate.dialect.MySQL8Dialect
show-sql: true
properties:
- hibernate.format_sql: true
\ No newline at end of file
+ hibernate.format_sql: true
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 21f409b..334ef90 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -33,6 +33,7 @@
overwrite-existing-jobs: true
jdbc:
initialize-schema: always
+ platform: mysql
properties:
org:
quartz:
@@ -46,11 +47,21 @@
useProperties: false
clusterCheckinInterval: 10000
isClustered: true
+ dataSource: myDS
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
+ dataSource:
+ myDS:
+ provider: hikaricp
+ driver: ${spring.datasource.driver-class-name}
+ URL: ${spring.datasource.url}
+ user: ${spring.datasource.username}
+ password: ${spring.datasource.password}
+ maxConnections: 5
+ validationQuery: select 1
servlet:
multipart:
enabled: true
diff --git a/src/main/resources/ppt.sql b/src/main/resources/ppt.sql
index ad94e82..28ab119 100644
--- a/src/main/resources/ppt.sql
+++ b/src/main/resources/ppt.sql
@@ -724,7 +724,7 @@
-- ----------------------------
-- Records of users
-- ----------------------------
-INSERT INTO `users` VALUES (1, 'testuser@example.com', '$2a$06$JqvHpC94mnN23uwmZX0XHeuyFj3M22Ikw8VBZRopfrlWbPfA4KREu', 'testuser', 1, '47050e8f-f3fd-4a9c-a828-0e0de456691f', '2025-06-03 11:34:08', 'https://www.baidu.com/facivon.ico', '测试用户', '这个用户很懒,还没有个性签名', 'zh-CN', '100mbps', '100mbps', 0, 27723388, 27723388, 0, '未知', 0.00, 0, 30790068, '948c9146-ff5f-4ad6-8ba5-d32e1209cafd', '0');
+INSERT INTO `users` VALUES (1, 'testuser@example.com', '$2a$06$JqvHpC94mnN23uwmZX0XHeuyFj3M22Ikw8VBZRopfrlWbPfA4KREu', 'testuser', 1, '47050e8f-f3fd-4a9c-a828-0e0de456691f', '2025-06-03 11:34:08', '/default-avatar.png', '测试用户', '这个用户很懒,还没有个性签名', 'zh-CN', '100mbps', '100mbps', 0, 27723388, 27723388, 0, '未知', 0.00, 0, 30790068, '948c9146-ff5f-4ad6-8ba5-d32e1209cafd', '0');
SET FOREIGN_KEY_CHECKS = 1;
diff --git a/src/main/resources/test_basic_data.sql b/src/main/resources/test_basic_data.sql
new file mode 100644
index 0000000..cb3c279
--- /dev/null
+++ b/src/main/resources/test_basic_data.sql
@@ -0,0 +1,17 @@
+-- 插入测试用户(如果users表为空的话)
+INSERT IGNORE INTO users (id, username, email, password, created_at, updated_at) VALUES
+(1, 'testuser1', 'test1@example.com', '$2a$10$test.hash.password1', NOW(), NOW()),
+(2, 'testuser2', 'test2@example.com', '$2a$10$test.hash.password2', NOW(), NOW()),
+(3, 'testuser3', 'test3@example.com', '$2a$10$test.hash.password3', NOW(), NOW());
+
+-- 插入测试论坛版块(如果forums表为空的话)
+INSERT IGNORE INTO forums (id, slug, name, description, sort_order, is_locked) VALUES
+(1, 'general', '综合讨论区', '这里是综合讨论的地方,大家可以畅所欲言', 1, FALSE),
+(2, 'technical', '技术交流', '技术相关的讨论和分享', 2, FALSE),
+(3, 'announcements', '公告区', '站点公告和重要通知', 0, FALSE);
+
+-- 插入测试话题(如果topics表为空的话)
+INSERT IGNORE INTO topics (id, forum_id, user_id, title, is_pinned, is_locked, created_at, updated_at) VALUES
+(1, 1, 1, '欢迎来到综合讨论区', FALSE, FALSE, NOW(), NOW()),
+(2, 1, 2, '大家都在做什么项目?', FALSE, FALSE, NOW(), NOW()),
+(3, 2, 3, 'Spring Boot最佳实践分享', FALSE, FALSE, NOW(), NOW());
\ No newline at end of file
diff --git a/src/main/resources/test_posts_data.sql b/src/main/resources/test_posts_data.sql
new file mode 100644
index 0000000..4d331f1
--- /dev/null
+++ b/src/main/resources/test_posts_data.sql
@@ -0,0 +1,28 @@
+-- 测试数据:帖子和回复
+-- 假设已有用户ID 1, 2, 3 和话题ID 1
+
+-- 插入主帖(parent_id为NULL)
+INSERT INTO posts (topic_id, user_id, content, created_at, updated_at, is_deleted, parent_id) VALUES
+(1, 1, '这是话题1的第一个回复内容。大家觉得这个话题怎么样?', NOW(), NOW(), FALSE, NULL),
+(1, 2, '我觉得这个话题很有意思,值得深入讨论!', NOW(), NOW(), FALSE, NULL);
+
+-- 插入二级回复(回复第一个帖子,post_id=1)
+INSERT INTO posts (topic_id, user_id, content, created_at, updated_at, is_deleted, parent_id) VALUES
+(1, 3, '同意楼上的观点,这确实是个值得讨论的话题。', NOW(), NOW(), FALSE, 1),
+(1, 1, '谢谢大家的支持!我们继续深入讨论吧。', NOW(), NOW(), FALSE, 1);
+
+-- 插入三级回复(回复第一个二级回复,post_id=3)
+INSERT INTO posts (topic_id, user_id, content, created_at, updated_at, is_deleted, parent_id) VALUES
+(1, 2, '我有一些不同的看法,让我来分享一下...', NOW(), NOW(), FALSE, 3);
+
+-- 插入更多回复到第二个主帖(post_id=2)
+INSERT INTO posts (topic_id, user_id, content, created_at, updated_at, is_deleted, parent_id) VALUES
+(1, 3, '我也同意这个观点,补充一点...', NOW(), NOW(), FALSE, 2),
+(1, 1, '大家都说得很有道理!', NOW(), NOW(), FALSE, 2);
+
+-- 如果需要为其他话题添加数据,可以修改topic_id
+-- 为话题2添加一些测试数据
+INSERT INTO posts (topic_id, user_id, content, created_at, updated_at, is_deleted, parent_id) VALUES
+(2, 1, '这是话题2的第一个回复。', NOW(), NOW(), FALSE, NULL),
+(2, 2, '话题2看起来也很有趣!', NOW(), NOW(), FALSE, NULL),
+(2, 3, '我对话题2有些疑问...', NOW(), NOW(), FALSE, 1); -- 回复话题2的第一个帖子
\ No newline at end of file
diff --git a/src/test/java/com/github/example/pt/ptApplicationTests.java b/src/test/java/com/github/example/pt/ptApplicationTests.java
index f5da35b..3122f61 100644
--- a/src/test/java/com/github/example/pt/ptApplicationTests.java
+++ b/src/test/java/com/github/example/pt/ptApplicationTests.java
@@ -1,9 +1,12 @@
package com.github.example.pt;
+
import org.junit.jupiter.api.Test;
+
class ptApplicationTests {
+
@Test
void contextLoads() {
// Basic check to ensure test framework runs
System.out.println("Basic test passed.");
}
-}
\ No newline at end of file
+}
diff --git a/target/classes/application-db.yml b/target/classes/application-db.yml
index 62f90f9..faf9438 100644
--- a/target/classes/application-db.yml
+++ b/target/classes/application-db.yml
@@ -10,4 +10,4 @@
database-platform: org.hibernate.dialect.MySQL8Dialect
show-sql: true
properties:
- hibernate.format_sql: true
\ No newline at end of file
+ hibernate.format_sql: true
diff --git a/target/classes/application.yml b/target/classes/application.yml
index 21f409b..334ef90 100644
--- a/target/classes/application.yml
+++ b/target/classes/application.yml
@@ -33,6 +33,7 @@
overwrite-existing-jobs: true
jdbc:
initialize-schema: always
+ platform: mysql
properties:
org:
quartz:
@@ -46,11 +47,21 @@
useProperties: false
clusterCheckinInterval: 10000
isClustered: true
+ dataSource: myDS
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
+ dataSource:
+ myDS:
+ provider: hikaricp
+ driver: ${spring.datasource.driver-class-name}
+ URL: ${spring.datasource.url}
+ user: ${spring.datasource.username}
+ password: ${spring.datasource.password}
+ maxConnections: 5
+ validationQuery: select 1
servlet:
multipart:
enabled: true
diff --git a/target/classes/com/github/example/pt/autoconfig/QuartzConfig$AutowiringSpringBeanJobFactory.class b/target/classes/com/github/example/pt/autoconfig/QuartzConfig$AutowiringSpringBeanJobFactory.class
index 333d8ed..29f91eb 100644
--- a/target/classes/com/github/example/pt/autoconfig/QuartzConfig$AutowiringSpringBeanJobFactory.class
+++ b/target/classes/com/github/example/pt/autoconfig/QuartzConfig$AutowiringSpringBeanJobFactory.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/autoconfig/SaTokenConfig.class b/target/classes/com/github/example/pt/autoconfig/SaTokenConfig.class
index 9344339..32703fb 100644
--- a/target/classes/com/github/example/pt/autoconfig/SaTokenConfig.class
+++ b/target/classes/com/github/example/pt/autoconfig/SaTokenConfig.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/config/ApiPrinter.class b/target/classes/com/github/example/pt/config/ApiPrinter.class
index 9007cf5..7a08cda 100644
--- a/target/classes/com/github/example/pt/config/ApiPrinter.class
+++ b/target/classes/com/github/example/pt/config/ApiPrinter.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/config/MailConfig.class b/target/classes/com/github/example/pt/config/MailConfig.class
index 3091d5c..477c8d2 100644
--- a/target/classes/com/github/example/pt/config/MailConfig.class
+++ b/target/classes/com/github/example/pt/config/MailConfig.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/config/SaTokenHandshakeInterceptor.class b/target/classes/com/github/example/pt/config/SaTokenHandshakeInterceptor.class
index c65cf6a..d069934 100644
--- a/target/classes/com/github/example/pt/config/SaTokenHandshakeInterceptor.class
+++ b/target/classes/com/github/example/pt/config/SaTokenHandshakeInterceptor.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/config/SecurityConfig.class b/target/classes/com/github/example/pt/config/SecurityConfig.class
index 554fba6..de31309 100644
--- a/target/classes/com/github/example/pt/config/SecurityConfig.class
+++ b/target/classes/com/github/example/pt/config/SecurityConfig.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/config/SiteBasicConfig.class b/target/classes/com/github/example/pt/config/SiteBasicConfig.class
index bdd9c21..0c786e5 100644
--- a/target/classes/com/github/example/pt/config/SiteBasicConfig.class
+++ b/target/classes/com/github/example/pt/config/SiteBasicConfig.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/config/TrackerConfig.class b/target/classes/com/github/example/pt/config/TrackerConfig.class
index b059e69..38d6e3e 100644
--- a/target/classes/com/github/example/pt/config/TrackerConfig.class
+++ b/target/classes/com/github/example/pt/config/TrackerConfig.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/DebugController$DebugPeer.class b/target/classes/com/github/example/pt/controller/DebugController$DebugPeer.class
index 355d0c6..3cc2b50 100644
--- a/target/classes/com/github/example/pt/controller/DebugController$DebugPeer.class
+++ b/target/classes/com/github/example/pt/controller/DebugController$DebugPeer.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/DebugController$DebugTorrent.class b/target/classes/com/github/example/pt/controller/DebugController$DebugTorrent.class
index 22fc1b8..3727055 100644
--- a/target/classes/com/github/example/pt/controller/DebugController$DebugTorrent.class
+++ b/target/classes/com/github/example/pt/controller/DebugController$DebugTorrent.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/ForumController.class b/target/classes/com/github/example/pt/controller/ForumController.class
index ee618ba..5cd27b9 100644
--- a/target/classes/com/github/example/pt/controller/ForumController.class
+++ b/target/classes/com/github/example/pt/controller/ForumController.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/PostController.class b/target/classes/com/github/example/pt/controller/PostController.class
index 35314d2..17c45e7 100644
--- a/target/classes/com/github/example/pt/controller/PostController.class
+++ b/target/classes/com/github/example/pt/controller/PostController.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/TopicController.class b/target/classes/com/github/example/pt/controller/TopicController.class
index 6e5e49f..8a5c7a9 100644
--- a/target/classes/com/github/example/pt/controller/TopicController.class
+++ b/target/classes/com/github/example/pt/controller/TopicController.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/announce/AnnounceController$PeerResult.class b/target/classes/com/github/example/pt/controller/announce/AnnounceController$PeerResult.class
index 583be35..32f477b 100644
--- a/target/classes/com/github/example/pt/controller/announce/AnnounceController$PeerResult.class
+++ b/target/classes/com/github/example/pt/controller/announce/AnnounceController$PeerResult.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/announce/AnnounceController.class b/target/classes/com/github/example/pt/controller/announce/AnnounceController.class
index 8eb41fb..4c5e952 100644
--- a/target/classes/com/github/example/pt/controller/announce/AnnounceController.class
+++ b/target/classes/com/github/example/pt/controller/announce/AnnounceController.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/auth/AuthController.class b/target/classes/com/github/example/pt/controller/auth/AuthController.class
index d29cc4f..d6d5c51 100644
--- a/target/classes/com/github/example/pt/controller/auth/AuthController.class
+++ b/target/classes/com/github/example/pt/controller/auth/AuthController.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/auth/dto/request/RegisterRequestDTO.class b/target/classes/com/github/example/pt/controller/auth/dto/request/RegisterRequestDTO.class
index d633326..05fc197 100644
--- a/target/classes/com/github/example/pt/controller/auth/dto/request/RegisterRequestDTO.class
+++ b/target/classes/com/github/example/pt/controller/auth/dto/request/RegisterRequestDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/CategoryResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/CategoryResponseDTO.class
index 624efea..0f17497 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/CategoryResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/CategoryResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/LoginStatusResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/LoginStatusResponseDTO.class
index 87095b5..696426a 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/LoginStatusResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/LoginStatusResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/PeerInfoResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/PeerInfoResponseDTO.class
index 82db9c4..4d80273 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/PeerInfoResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/PeerInfoResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/TorrentInfoResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/TorrentInfoResponseDTO.class
index 29afc9e..e88bb8e 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/TorrentInfoResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/TorrentInfoResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/TransferHistoryDTO.class b/target/classes/com/github/example/pt/controller/dto/response/TransferHistoryDTO.class
index fc8a3ab..c69cdb8 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/TransferHistoryDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/TransferHistoryDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/UserBasicResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/UserBasicResponseDTO.class
index 50117e7..d68ecac 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/UserBasicResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/UserBasicResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/UserGroupResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/UserGroupResponseDTO.class
index 8938bd6..24b37b8 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/UserGroupResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/UserGroupResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/UserResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/UserResponseDTO.class
index c982c44..7eac134 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/UserResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/UserResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/UserSessionResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/UserSessionResponseDTO.class
index 62d76fb..108bc97 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/UserSessionResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/UserSessionResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/UserTinyResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/UserTinyResponseDTO.class
index 0a47108..b83d1bb 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/UserTinyResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/UserTinyResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/torrent/TorrentController.class b/target/classes/com/github/example/pt/controller/torrent/TorrentController.class
index 42260e3..ddb7451 100644
--- a/target/classes/com/github/example/pt/controller/torrent/TorrentController.class
+++ b/target/classes/com/github/example/pt/controller/torrent/TorrentController.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/torrent/dto/request/SearchTorrentRequestDTO.class b/target/classes/com/github/example/pt/controller/torrent/dto/request/SearchTorrentRequestDTO.class
index c859017..b258072 100644
--- a/target/classes/com/github/example/pt/controller/torrent/dto/request/SearchTorrentRequestDTO.class
+++ b/target/classes/com/github/example/pt/controller/torrent/dto/request/SearchTorrentRequestDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/torrent/dto/request/ThanksResponseDTO.class b/target/classes/com/github/example/pt/controller/torrent/dto/request/ThanksResponseDTO.class
index cb052d5..c422e4f 100644
--- a/target/classes/com/github/example/pt/controller/torrent/dto/request/ThanksResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/torrent/dto/request/ThanksResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/torrent/dto/request/TorrentScrapeRequestDTO.class b/target/classes/com/github/example/pt/controller/torrent/dto/request/TorrentScrapeRequestDTO.class
index 1becb2d..9a75417 100644
--- a/target/classes/com/github/example/pt/controller/torrent/dto/request/TorrentScrapeRequestDTO.class
+++ b/target/classes/com/github/example/pt/controller/torrent/dto/request/TorrentScrapeRequestDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentScrapeResponseDTO.class b/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentScrapeResponseDTO.class
index 72ca36f..281050e 100644
--- a/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentScrapeResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentScrapeResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentSearchResultResponseDTO.class b/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentSearchResultResponseDTO.class
index f3b6f7c..303f183 100644
--- a/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentSearchResultResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentSearchResultResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentUploadSuccessResponseDTO.class b/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentUploadSuccessResponseDTO.class
index df5d002..2f33bef 100644
--- a/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentUploadSuccessResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentUploadSuccessResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/torrent/form/TorrentUploadForm.class b/target/classes/com/github/example/pt/controller/torrent/form/TorrentUploadForm.class
index c545ae5..eec863c 100644
--- a/target/classes/com/github/example/pt/controller/torrent/form/TorrentUploadForm.class
+++ b/target/classes/com/github/example/pt/controller/torrent/form/TorrentUploadForm.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/crontask/PeersCleanup.class b/target/classes/com/github/example/pt/crontask/PeersCleanup.class
index 924eda1..c80d93a 100644
--- a/target/classes/com/github/example/pt/crontask/PeersCleanup.class
+++ b/target/classes/com/github/example/pt/crontask/PeersCleanup.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/Exam.class b/target/classes/com/github/example/pt/entity/Exam.class
index 8473aba..131d382 100644
--- a/target/classes/com/github/example/pt/entity/Exam.class
+++ b/target/classes/com/github/example/pt/entity/Exam.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/Forum$ForumBuilder.class b/target/classes/com/github/example/pt/entity/Forum$ForumBuilder.class
index 9c8ecc3..7a15411 100644
--- a/target/classes/com/github/example/pt/entity/Forum$ForumBuilder.class
+++ b/target/classes/com/github/example/pt/entity/Forum$ForumBuilder.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/Forum.class b/target/classes/com/github/example/pt/entity/Forum.class
index cc02e3b..8b8adb2 100644
--- a/target/classes/com/github/example/pt/entity/Forum.class
+++ b/target/classes/com/github/example/pt/entity/Forum.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/ForumTag$ForumTagBuilder.class b/target/classes/com/github/example/pt/entity/ForumTag$ForumTagBuilder.class
index 38321ae..62e5b72 100644
--- a/target/classes/com/github/example/pt/entity/ForumTag$ForumTagBuilder.class
+++ b/target/classes/com/github/example/pt/entity/ForumTag$ForumTagBuilder.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/ForumTag.class b/target/classes/com/github/example/pt/entity/ForumTag.class
index e092880..08f8d75 100644
--- a/target/classes/com/github/example/pt/entity/ForumTag.class
+++ b/target/classes/com/github/example/pt/entity/ForumTag.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/LoginHistory.class b/target/classes/com/github/example/pt/entity/LoginHistory.class
index 0f6212a..8fc3721 100644
--- a/target/classes/com/github/example/pt/entity/LoginHistory.class
+++ b/target/classes/com/github/example/pt/entity/LoginHistory.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/Peer.class b/target/classes/com/github/example/pt/entity/Peer.class
index 3629440..181dbac 100644
--- a/target/classes/com/github/example/pt/entity/Peer.class
+++ b/target/classes/com/github/example/pt/entity/Peer.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/Post$PostBuilder.class b/target/classes/com/github/example/pt/entity/Post$PostBuilder.class
index 9eaec84..65ce88b 100644
--- a/target/classes/com/github/example/pt/entity/Post$PostBuilder.class
+++ b/target/classes/com/github/example/pt/entity/Post$PostBuilder.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/Post.class b/target/classes/com/github/example/pt/entity/Post.class
index 23eadd3..04451d7 100644
--- a/target/classes/com/github/example/pt/entity/Post.class
+++ b/target/classes/com/github/example/pt/entity/Post.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/PostLike$PostLikeBuilder.class b/target/classes/com/github/example/pt/entity/PostLike$PostLikeBuilder.class
index fe98d63..485b82f 100644
--- a/target/classes/com/github/example/pt/entity/PostLike$PostLikeBuilder.class
+++ b/target/classes/com/github/example/pt/entity/PostLike$PostLikeBuilder.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/PostLike.class b/target/classes/com/github/example/pt/entity/PostLike.class
index 9dada7e..903d6af 100644
--- a/target/classes/com/github/example/pt/entity/PostLike.class
+++ b/target/classes/com/github/example/pt/entity/PostLike.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/SeedBox.class b/target/classes/com/github/example/pt/entity/SeedBox.class
index 2f3ffe9..763691c 100644
--- a/target/classes/com/github/example/pt/entity/SeedBox.class
+++ b/target/classes/com/github/example/pt/entity/SeedBox.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/Thanks.class b/target/classes/com/github/example/pt/entity/Thanks.class
index 96c6e4b..95f9020 100644
--- a/target/classes/com/github/example/pt/entity/Thanks.class
+++ b/target/classes/com/github/example/pt/entity/Thanks.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/Topic$TopicBuilder.class b/target/classes/com/github/example/pt/entity/Topic$TopicBuilder.class
index ea91c3b..58cab6d 100644
--- a/target/classes/com/github/example/pt/entity/Topic$TopicBuilder.class
+++ b/target/classes/com/github/example/pt/entity/Topic$TopicBuilder.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/Topic.class b/target/classes/com/github/example/pt/entity/Topic.class
index 35f3c95..da6bbbc 100644
--- a/target/classes/com/github/example/pt/entity/Topic.class
+++ b/target/classes/com/github/example/pt/entity/Topic.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/TopicSubscription.class b/target/classes/com/github/example/pt/entity/TopicSubscription.class
index 2d709d1..0f6cc3a 100644
--- a/target/classes/com/github/example/pt/entity/TopicSubscription.class
+++ b/target/classes/com/github/example/pt/entity/TopicSubscription.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/TopicView.class b/target/classes/com/github/example/pt/entity/TopicView.class
index aca8526..0821d1f 100644
--- a/target/classes/com/github/example/pt/entity/TopicView.class
+++ b/target/classes/com/github/example/pt/entity/TopicView.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/Torrent.class b/target/classes/com/github/example/pt/entity/Torrent.class
index 3941ca1..b5cab29 100644
--- a/target/classes/com/github/example/pt/entity/Torrent.class
+++ b/target/classes/com/github/example/pt/entity/Torrent.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/TransferHistory.class b/target/classes/com/github/example/pt/entity/TransferHistory.class
index 82ef10c..5b7f155 100644
--- a/target/classes/com/github/example/pt/entity/TransferHistory.class
+++ b/target/classes/com/github/example/pt/entity/TransferHistory.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/User.class b/target/classes/com/github/example/pt/entity/User.class
index 4a30cc3..6748056 100644
--- a/target/classes/com/github/example/pt/entity/User.class
+++ b/target/classes/com/github/example/pt/entity/User.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/UserForumHistory$UserForumHistoryBuilder.class b/target/classes/com/github/example/pt/entity/UserForumHistory$UserForumHistoryBuilder.class
index cbf6dbd..26095cf 100644
--- a/target/classes/com/github/example/pt/entity/UserForumHistory$UserForumHistoryBuilder.class
+++ b/target/classes/com/github/example/pt/entity/UserForumHistory$UserForumHistoryBuilder.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/UserForumHistory.class b/target/classes/com/github/example/pt/entity/UserForumHistory.class
index 52179f7..cbe434a 100644
--- a/target/classes/com/github/example/pt/entity/UserForumHistory.class
+++ b/target/classes/com/github/example/pt/entity/UserForumHistory.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/entity/UserGroup.class b/target/classes/com/github/example/pt/entity/UserGroup.class
index 1b814cb..6e79055 100644
--- a/target/classes/com/github/example/pt/entity/UserGroup.class
+++ b/target/classes/com/github/example/pt/entity/UserGroup.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/exception/APIGenericException.class b/target/classes/com/github/example/pt/exception/APIGenericException.class
index e2856b8..79847d4 100644
--- a/target/classes/com/github/example/pt/exception/APIGenericException.class
+++ b/target/classes/com/github/example/pt/exception/APIGenericException.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/exception/FixedAnnounceException.class b/target/classes/com/github/example/pt/exception/FixedAnnounceException.class
index 33c9e79..1b8ab5f 100644
--- a/target/classes/com/github/example/pt/exception/FixedAnnounceException.class
+++ b/target/classes/com/github/example/pt/exception/FixedAnnounceException.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/exception/InvalidAnnounceException.class b/target/classes/com/github/example/pt/exception/InvalidAnnounceException.class
index 8e8a69a..0d147b2 100644
--- a/target/classes/com/github/example/pt/exception/InvalidAnnounceException.class
+++ b/target/classes/com/github/example/pt/exception/InvalidAnnounceException.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/exception/InvalidTorrentVerifyException.class b/target/classes/com/github/example/pt/exception/InvalidTorrentVerifyException.class
index 277775f..e8f45d2 100644
--- a/target/classes/com/github/example/pt/exception/InvalidTorrentVerifyException.class
+++ b/target/classes/com/github/example/pt/exception/InvalidTorrentVerifyException.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/exception/RetryableAnnounceException.class b/target/classes/com/github/example/pt/exception/RetryableAnnounceException.class
index 651b6e2..c64c060 100644
--- a/target/classes/com/github/example/pt/exception/RetryableAnnounceException.class
+++ b/target/classes/com/github/example/pt/exception/RetryableAnnounceException.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/AnnounceService$AnnounceTask.class b/target/classes/com/github/example/pt/service/AnnounceService$AnnounceTask.class
index 946336a..7bb7d5c 100644
--- a/target/classes/com/github/example/pt/service/AnnounceService$AnnounceTask.class
+++ b/target/classes/com/github/example/pt/service/AnnounceService$AnnounceTask.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/AnnounceService.class b/target/classes/com/github/example/pt/service/AnnounceService.class
index 74cfac1..5b5562a 100644
--- a/target/classes/com/github/example/pt/service/AnnounceService.class
+++ b/target/classes/com/github/example/pt/service/AnnounceService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/AuthenticationService.class b/target/classes/com/github/example/pt/service/AuthenticationService.class
index 4a351a3..deaef28 100644
--- a/target/classes/com/github/example/pt/service/AuthenticationService.class
+++ b/target/classes/com/github/example/pt/service/AuthenticationService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/BlacklistClientService.class b/target/classes/com/github/example/pt/service/BlacklistClientService.class
index b556e73..8514c94 100644
--- a/target/classes/com/github/example/pt/service/BlacklistClientService.class
+++ b/target/classes/com/github/example/pt/service/BlacklistClientService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/CategoryService.class b/target/classes/com/github/example/pt/service/CategoryService.class
index e8b2a8f..e241621 100644
--- a/target/classes/com/github/example/pt/service/CategoryService.class
+++ b/target/classes/com/github/example/pt/service/CategoryService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/ExamPlanService.class b/target/classes/com/github/example/pt/service/ExamPlanService.class
index 4bed8bb..f7dc083 100644
--- a/target/classes/com/github/example/pt/service/ExamPlanService.class
+++ b/target/classes/com/github/example/pt/service/ExamPlanService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/LoginHistoryService.class b/target/classes/com/github/example/pt/service/LoginHistoryService.class
index afb141f..d2cee3d 100644
--- a/target/classes/com/github/example/pt/service/LoginHistoryService.class
+++ b/target/classes/com/github/example/pt/service/LoginHistoryService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/PeerService.class b/target/classes/com/github/example/pt/service/PeerService.class
index 7c87eb8..40e8fa7 100644
--- a/target/classes/com/github/example/pt/service/PeerService.class
+++ b/target/classes/com/github/example/pt/service/PeerService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/PermissionService.class b/target/classes/com/github/example/pt/service/PermissionService.class
index f538c86..a7d6823 100644
--- a/target/classes/com/github/example/pt/service/PermissionService.class
+++ b/target/classes/com/github/example/pt/service/PermissionService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/PromotionService.class b/target/classes/com/github/example/pt/service/PromotionService.class
index c88ae88..512f454 100644
--- a/target/classes/com/github/example/pt/service/PromotionService.class
+++ b/target/classes/com/github/example/pt/service/PromotionService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/SettingService.class b/target/classes/com/github/example/pt/service/SettingService.class
index 60dfe1d..62595e4 100644
--- a/target/classes/com/github/example/pt/service/SettingService.class
+++ b/target/classes/com/github/example/pt/service/SettingService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/TagService.class b/target/classes/com/github/example/pt/service/TagService.class
index bc48eaf..251ab50 100644
--- a/target/classes/com/github/example/pt/service/TagService.class
+++ b/target/classes/com/github/example/pt/service/TagService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/TorrentService.class b/target/classes/com/github/example/pt/service/TorrentService.class
index 409eef9..6b2a693 100644
--- a/target/classes/com/github/example/pt/service/TorrentService.class
+++ b/target/classes/com/github/example/pt/service/TorrentService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/TransferHistoryService.class b/target/classes/com/github/example/pt/service/TransferHistoryService.class
index 0c05ee7..08df053 100644
--- a/target/classes/com/github/example/pt/service/TransferHistoryService.class
+++ b/target/classes/com/github/example/pt/service/TransferHistoryService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/UserGroupService.class b/target/classes/com/github/example/pt/service/UserGroupService.class
index c2b5b77..60d996c 100644
--- a/target/classes/com/github/example/pt/service/UserGroupService.class
+++ b/target/classes/com/github/example/pt/service/UserGroupService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/UserService.class b/target/classes/com/github/example/pt/service/UserService.class
index bd7145d..f706ebc 100644
--- a/target/classes/com/github/example/pt/service/UserService.class
+++ b/target/classes/com/github/example/pt/service/UserService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/type/AnnounceEventType.class b/target/classes/com/github/example/pt/type/AnnounceEventType.class
index 1e8df5e..62dd62e 100644
--- a/target/classes/com/github/example/pt/type/AnnounceEventType.class
+++ b/target/classes/com/github/example/pt/type/AnnounceEventType.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/IPUtil.class b/target/classes/com/github/example/pt/util/IPUtil.class
index a68be73..dab2236 100644
--- a/target/classes/com/github/example/pt/util/IPUtil.class
+++ b/target/classes/com/github/example/pt/util/IPUtil.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/InfoHashUtil.class b/target/classes/com/github/example/pt/util/InfoHashUtil.class
index 916c74d..b18f975 100644
--- a/target/classes/com/github/example/pt/util/InfoHashUtil.class
+++ b/target/classes/com/github/example/pt/util/InfoHashUtil.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/PasswordHash.class b/target/classes/com/github/example/pt/util/PasswordHash.class
index 5443baf..4a8d67a 100644
--- a/target/classes/com/github/example/pt/util/PasswordHash.class
+++ b/target/classes/com/github/example/pt/util/PasswordHash.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/RandomUtil.class b/target/classes/com/github/example/pt/util/RandomUtil.class
index b6ac3fe..969ad27 100644
--- a/target/classes/com/github/example/pt/util/RandomUtil.class
+++ b/target/classes/com/github/example/pt/util/RandomUtil.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/SafeUUID.class b/target/classes/com/github/example/pt/util/SafeUUID.class
index a20c7c6..a070c31 100644
--- a/target/classes/com/github/example/pt/util/SafeUUID.class
+++ b/target/classes/com/github/example/pt/util/SafeUUID.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/TorrentParser.class b/target/classes/com/github/example/pt/util/TorrentParser.class
index 33dfca4..4cb7ca9 100644
--- a/target/classes/com/github/example/pt/util/TorrentParser.class
+++ b/target/classes/com/github/example/pt/util/TorrentParser.class
Binary files differ
diff --git a/target/classes/ppt.sql b/target/classes/ppt.sql
index ad94e82..28ab119 100644
--- a/target/classes/ppt.sql
+++ b/target/classes/ppt.sql
@@ -724,7 +724,7 @@
-- ----------------------------
-- Records of users
-- ----------------------------
-INSERT INTO `users` VALUES (1, 'testuser@example.com', '$2a$06$JqvHpC94mnN23uwmZX0XHeuyFj3M22Ikw8VBZRopfrlWbPfA4KREu', 'testuser', 1, '47050e8f-f3fd-4a9c-a828-0e0de456691f', '2025-06-03 11:34:08', 'https://www.baidu.com/facivon.ico', '测试用户', '这个用户很懒,还没有个性签名', 'zh-CN', '100mbps', '100mbps', 0, 27723388, 27723388, 0, '未知', 0.00, 0, 30790068, '948c9146-ff5f-4ad6-8ba5-d32e1209cafd', '0');
+INSERT INTO `users` VALUES (1, 'testuser@example.com', '$2a$06$JqvHpC94mnN23uwmZX0XHeuyFj3M22Ikw8VBZRopfrlWbPfA4KREu', 'testuser', 1, '47050e8f-f3fd-4a9c-a828-0e0de456691f', '2025-06-03 11:34:08', '/default-avatar.png', '测试用户', '这个用户很懒,还没有个性签名', 'zh-CN', '100mbps', '100mbps', 0, 27723388, 27723388, 0, '未知', 0.00, 0, 30790068, '948c9146-ff5f-4ad6-8ba5-d32e1209cafd', '0');
SET FOREIGN_KEY_CHECKS = 1;
diff --git a/target/classes/test_basic_data.sql b/target/classes/test_basic_data.sql
new file mode 100644
index 0000000..cb3c279
--- /dev/null
+++ b/target/classes/test_basic_data.sql
@@ -0,0 +1,17 @@
+-- 插入测试用户(如果users表为空的话)
+INSERT IGNORE INTO users (id, username, email, password, created_at, updated_at) VALUES
+(1, 'testuser1', 'test1@example.com', '$2a$10$test.hash.password1', NOW(), NOW()),
+(2, 'testuser2', 'test2@example.com', '$2a$10$test.hash.password2', NOW(), NOW()),
+(3, 'testuser3', 'test3@example.com', '$2a$10$test.hash.password3', NOW(), NOW());
+
+-- 插入测试论坛版块(如果forums表为空的话)
+INSERT IGNORE INTO forums (id, slug, name, description, sort_order, is_locked) VALUES
+(1, 'general', '综合讨论区', '这里是综合讨论的地方,大家可以畅所欲言', 1, FALSE),
+(2, 'technical', '技术交流', '技术相关的讨论和分享', 2, FALSE),
+(3, 'announcements', '公告区', '站点公告和重要通知', 0, FALSE);
+
+-- 插入测试话题(如果topics表为空的话)
+INSERT IGNORE INTO topics (id, forum_id, user_id, title, is_pinned, is_locked, created_at, updated_at) VALUES
+(1, 1, 1, '欢迎来到综合讨论区', FALSE, FALSE, NOW(), NOW()),
+(2, 1, 2, '大家都在做什么项目?', FALSE, FALSE, NOW(), NOW()),
+(3, 2, 3, 'Spring Boot最佳实践分享', FALSE, FALSE, NOW(), NOW());
\ No newline at end of file
diff --git a/target/classes/test_posts_data.sql b/target/classes/test_posts_data.sql
new file mode 100644
index 0000000..4d331f1
--- /dev/null
+++ b/target/classes/test_posts_data.sql
@@ -0,0 +1,28 @@
+-- 测试数据:帖子和回复
+-- 假设已有用户ID 1, 2, 3 和话题ID 1
+
+-- 插入主帖(parent_id为NULL)
+INSERT INTO posts (topic_id, user_id, content, created_at, updated_at, is_deleted, parent_id) VALUES
+(1, 1, '这是话题1的第一个回复内容。大家觉得这个话题怎么样?', NOW(), NOW(), FALSE, NULL),
+(1, 2, '我觉得这个话题很有意思,值得深入讨论!', NOW(), NOW(), FALSE, NULL);
+
+-- 插入二级回复(回复第一个帖子,post_id=1)
+INSERT INTO posts (topic_id, user_id, content, created_at, updated_at, is_deleted, parent_id) VALUES
+(1, 3, '同意楼上的观点,这确实是个值得讨论的话题。', NOW(), NOW(), FALSE, 1),
+(1, 1, '谢谢大家的支持!我们继续深入讨论吧。', NOW(), NOW(), FALSE, 1);
+
+-- 插入三级回复(回复第一个二级回复,post_id=3)
+INSERT INTO posts (topic_id, user_id, content, created_at, updated_at, is_deleted, parent_id) VALUES
+(1, 2, '我有一些不同的看法,让我来分享一下...', NOW(), NOW(), FALSE, 3);
+
+-- 插入更多回复到第二个主帖(post_id=2)
+INSERT INTO posts (topic_id, user_id, content, created_at, updated_at, is_deleted, parent_id) VALUES
+(1, 3, '我也同意这个观点,补充一点...', NOW(), NOW(), FALSE, 2),
+(1, 1, '大家都说得很有道理!', NOW(), NOW(), FALSE, 2);
+
+-- 如果需要为其他话题添加数据,可以修改topic_id
+-- 为话题2添加一些测试数据
+INSERT INTO posts (topic_id, user_id, content, created_at, updated_at, is_deleted, parent_id) VALUES
+(2, 1, '这是话题2的第一个回复。', NOW(), NOW(), FALSE, NULL),
+(2, 2, '话题2看起来也很有趣!', NOW(), NOW(), FALSE, NULL),
+(2, 3, '我对话题2有些疑问...', NOW(), NOW(), FALSE, 1); -- 回复话题2的第一个帖子
\ No newline at end of file
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
index 7af9fb2..1ca63d6 100644
--- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
+++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -1,121 +1,55 @@
com\github\example\pt\service\BlacklistClientService.class
com\github\example\pt\repository\PromotionPolicyRepository.class
com\github\example\pt\service\AnnouncePerformanceMonitorService.class
-com\github\example\pt\repository\TorrentRepository.class
com\github\example\pt\service\SettingService.class
-com\github\example\pt\util\edazdarevic\commons\net\CIDRUtil.class
com\github\example\pt\entity\TransferHistory.class
com\github\example\pt\exception\BrowserReadableAnnounceException.class
com\github\example\pt\entity\UserGroup.class
-com\github\example\pt\controller\dto\response\PromotionResponseDTO.class
com\github\example\pt\repository\TransferHistoryRepository.class
com\github\example\pt\controller\DebugController$DebugTorrent.class
-com\github\example\pt\util\ClassUtil.class
com\github\example\pt\util\TorrentParser.class
-com\github\example\pt\repository\ChatMessageRepository.class
com\github\example\pt\controller\announce\AnnounceController.class
com\github\example\pt\controller\torrent\dto\request\TorrentScrapeRequestDTO.class
com\github\example\pt\entity\Peer.class
-com\github\example\pt\controller\dto\response\UserGroupResponseDTO.class
-com\github\example\pt\service\ExamService.class
-com\github\example\pt\exception\RESTException.class
-com\github\example\pt\exception\InvalidAnnounceException.class
-com\github\example\pt\redisrepository\RedisLoginAttemptRepository.class
com\github\example\pt\controller\torrent\TorrentController.class
com\github\example\pt\controller\chat\ChatHistoryController.class
com\github\example\pt\entity\SettingEntity.class
-com\github\example\pt\exception\APIErrorCode.class
com\github\example\pt\repository\TagRepository.class
-com\github\example\pt\controller\dto\response\UserBasicResponseDTO.class
com\github\example\pt\type\PrivacyLevel.class
-com\github\example\pt\repository\SettingRepository.class
com\github\example\pt\listener\SaTokenEventListener.class
com\github\example\pt\util\URLEncodeUtil.class
-com\github\example\pt\entity\Exam.class
com\github\example\pt\controller\auth\dto\request\LoginRequestDTO.class
-com\github\example\pt\type\GuestAccessBlocker.class
-com\github\example\pt\exception\RetryableAnnounceException.class
com\github\example\pt\config\WebSocketConfig.class
-com\github\example\pt\repository\ExamPlanRepository.class
-com\github\example\pt\config\ApiPrinter.class
-com\github\example\pt\entity\ExamPlan.class
com\github\example\pt\service\AuthenticationService.class
-com\github\example\pt\controller\dto\response\ScrapeContainerDTO.class
-com\github\example\pt\service\PromotionService.class
com\github\example\pt\config\SecurityConfig.class
com\github\example\pt\type\LoginType.class
com\github\example\pt\service\TagService.class
-com\github\example\pt\ptApplication.class
com\github\example\pt\controller\dto\response\UserTinyResponseDTO.class
-com\github\example\pt\util\BencodeUtil.class
com\github\example\pt\autoconfig\SafeHTMLConfig.class
-com\github\example\pt\repository\LoginHistoryRepository.class
-com\github\example\pt\util\IPUtil.class
-com\github\example\pt\controller\category\CategoryController.class
-com\github\example\pt\exception\FixedAnnounceException.class
-com\github\example\pt\util\SafeUUID.class
com\github\example\pt\service\CategoryService.class
-com\github\example\pt\util\PackUtil.class
-com\github\example\pt\controller\chat\dto\ChatMessageDTO.class
-com\github\example\pt\config\SaTokenHandshakeInterceptor.class
-com\github\example\pt\repository\UserRepository.class
com\github\example\pt\service\PermissionService.class
com\github\example\pt\type\AnnounceEventTypeConverter.class
-com\github\example\pt\util\InfoHashUtil.class
-com\github\example\pt\controller\dto\response\LoginStatusResponseDTO.class
-com\github\example\pt\exception\TorrentException.class
com\github\example\pt\repository\CategoryRepository.class
com\github\example\pt\exception\InvalidTorrentVersionException.class
-com\github\example\pt\repository\UserGroupRepository.class
com\github\example\pt\controller\promotion\PromotionController.class
com\github\example\pt\service\ExamPlanService.class
com\github\example\pt\controller\DebugController.class
-com\github\example\pt\type\IPFormatRequirement.class
com\github\example\pt\controller\auth\AuthController.class
-com\github\example\pt\autoconfig\QuartzConfig$AutowiringSpringBeanJobFactory.class
com\github\example\pt\controller\dto\response\UserSessionResponseDTO.class
com\github\example\pt\entity\ChatMessage.class
-com\github\example\pt\service\LoginHistoryService.class
-com\github\example\pt\util\ExecutorUtil.class
com\github\example\pt\service\AnnounceService.class
com\github\example\pt\controller\torrent\dto\response\TorrentScrapeResponseDTO.class
-com\github\example\pt\exception\InvalidTorrentPiecesException.class
-com\github\example\pt\service\UserGroupService.class
com\github\example\pt\util\PasswordHash.class
com\github\example\pt\service\ThanksService.class
-com\github\example\pt\controller\feed\FeedController.class
-com\github\example\pt\util\MiscUtil.class
-com\github\example\pt\exception\InvalidTorrentVerifyException.class
com\github\example\pt\service\TransferHistoryService$PeerStatus.class
-com\github\example\pt\controller\torrent\dto\request\ThanksResponseDTO.class
-com\github\example\pt\exception\InvalidTorrentFileException.class
com\github\example\pt\repository\PermissionRepository.class
-com\github\example\pt\controller\advice\GlobalControllerAdvice.class
com\github\example\pt\entity\Category.class
-com\github\example\pt\repository\ExamRepository.class
-com\github\example\pt\controller\torrent\form\TorrentUploadForm.class
-com\github\example\pt\exception\EmptyTorrentFileException.class
-com\github\example\pt\service\PeerService.class
-com\github\example\pt\util\ByteUtil.class
-com\github\example\pt\entity\User.class
-com\github\example\pt\exception\AnnounceException.class
-com\github\example\pt\repository\PeersRepository.class
com\github\example\pt\autoconfig\JetcacheConfig.class
-com\github\example\pt\controller\auth\dto\request\RegisterRequestDTO.class
-com\github\example\pt\util\RandomUtil.class
com\github\example\pt\type\AnnounceEventType.class
com\github\example\pt\service\UserService.class
-com\github\example\pt\objects\ResponsePojo.class
-com\github\example\pt\autoconfig\JacksonConfig.class
-com\github\example\pt\exception\TrackerException.class
com\github\example\pt\util\IpValidator.class
com\github\example\pt\entity\Permission.class
com\github\example\pt\controller\torrent\dto\response\TorrentUploadSuccessResponseDTO.class
-com\github\example\pt\entity\LoginHistory.class
-com\github\example\pt\service\AnnounceService$AnnounceTask.class
-com\github\example\pt\service\TorrentService.class
-com\github\example\pt\entity\Thanks.class
-com\github\example\pt\config\MailConfig.class
com\github\example\pt\autoconfig\WorkDirectoryConfig.class
com\github\example\pt\controller\dto\response\TorrentBasicResponseDTO.class
com\github\example\pt\autoconfig\RedisConfig.class
@@ -124,27 +58,93 @@
com\github\example\pt\exception\APIGenericException.class
com\github\example\pt\exception\BadConfigException.class
com\github\example\pt\type\GuestAccessRequirement.class
-com\github\example\pt\config\TrackerConfig.class
-com\github\example\pt\controller\announce\AnnounceController$PeerResult.class
com\github\example\pt\entity\SeedBox.class
com\github\example\pt\controller\torrent\dto\request\SearchTorrentRequestDTO.class
-com\github\example\pt\service\TransferHistoryService.class
com\github\example\pt\exception\AnnounceBusyException.class
-com\github\example\pt\crontask\PeersCleanup.class
-com\github\example\pt\websocket\ChatRawWebSocketHandler.class
-com\github\example\pt\controller\dto\response\CategoryResponseDTO.class
-com\github\example\pt\entity\Tag.class
-com\github\example\pt\repository\ThanksRepository.class
-com\github\example\pt\controller\dto\response\TransferHistoryDTO.class
com\github\example\pt\util\HibernateSessionUtil.class
com\github\example\pt\controller\dto\response\PeerInfoResponseDTO.class
com\github\example\pt\controller\dto\response\TorrentInfoResponseDTO.class
-com\github\example\pt\entity\PromotionPolicy.class
-com\github\example\pt\redisentity\RedisLoginAttempt.class
-com\github\example\pt\autoconfig\QuartzConfig.class
com\github\example\pt\entity\Torrent.class
com\github\example\pt\controller\dto\response\UserResponseDTO.class
com\github\example\pt\controller\torrent\dto\response\TorrentSearchResultResponseDTO.class
com\github\example\pt\config\SiteBasicConfig.class
com\github\example\pt\service\SaTokenPermImpl.class
com\github\example\pt\util\GsonUtil.class
+com\github\example\pt\repository\TorrentRepository.class
+com\github\example\pt\util\edazdarevic\commons\net\CIDRUtil.class
+com\github\example\pt\controller\dto\response\PromotionResponseDTO.class
+com\github\example\pt\util\ClassUtil.class
+com\github\example\pt\repository\ChatMessageRepository.class
+com\github\example\pt\controller\dto\response\UserGroupResponseDTO.class
+com\github\example\pt\service\ExamService.class
+com\github\example\pt\exception\RESTException.class
+com\github\example\pt\exception\InvalidAnnounceException.class
+com\github\example\pt\redisrepository\RedisLoginAttemptRepository.class
+com\github\example\pt\exception\APIErrorCode.class
+com\github\example\pt\controller\dto\response\UserBasicResponseDTO.class
+com\github\example\pt\repository\SettingRepository.class
+com\github\example\pt\entity\Exam.class
+com\github\example\pt\type\GuestAccessBlocker.class
+com\github\example\pt\exception\RetryableAnnounceException.class
+com\github\example\pt\repository\ExamPlanRepository.class
+com\github\example\pt\config\ApiPrinter.class
+com\github\example\pt\entity\ExamPlan.class
+com\github\example\pt\controller\dto\response\ScrapeContainerDTO.class
+com\github\example\pt\service\PromotionService.class
+com\github\example\pt\ptApplication.class
+com\github\example\pt\util\BencodeUtil.class
+com\github\example\pt\repository\LoginHistoryRepository.class
+com\github\example\pt\util\IPUtil.class
+com\github\example\pt\controller\category\CategoryController.class
+com\github\example\pt\exception\FixedAnnounceException.class
+com\github\example\pt\util\SafeUUID.class
+com\github\example\pt\util\PackUtil.class
+com\github\example\pt\controller\chat\dto\ChatMessageDTO.class
+com\github\example\pt\config\SaTokenHandshakeInterceptor.class
+com\github\example\pt\repository\UserRepository.class
+com\github\example\pt\util\InfoHashUtil.class
+com\github\example\pt\controller\dto\response\LoginStatusResponseDTO.class
+com\github\example\pt\exception\TorrentException.class
+com\github\example\pt\repository\UserGroupRepository.class
+com\github\example\pt\type\IPFormatRequirement.class
+com\github\example\pt\autoconfig\QuartzConfig$AutowiringSpringBeanJobFactory.class
+com\github\example\pt\service\LoginHistoryService.class
+com\github\example\pt\util\ExecutorUtil.class
+com\github\example\pt\exception\InvalidTorrentPiecesException.class
+com\github\example\pt\service\UserGroupService.class
+com\github\example\pt\controller\feed\FeedController.class
+com\github\example\pt\util\MiscUtil.class
+com\github\example\pt\exception\InvalidTorrentVerifyException.class
+com\github\example\pt\controller\torrent\dto\request\ThanksResponseDTO.class
+com\github\example\pt\exception\InvalidTorrentFileException.class
+com\github\example\pt\controller\advice\GlobalControllerAdvice.class
+com\github\example\pt\repository\ExamRepository.class
+com\github\example\pt\controller\torrent\form\TorrentUploadForm.class
+com\github\example\pt\exception\EmptyTorrentFileException.class
+com\github\example\pt\service\PeerService.class
+com\github\example\pt\util\ByteUtil.class
+com\github\example\pt\entity\User.class
+com\github\example\pt\exception\AnnounceException.class
+com\github\example\pt\repository\PeersRepository.class
+com\github\example\pt\controller\auth\dto\request\RegisterRequestDTO.class
+com\github\example\pt\util\RandomUtil.class
+com\github\example\pt\objects\ResponsePojo.class
+com\github\example\pt\autoconfig\JacksonConfig.class
+com\github\example\pt\exception\TrackerException.class
+com\github\example\pt\entity\LoginHistory.class
+com\github\example\pt\service\AnnounceService$AnnounceTask.class
+com\github\example\pt\service\TorrentService.class
+com\github\example\pt\entity\Thanks.class
+com\github\example\pt\config\MailConfig.class
+com\github\example\pt\config\TrackerConfig.class
+com\github\example\pt\controller\announce\AnnounceController$PeerResult.class
+com\github\example\pt\service\TransferHistoryService.class
+com\github\example\pt\crontask\PeersCleanup.class
+com\github\example\pt\websocket\ChatRawWebSocketHandler.class
+com\github\example\pt\controller\dto\response\CategoryResponseDTO.class
+com\github\example\pt\entity\Tag.class
+com\github\example\pt\repository\ThanksRepository.class
+com\github\example\pt\controller\dto\response\TransferHistoryDTO.class
+com\github\example\pt\entity\PromotionPolicy.class
+com\github\example\pt\redisentity\RedisLoginAttempt.class
+com\github\example\pt\autoconfig\QuartzConfig.class
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
index d000526..560ecf2 100644
--- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
+++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -1,144 +1,186 @@
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\LoginHistoryService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\UserService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Torrent.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\ChatMessage.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ClassUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Thanks.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ExecutorUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\WebSocketConfig.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\chat\dto\ChatMessageDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\MiscUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\SettingService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserSessionResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\BadConfigException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\QuartzConfig.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\SaTokenPermImpl.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TransferHistoryService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentPiecesException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ChatMessageRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentFileException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\AnnounceBusyException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\EmptyTorrentFileException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\IPUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\redisentity\RedisLoginAttempt.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Category.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Peer.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\ApiPrinter.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\PrivacyLevel.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\TorrentException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SaTokenHandshakeInterceptor.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserBasicResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\feed\FeedController.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ExamService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PromotionService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\MailConfig.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\LoginHistory.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\BrowserReadableAnnounceException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentVersionException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PermissionService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentVerifyException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\GuestAccessBlocker.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentSearchResultResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\IpValidator.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\PromotionPolicy.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\SafeUUID.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\form\TorrentUploadForm.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\APIErrorCode.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\AnnounceEventType.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PermissionRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\chat\ChatHistoryController.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\LoginType.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ExamPlanService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Permission.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\TrackerException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TransferHistoryRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\UserGroup.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\redisrepository\RedisLoginAttemptRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\CategoryService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\InfoHashUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\URLEncodeUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\objects\ResponsePojo.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\crontask\PeersCleanup.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\announce\AnnounceController.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TransferHistoryDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\websocket\ChatRawWebSocketHandler.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TorrentBasicResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\AnnounceException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\dto\request\LoginRequestDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ThanksService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\AuthController.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\UserGroupService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\BlacklistClientService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\PackUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ExamPlanRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ByteUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\WorkDirectoryConfig.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AuthenticationService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\TorrentController.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\SearchTorrentRequestDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\LoginStatusResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\User.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\RetryableAnnounceException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\PasswordHash.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\PeerInfoResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\TrackerConfig.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\SeedBox.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\CategoryResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\AnnounceEventTypeConverter.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\TorrentParser.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\HibernateSessionUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SiteBasicConfig.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Exam.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\TransferHistory.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\CategoryRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TorrentRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\dto\request\RegisterRequestDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\category\CategoryController.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\SettingEntity.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\TorrentScrapeRequestDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\GuestAccessRequirement.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\edazdarevic\commons\net\CIDRUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\GsonUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TagRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentScrapeResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\FixedAnnounceException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TorrentService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\APIGenericException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\ExamPlan.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\ptApplication.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ThanksRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TorrentInfoResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\listener\SaTokenEventListener.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidAnnounceException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\IPFormatRequirement.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserTinyResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\DebugController.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\PromotionResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\JacksonConfig.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ExamRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\BooleanUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AnnouncePerformanceMonitorService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\RESTException.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\advice\GlobalControllerAdvice.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\JetcacheConfig.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\promotion\PromotionController.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\RandomUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SecurityConfig.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\ScrapeContainerDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentUploadSuccessResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\RedisConfig.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\BencodeUtil.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PeersRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Tag.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserGroupResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PeerService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\UserRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\UserGroupRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\LoginHistoryRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\ThanksResponseDTO.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\SettingRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AnnounceService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TagService.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PromotionPolicyRepository.java
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\SafeHTMLConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\TopicViewId.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\TrackerException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\chat\dto\ChatMessageDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\PeerInfoResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TopicService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\TopicTag.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\objects\ResponsePojo.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserBasicResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ForumService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Peer.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\TorrentException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AnnouncePerformanceMonitorService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PostService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\SafeHTMLConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ExamPlanService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\MailConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentFileException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PostRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ForumRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\InfoHashUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\SafeUUID.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\LoginHistoryRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\ChatMessage.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\websocket\ChatRawWebSocketHandler.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\PostController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\AuthController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TagRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\SettingService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TorrentInfoResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\CategoryResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\CategoryRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\IPUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\JetcacheConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\APIErrorCode.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentUploadSuccessResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentSearchResultResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\AnnounceException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\BrowserReadableAnnounceException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\FixedAnnounceException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\category\CategoryController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserGroupResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\GsonUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\UserForumHistoryRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\PostLike.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\SaTokenConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Post.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\UserGroupService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\crontask\PeersCleanup.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\MiscUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\dto\request\RegisterRequestDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\UserGroupRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\advice\GlobalControllerAdvice.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\RandomUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\promotion\PromotionController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ShareRatioService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ClassUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Forum.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Torrent.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\BencodeUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\dto\request\LoginRequestDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\PrivacyLevel.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\TopicController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ByteUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\ForumTagController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\TopicSubscription.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\form\TorrentUploadForm.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\RetryableAnnounceException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ForumTagRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ExamRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PeersRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\BlacklistClientService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TopicViewService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\redisrepository\RedisLoginAttemptRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Exam.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\chat\ChatHistoryController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TagService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserSessionResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\UserForumHistoryController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\QuartzConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentVersionException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PromotionPolicyRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TopicSubscriptionService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Topic.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\ForumActionType.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\WorkDirectoryConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\WebSocketConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TopicTagRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AnnounceService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\edazdarevic\commons\net\CIDRUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\ExamPlan.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ExecutorUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ChatMessageRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TransferHistoryService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SaTokenHandshakeInterceptor.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ThanksRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\SaTokenPermImpl.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\UserService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TopicViewRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\LoginHistoryService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\PasswordHash.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TransferHistoryDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\UserForumHistory.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\HibernateSessionUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidAnnounceException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ExamPlanRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\LoginStatusResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentPiecesException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\RedisConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PeerService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\UserGroup.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\TorrentScrapeRequestDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\LoginType.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PromotionService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ThanksService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\GuestAccessRequirement.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\AnnounceBusyException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TorrentService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\JacksonConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\TopicSubscriptionController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\ScrapeContainerDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\UserForumHistoryService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TopicTagService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\RESTException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PermissionService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\APIGenericException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\ptApplication.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\SettingEntity.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\TopicSubscriptionId.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\GuestAccessBlocker.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\IpValidator.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\User.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\AnnounceEventType.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\EmptyTorrentFileException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\IPFormatRequirement.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TorrentRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentScrapeResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\PackUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\TorrentParser.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\URLEncodeUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\feed\FeedController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Tag.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\BooleanUtil.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Permission.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\ApiPrinter.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TopicRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AuthenticationService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ExamService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\redisentity\RedisLoginAttempt.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SiteBasicConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\listener\SaTokenEventListener.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\PostLikeController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\UserRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Category.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PostLikeRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\TransferHistory.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TorrentBasicResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ForumTagService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\TorrentController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\DebugController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PostLikeService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\SearchTorrentRequestDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\TrackerConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\SeedBox.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TopicSubscriptionRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Thanks.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\TorrentDownloadController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\TopicView.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TransferHistoryRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\AnnounceEventTypeConverter.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\BadConfigException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SecurityConfig.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\announce\AnnounceController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\ForumController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\CategoryService.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\PromotionPolicy.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\LoginHistory.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\TopicViewController.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\PromotionResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\SettingRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserTinyResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PermissionRepository.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\TopicTagId.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentVerifyException.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\ThanksResponseDTO.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\ForumTag.java
diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
index e72d29d..c88594e 100644
--- a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
+++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
@@ -1 +1 @@
-C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\test\java\com\github\example\pt\ptApplicationTests.java
+C:\Users\20815\PT_Sixth\PT_Sixth_Backend\src\test\java\com\github\example\pt\ptApplicationTests.java
diff --git a/target/surefire-reports/2025-06-06T13-53-41_147-jvmRun1.dump b/target/surefire-reports/2025-06-06T13-53-41_147-jvmRun1.dump
deleted file mode 100644
index 4636bb9..0000000
--- a/target/surefire-reports/2025-06-06T13-53-41_147-jvmRun1.dump
+++ /dev/null
@@ -1,14 +0,0 @@
-# Created at 2025-06-06T13:53:42.822
-System.exit() or native command error interrupted process checker.
-java.lang.IllegalStateException: Cannot use PPID 5704 process information. Going to use NOOP events.
- at org.apache.maven.surefire.booter.PpidChecker.checkProcessInfo(PpidChecker.java:155)
- at org.apache.maven.surefire.booter.PpidChecker.isProcessAlive(PpidChecker.java:116)
- at org.apache.maven.surefire.booter.ForkedBooter$2.run(ForkedBooter.java:214)
- at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
- at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
- at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
- at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
- at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
- at java.base/java.lang.Thread.run(Thread.java:840)
-
-
diff --git a/target/test-classes/com/github/example/pt/ptApplicationTests.class b/target/test-classes/com/github/example/pt/ptApplicationTests.class
index 6aad098..f4948e0 100644
--- a/target/test-classes/com/github/example/pt/ptApplicationTests.class
+++ b/target/test-classes/com/github/example/pt/ptApplicationTests.class
Binary files differ