trovesuite 1.0.12__tar.gz → 1.0.14__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. {trovesuite-1.0.12/src/trovesuite.egg-info → trovesuite-1.0.14}/PKG-INFO +1 -1
  2. {trovesuite-1.0.12 → trovesuite-1.0.14}/pyproject.toml +3 -3
  3. {trovesuite-1.0.12 → trovesuite-1.0.14}/setup.py +1 -1
  4. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/auth/auth_service.py +68 -8
  5. {trovesuite-1.0.12 → trovesuite-1.0.14/src/trovesuite.egg-info}/PKG-INFO +1 -1
  6. {trovesuite-1.0.12 → trovesuite-1.0.14}/LICENSE +0 -0
  7. {trovesuite-1.0.12 → trovesuite-1.0.14}/MANIFEST.in +0 -0
  8. {trovesuite-1.0.12 → trovesuite-1.0.14}/README.md +0 -0
  9. {trovesuite-1.0.12 → trovesuite-1.0.14}/requirements.txt +0 -0
  10. {trovesuite-1.0.12 → trovesuite-1.0.14}/setup.cfg +0 -0
  11. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/__init__.py +0 -0
  12. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/auth/__init__.py +0 -0
  13. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/auth/auth_base.py +0 -0
  14. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/auth/auth_controller.py +0 -0
  15. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/auth/auth_read_dto.py +0 -0
  16. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/auth/auth_write_dto.py +0 -0
  17. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/configs/__init__.py +0 -0
  18. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/configs/database.py +0 -0
  19. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/configs/logging.py +0 -0
  20. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/configs/settings.py +0 -0
  21. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/entities/__init__.py +0 -0
  22. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/entities/health.py +0 -0
  23. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/entities/sh_response.py +0 -0
  24. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/notification/__init__.py +0 -0
  25. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/notification/notification_base.py +0 -0
  26. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/notification/notification_controller.py +0 -0
  27. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/notification/notification_read_dto.py +0 -0
  28. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/notification/notification_service.py +0 -0
  29. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/notification/notification_write_dto.py +0 -0
  30. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/storage/__init__.py +0 -0
  31. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/storage/storage_base.py +0 -0
  32. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/storage/storage_controller.py +0 -0
  33. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/storage/storage_read_dto.py +0 -0
  34. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/storage/storage_service.py +0 -0
  35. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/storage/storage_write_dto.py +0 -0
  36. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/utils/__init__.py +0 -0
  37. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite/utils/helper.py +0 -0
  38. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite.egg-info/SOURCES.txt +0 -0
  39. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite.egg-info/dependency_links.txt +0 -0
  40. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite.egg-info/not-zip-safe +0 -0
  41. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite.egg-info/requires.txt +0 -0
  42. {trovesuite-1.0.12 → trovesuite-1.0.14}/src/trovesuite.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trovesuite
3
- Version: 1.0.12
3
+ Version: 1.0.14
4
4
  Summary: TroveSuite services package providing authentication, authorization, notifications, Azure Storage, and other enterprise services for TroveSuite applications
5
5
  Home-page: https://dev.azure.com/brightgclt/trovesuite/_git/packages
6
6
  Author: Bright Debrah Owusu
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "trovesuite"
7
- version = "1.0.12"
7
+ version = "1.0.14"
8
8
  description = "TroveSuite services package providing authentication, authorization, notifications, Azure Storage, and other enterprise services for TroveSuite applications"
9
9
  authors = ["brightgclt <brightgclt@gmail.com>"]
10
10
  license = "MIT"
@@ -58,7 +58,7 @@ Documentation = "https://dev.azure.com/brightgclt/trovesuite/_git/packages"
58
58
 
59
59
  [project]
60
60
  name = "trovesuite"
61
- version = "1.0.12"
61
+ version = "1.0.14"
62
62
  description = "TroveSuite services package providing authentication, authorization, notifications, Azure Storage, and other enterprise services for TroveSuite applications"
63
63
  readme = "README.md"
64
64
  license = {text = "MIT"}
@@ -121,7 +121,7 @@ Documentation = "https://dev.azure.com/brightgclt/trovesuite/_git/packages"
121
121
  [tool.setuptools.packages.find]
122
122
  where = ["src"]
123
123
  include = ["trovesuite*"]
124
- exclude = ["*controller*", "*main*", "*test*"]
124
+ exclude = ["*test*"]
125
125
 
126
126
  [tool.setuptools.package-dir]
127
127
  "" = "src"
@@ -15,7 +15,7 @@ with open("pyproject.toml", "r", encoding="utf-8") as fh:
15
15
 
16
16
  setup(
17
17
  name="trovesuite",
18
- version="1.0.12",
18
+ version="1.0.14",
19
19
  author="Bright Debrah Owusu",
20
20
  author_email="owusu.debrah@deladetech.com",
21
21
  description="TroveSuite services package providing authentication, authorization, notifications, and other enterprise services for TroveSuite applications",
@@ -225,18 +225,61 @@ class AuthService:
225
225
  (user_id,),
226
226
  )
227
227
 
