Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(db): add audit log for database changes #5703

Closed
wants to merge 9 commits into from
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -220,3 +220,6 @@ components.d.ts

# Pyright
pyrightconfig.json

# Ignore Visual Studio Code settings
.vscode/
1 change: 1 addition & 0 deletions src/dispatch/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
from dispatch.forms.type.models import FormsType # noqa lgtm[py/unused-import]
from dispatch.forms.models import Forms # noqa lgtm[py/unused-import]
from dispatch.email_templates.models import EmailTemplates # noqa lgtm[py/unused-import]
from dispatch.audit.models import Audit # noqa lgtm[py/unused-import]


except Exception:
Expand Down
Empty file added src/dispatch/audit/__init__.py
Empty file.
42 changes: 42 additions & 0 deletions src/dispatch/audit/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from typing import Any, Optional

from sqlalchemy import Column, Integer, ForeignKey, String
from sqlalchemy.orm import relationship

from dispatch.auth.models import DispatchUser
from dispatch.database.base import Base
from sqlalchemy.dialects.postgresql import JSONB
from dispatch.models import DispatchBase, TimeStampMixin, PrimaryKey


class Audit(TimeStampMixin, Base):
# Columns
id = Column(Integer, primary_key=True)
record_id = Column(Integer, nullable=True)
table_name = Column(String, nullable=True)
changed_data = Column(JSONB, default={}, nullable=False, server_default="{}")
# Relationships
dispatch_user_id = Column(Integer, ForeignKey("dispatch_core.dispatch_user.id"), nullable=True)
dispatch_user = relationship(
"DispatchUser", back_populates="audits", foreign_keys=[dispatch_user_id], post_update=True
)


# Pydantic models
class AuditBase(DispatchBase):
record_id: int
table_name: Optional[str]
changed_data: Optional[dict[str, Any]] = {}


class AuditCreate(AuditBase):
dispatch_user: Optional[DispatchUser]


class AuditBaseUpdate(AuditBase):
dispatch_user = Optional[DispatchUser]


class AuditRead(AuditBase):
id: PrimaryKey
dispatch_user = Optional[DispatchUser]
3 changes: 2 additions & 1 deletion src/dispatch/auth/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
DISPATCH_JWT_ALG,
DISPATCH_JWT_EXP,
)
from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.enums import DispatchEnum, UserRoles
from dispatch.models import OrganizationSlug, PrimaryKey, TimeStampMixin, DispatchBase, Pagination
from dispatch.organization.models import Organization, OrganizationRead
Expand Down Expand Up @@ -60,6 +60,7 @@ class DispatchUser(Base, TimeStampMixin):

# relationships
events = relationship("Event", backref="dispatch_user")
audits = relationship("Audit", back_populates="dispatch_user")

search_vector = Column(
TSVectorType("email", regconfig="pg_catalog.simple", weights={"email": "A"})
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/case/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
CaseCostUpdate,
)
from dispatch.conversation.models import ConversationRead
from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.document.models import Document, DocumentRead
from dispatch.entity.models import EntityRead
from dispatch.enums import Visibility
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/case/priority/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from sqlalchemy.event import listen
from sqlalchemy_utils import TSVectorType

from dispatch.database.core import Base, ensure_unique_default_per_project
from dispatch.database.base import Base, ensure_unique_default_per_project
from dispatch.models import DispatchBase, NameStr, ProjectMixin, PrimaryKey, Pagination
from dispatch.project.models import ProjectRead

Expand Down
3 changes: 3 additions & 0 deletions src/dispatch/case/priority/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from fastapi import APIRouter, Depends, HTTPException, status

