Skip to content

Commit 1685fe0

Browse files
chore(CE): Add Audit to Workspace Controller (#640)
* Resolve conflict in cherry-pick of cd1bbac and change the commit message * chore(CE): Resolve conflict --------- Co-authored-by: TivonB-AI2 <[email protected]> Co-authored-by: TivonB-AI2 <[email protected]>
1 parent 34e4704 commit 1685fe0

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

server/app/controllers/api/v1/workspaces_controller.rb

+19
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ module Api
55
module V1
66
class WorkspacesController < ApplicationController
77
include Workspaces
8+
include AuditLogger
9+
include ResourceLinkBuilder
810
skip_after_action :verify_authorized, only: %i[index show]
11+
after_action :create_audit_log, only: %i[create update]
912

1013
def index
1114
result = ListAll.call(user: current_user)
@@ -31,6 +34,10 @@ def create
3134
result = Create.call(user: current_user, workspace_params:)
3235
if result.success?
3336
@workspace = result.workspace
37+
@audit_resource = @workspace.name
38+
@resource_id = @workspace.id
39+
@payload = workspace_params
40+
authorize @workspace
3441
render json: result.workspace, status: :created
3542
else
3643
render_error(
@@ -46,6 +53,9 @@ def update
4653
result = Update.call(id: params[:id], user: current_user, workspace_params:)
4754
if result.success?
4855
@workspace = result.workspace
56+
@audit_resource = @workspace.name
57+
@payload = workspace_params
58+
authorize @workspace
4959
render json: @workspace, status: :ok
5060
else
5161
render_error(
@@ -58,6 +68,9 @@ def update
5868

5969
def destroy
6070
authorize current_workspace, policy_class: WorkspacePolicy
71+
action = "delete"
72+
resource = current_user.workspaces.find_by(id: params[:id]).name
73+
audit!(action:, resource_id: params[:id], resource:)
6174
result = Workspaces::Delete.call(id: params[:id], user: current_user)
6275
if result.success?
6376
head :no_content
@@ -72,6 +85,12 @@ def destroy
7285

7386
private
7487

88+
def create_audit_log
89+
resource_id = @resource_id || params[:id]
90+
resource_link = build_link!(resource_id:)
91+
audit!(action: @action, resource_id:, resource: @audit_resource, payload: @payload, resource_link:)
92+
end
93+
7594
def workspace_params
7695
params.require(:workspace).permit(:name, :organization_id, :description, :region)
7796
end

server/spec/requests/api/v1/workspaces_controller_spec.rb

+48
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,18 @@
160160
.to eq(request_body.dig(:workspace, :organization_id))
161161
expect(response_hash.dig(:data, :attributes, :members_count))
162162
.to eq(workspace.users.count)
163+
164+
audit_log = AuditLog.last
165+
expect(audit_log).not_to be_nil
166+
expect(audit_log.user_id).to eq(user.id)
167+
expect(audit_log.action).to eq("create")
168+
expect(audit_log.resource_type).to eq("Workspace")
169+
expect(audit_log.resource_id).to eq(response_hash.dig(:data, :id).to_i)
170+
expect(audit_log.resource).to eq(response_hash.dig(:data, :attributes, :name))
171+
expect(audit_log.workspace_id).to eq(workspace_id)
172+
expect(audit_log.resource_link).to eq("/reports/#{response_hash.dig(:data, :id)}")
173+
expect(audit_log.created_at).not_to be_nil
174+
expect(audit_log.updated_at).not_to be_nil
163175
end
164176

165177
it "creates a new workspace and returns success for member_role" do
@@ -216,6 +228,18 @@
216228
expect(response_hash.dig(:data, :attributes, :name)).to eq("test")
217229
expect(response_hash.dig(:data, :attributes, :description)).to eq("workspace description changes")
218230
expect(response_hash.dig(:data, :attributes, :region)).to eq("us-west2")
231+
232+
audit_log = AuditLog.last
233+
expect(audit_log).not_to be_nil
234+
expect(audit_log.user_id).to eq(user.id)
235+
expect(audit_log.action).to eq("update")
236+
expect(audit_log.resource_type).to eq("Workspace")
237+
expect(audit_log.resource_id).to eq(response_hash.dig(:data, :id).to_i)
238+
expect(audit_log.resource).to eq(response_hash.dig(:data, :attributes, :name))
239+
expect(audit_log.workspace_id).to eq(workspace_id)
240+
expect(audit_log.resource_link).to eq("/reports/#{response_hash.dig(:data, :id)}")
241+
expect(audit_log.created_at).not_to be_nil
242+
expect(audit_log.updated_at).not_to be_nil
219243
end
220244

221245
it "updates the workspace and returns success if slug is missing" do
@@ -230,6 +254,18 @@
230254
expect(response_hash.dig(:data, :attributes, :name)).to eq("test")
231255
expect(response_hash.dig(:data, :attributes, :description)).to eq("workspace description changes")
232256
expect(response_hash.dig(:data, :attributes, :region)).to eq("us-west2")
257+
258+
audit_log = AuditLog.last
259+
expect(audit_log).not_to be_nil
260+
expect(audit_log.user_id).to eq(user.id)
261+
expect(audit_log.action).to eq("update")
262+
expect(audit_log.resource_type).to eq("Workspace")
263+
expect(audit_log.resource_id).to eq(response_hash.dig(:data, :id).to_i)
264+
expect(audit_log.resource).to eq(response_hash.dig(:data, :attributes, :name))
265+
expect(audit_log.workspace_id).to eq(workspace_id)
266+
expect(audit_log.resource_link).to eq("/reports/#{response_hash.dig(:data, :id)}")
267+
expect(audit_log.created_at).not_to be_nil
268+
expect(audit_log.updated_at).not_to be_nil
233269
end
234270

235271
it "updates the workspace and returns success for viewer_role" do
@@ -275,6 +311,18 @@
275311
it "returns success and delete workspace" do
276312
delete "/api/v1/workspaces/#{workspace.id}", headers: auth_headers(user, workspace_id)
277313
expect(response).to have_http_status(:no_content)
314+
315+
audit_log = AuditLog.last
316+
expect(audit_log).not_to be_nil
317+
expect(audit_log.user_id).to eq(user.id)
318+
expect(audit_log.action).to eq("delete")
319+
expect(audit_log.resource_type).to eq("Workspace")
320+
expect(audit_log.resource_id).to eq(workspace_id)
321+
expect(audit_log.resource).to eq(workspace.name)
322+
expect(audit_log.workspace_id).to eq(nil)
323+
expect(audit_log.resource_link).to eq(nil)
324+
expect(audit_log.created_at).not_to be_nil
325+
expect(audit_log.updated_at).not_to be_nil
278326
end
279327

280328
it "returns success and delete workspace for viewer_role" do

0 commit comments

Comments
 (0)