fdc-shared-kernel 0.0.6__tar.gz → 0.0.9__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 (48) hide show
  1. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/PKG-INFO +73 -2
  2. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/README.md +73 -2
  3. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/README_pypi.md +73 -2
  4. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/pyproject.toml +1 -1
  5. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/PKG-INFO +73 -2
  6. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/SOURCES.txt +3 -0
  7. fdc_shared_kernel-0.0.9/src/shared_kernel/auth/__init__.py +2 -0
  8. fdc_shared_kernel-0.0.9/src/shared_kernel/auth/jwt_helper.py +44 -0
  9. fdc_shared_kernel-0.0.9/src/shared_kernel/auth/token_handler.py +31 -0
  10. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/config/__init__.py +3 -5
  11. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/database/__init__.py +5 -7
  12. fdc_shared_kernel-0.0.9/src/shared_kernel/exceptions/http_exceptions.py +60 -0
  13. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/messaging/nats_databus.py +8 -9
  14. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/security/key_vault/__init__.py +1 -1
  15. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/security/key_vault/aws_secret_manager.py +9 -10
  16. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/security/key_vault/azure_keyvault.py +4 -5
  17. fdc_shared_kernel-0.0.6/src/shared_kernel/exceptions/http_exceptions.py +0 -60
  18. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/requirements.txt +0 -0
  19. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/setup.cfg +0 -0
  20. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/dependency_links.txt +0 -0
  21. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/requires.txt +0 -0
  22. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/top_level.txt +0 -0
  23. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/__init__.py +0 -0
  24. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/__init__.py +0 -0
  25. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/configuration_exceptions.py +0 -0
  26. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/custom_exceptions.py +0 -0
  27. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/data_validation_exceptions.py +0 -0
  28. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/infrastructure_exceptions.py +0 -0
  29. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/operational_exceptions.py +0 -0
  30. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/security_exceptions.py +0 -0
  31. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/interfaces/__init__.py +0 -0
  32. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/interfaces/databus.py +0 -0
  33. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/interfaces/keyvault.py +0 -0
  34. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/logger/__init__.py +0 -0
  35. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/messaging/__init__.py +0 -0
  36. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/models/__init__.py +0 -0
  37. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/security/__init__.py +0 -0
  38. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/__init__.py +0 -0
  39. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/config/test_config.py +0 -0
  40. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/logger/test_logger.py +0 -0
  41. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/messaging/test_nats_interface.py +0 -0
  42. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/utils/test_data_validators.py +0 -0
  43. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/utils/test_date_format_utils.py +0 -0
  44. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/utils/test_string_utils.py +0 -0
  45. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/utils/__init__.py +0 -0
  46. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/utils/data_validators_utils.py +0 -0
  47. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/utils/date_format_utils.py +0 -0
  48. {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/utils/string_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fdc_shared_kernel
3
- Version: 0.0.6
3
+ Version: 0.0.9
4
4
  Summary: Shared library for microservice
5
5
  Author-email: Shikhil S <shikhil.s@dbizsolution.com>, Ahammed Akdham N <ahammedakdham.n@dbizsolution.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -111,7 +111,7 @@ engine, SessionLocal = db_instance.init_db_connection()
111
111
 
112
112
  ### Initializing NATS Connection
113
113
 
114
- Use the `NATSClient` class to initialize a messaging connection:
114
+ Use the `NATSClient` class to initialize:
115
115
 
116
116
  ```
117
117
  from shared_kernel.messaging import NATSClient
@@ -130,3 +130,74 @@ def run():
130
130
  if __name__ == '__main__':
131
131
  asyncio.run(run())
132
132
  ```
133
+
134
+
135
+ ### Using Keyvault Manager
136
+
137
+ Use the `KeyVaultManager` class to initialize:
138
+
139
+ ```
140
+ from shared_kernel.security import KeyVaultManager
141
+
142
+ def run():
143
+ aws_vault = KeyVaultManager.create_key_vault('aws', {
144
+ 'region_name': 'us-east-1',
145
+ 'AWS_SERVER_PUBLIC_KEY': '<key here>',
146
+ 'AWS_SERVER_SECRET_KEY': '<secret here>'
147
+ })
148
+ # AWS Secrets Manager operations
149
+ aws_vault.store_secret("fdc_api_key", "123456")
150
+
151
+ print(aws_vault.retrieve_secret("fdc_api_key")) # Output: 123456
152
+
153
+ print(aws_vault.list_secrets()) # Output: ['fdc_api_key']
154
+
155
+ aws_vault.delete_secret("api_key")
156
+ print(aws_vault.list_secrets()) # Output: []
157
+ if __name__ == '__main__':
158
+ run()
159
+ ```
160
+
161
+
162
+ ### Using JWT Token handler
163
+
164
+ Use the `JWTTokenHandler` class to initialize:
165
+
166
+ ```
167
+ from shared_kernel.security import JWTTokenHandler
168
+
169
+ def run():
170
+ secret_key = 'your-secret-key'
171
+ token_handler = JWTTokenHandler(secret_key)
172
+ payload = token_handler.decode_token('your-jwt-token')
173
+
174
+ if __name__ == '__main__':
175
+ run()
176
+ ```
177
+
178
+ ### Using JWTTokenHandler
179
+
180
+ Use the `JWTTokenHandler` class to initialize:
181
+
182
+ ```
183
+ from shared_kernel.auth import JWTTokenHandler
184
+
185
+ def run():
186
+ secret_key = 'your-secret-key'
187
+ token_handler = JWTTokenHandler(secret_key)
188
+ payload = token_handler.decode_token('your-jwt-token')
189
+ if __name__ == '__main__':
190
+ run()
191
+ ```
192
+
193
+ In routes
194
+
195
+ ```
196
+ from shared_kernel.auth import token_required
197
+
198
+ @app.route('/')
199
+ @token_required
200
+ def user(current_user):
201
+ return jsonify(current_user)
202
+ ```
203
+
@@ -109,7 +109,7 @@ engine, SessionLocal = db_instance.init_db_connection()
109
109
 
110
110
  ### Initializing NATS Connection
111
111
 
112
- Use the `NATSClient` class to initialize a messaging connection:
112
+ Use the `NATSClient` class to initialize:
113
113
 
114
114
  ```
115
115
  from shared_kernel.messaging import NATSClient
@@ -127,4 +127,75 @@ def run():
127
127
 
128
128
  if __name__ == '__main__':
129
129
  asyncio.run(run())
130
- ```
130
+ ```
131
+
132
+
133
+ ### Using Keyvault Manager
134
+
135
+ Use the `KeyVaultManager` class to initialize:
136
+
137
+ ```
138
+ from shared_kernel.security import KeyVaultManager
139
+
140
+ def run():
141
+ aws_vault = KeyVaultManager.create_key_vault('aws', {
142
+ 'region_name': 'us-east-1',
143
+ 'AWS_SERVER_PUBLIC_KEY': '<key here>',
144
+ 'AWS_SERVER_SECRET_KEY': '<secret here>'
145
+ })
146
+ # AWS Secrets Manager operations
147
+ aws_vault.store_secret("fdc_api_key", "123456")
148
+
149
+ print(aws_vault.retrieve_secret("fdc_api_key")) # Output: 123456
150
+
151
+ print(aws_vault.list_secrets()) # Output: ['fdc_api_key']
152
+
153
+ aws_vault.delete_secret("api_key")
154
+ print(aws_vault.list_secrets()) # Output: []
155
+ if __name__ == '__main__':
156
+ run()
157
+ ```
158
+
159
+
160
+ ### Using JWT Token handler
161
+
162
+ Use the `JWTTokenHandler` class to initialize:
163
+
164
+ ```
165
+ from shared_kernel.security import JWTTokenHandler
166
+
167
+ def run():
168
+ secret_key = 'your-secret-key'
169
+ token_handler = JWTTokenHandler(secret_key)
170
+ payload = token_handler.decode_token('your-jwt-token')
171
+
172
+ if __name__ == '__main__':
173
+ run()
174
+ ```
175
+
176
+ ### Using JWTTokenHandler
177
+
178
+ Use the `JWTTokenHandler` class to initialize:
179
+
180
+ ```
181
+ from shared_kernel.auth import JWTTokenHandler
182
+
183
+ def run():
184
+ secret_key = 'your-secret-key'
185
+ token_handler = JWTTokenHandler(secret_key)
186
+ payload = token_handler.decode_token('your-jwt-token')
187
+ if __name__ == '__main__':
188
+ run()
189
+ ```
190
+
191
+ In routes
192
+
193
+ ```
194
+ from shared_kernel.auth import token_required
195
+
196
+ @app.route('/')
197
+ @token_required
198
+ def user(current_user):
199
+ return jsonify(current_user)
200
+ ```
201
+
@@ -78,7 +78,7 @@ engine, SessionLocal = db_instance.init_db_connection()
78
78
 
79
79
  ### Initializing NATS Connection
80
80
 
81
- Use the `NATSClient` class to initialize a messaging connection:
81
+ Use the `NATSClient` class to initialize:
82
82
 
83
83
  ```
84
84
  from shared_kernel.messaging import NATSClient
@@ -96,4 +96,75 @@ def run():
96
96
 
97
97
  if __name__ == '__main__':
98
98
  asyncio.run(run())
99
- ```
99
+ ```
100
+
101
+
102
+ ### Using Keyvault Manager
103
+
104
+ Use the `KeyVaultManager` class to initialize:
105
+
106
+ ```
107
+ from shared_kernel.security import KeyVaultManager
108
+
109
+ def run():
110
+ aws_vault = KeyVaultManager.create_key_vault('aws', {
111
+ 'region_name': 'us-east-1',
112
+ 'AWS_SERVER_PUBLIC_KEY': '<key here>',
113
+ 'AWS_SERVER_SECRET_KEY': '<secret here>'
114
+ })
115
+ # AWS Secrets Manager operations
116
+ aws_vault.store_secret("fdc_api_key", "123456")
117
+
118
+ print(aws_vault.retrieve_secret("fdc_api_key")) # Output: 123456
119
+
120
+ print(aws_vault.list_secrets()) # Output: ['fdc_api_key']
121
+
122
+ aws_vault.delete_secret("api_key")
123
+ print(aws_vault.list_secrets()) # Output: []
124
+ if __name__ == '__main__':
125
+ run()
126
+ ```
127
+
128
+
129
+ ### Using JWT Token handler
130
+
131
+ Use the `JWTTokenHandler` class to initialize:
132
+
133
+ ```
134
+ from shared_kernel.security import JWTTokenHandler
135
+
136
+ def run():
137
+ secret_key = 'your-secret-key'
138
+ token_handler = JWTTokenHandler(secret_key)
139
+ payload = token_handler.decode_token('your-jwt-token')
140
+
141
+ if __name__ == '__main__':
142
+ run()
143
+ ```
144
+
145
+ ### Using JWTTokenHandler
146
+
147
+ Use the `JWTTokenHandler` class to initialize:
148
+
149
+ ```
150
+ from shared_kernel.auth import JWTTokenHandler
151
+
152
+ def run():
153
+ secret_key = 'your-secret-key'
154
+ token_handler = JWTTokenHandler(secret_key)
155
+ payload = token_handler.decode_token('your-jwt-token')
156
+ if __name__ == '__main__':
157
+ run()
158
+ ```
159
+
160
+ In routes
161
+
162
+ ```
163
+ from shared_kernel.auth import token_required
164
+
165
+ @app.route('/')
166
+ @token_required
167
+ def user(current_user):
168
+ return jsonify(current_user)
169
+ ```
170
+
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "fdc_shared_kernel"
7
- version = "0.0.6"
7
+ version = "0.0.9"
8
8
  requires-python = ">=3.7"
9
9
  readme = "README_pypi.md"
10
10
  description = "Shared library for microservice"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fdc_shared_kernel
3
- Version: 0.0.6
3
+ Version: 0.0.9
4
4
  Summary: Shared library for microservice
5
5
  Author-email: Shikhil S <shikhil.s@dbizsolution.com>, Ahammed Akdham N <ahammedakdham.n@dbizsolution.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -111,7 +111,7 @@ engine, SessionLocal = db_instance.init_db_connection()
111
111
 
112
112
  ### Initializing NATS Connection
113
113
 
114
- Use the `NATSClient` class to initialize a messaging connection:
114
+ Use the `NATSClient` class to initialize:
115
115
 
116
116
  ```
117
117
  from shared_kernel.messaging import NATSClient
@@ -130,3 +130,74 @@ def run():
130
130
  if __name__ == '__main__':
131
131
  asyncio.run(run())
132
132
  ```
133
+
134
+
135
+ ### Using Keyvault Manager
136
+
137
+ Use the `KeyVaultManager` class to initialize:
138
+
139
+ ```
140
+ from shared_kernel.security import KeyVaultManager
141
+
142
+ def run():
143
+ aws_vault = KeyVaultManager.create_key_vault('aws', {
144
+ 'region_name': 'us-east-1',
145
+ 'AWS_SERVER_PUBLIC_KEY': '<key here>',
146
+ 'AWS_SERVER_SECRET_KEY': '<secret here>'
147
+ })
148
+ # AWS Secrets Manager operations
149
+ aws_vault.store_secret("fdc_api_key", "123456")
150
+
151
+ print(aws_vault.retrieve_secret("fdc_api_key")) # Output: 123456
152
+
153
+ print(aws_vault.list_secrets()) # Output: ['fdc_api_key']
154
+
155
+ aws_vault.delete_secret("api_key")
156
+ print(aws_vault.list_secrets()) # Output: []
157
+ if __name__ == '__main__':
158
+ run()
159
+ ```
160
+
161
+
162
+ ### Using JWT Token handler
163
+
164
+ Use the `JWTTokenHandler` class to initialize:
165
+
166
+ ```
167
+ from shared_kernel.security import JWTTokenHandler
168
+
169
+ def run():
170
+ secret_key = 'your-secret-key'
171
+ token_handler = JWTTokenHandler(secret_key)
172
+ payload = token_handler.decode_token('your-jwt-token')
173
+
174
+ if __name__ == '__main__':
175
+ run()
176
+ ```
177
+
178
+ ### Using JWTTokenHandler
179
+
180
+ Use the `JWTTokenHandler` class to initialize:
181
+
182
+ ```
183
+ from shared_kernel.auth import JWTTokenHandler
184
+
185
+ def run():
186
+ secret_key = 'your-secret-key'
187
+ token_handler = JWTTokenHandler(secret_key)
188
+ payload = token_handler.decode_token('your-jwt-token')
189
+ if __name__ == '__main__':
190
+ run()
191
+ ```
192
+
193
+ In routes
194
+
195
+ ```
196
+ from shared_kernel.auth import token_required
197
+
198
+ @app.route('/')
199
+ @token_required
200
+ def user(current_user):
201
+ return jsonify(current_user)
202
+ ```
203
+
@@ -8,6 +8,9 @@ src/fdc_shared_kernel.egg-info/dependency_links.txt
8
8
  src/fdc_shared_kernel.egg-info/requires.txt
9
9
  src/fdc_shared_kernel.egg-info/top_level.txt
10
10
  src/shared_kernel/__init__.py
11
+ src/shared_kernel/auth/__init__.py
12
+ src/shared_kernel/auth/jwt_helper.py
13
+ src/shared_kernel/auth/token_handler.py
11
14
  src/shared_kernel/config/__init__.py
12
15
  src/shared_kernel/database/__init__.py
13
16
  src/shared_kernel/exceptions/__init__.py
@@ -0,0 +1,2 @@
1
+ from shared_kernel.auth.jwt_helper import JWTTokenHandler
2
+ from shared_kernel.auth.token_handler import token_required
@@ -0,0 +1,44 @@
1
+ import jwt
2
+ from shared_kernel.exceptions import Unauthorized
3
+
4
+
5
+ class JWTTokenHandler:
6
+ _instance = None
7
+
8
+ def __new__(cls, secret_key: str = None):
9
+ if cls._instance is None:
10
+ if secret_key is None:
11
+ raise ValueError("Secret key must be provided for the first initialization.")
12
+ cls._instance = super(JWTTokenHandler, cls).__new__(cls)
13
+ cls._instance._initialize(secret_key)
14
+ return cls._instance
15
+
16
+ def _initialize(self, secret_key: str):
17
+ """
18
+ Initialize the JWTTokenHandler with a secret key.
19
+
20
+ Args:
21
+ secret_key (str): The secret key used for decoding and verifying JWT tokens.
22
+ """
23
+ self.secret_key = secret_key
24
+
25
+ def decode_token(self, token: str) -> dict:
26
+ """
27
+ Decode and verify a JWT token using the provided secret key.
28
+
29
+ Args:
30
+ token (str): The JWT token to be decoded.
31
+
32
+ Returns:
33
+ dict: The payload of the decoded token.
34
+
35
+ Raises:
36
+ Unauthorized: If the token is expired or invalid.
37
+ """
38
+ try:
39
+ payload = jwt.decode(token, self.secret_key, algorithms=['HS256'])
40
+ return payload
41
+ except jwt.ExpiredSignatureError:
42
+ raise Unauthorized('Token expired')
43
+ except jwt.InvalidTokenError:
44
+ raise Unauthorized('Invalid token')
@@ -0,0 +1,31 @@
1
+ from flask import request
2
+ from shared_kernel.auth import JWTTokenHandler
3
+ from shared_kernel.config import Config
4
+ from shared_kernel.exceptions import Unauthorized
5
+
6
+ config = Config()
7
+ token_handler = JWTTokenHandler(config.get('JWT_SECRET_KEY'))
8
+
9
+
10
+ # Decorator to protect routes
11
+ def token_required(f):
12
+ def decorator(*args, **kwargs):
13
+ token = None
14
+ if 'Authorization' in request.headers:
15
+ token = request.headers['Authorization'].replace('Bearer ', '')
16
+
17
+ if not token:
18
+ raise Unauthorized('Token is missing!')
19
+
20
+ payload = token_handler.decode_token(token)
21
+ if 'error' in payload:
22
+ raise Unauthorized("Failed to parse token")
23
+
24
+ # Add user information to the request context
25
+ current_user = {
26
+ "user_id": payload['user_id'],
27
+ "org_id": payload['org_id']
28
+ }
29
+ return f(current_user, *args, **kwargs)
30
+
31
+ return decorator
@@ -1,10 +1,8 @@
1
1
  import os
2
+ import logging
2
3
  from typing import Any
3
4
  from dotenv import load_dotenv, find_dotenv
4
5
  from shared_kernel.exceptions import MissingConfiguration, InvalidConfiguration
5
- from shared_kernel.logger import Logger
6
-
7
- logger = Logger('SHARED_KERNEL')
8
6
 
9
7
 
10
8
  class Config:
@@ -26,12 +24,12 @@ class Config:
26
24
  if env_path is None:
27
25
  dotenv_path = find_dotenv()
28
26
  if not dotenv_path:
29
- logger.error(".env file not found")
27
+ logging.error(".env file not found")
30
28
  raise InvalidConfiguration(".env file not found")
31
29
  else:
32
30
  dotenv_path = env_path
33
31
 
34
- logger.info(f"Loading environment variables from {dotenv_path}")
32
+ logging.info(f"Loading environment variables from {dotenv_path}")
35
33
  load_dotenv(dotenv_path)
36
34
 
37
35
  @staticmethod
@@ -1,7 +1,7 @@
1
+ import logging
1
2
  from sqlalchemy import create_engine
2
3
  from sqlalchemy.ext.declarative import declarative_base
3
4
  from sqlalchemy.orm import sessionmaker
4
- from shared_kernel.logger import Logger
5
5
  from typing import Tuple
6
6
 
7
7
 
@@ -15,8 +15,6 @@ class DB:
15
15
  self.engine = create_engine(db_url, pool_size=20, max_overflow=100)
16
16
  self.SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=self.engine)
