| 104 | |
| 105 | |
| 106 | async def create_usergroup( |
| 107 | request: Request, |
| 108 | db_session: AsyncSession, |
| 109 | current_user: PublicUser | AnonymousUser, |
| 110 | usergroup_create: UserGroupCreate, |
| 111 | ) -> UserGroupRead: |
| 112 | |
| 113 | from src.security.auth import resolve_acting_user_id |
| 114 | |
| 115 | usergroup = UserGroup.model_validate(usergroup_create) |
| 116 | |
| 117 | await require_org_membership( |
| 118 | resolve_acting_user_id(current_user), usergroup_create.org_id, db_session |
| 119 | ) |
| 120 | |
| 121 | # RBAC check |
| 122 | await rbac_check( |
| 123 | request, |
| 124 | usergroup_uuid="usergroup_X", |
| 125 | current_user=current_user, |
| 126 | action="create", |
| 127 | db_session=db_session, |
| 128 | ) |
| 129 | |
| 130 | # Check if Organization exists |
| 131 | statement = select(Organization).where(Organization.id == usergroup_create.org_id) |
| 132 | org = (await db_session.execute(statement)).scalars().first() |
| 133 | |
| 134 | if not org or org.id is None: |
| 135 | raise HTTPException( |
| 136 | status_code=400, |
| 137 | detail="Organization does not exist", |
| 138 | ) |
| 139 | |
| 140 | # Usage check |
| 141 | await check_limits_with_usage("courses", org.id, db_session) |
| 142 | |
| 143 | # Complete the object |
| 144 | usergroup.usergroup_uuid = f"usergroup_{uuid4()}" |
| 145 | usergroup.creation_date = str(datetime.now()) |
| 146 | usergroup.update_date = str(datetime.now()) |
| 147 | |
| 148 | # Save the object |
| 149 | db_session.add(usergroup) |
| 150 | await db_session.commit() |
| 151 | await db_session.refresh(usergroup) |
| 152 | |
| 153 | # Feature usage |
| 154 | await increase_feature_usage("usergroups", org.id, db_session) |
| 155 | |
| 156 | await dispatch_webhooks( |
| 157 | event_name="usergroup_created", |
| 158 | org_id=org.id, |
| 159 | data={ |
| 160 | "usergroup_uuid": usergroup.usergroup_uuid, |
| 161 | "name": usergroup.name, |
| 162 | }, |
| 163 | ) |