Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/conode/application/attach_node_to_group/attach_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ class AttachNodeInteractor:
company_repository: CompanyRepository

async def execute(self, request: AttachNodeRequestDTO) -> list[NodeAssociation]:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
group = await self.group_repository.get_by_id(request.group_id)

request_nodes = set(request.nodes)
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/detach_node_from_group/detach_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ class DetachNodeInteractor:
company_repository: CompanyRepository

async def execute(self, association_id: NodeAssociationId) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
association = await self.node_association_repository.get_by_id(
association_id,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class UserMeta(TypedDict):
last_name: str
email: str
username: str
email_verified: bool


class TokenManagerResponse(NamedTuple):
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_company/update_company.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ class UpdateCompanyInteractor:
async def execute(
self, company_id: CompanyId, request: UpdateCompanyRequestDTO
) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
company = await self.company_repository.get_by_id(company_id)

await self.access_control_service.ensure_user_can_manipulate_company(
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_context/create_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ class CreateContextInteractor:
access_control_service: AccessControlService

async def execute(self, request: CreateContextRequestDTO) -> Context:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
company = await self.company_repository.get_by_id(request.company_id)

await self.access_control_service.ensure_user_can_create_contexts(
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_context/delete_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ class DeleteContextInteractor:
transaction_manager: TransactionManager

async def execute(self, context_id: ContextId) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
context = await self.context_repository.get_by_id(context_id)

await self.access_control_service.ensure_user_can_manipulate_context(
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_edge/create_edge.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ class CreateEdgeInteractor:
edge_repository: EdgeRepository

async def execute(self, request: CreateEdgeRequestDTO) -> Edge:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
context = await self.context_repository.get_by_id(request.context_id)
company = await self.company_repository.get_by_id(context.company_id)

Expand Down
3 changes: 2 additions & 1 deletion src/conode/application/manage_edge/delete_edge.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ class DeleteEdgeInteractor:
context_repository: ContextRepository

async def execute(self, edge_id: EdgeId) -> None:
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
edge = await self.edge_repository.get_by_id(edge_id)
context = await self.context_repository.get_by_id(edge.context_id)

Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_group/create_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ class CreateGroupInteractor:
access_control_service: AccessControlService

async def execute(self, request: CreateGroupRequestDTO) -> Group:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
company = await self.company_repository.get_by_id(request.company_id)

await self.access_control_service.ensure_user_can_create_groups(
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_group/delete_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ class DeleteGroupInteractor:
access_control_service: AccessControlService

async def execute(self, group_id: GroupId) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
group = await self.group_repository.get_by_id(group_id)

await self.access_control_service.ensure_user_can_manipulate_group(
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_node/create_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ class CreateNodeInteractor:
access_control_service: AccessControlService

async def execute(self, request: CreateNodeRequestDTO) -> Node:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
group = await self.group_repository.get_by_id(request.group_id)
company = await self.company_repository.get_by_id(group.company_id)

Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_node/delete_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ class DeleteNodeInteractor:
access_control_service: AccessControlService

async def execute(self, node_id: NodeId) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
node = await self.node_repository.get_by_id(node_id)

existing_associations = (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ class UpdateCurrentUserProfileInteractor:
access_control_service: AccessControlService

async def execute(self, request: UpdateCurrentUserProfileRequestDTO) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
user.update_profile(
first_name=request.first_name,
last_name=request.last_name,
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_profile/update_user_profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ class UpdateUserProfileInteractor:
async def execute(
self, user_id: UserId, request: UpdateUserProfileRequestDTO
) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
if user.id == user_id:
target = user
else:
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_role/create_role.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ class CreateRoleInteractor:
role_permissions_repository: RolePermissionsRepository

async def execute(self, request: CreateRoleRequestDTO) -> Role:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
company = await self.company_repository.get_by_id(request.company_id)

await self.access_control_service.ensure_user_can_create_roles(
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_role/delete_role.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ class DeleteRoleInteractor:
access_control_service: AccessControlService

async def execute(self, role_id: RoleId) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
role = await self.role_repository.get_by_id(role_id)

await self.access_control_service.ensure_user_can_manipulate_role(
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/manage_role/update_role.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ class UpdateRoleInteractor:
role_repository: RoleRepository

async def execute(self, request: UpdateRoleRequestDTO) -> UpdateRoleResponseDTO:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
role = await self.role_repository.get_by_id(request.role_id)

await self.access_control_service.ensure_user_can_manipulate_role(
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/register_company/register_company.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ class RegisterCompanyInteractor:
role_repository: RoleRepository

async def execute(self, request: RegisterCompanyRequestDTO) -> Company:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
company = Company.new(
company_id=CompanyId(uuid4()),
name=request.name,
Expand Down
9 changes: 6 additions & 3 deletions src/conode/application/services/access_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
RolePermission,
RolePermissionEntityId,
)
from conode.domain.user import Email, User, UserId, UserSystemRole
from conode.domain.user import Email, User, UserId

type RolesPermissions = list[RolePermission]

Expand Down Expand Up @@ -55,8 +55,8 @@ async def get_authorized_user(self) -> User:
meta = self.identity_provider.get_current_user_meta()

user = await self.user_repository.get_by_email(Email(meta["email"]))
if user is None:
async with self.transaction_manager:
async with self.transaction_manager:
if user is None:
user = User.new(
user_id=UserId(uuid4()),
first_name=meta["first_name"],
Expand All @@ -67,6 +67,9 @@ async def get_authorized_user(self) -> User:
)
await self.user_repository.create(user)

user.email_verified = meta["email_verified"]
await self.user_repository.update(user)

return user

def check(
Expand Down
3 changes: 2 additions & 1 deletion src/conode/application/share_graph/accept_offer.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@ class AcceptOfferInteractor:
offer_context_repository: OfferContextRepository

async def execute(self, offer_id: OfferId) -> Contract:
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
offer = await self.offer_repository.get_by_id(offer_id)

offer_from_company, offer_to_company = await self._get_offer_companies(
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/share_graph/decline_offer.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ class DeclineOfferInteractor:
company_repository: CompanyRepository

async def execute(self, offer_id: OfferId) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
offer = await self.offer_repository.get_by_id(offer_id)
company = await self.company_repository.get_by_id(offer.to_company_id)

Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/share_graph/send_offer_to_company.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ class SendOfferToCompanyInteractor:
context_repository: ContextRepository

async def execute(self, request: SendOfferToCompanyRequestDTO) -> Offer:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
from_company, to_company = (
await self.company_repository.get_by_id(request.from_company_id),
await self.company_repository.get_by_id(request.to_company_id),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ class DecrementEdgeWeightInteractor:
access_control_service: AccessControlService

async def execute(self, edge_id: EdgeId) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
edge = await self.edge_repository.get_by_id(edge_id)
context = await self.context_repository.get_by_id(edge.context_id)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ class IncrementEdgeWeightInteractor:
context_repository: ContextRepository

async def execute(self, edge_id: EdgeId) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
edge = await self.edge_repository.get_by_id(edge_id)
context = await self.context_repository.get_by_id(edge.context_id)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ class UpdateEdgeWeightInteractor:
context_repository: ContextRepository

async def execute(self, edge_id: EdgeId, weight: float) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
edge = await self.edge_repository.get_by_id(edge_id)
context = await self.context_repository.get_by_id(edge.context_id)

Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/update_node/update_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ class UpdateNodeInteractor:
transaction_manager: TransactionManager

async def execute(self, request: UpdateNodeRequestDTO) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
node = await self.node_repository.get_by_id(request.node_id)

existing_associations = (
Expand Down
4 changes: 2 additions & 2 deletions src/conode/application/verify_company/verify_company.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ class VerifyCompanyInteractor:
access_control_service: AccessControlService

async def execute(self, company_id: CompanyId) -> None:
async with self.transaction_manager:
user = await self.access_control_service.get_authorized_user()
user = await self.access_control_service.get_authorized_user()

async with self.transaction_manager:
self.access_control_service.ensure_user_can_verify_companies(user)

company = await self.company_repository.get_by_id(company_id)
Expand Down
2 changes: 2 additions & 0 deletions src/conode/domain/user/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ class User(Entity[UserId]):
first_name: FirstName
last_name: LastName
username: Username
email_verified: bool
email: Email
bio: Bio

Expand All @@ -135,6 +136,7 @@ def new(
last_name=LastName(last_name),
username=Username(username),
email=Email(email),
email_verified=False,
system_role=UserSystemRole.USER,
created_at=now,
updated_at=now,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""email-flag

Revision ID: d196baf978b0
Revises: 4574d0b1f6b0
Create Date: 2026-08-11 15:58:28.896881

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'd196baf978b0'
down_revision: Union[str, Sequence[str], None] = '4574d0b1f6b0'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('user_record', sa.Column('email_verified', sa.Boolean(), nullable=False))
# ### end Alembic commands ###


def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('user_record', 'email_verified')
# ### end Alembic commands ###
1 change: 1 addition & 0 deletions src/conode/infrastructure/persistence/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
Column("username", UsernameType, nullable=False),
Column("last_name", LastNameType, nullable=False),
Column("first_name", FirstNameType, nullable=False),
Column("email_verified", Boolean, nullable=False),
Column("email", EmailType, nullable=False),
Column("bio", BioType, nullable=False),
Column("created_at", DateTime(timezone=True), nullable=False),
Expand Down
Loading
Loading