17
17
  self.Base = declarative_base()
18
- self.logger = Logger(name="database")
19
- self.logger.configure_logger()
20
18
 
21
19
  def init_db_connection(self) -> Tuple[create_engine, sessionmaker]:
22
20
  """
@@ -24,20 +22,20 @@ class DB:
24
22
 
25
23
  :return: A tuple containing the SQLAlchemy engine and session maker.
26
24
  """
27
- self.logger.info("Database connection initialized successfully.")
25
+ logging.info("Database connection initialized successfully.")
28
26
  return self.engine, self.SessionLocal
29
27
 
30
28
  def create_tables(self):
31
29
  """
32
30
  Creates all tables stored in declarative Base.
33
31
  """
34
- self.logger.info("Creating tables...")
32
+ logging.info("Creating tables...")
35
33
  self.Base.metadata.create_all(bind=self.engine)
36
- self.logger.info("Tables created successfully.")
34
+ logging.info("Tables created successfully.")
37
35
 
38
36
  def close_session(self):
39
37
  """
40
38
  Closes the database session.
41
39
  """
42
40
  self.SessionLocal.remove()
43
- self.logger.info("Session closed successfully.")
41
+ logging.info("Session closed successfully.")
@@ -0,0 +1,60 @@
1
+ import http
2
+
3
+
4
+ class HTTPException(Exception):
5
+ """Base class for all HTTP exceptions."""
6
+
7
+ def __init__(self, message: str = "", code: int = None) -> None:
8
+ super().__init__(message)
9
+ self.code = code
10
+
11
+ def __str__(self) -> str:
12
+ return f"{super().__str__()}"
13
+
14
+
15
+ class BadRequest(HTTPException):
16
+ """Raised for HTTP 400 Bad Request errors."""
17
+ code = http.HTTPStatus.BAD_REQUEST.value
18
+
19
+ def __init__(self, message: str = "Bad Request", code: int = 400) -> None:
20
+ super().__init__(message=message, code=code or self.code)
21
+
22
+
23
+ class Unauthorized(HTTPException):
24
+ """Raised for HTTP 401 Unauthorized errors."""
25
+ code = http.HTTPStatus.UNAUTHORIZED.value
26
+
27
+ def __init__(self, message: str = "Unauthorized", code: int = 400) -> None:
28
+ super().__init__(message=message, code=code or self.code)
29
+
30
+
31
+ class Forbidden(HTTPException):
32
+ """Raised for HTTP 403 Forbidden errors."""
33
+ code = http.HTTPStatus.FORBIDDEN.value
34
+
35
+ def __init__(self, message: str = "Forbidden", code: int = 403) -> None:
36
+ super().__init__(message=message, code=code or self.code)
37
+
38
+
39
+ class NotFound(HTTPException):
40
+ """Raised for HTTP 404 Not Found errors."""
41
+ code = http.HTTPStatus.NOT_FOUND.value
42
+
43
+ def __init__(self, message: str = "Not Found", code: int = 404) -> None:
44
+ super().__init__(message=message, code=code or self.code)
45
+
46
+
47
+ class Conflict(HTTPException):
48
+ """Raised for HTTP 409 Conflict errors."""
49
+ code = http.HTTPStatus.CONFLICT.value
50
+
51
+ def __init__(self, message: str = "Conflict", code: int = 409) -> None:
52
+ super().__init__(message=message, code=code or self.code)
53
+
54
+
55
+ class InternalServerError(HTTPException):
56
+ """Raised for HTTP 500 Internal Server Error."""
57
+ code = http.HTTPStatus.INTERNAL_SERVER_ERROR.value
58
+
59
+ def __init__(self, message: str = "Internal Server Error", code: int = 500) -> None:
60
+ super().__init__(message=message, code=code or self.code)
@@ -1,9 +1,9 @@
1
1
  import json
