Skip to content
This repository was archived by the owner on Jul 22, 2025. It is now read-only.

Commit 453ff2d

Browse files
committed
Naming and delete support
1 parent 5856d2e commit 453ff2d

File tree

6 files changed

+490
-49
lines changed

6 files changed

+490
-49
lines changed

ai_artifact_key_value_api_spec.rb

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# frozen_string_literal: true
2+
3+
RSpec.describe "AI Artifact Key-Value API", type: :system, js: true do
4+
fab!(:user)
5+
fab!(:private_message_topic) { Fabricate(:private_message_topic, user: user) }
6+
fab!(:private_message_post) { Fabricate(:post, topic: private_message_topic, user: user) }
7+
fab!(:artifact) do
8+
Fabricate(
9+
:ai_artifact,
10+
post: private_message_post,
11+
metadata: {
12+
public: true,
13+
},
14+
html: '<div id="log">Artifact Loaded</div>',
15+
js: <<~JS,
16+
const logElement = document.getElementById('log');
17+
18+
window.addEventListener('load', async function() {
19+
try {
20+
logElement.innerHTML = "TESTING KEY-VALUE API...";
21+
const log = [];
22+
await window.discourseArtifact.set('test_key', 'test_value');
23+
log.push('Set operation completed');
24+
logElement.innerHTML = log.join('<br>');
25+
26+
const value = await window.discourseArtifact.get('test_key');
27+
log.push('Got value:' + value);
28+
29+
await window.discourseArtifact.delete('test_key');
30+
log.push('Delete operation completed');
31+
32+
const deletedValue = await window.discourseArtifact.get('test_key');
33+
log.push('Deleted value should be null:' + deletedValue);
34+
35+
logElement.innerHTML = log.join('<br>');
36+
logElement.setAttribute('data-test-complete', 'true');
37+
} catch (error) {
38+
logElement.innerHTML = error.message;
39+
logElement.setAttribute('data-test-error', 'true');
40+
}
41+
});
42+
JS
43+
)
44+
end
45+
46+
before do
47+
SiteSetting.discourse_ai_enabled = true
48+
SiteSetting.ai_bot_enabled = true
49+
sign_in(user)
50+
end
51+
52+
it "provides working key-value API in artifact JavaScript" do
53+
visit "/discourse-ai/ai-bot/artifacts/#{artifact.id}"
54+
55+
within_frame(find("iframe")) do
56+
expect(page).to have_selector("#log", wait: 10)
57+
expect(page).to have_selector("#log[data-test-complete='true']", wait: 15)
58+
expect(page).not_to have_selector("#log[data-test-error]")
59+
end
60+
61+
expect(artifact.key_values.find_by(key: "test_key", user: user)).to be_nil
62+
end
63+
end

app/controllers/discourse_ai/ai_bot/artifact_key_values_controller.rb

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module DiscourseAi
44
module AiBot
55
class ArtifactKeyValuesController < ::ApplicationController
66
requires_plugin DiscourseAi::PLUGIN_NAME
7-
before_action :ensure_logged_in, only: %i[create]
7+
before_action :ensure_logged_in, only: %i[set destroy]
88
before_action :find_artifact
99

1010
PER_PAGE_MAX = 100
@@ -40,9 +40,31 @@ def index
4040
}
4141
end
4242

43-
def create
44-
key_value = @artifact.key_values.build(key_value_params)
45-
key_value.user = current_user
43+
def destroy
44+
if params[:key].blank?
45+
render json: { error: "Key parameter is required" }, status: :bad_request
46+
return
47+
end
48+
49+
key_value = @artifact.key_values.find_by(user_id: current_user.id, key: params[:key])
50+
51+
if key_value.nil?
52+
render json: { error: "Key not found" }, status: :not_found
53+
elsif key_value.destroy
54+
head :ok
55+
else
56+
render json: { errors: key_value.errors.full_messages }, status: :unprocessable_entity
57+
end
58+
end
59+
60+
def set
61+
key_value =
62+
@artifact.key_values.find_or_initialize_by(
63+
user: current_user,
64+
key: key_value_params[:key],
65+
)
66+
67+
key_value.assign_attributes(key_value_params.except(:key))
4668

4769
if key_value.save
4870
render json: AiArtifactKeyValueSerializer.new(key_value).as_json

0 commit comments

Comments
 (0)