Skip to content

Commit c8ab7f4

Browse files
committed
feat(auditlog): Add audit logs for file create/delete
1 parent 77c3517 commit c8ab7f4

4 files changed

Lines changed: 67 additions & 1 deletion

File tree

invenio_rdm_records/auditlog/actions.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
Grant,
1919
)
2020

21-
from .context import LogChangesContext, ResourceDataContext
21+
from .context import FileContext, LogChangesContext, ResourceDataContext
2222

2323

2424
class ParentBaseAuditLog(BaseAuditLog):
@@ -128,3 +128,32 @@ class RDMDraftAccessSettingsAuditLog(RDMRecordAccessSettingsAuditLog):
128128
message_template = _(
129129
"User {user_id} updated access settings of {resource_type} {resource_id} via draft."
130130
)
131+
132+
133+
class FileCreateAuditLog(BaseAuditLog):
134+
"""Audit log for file create."""
135+
136+
resource_type = "draft"
137+
138+
context = BaseAuditLog.context + [
139+
FileContext(),
140+
]
141+
142+
id = "file.create"
143+
message_template = _(
144+
"User {user_id} created file {file_key} of {resource_type} {resource_id}."
145+
)
146+
147+
metadata_schema = {
148+
**BaseAuditLog.metadata_schema,
149+
"file_key": ma.fields.String(required=True),
150+
}
151+
152+
153+
class FileDeleteAuditLog(FileCreateAuditLog):
154+
"""Audit log for file delete."""
155+
156+
id = "file.delete"
157+
message_template = _(
158+
"User {user_id} deleted file {file_key} of {resource_type} {resource_id}."
159+
)

invenio_rdm_records/auditlog/context.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,12 @@ def __call__(self, data, **kwargs):
3838
"type": "draft" if isinstance(resource, RDMDraft) else "record",
3939
}
4040
dict_set(data, "metadata.triggered_by", triggered_by)
41+
42+
43+
class FileContext(object):
44+
"""Payload generator for setting file data."""
45+
46+
def __call__(self, data, **kwargs):
47+
"""Update data with file data."""
48+
file_key = kwargs.get("file_key", None)
49+
dict_set(data, "metadata.file_key", file_key)

invenio_rdm_records/services/files/service.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,14 @@
77

88
"""File Service API."""
99

10+
from invenio_audit_logs.services.uow import AuditLogOp
1011
from invenio_records_resources.services import FileService
12+
from invenio_records_resources.services.uow import unit_of_work
1113

14+
from invenio_rdm_records.auditlog.actions import (
15+
FileCreateAuditLog,
16+
FileDeleteAuditLog,
17+
)
1218
from invenio_rdm_records.services.errors import RecordDeletedException
1319

1420

@@ -32,3 +38,23 @@ def _get_record(self, id_, identity, action, file_key=None):
3238
self._check_record_deleted_permissions(record, identity)
3339

3440
return record
41+
42+
@unit_of_work()
43+
def commit_file(self, identity, id_, file_key, uow=None):
44+
"""Commit a file upload."""
45+
result = super().commit_file(identity, id_, file_key, uow=uow)
46+
47+
uow.register(
48+
AuditLogOp(FileCreateAuditLog.build(identity, id_, file_key=file_key))
49+
) # Added here as audit logs can't be added to invenio-records-resources
50+
return result
51+
52+
@unit_of_work()
53+
def delete_file(self, identity, id_, file_key, uow=None):
54+
"""Delete a file."""
55+
result = super().delete_file(identity, id_, file_key, uow=uow)
56+
57+
uow.register(
58+
AuditLogOp(FileDeleteAuditLog.build(identity, id_, file_key=file_key))
59+
) # Added here as audit logs can't be added to invenio-records-resources
60+
return result

setup.cfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ invenio_audit_logs.actions =
154154
draft.secret_link_update = invenio_rdm_records.auditlog.actions:RDMDraftSecretLinkAuditLog
155155
record.access_settings_update = invenio_rdm_records.auditlog.actions:RDMRecordAccessSettingsAuditLog
156156
draft.access_settings_update = invenio_rdm_records.auditlog.actions:RDMDraftAccessSettingsAuditLog
157+
file.create = invenio_rdm_records.auditlog.actions:FileCreateAuditLog
158+
file.delete = invenio_rdm_records.auditlog.actions:FileDeleteAuditLog
157159

158160
[build_sphinx]
159161
source-dir = docs/

0 commit comments

Comments
 (0)