2
+ import logging
2
3
  from nats.aio.client import Client as NATS
3
4
  from nats.js.api import ConsumerConfig, DeliverPolicy, StreamConfig
4
5
  from typing import Callable, Any, List, Union
5
6
  from shared_kernel.interfaces import DataBus
6
- from shared_kernel.logger import Logger
7
7
 
8
8
 
9
9
  class NATSDataBus(DataBus):
@@ -32,7 +32,6 @@ class NATSDataBus(DataBus):
32
32
  self.connected = False
33
33
  self.js = None # JetStream context
34
34
  self.initialized = True
35
- self.logger = Logger('SHARED_KERNEL')
36
35
 
37
36
  async def make_connection(self):
38
37
  """
@@ -90,12 +89,12 @@ class NATSDataBus(DataBus):
90
89
  ack = await self.js.publish(
91
90
  topic, json.dumps(event_payload).encode("utf-8")
92
91
  )
93
- self.logger.info(
92
+ logging.info(
94
93
  f"Published event '{event_payload.get('event_name')}' to topic '{topic}', ack: {ack}"
95
94
  )
96
95
  return True
97
96
  except Exception as e:
98
- self.logger.error(
97
+ logging.error(
99
98
  f"Failed to publish event '{event_payload.get('event_name')}': {str(e)}",
100
99
  exc_info=True,
101
100
  )
@@ -121,7 +120,7 @@ class NATSDataBus(DataBus):
121
120
  )
122
121
  return json.loads(response.data.decode("utf-8"))
123
122
  except Exception as e:
124
- self.logger.error(f"Failed to request topic '{topic}': {e}", exc_info=True)
123
+ logging.error(f"Failed to request topic '{topic}': {e}", exc_info=True)
125
124
  raise e
126
125
 
127
126
  async def subscribe_async_event(
@@ -144,10 +143,10 @@ class NATSDataBus(DataBus):
144
143
  )
145
144
 
146
145
  await self.js.subscribe(topic, cb=callback, config=consumer_config)
147
- self.logger.info(f"Subscribed to async event on topic '{topic}'")
146
+ logging.info(f"Subscribed to async event on topic '{topic}'")
148
147
 
149
148
  except Exception as e:
150
- self.logger.error(
149
+ logging.error(
151
150
  f"Failed to subscribe to async event on topic '{topic}': {e}",
152
151
  exc_info=True,
153
152
  )
@@ -163,10 +162,10 @@ class NATSDataBus(DataBus):
163
162
  """