228
+ # ✅ NEW: Get system-level roles from main.system_user_groups and main.system_assign_roles
229
+ logger.info(f"Fetching system-level roles for user: {user_id}")
230
+
231
+ system_roles = DatabaseManager.execute_query(
232
+ """
233
+ SELECT DISTINCT sug.group_id, sug.user_id, sar.role_id, sar.resource_type
234
+ FROM main.system_user_groups sug
235
+ INNER JOIN main.system_assign_roles sar ON sug.group_id = sar.group_id
236
+ WHERE sug.user_id = %s
237
+ AND sar.is_active = true
238
+ AND sar.delete_status = 'NOT_DELETED'
239
+ """,
240
+ (user_id,)
241
+ )
242
+
243
+ if system_roles:
244
+ logger.info(f"Found {len(system_roles)} system-level role(s) for user: {user_id}")
245
+ else:
246
+ logger.info(f"No system-level roles found for user: {user_id}")
247
+
248
+ # ✅ NEW: Also check for direct system role assignments (user_id in system_assign_roles)
249
+ direct_system_roles = DatabaseManager.execute_query(
250
+ """
251
+ SELECT DISTINCT NULL as group_id, sar.user_id, sar.role_id, sar.resource_type
252
+ FROM main.system_assign_roles sar
253
+ WHERE sar.user_id = %s
254
+ AND sar.is_active = true
255
+ AND sar.delete_status = 'NOT_DELETED'
256
+ """,
257
+ (user_id,)
258
+ )
259
+
260
+ if direct_system_roles:
261
+ logger.info(f"Found {len(direct_system_roles)} direct system-level role assignment(s) for user: {user_id}")
262
+ system_roles.extend(direct_system_roles)
263
+
264
+ # ✅ NEW: Merge tenant-level and system-level roles
265
+ all_roles = get_user_roles + system_roles
266
+ logger.info(f"Total roles (tenant + system) for user {user_id}: {len(all_roles)}")
267
+
228
268
  # GET permissions and Append to Role
229
269
  get_user_roles_with_tenant_and_permissions = []
230
- for role in get_user_roles:
270
+ for role in all_roles:
231
271
  permissions = DatabaseManager.execute_query(
232
272
  f"""SELECT permission_id FROM {db_settings.MAIN_ROLE_PERMISSIONS_TABLE} WHERE role_id = %s""",
233
- params=(role["role_id"],),)
273
+ params=(role["role_id"],),
274
+ )
234
275
 
235
276
  role_dict = {**role, "tenant_id": tenant_id, "permissions": [p['permission_id'] for p in permissions]}
236
277
  get_user_roles_with_tenant_and_permissions.append(role_dict)
237
278
 
238
279
  roles_dto = Helper.map_to_dto(get_user_roles_with_tenant_and_permissions, AuthServiceReadDto)
239
280
 
281
+ logger.info(f"Authorization successful for user: {user_id} with {len(roles_dto)} total role entries")
282
+
240
283
  return Respons[AuthServiceReadDto](
241
284
  detail="Authorized",
242
285
  data=roles_dto,
@@ -249,7 +292,7 @@ class AuthService:
249
292
  raise http_ex
250
293
 
251
294
  except Exception as e:
252
- logger.error("Authorization check failed for user: %s", str(e))
295
+ logger.error("Authorization check failed for user: %s - Error: %s", user_id, str(e), exc_info=True)
253
296
  return Respons[AuthServiceReadDto](
254
297
  detail=None,
255
298
  data=[],
@@ -258,6 +301,7 @@ class AuthService:
258
301
  error="Authorization check failed due to an internal error"
259
302
  )
260
303
 
304
+
261
305
  @staticmethod
262
306
  def check_permission(users_data: list, action=None, resource_type=None) -> bool:
263
307
  """
@@ -302,18 +346,34 @@ class AuthService:
302
346
  def authorize_user_from_token(token: str) -> Respons[AuthServiceReadDto]:
303
347
  """
304
348
  Convenience method to authorize a user directly from a JWT token.
305
-
349
+
306
350
  Args:
307
351
  token: JWT token string
308
-
352
+
309
353
  Returns:
310
354
  Respons[AuthServiceReadDto]: Authorization result with user roles and permissions
311
-
355
+
312
356
  Raises:
313
357
  HTTPException: If token is invalid
314
358
  """
315
- user_info = AuthService.decode_token(token)
316
- return AuthService.authorize(user_info["user_id"], user_info["tenant_id"])
359
+ credentials_exception = HTTPException(
360
+ status_code=401,
361
+ detail="Could not validate credentials",
362
+ headers={"WWW-Authenticate": "Bearer"},
363
+ )
364
+ try:
365
+ payload = jwt.decode(token, db_settings.SECRET_KEY, algorithms=[db_settings.ALGORITHM])
366
+ user_id = payload.get("user_id")
367
+ tenant_id = payload.get("tenant_id")
368
+
369
+ if user_id is None or tenant_id is None:
370
+ raise credentials_exception
371
+
372
+ data = AuthServiceWriteDto(user_id=user_id, tenant_id=tenant_id)
373
+ return AuthService.authorize(data=data)
374
+
375
+ except jwt.InvalidTokenError as exc:
376
+ raise credentials_exception from exc
317
377
 
318
378
  @staticmethod
319
379
  def get_user_permissions(user_roles: list) -> list:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trovesuite
3
- Version: 1.0.12
3
+ Version: 1.0.14
4
4
  Summary: TroveSuite services package providing authentication, authorization, notifications, Azure Storage, and other enterprise services for TroveSuite applications
5
5
  Home-page: https://dev.azure.com/brightgclt/trovesuite/_git/packages
6
6
  Author: Bright Debrah Owusu
File without changes
File without changes
File without changes
File without changes