fix: resolve JS-005, JS-006, SVC-006 architecture violations
- JS-005: Add initialization guards to email-templates.js (admin/vendor) - JS-006: Add try/catch error handling to content-pages.js init - SVC-006: Move db.commit() from services to endpoints for proper transaction control in email_template_service and vendor_team_service 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -220,7 +220,6 @@ class EmailTemplateService:
|
||||
template.body_html = body_html
|
||||
template.body_text = body_text
|
||||
|
||||
self.db.commit()
|
||||
logger.info(f"Updated platform template: {code}/{language}")
|
||||
|
||||
def preview_template(
|
||||
@@ -575,8 +574,6 @@ class EmailTemplateService:
|
||||
name=name,
|
||||
)
|
||||
|
||||
self.db.commit()
|
||||
|
||||
logger.info(f"Vendor {vendor_id} updated template override: {code}/{language}")
|
||||
|
||||
return {
|
||||
@@ -614,7 +611,6 @@ class EmailTemplateService:
|
||||
if not deleted:
|
||||
raise ResourceNotFoundException("No override found for this template and language")
|
||||
|
||||
self.db.commit()
|
||||
logger.info(f"Vendor {vendor_id} deleted template override: {code}/{language}")
|
||||
|
||||
def preview_vendor_template(
|
||||
|
||||
@@ -406,20 +406,65 @@ class VendorTeamService:
|
||||
"id": vu.user.id,
|
||||
"email": vu.user.email,
|
||||
"username": vu.user.username,
|
||||
"first_name": vu.user.first_name,
|
||||
"last_name": vu.user.last_name,
|
||||
"full_name": vu.user.full_name,
|
||||
"user_type": vu.user_type,
|
||||
"role": vu.role.name if vu.role else "owner",
|
||||
"role_name": vu.role.name if vu.role else "owner",
|
||||
"role_id": vu.role.id if vu.role else None,
|
||||
"permissions": vu.get_all_permissions(),
|
||||
"is_active": vu.is_active,
|
||||
"is_owner": vu.is_owner,
|
||||
"invitation_pending": vu.is_invitation_pending,
|
||||
"invited_at": vu.invitation_sent_at,
|
||||
"accepted_at": vu.invitation_accepted_at,
|
||||
"joined_at": vu.invitation_accepted_at or vu.created_at or vu.user.created_at,
|
||||
}
|
||||
)
|
||||
|
||||
return members
|
||||
|
||||
def get_vendor_roles(self, db: Session, vendor_id: int) -> list[dict[str, Any]]:
|
||||
"""
|
||||
Get all roles for a vendor.
|
||||
|
||||
Creates default preset roles if none exist.
|
||||
|
||||
Args:
|
||||
db: Database session
|
||||
vendor_id: Vendor ID
|
||||
|
||||
Returns:
|
||||
List of role info dicts
|
||||
"""
|
||||
roles = db.query(Role).filter(Role.vendor_id == vendor_id).all()
|
||||
|
||||
# Create default roles if none exist
|
||||
if not roles:
|
||||
default_role_names = ["manager", "staff", "support", "viewer", "marketing"]
|
||||
for role_name in default_role_names:
|
||||
permissions = list(get_preset_permissions(role_name))
|
||||
role = Role(
|
||||
vendor_id=vendor_id,
|
||||
name=role_name,
|
||||
permissions=permissions,
|
||||
)
|
||||
db.add(role)
|
||||
db.flush() # Flush to get IDs without committing (endpoint commits)
|
||||
roles = db.query(Role).filter(Role.vendor_id == vendor_id).all()
|
||||
|
||||
return [
|
||||
{
|
||||
"id": role.id,
|
||||
"name": role.name,
|
||||
"permissions": role.permissions or [],
|
||||
"vendor_id": role.vendor_id,
|
||||
"created_at": role.created_at,
|
||||
"updated_at": role.updated_at,
|
||||
}
|
||||
for role in roles
|
||||
]
|
||||
|
||||
# Private helper methods
|
||||
|
||||
def _generate_invitation_token(self) -> str:
|
||||
|
||||
Reference in New Issue
Block a user