164
163
  try:
165
164
  await self.nc.subscribe(topic, cb=callback)
166
- self.logger.info(f"Subscribed to sync event on topic '{topic}'")
165
+ logging.info(f"Subscribed to sync event on topic '{topic}'")
167
166
 
168
167
  except Exception as e:
169
- self.logger.error(
168
+ logging.error(
170
169
  f"Failed to subscribe to sync event on topic '{topic}': {e}",
171
170
  exc_info=True,
172
171
  )
@@ -3,7 +3,7 @@ from shared_kernel.security.key_vault.aws_secret_manager import AWSSecretsManage
3
3
  from shared_kernel.security.key_vault.azure_keyvault import AzureKeyVault
4
4
 
5
5
 
6
- class KeyVaultFactory:
6
+ class KeyVaultManager:
7
7
  @staticmethod
8
8
  def create_key_vault(vault_type: str, config: dict) -> KeyVaultInterface:
9
9
  if vault_type == 'AZURE':
@@ -1,7 +1,7 @@
1
1
  import boto3
2
+ import logging
2
3
  from botocore.exceptions import ClientError
3
4
  from shared_kernel.interfaces import KeyVaultInterface
4
- from shared_kernel.logger import Logger
5
5
 
6
6
 
7
7
  class AWSSecretsManager(KeyVaultInterface):
@@ -29,8 +29,7 @@ class AWSSecretsManager(KeyVaultInterface):
29
29
  aws_access_key_id=self._aws_access_key_id,
30
30
  aws_secret_access_key=self._aws_secret_access_key,
31
31
  region_name=self._region_name)