from dispatch.auth.service import CurrentUser
from dispatch.database.core import DbSession
from dispatch.database.service import CommonParameters, search_filter_sort_paginate
from dispatch.auth.permissions import SensitiveProjectActionPermission, PermissionsDependency
Expand Down Expand Up @@ -47,8 +48,10 @@ def update_case_priority(
db_session: DbSession,
case_priority_id: PrimaryKey,
case_priority_in: CasePriorityUpdate,
current_user: CurrentUser,
):
"""Updates an existing case priority."""
db_session.user = current_user
case_priority = get(db_session=db_session, case_priority_id=case_priority_id)
if not case_priority:
raise HTTPException(
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/case/severity/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from sqlalchemy.event import listen
from sqlalchemy_utils import TSVectorType

from dispatch.database.core import Base, ensure_unique_default_per_project
from dispatch.database.base import Base, ensure_unique_default_per_project
from dispatch.models import DispatchBase, NameStr, ProjectMixin, PrimaryKey, Pagination
from dispatch.project.models import ProjectRead

Expand Down
3 changes: 3 additions & 0 deletions src/dispatch/case/severity/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from fastapi import APIRouter, Depends, HTTPException, status

from dispatch.auth.service import CurrentUser
from dispatch.database.core import DbSession
from dispatch.database.service import CommonParameters, search_filter_sort_paginate
from dispatch.auth.permissions import SensitiveProjectActionPermission, PermissionsDependency
Expand Down Expand Up @@ -48,8 +49,10 @@ def update_case_severity(
db_session: DbSession,
case_severity_id: PrimaryKey,
case_severity_in: CaseSeverityUpdate,
current_user: CurrentUser,
):
"""Updates an existing case severity."""
db_session.user = current_user
case_severity = get(db_session=db_session, case_severity_id=case_severity_id)
if not case_severity:
raise HTTPException(
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/case/type/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from sqlalchemy_utils import TSVectorType

from dispatch.cost_model.models import CostModelRead
from dispatch.database.core import Base, ensure_unique_default_per_project
from dispatch.database.base import Base, ensure_unique_default_per_project
from dispatch.enums import Visibility
from dispatch.models import DispatchBase, NameStr, Pagination, PrimaryKey, ProjectMixin
from dispatch.plugin.models import PluginMetadata
Expand Down
3 changes: 3 additions & 0 deletions src/dispatch/case/type/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from fastapi import APIRouter, Depends, HTTPException, status

from dispatch.auth.service import CurrentUser
from dispatch.auth.permissions import SensitiveProjectActionPermission, PermissionsDependency
from dispatch.database.core import DbSession
from dispatch.database.service import CommonParameters, search_filter_sort_paginate
Expand Down Expand Up @@ -42,8 +43,10 @@ def update_case_type(
db_session: DbSession,
case_type_id: PrimaryKey,
case_type_in: CaseTypeUpdate,
current_user: CurrentUser,
):
"""Updates an existing case type."""
db_session.user = current_user
case_type = get(db_session=db_session, case_type_id=case_type_id)
if not case_type:
raise HTTPException(
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/case_cost/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from sqlalchemy.orm import relationship
from typing import List, Optional

from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.case_cost_type.models import CaseCostTypeRead
from dispatch.models import DispatchBase, Pagination, PrimaryKey, ProjectMixin, TimeStampMixin
from dispatch.project.models import ProjectRead
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/case_cost_type/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from sqlalchemy_utils import TSVectorType, JSONType

from dispatch.database.core import Base, ensure_unique_default_per_project
from dispatch.database.base import Base, ensure_unique_default_per_project
from dispatch.models import (
DispatchBase,
NameStr,
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/conference/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from pydantic import validator, Field
from sqlalchemy import Column, Integer, String, ForeignKey

from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.messaging.strings import INCIDENT_CONFERENCE_DESCRIPTION
from dispatch.models import ResourceBase, ResourceMixin

Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/conversation/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from sqlalchemy import Column, String, Integer, ForeignKey

from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.messaging.strings import INCIDENT_CONVERSATION_DESCRIPTION
from dispatch.models import ResourceBase, ResourceMixin, PrimaryKey

Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/cost_model/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from sqlalchemy_utils import TSVectorType
from typing import List, Optional

from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.models import (
DispatchBase,
NameStr,
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/data/alert/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy_utils import TSVectorType

from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.models import DispatchBase, TimeStampMixin, PrimaryKey, Pagination


Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/data/query/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from sqlalchemy.orm import relationship
from sqlalchemy_utils import TSVectorType

from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.models import (
DispatchBase,
ProjectMixin,
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/data/source/data_format/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from sqlalchemy_utils import TSVectorType

from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.models import DispatchBase, ProjectMixin, Pagination, PrimaryKey
from dispatch.project.models import ProjectRead

Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/data/source/environment/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from sqlalchemy_utils import TSVectorType

from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.models import DispatchBase, ProjectMixin, Pagination, PrimaryKey
from dispatch.project.models import ProjectRead

Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/data/source/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from sqlalchemy import UniqueConstraint

from sqlalchemy_utils import TSVectorType
from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.models import (
DispatchBase,
ProjectMixin,
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/data/source/status/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from sqlalchemy_utils import TSVectorType

from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.models import DispatchBase, ProjectMixin, Pagination, PrimaryKey
from dispatch.project.models import ProjectRead

Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/data/source/transport/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from sqlalchemy_utils import TSVectorType

from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.models import DispatchBase, ProjectMixin, Pagination, PrimaryKey
from dispatch.project.models import ProjectRead

Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/data/source/type/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from sqlalchemy_utils import TSVectorType

from dispatch.database.core import Base
from dispatch.database.base import Base
from dispatch.models import DispatchBase, ProjectMixin, Pagination, PrimaryKey
from dispatch.project.models import ProjectRead

Expand Down
Loading
Loading