Skip to content

Commit 807740e

Browse files
authored
Merge pull request #11 from devchat-ai/feat-diff
feat: add topic delete logic
2 parents 24e0891 + 1203de9 commit 807740e

6 files changed

Lines changed: 178 additions & 32 deletions

File tree

api/topic.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,54 @@
4848
}
4949
```
5050

51+
## Delete Topic
52+
53+
### JS to Java
54+
55+
```json
56+
{
57+
"action": "deleteTopic/request",
58+
"metadata": {
59+
"callback": "responseFunctionName"
60+
},
61+
"payload": {
62+
"topicHash": "xxx"
63+
}
64+
}
65+
```
66+
67+
### Java to JS
68+
69+
- success
70+
71+
```json
72+
{
73+
"action": "deleteTopic/response",
74+
"metadata": {
75+
"status": "success",
76+
"error": ""
77+
},
78+
"payload": {
79+
"topicHash": "xxx"
80+
}
81+
}
82+
```
83+
84+
- failed
85+
86+
```json
87+
{
88+
"action": "deleteTopic/response",
89+
"metadata": {
90+
"status": "failed",
91+
"error": "xxx"
92+
},
93+
"payload": {
94+
"topicHash": "xxx"
95+
}
96+
}
97+
```
98+
5199
## Query Topic History Conversations
52100

53101
### JS to Java

src/main/java/ai/devchat/devchat/ActionHandlerFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public class ActionHandlerFactory {
2727
put(DevChatActions.UPDATE_SETTING_REQUEST, UpdateSettingRequestHandler.class);
2828
put(DevChatActions.SHOW_SETTING_DIALOG_REQUEST, ShowSettingDialogRequestHandler.class);
2929
put(DevChatActions.DELETE_LAST_CONVERSATION_REQUEST, DeleteLastConversationRequestHandler.class);
30+
put(DevChatActions.DELETE_TOPIC_REQUEST, DeleteTopicRequestHandler.class);
3031
}
3132
};
3233

src/main/java/ai/devchat/devchat/DevChatActions.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,6 @@ public class DevChatActions {
3535
public static final String SHOW_SETTING_DIALOG_REQUEST = "showSettingDialog/request";
3636
public static final String DELETE_LAST_CONVERSATION_REQUEST = "deleteLastConversation/request";
3737
public static final String DELETE_LAST_CONVERSATION_RESPONSE = "deleteLastConversation/response";
38+
public static final String DELETE_TOPIC_REQUEST = "deleteTopic/request";
39+
public static final String DELETE_TOPIC_RESPONSE = "deleteTopic/response";
3840
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package ai.devchat.devchat.handler;
2+
3+
import ai.devchat.devchat.ActionHandler;
4+
import ai.devchat.devchat.DevChatActionHandler;
5+
import ai.devchat.devchat.DevChatActions;
6+
import ai.devchat.idea.storage.DeletedTopicsState;
7+
import com.alibaba.fastjson.JSONObject;
8+
9+
public class DeleteTopicRequestHandler implements ActionHandler {
10+
private JSONObject metadata;
11+
private JSONObject payload;
12+
private final DevChatActionHandler devChatActionHandler;
13+
14+
public DeleteTopicRequestHandler(DevChatActionHandler devChatActionHandler) {
15+
this.devChatActionHandler = devChatActionHandler;
16+
}
17+
18+
@Override
19+
public void executeAction() {
20+
String callbackFunc = metadata.getString("callback");
21+
String topicHash = payload.getString("topicHash");
22+
23+
DeletedTopicsState state = DeletedTopicsState.getInstance();
24+
25+
if (!state.deletedTopicHashes.contains(topicHash)) {
26+
state.deletedTopicHashes.add(topicHash);
27+
}
28+
29+
devChatActionHandler.sendResponse(DevChatActions.DELETE_TOPIC_RESPONSE, callbackFunc, (metadata, payload) -> {
30+
metadata.put("status", "success");
31+
metadata.put("error", "");
32+
payload.put("topicHash", topicHash);
33+
});
34+
}
35+
36+
@Override
37+
public void setMetadata(JSONObject metadata) {
38+
this.metadata = metadata;
39+
}
40+
41+
@Override
42+
public void setPayload(JSONObject payload) {
43+
this.payload = payload;
44+
}
45+
}

src/main/java/ai/devchat/devchat/handler/ListTopicsRequestHandler.java

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
import ai.devchat.devchat.ActionHandler;
77
import ai.devchat.devchat.DevChatActionHandler;
88
import ai.devchat.devchat.DevChatActions;
9+
import ai.devchat.idea.storage.DeletedTopicsState;
910

1011
import com.alibaba.fastjson.JSONArray;
1112
import com.alibaba.fastjson.JSONObject;
1213

14+
import java.util.List;
15+
1316
public class ListTopicsRequestHandler implements ActionHandler {
1417
private JSONObject metadata;
1518
private JSONObject payload;
@@ -26,43 +29,58 @@ public void executeAction() {
2629
String callbackFunc = metadata.getString("callback");
2730
try {
2831
DevChatWrapper devchatWrapper = new DevChatWrapper(DevChatPathUtil.getDevchatBinPath());
29-
/* topics format:
30-
[
31-
{
32-
"root_prompt": {
33-
"user": "Daniel Hu <tao.hu@merico.dev>",
34-
"date": 1698828624,
35-
"context": [
36-
{
37-
"content": "{\"languageId\":\"python\",\"path\":\"a.py\",\"startLine\":0,\"content\":\"adkfjj\\n\"}",
38-
"role": "system"
39-
}
40-
],
41-
"request": "hello",
42-
"responses": [
43-
"Hi there! How can I assist you with Python today?"
44-
],
45-
"request_tokens": 46,
46-
"response_tokens": 22,
47-
"hash": "596cf7c60a936e33409c71b67ba7f9903886bbeb7c7d2aacf6d1556b0831f04b",
48-
"parent": null
49-
},
50-
"latest_time": 1698828867,
51-
"title": null,
52-
"hidden": false
53-
}
54-
]
32+
/*
33+
* topics format:
34+
* [
35+
* {
36+
* "root_prompt": {
37+
* "user": "Daniel Hu <tao.hu@merico.dev>",
38+
* "date": 1698828624,
39+
* "context": [
40+
* {
41+
* "content":
42+
* "{\"languageId\":\"python\",\"path\":\"a.py\",\"startLine\":0,\"content\":\"adkfjj\\n\"}",
43+
* "role": "system"
44+
* }
45+
* ],
46+
* "request": "hello",
47+
* "responses": [
48+
* "Hi there! How can I assist you with Python today?"
49+
* ],
50+
* "request_tokens": 46,
51+
* "response_tokens": 22,
52+
* "hash": "596cf7c60a936e33409c71b67ba7f9903886bbeb7c7d2aacf6d1556b0831f04b",
53+
* "parent": null
54+
* },
55+
* "latest_time": 1698828867,
56+
* "title": null,
57+
* "hidden": false
58+
* }
59+
* ]
5560
*/
5661
JSONArray topics = devchatWrapper.listTopics();
57-
// remove request_tokens and response_tokens in the topics object, then update title field.
62+
63+
// Get deleted topics hash list
64+
DeletedTopicsState deletedTopicsState = DeletedTopicsState.getInstance();
65+
List<String> deletedTopicHashes = deletedTopicsState.deletedTopicHashes;
66+
67+
// Filter out deleted topics
68+
JSONArray filteredTopics = new JSONArray();
69+
// remove request_tokens and response_tokens in the topics object, then update
70+
// title field.
5871
for (int i = 0; i < topics.size(); i++) {
5972
JSONObject topic = topics.getJSONObject(i);
60-
topic.remove("latest_time");
61-
topic.remove("hidden");
62-
// set title = root_prompt.request + "-" + root_prompt.responses[0]
6373
JSONObject rootPrompt = topic.getJSONObject("root_prompt");
64-
String title = rootPrompt.getString("request") + "-" + rootPrompt.getJSONArray("responses").getString(0);
65-
rootPrompt.put("title", title);
74+
String topicHash = rootPrompt.getString("hash");
75+
76+
if (!deletedTopicHashes.contains(topicHash)) {
77+
// set title = root_prompt.request + "-" + root_prompt.responses[0]
78+
String title = rootPrompt.getString("request") + "-"
79+
+ rootPrompt.getJSONArray("responses").getString(0);
80+
rootPrompt.put("title", title);
81+
82+
filteredTopics.add(topic);
83+
}
6684
}
6785

6886
devChatActionHandler.sendResponse(DevChatActions.LIST_TOPICS_RESPONSE, callbackFunc, (metadata, payload) -> {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package ai.devchat.idea.storage;
2+
3+
import com.intellij.openapi.components.PersistentStateComponent;
4+
import com.intellij.openapi.components.ServiceManager;
5+
import com.intellij.openapi.components.State;
6+
import com.intellij.openapi.components.Storage;
7+
import com.intellij.util.xmlb.XmlSerializerUtil;
8+
import org.jetbrains.annotations.NotNull;
9+
import org.jetbrains.annotations.Nullable;
10+
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
14+
@State(name = "ai.devchat.devchat.DeletedTopicsState", storages = @Storage("deletedTopics.xml"))
15+
public class DeletedTopicsState implements PersistentStateComponent<DeletedTopicsState> {
16+
public List<String> deletedTopicHashes = new ArrayList<>();
17+
18+
public static DeletedTopicsState getInstance() {
19+
return ServiceManager.getService(DeletedTopicsState.class);
20+
}
21+
22+
@Nullable
23+
@Override
24+
public DeletedTopicsState getState() {
25+
return this;
26+
}
27+
28+
@Override
29+
public void loadState(@NotNull DeletedTopicsState state) {
30+
XmlSerializerUtil.copyBean(state, this);
31+
}
32+
}

0 commit comments

Comments
 (0)