32
- self.logger = Logger('SHARED_KERNEL')
33
- self.logger.info(f"Connected to AWS Secrets Manager in region: {self._region_name}")
32
+ logging.info(f"Connected to AWS Secrets Manager in region: {self._region_name}")
34
33
 
35
34
  def store_secret(self, name: str, secret: str) -> None:
36
35
  """
@@ -45,13 +44,13 @@ class AWSSecretsManager(KeyVaultInterface):
45
44
  """
46
45
  try:
47
46
  self._client.create_secret(Name=name, SecretString=secret)
48
- self.logger.info(f"Stored secret '{name}'")
47
+ logging.info(f"Stored secret '{name}'")
49
48
  except ClientError as e:
50
49
  if e.response['Error']['Code'] == 'ResourceExistsException':
51
50
  self._client.update_secret(SecretId=name, SecretString=secret)
52
- self.logger.info(f"Updated secret '{name}'")
51
+ logging.info(f"Updated secret '{name}'")
53
52
  else:
54
- self.logger.error(f"Failed to update secret '{name}' | Error: '{e}'")
53
+ logging.error(f"Failed to update secret '{name}' | Error: '{e}'")
55
54
  raise e
56
55
 
57
56
  def retrieve_secret(self, name: str) -> str:
@@ -71,7 +70,7 @@ class AWSSecretsManager(KeyVaultInterface):
71
70
  response = self._client.get_secret_value(SecretId=name)
72
71
  return response['SecretString']
73
72
  except ClientError as e:
74
- self.logger.error(f"Error retrieving secret '{name}': {e}")
73
+ logging.error(f"Error retrieving secret '{name}': {e}")
75
74
  return None
76
75
 
77
76
  def delete_secret(self, name: str) -> None:
@@ -86,9 +85,9 @@ class AWSSecretsManager(KeyVaultInterface):
86
85
  """
87
86
  try:
88
87
  self._client.delete_secret(SecretId=name, ForceDeleteWithoutRecovery=True)
89
- self.logger.info(f"Deleted secret '{name}'")
88
+ logging.info(f"Deleted secret '{name}'")
90
89
  except ClientError as e:
91
- self.logger.error(f"Error deleting secret '{name}': {e}")
90
+ logging.error(f"Error deleting secret '{name}': {e}")
92
91
 
93
92
  def list_secrets(self) -> list:
94
93
  """
@@ -104,5 +103,5 @@ class AWSSecretsManager(KeyVaultInterface):
104
103
  response = self._client.list_secrets()
105
104
  return [secret['Name'] for secret in response['SecretList']]
106
105
  except ClientError as e:
107
- self.logger.error(f"Error listing secrets: {e}")
106
+ logging.error(f"Error listing secrets: {e}")
108
107
  return []
@@ -1,7 +1,7 @@
1
1
  from azure.identity import ClientSecretCredential
2
2
  from azure.keyvault.secrets import SecretClient
3
3
  from shared_kernel.interfaces import KeyVaultInterface
4
- from shared_kernel.logger import Logger
4
+ import logging
5
5
 
6
6
 
7
7
  class AzureKeyVault(KeyVaultInterface):
@@ -38,8 +38,7 @@ class AzureKeyVault(KeyVaultInterface):
38
38
  client_secret=config.get('client_secret')
39
39
  )
40
40
  self._client = SecretClient(vault_url=self._vault_url, credential=self._credential)
41
- self.logger = Logger('SHARED_KERNEL')
42
- self.logger.info(f"Connected to Azure Key Vault at: {self._vault_url}")
41
+ logging.info(f"Connected to Azure Key Vault at: {self._vault_url}")
43
42
 
44
43
  def store_secret(self, name: str, secret: str) -> None:
45
44
  """
@@ -50,7 +49,7 @@ class AzureKeyVault(KeyVaultInterface):
50
49
  secret (str): The value of the secret.
51
50
  """
52
51
  self._client.set_secret(name, secret)
53
- self.logger.info(f"Stored secret '{name}'")
52
+ logging.info(f"Stored secret '{name}'")
54
53
 
55
54
  def retrieve_secret(self, name: str) -> str:
56
55
  """
@@ -73,7 +72,7 @@ class AzureKeyVault(KeyVaultInterface):
73
72
  name (str): The name of the secret.
74
73
  """
75
74
  self._client.begin_delete_secret(name)
76
- self.logger.info(f"Deleted secret '{name}'")
75
+ logging.info(f"Deleted secret '{name}'")
77
76
 
78
77
  def list_secrets(self) -> list:
79
78
  """
@@ -1,60 +0,0 @@
1
- import http
2
-
3
-
4
- class HTTPException(Exception):
5
- """Base class for all HTTP exceptions."""
6
-
7
- def __init__(self, message: str = "", status_code: int = None) -> None:
8
- super().__init__(message)
9
- self.status_code = status_code
10
-
11
- def __str__(self) -> str:
12
- return f"{self.status_code}: {super().__str__()}"
13
-
14
-
15
- class BadRequest(HTTPException):
16
- """Raised for HTTP 400 Bad Request errors."""
17
- status_code = http.HTTPStatus.BAD_REQUEST.value
18
-
19
- def __init__(self, message: str = "Bad Request", status_code: int = None) -> None:
20
- super().__init__(message=message, status_code=status_code or self.status_code)
21
-
22
-
23
- class Unauthorized(HTTPException):
24
- """Raised for HTTP 401 Unauthorized errors."""
25
- status_code = http.HTTPStatus.UNAUTHORIZED.value
26
-
27
- def __init__(self, message: str = "Unauthorized", status_code: int = None) -> None:
28
- super().__init__(message=message, status_code=status_code or self.status_code)
29
-
30
-
31
- class Forbidden(HTTPException):
32
- """Raised for HTTP 403 Forbidden errors."""
33
- status_code = http.HTTPStatus.FORBIDDEN.value
34
-
35
- def __init__(self, message: str = "Forbidden", status_code: int = None) -> None:
36
- super().__init__(message=message, status_code=status_code or self.status_code)
37
-
38
-
39
- class NotFound(HTTPException):
40
- """Raised for HTTP 404 Not Found errors."""
41
- status_code = http.HTTPStatus.NOT_FOUND.value
42
-
43
- def __init__(self, message: str = "Not Found", status_code: int = None) -> None:
44
- super().__init__(message=message, status_code=status_code or self.status_code)
45
-
46
-
47
- class Conflict(HTTPException):
48
- """Raised for HTTP 409 Conflict errors."""
49
- status_code = http.HTTPStatus.CONFLICT.value
50
-
51
- def __init__(self, message: str = "Conflict", status_code: int = None) -> None:
52
- super().__init__(message=message, status_code=status_code or self.status_code)
53
-
54
-
55
- class InternalServerError(HTTPException):
56
- """Raised for HTTP 500 Internal Server Error."""
57
- status_code = http.HTTPStatus.INTERNAL_SERVER_ERROR.value
58
-
59
- def __init__(self, message: str = "Internal Server Error", status_code: int = None) -> None:
60
- super().__init__(message=message, status_code=status_code or self.status_code)