maleo-foundation 0.2.96__py3-none-any.whl → 0.2.98__py3-none-any.whl

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 (63) hide show
  1. maleo_foundation/authentication.py +9 -9
  2. maleo_foundation/authorization.py +2 -2
  3. maleo_foundation/client/manager.py +11 -2
  4. maleo_foundation/client/services/encryption/aes.py +2 -2
  5. maleo_foundation/client/services/encryption/rsa.py +2 -2
  6. maleo_foundation/client/services/key.py +6 -3
  7. maleo_foundation/client/services/signature.py +2 -2
  8. maleo_foundation/client/services/token.py +2 -2
  9. maleo_foundation/constants.py +7 -7
  10. maleo_foundation/managers/cache/base.py +5 -1
  11. maleo_foundation/managers/cache/redis.py +12 -12
  12. maleo_foundation/managers/client/base.py +8 -8
  13. maleo_foundation/managers/client/google/base.py +6 -6
  14. maleo_foundation/managers/client/google/parameter.py +12 -5
  15. maleo_foundation/managers/client/google/secret.py +22 -7
  16. maleo_foundation/managers/client/google/storage.py +17 -17
  17. maleo_foundation/managers/client/maleo.py +9 -9
  18. maleo_foundation/managers/db.py +12 -12
  19. maleo_foundation/managers/middleware.py +22 -22
  20. maleo_foundation/managers/service.py +52 -52
  21. maleo_foundation/middlewares/authentication.py +11 -8
  22. maleo_foundation/middlewares/base.py +68 -64
  23. maleo_foundation/middlewares/cors.py +6 -6
  24. maleo_foundation/models/responses.py +37 -37
  25. maleo_foundation/models/schemas/encryption.py +5 -5
  26. maleo_foundation/models/schemas/general.py +33 -33
  27. maleo_foundation/models/schemas/hash.py +4 -4
  28. maleo_foundation/models/schemas/key.py +4 -4
  29. maleo_foundation/models/schemas/parameter.py +15 -15
  30. maleo_foundation/models/schemas/result.py +47 -47
  31. maleo_foundation/models/schemas/signature.py +5 -5
  32. maleo_foundation/models/schemas/token.py +4 -4
  33. maleo_foundation/models/transfers/general/__init__.py +63 -18
  34. maleo_foundation/models/transfers/general/key.py +4 -4
  35. maleo_foundation/models/transfers/general/token.py +67 -20
  36. maleo_foundation/models/transfers/parameters/token.py +1 -1
  37. maleo_foundation/models/transfers/results/client/controllers/http.py +4 -4
  38. maleo_foundation/models/transfers/results/encryption/aes.py +2 -2
  39. maleo_foundation/models/transfers/results/encryption/rsa.py +2 -2
  40. maleo_foundation/models/transfers/results/hash.py +2 -2
  41. maleo_foundation/models/transfers/results/key.py +3 -3
  42. maleo_foundation/models/transfers/results/signature.py +2 -2
  43. maleo_foundation/models/transfers/results/token.py +2 -2
  44. maleo_foundation/utils/cleaner.py +22 -0
  45. maleo_foundation/utils/client.py +6 -6
  46. maleo_foundation/utils/controller.py +8 -8
  47. maleo_foundation/utils/dependencies/auth.py +2 -2
  48. maleo_foundation/utils/dependencies/context.py +1 -1
  49. maleo_foundation/utils/exceptions.py +10 -10
  50. maleo_foundation/utils/extractor.py +2 -2
  51. maleo_foundation/utils/formatter/case.py +4 -4
  52. maleo_foundation/utils/loaders/credential/google.py +3 -1
  53. maleo_foundation/utils/loaders/json.py +2 -2
  54. maleo_foundation/utils/loaders/yaml.py +2 -2
  55. maleo_foundation/utils/logging.py +30 -24
  56. maleo_foundation/utils/merger.py +5 -2
  57. maleo_foundation/utils/query.py +48 -44
  58. maleo_foundation/utils/repository.py +8 -8
  59. maleo_foundation/utils/searcher.py +4 -1
  60. {maleo_foundation-0.2.96.dist-info → maleo_foundation-0.2.98.dist-info}/METADATA +1 -1
  61. {maleo_foundation-0.2.96.dist-info → maleo_foundation-0.2.98.dist-info}/RECORD +63 -62
  62. {maleo_foundation-0.2.96.dist-info → maleo_foundation-0.2.98.dist-info}/WHEEL +0 -0
  63. {maleo_foundation-0.2.96.dist-info → maleo_foundation-0.2.98.dist-info}/top_level.txt +0 -0
@@ -7,32 +7,32 @@ from maleo_foundation.types import BaseTypes
7
7
 
8
8
  class BaseGeneralSchemas:
9
9
  class DateFilter(BaseModel):
10
- name:str = Field(..., description="Column name.")
11
- from_date:BaseTypes.OptionalDatetime = Field(None, description="From date.")
12
- to_date:BaseTypes.OptionalDatetime = Field(None, description="To date.")
10
+ name: str = Field(..., description="Column name.")
11
+ from_date: BaseTypes.OptionalDatetime = Field(None, description="From date.")
12
+ to_date: BaseTypes.OptionalDatetime = Field(None, description="To date.")
13
13
 
14
14
  class SortColumn(BaseModel):
15
- name:str = Field(..., description="Column name.")
16
- order:BaseEnums.SortOrder = Field(..., description="Sort order.")
15
+ name: str = Field(..., description="Column name.")
16
+ order: BaseEnums.SortOrder = Field(..., description="Sort order.")
17
17
 
18
18
  class SimplePagination(BaseModel):
19
- page:int = Field(1, ge=1, description="Page number, must be >= 1.")
20
- limit:int = Field(10, ge=1, le=100, description="Page size, must be 1 <= limit <= 100.")
19
+ page: int = Field(1, ge=1, description="Page number, must be >= 1.")
20
+ limit: int = Field(10, ge=1, le=100, description="Page size, must be 1 <= limit <= 100.")
21
21
 
22
22
  #* ----- ----- ----- Data ----- ----- ----- *#
23
23
  class Identifiers(BaseModel):
24
- id:int = Field(..., ge=1, description="Data's ID, must be >= 1.")
25
- uuid:UUID = Field(..., description="Data's UUID.")
24
+ id: int = Field(..., ge=1, description="Data's ID, must be >= 1.")
25
+ uuid: UUID = Field(..., description="Data's UUID.")
26
26
 
27
27
  class EssentialTimestamps(BaseModel):
28
- created_at:datetime = Field(..., description="Data's created_at timestamp")
29
- updated_at:datetime = Field(..., description="Data's updated_at timestamp")
28
+ created_at: datetime = Field(..., description="Data's created_at timestamp")
29
+ updated_at: datetime = Field(..., description="Data's updated_at timestamp")
30
30
 
31
31
  class StatusTimestamps(BaseModel):
32
- deleted_at:BaseTypes.OptionalDatetime = Field(..., description="Data's deleted_at timestamp")
33
- restored_at:BaseTypes.OptionalDatetime = Field(..., description="Data's restored_at timestamp")
34
- deactivated_at:BaseTypes.OptionalDatetime = Field(..., description="Data's deactivated_at timestamp")
35
- activated_at:datetime = Field(..., description="Data's activated_at timestamp")
32
+ deleted_at: BaseTypes.OptionalDatetime = Field(..., description="Data's deleted_at timestamp")
33
+ restored_at: BaseTypes.OptionalDatetime = Field(..., description="Data's restored_at timestamp")
34
+ deactivated_at: BaseTypes.OptionalDatetime = Field(..., description="Data's deactivated_at timestamp")
35
+ activated_at: datetime = Field(..., description="Data's activated_at timestamp")
36
36
 
37
37
  class Timestamps(
38
38
  StatusTimestamps,
@@ -40,54 +40,54 @@ class BaseGeneralSchemas:
40
40
  ): pass
41
41
 
42
42
  class Status(BaseModel):
43
- status:BaseEnums.StatusType = Field(..., description="Data's status")
43
+ status: BaseEnums.StatusType = Field(..., description="Data's status")
44
44
 
45
45
  class IsDefault(BaseModel):
46
- is_default:BaseTypes.OptionalBoolean = Field(None, description="Whether data is default")
46
+ is_default: BaseTypes.OptionalBoolean = Field(None, description="Whether data is default")
47
47
 
48
48
  class IsRoot(BaseModel):
49
- is_root:BaseTypes.OptionalBoolean = Field(None, description="Whether data is root")
49
+ is_root: BaseTypes.OptionalBoolean = Field(None, description="Whether data is root")
50
50
 
51
51
  class IsParent(BaseModel):
52
- is_parent:BaseTypes.OptionalBoolean = Field(None, description="Whether data is parent")
52
+ is_parent: BaseTypes.OptionalBoolean = Field(None, description="Whether data is parent")
53
53
 
54
54
  class IsChild(BaseModel):
55
- is_child:BaseTypes.OptionalBoolean = Field(None, description="Whether data is child")
55
+ is_child: BaseTypes.OptionalBoolean = Field(None, description="Whether data is child")
56
56
 
57
57
  class IsLeaf(BaseModel):
58
- is_leaf:BaseTypes.OptionalBoolean = Field(None, description="Whether data is leaf")
58
+ is_leaf: BaseTypes.OptionalBoolean = Field(None, description="Whether data is leaf")
59
59
 
60
60
  class Order(BaseModel):
61
- order:BaseTypes.OptionalInteger = Field(..., description="Data's order")
61
+ order: BaseTypes.OptionalInteger = Field(..., description="Data's order")
62
62
 
63
63
  class Code(BaseModel):
64
- code:str = Field(..., description="Data's code")
64
+ code: str = Field(..., description="Data's code")
65
65
 
66
66
  class Key(BaseModel):
67
- key:str = Field(..., description="Data's key")
67
+ key: str = Field(..., description="Data's key")
68
68
 
69
69
  class Name(BaseModel):
70
- name:str = Field(..., description="Data's name")
70
+ name: str = Field(..., description="Data's name")
71
71
 
72
72
  class Secret(BaseModel):
73
- secret:UUID = Field(..., description="Data's secret")
73
+ secret: UUID = Field(..., description="Data's secret")
74
74
 
75
75
  #* ----- ----- ----- RSA Key ----- ----- ----- *#
76
76
  class PrivateKey(BaseModel):
77
- private_key:str = Field(..., description="Private key in str format.")
77
+ private_key: str = Field(..., description="Private key in str format.")
78
78
 
79
79
  class PublicKey(BaseModel):
80
- public_key:str = Field(..., description="Public key in str format.")
80
+ public_key: str = Field(..., description="Public key in str format.")
81
81
 
82
82
  class KeyPair(PublicKey, PrivateKey): pass
83
83
 
84
84
  class RSAKeys(BaseModel):
85
- password:str = Field(..., description="Key's password")
86
- private:str = Field(..., description="Private key")
87
- public:str = Field(..., description="Public key")
85
+ password: str = Field(..., description="Key's password")
86
+ private: str = Field(..., description="Private key")
87
+ public: str = Field(..., description="Public key")
88
88
 
89
89
  class AccessedAt(BaseModel):
90
- accessed_at:datetime = Field(datetime.now(tz=timezone.utc), description="Accessed at")
90
+ accessed_at: datetime = Field(datetime.now(tz=timezone.utc), description="Accessed at")
91
91
 
92
92
  class AccessedBy(BaseModel):
93
- accessed_by:int = Field(0, ge=0, description="Accessed by")
93
+ accessed_by: int = Field(0, ge=0, description="Accessed by")
@@ -3,13 +3,13 @@ from pydantic import BaseModel, Field
3
3
 
4
4
  class MaleoFoundationHashSchemas:
5
5
  class Key(BaseModel):
6
- key:str = Field(..., description="Key")
6
+ key: str = Field(..., description="Key")
7
7
 
8
8
  class Message(BaseModel):
9
- message:str = Field(..., description="Message")
9
+ message: str = Field(..., description="Message")
10
10
 
11
11
  class Hash(BaseModel):
12
- hash:str = Field(..., description="Hash")
12
+ hash: str = Field(..., description="Hash")
13
13
 
14
14
  class IsValid(BaseModel):
15
- is_valid:bool = Field(..., description="Is valid hash")
15
+ is_valid: bool = Field(..., description="Is valid hash")
@@ -5,11 +5,11 @@ from maleo_foundation.types import BaseTypes
5
5
 
6
6
  class BaseKeySchemas:
7
7
  class KeySize(BaseModel):
8
- key_size:int = Field(2048, ge=2048, le=16384, description="Key's size")
8
+ key_size: int = Field(2048, ge=2048, le=16384, description="Key's size")
9
9
 
10
10
  class Password(BaseModel):
11
- password:BaseTypes.OptionalString = Field(None, min_length=32, max_length=1024, description="password")
11
+ password: BaseTypes.OptionalString = Field(None, min_length=32, max_length=1024, description="password")
12
12
 
13
13
  class Key(BaseModel):
14
- type:BaseEnums.KeyType = Field(..., description="Key's type")
15
- value:str = Field(..., description="Key's value")
14
+ type: BaseEnums.KeyType = Field(..., description="Key's type")
15
+ value: str = Field(..., description="Key's value")
@@ -9,19 +9,19 @@ from maleo_foundation.extended_types import ExtendedTypes
9
9
 
10
10
  class BaseParameterSchemas:
11
11
  class IdentifierType(BaseModel):
12
- identifier:BaseEnums.IdentifierTypes = Field(..., description="Data's identifier type")
12
+ identifier: BaseEnums.IdentifierTypes = Field(..., description="Data's identifier type")
13
13
 
14
14
  class IdentifierValue(BaseModel):
15
- value:BaseTypes.IdentifierValue = Field(..., description="Data's identifier value")
15
+ value: BaseTypes.IdentifierValue = Field(..., description="Data's identifier value")
16
16
 
17
17
  class OptionalListOfIds(BaseModel):
18
- ids:BaseTypes.OptionalListOfIntegers = Field(None, description="Specific Ids")
18
+ ids: BaseTypes.OptionalListOfIntegers = Field(None, description="Specific Ids")
19
19
 
20
20
  class OptionalListOfUuids(BaseModel):
21
- uuids:BaseTypes.OptionalListOfUUIDs = Field(None, description="Specific Uuids")
21
+ uuids: BaseTypes.OptionalListOfUUIDs = Field(None, description="Specific Uuids")
22
22
 
23
23
  class Filters(BaseModel):
24
- filters:BaseTypes.ListOfStrings = Field([], description="Filters for date range, e.g. 'created_at|from::<ISO_DATETIME>|to::<ISO_DATETIME>'.")
24
+ filters: BaseTypes.ListOfStrings = Field([], description="Filters for date range, e.g. 'created_at|from::<ISO_DATETIME>|to::<ISO_DATETIME>'.")
25
25
 
26
26
  @field_validator("filters")
27
27
  @classmethod
@@ -38,25 +38,25 @@ class BaseParameterSchemas:
38
38
  return final_values
39
39
 
40
40
  class DateFilters(BaseModel):
41
- date_filters:ExtendedTypes.ListOfDateFilters = Field([], description="Date filters to be applied")
41
+ date_filters: ExtendedTypes.ListOfDateFilters = Field([], description="Date filters to be applied")
42
42
 
43
43
  class OptionalListOfStatuses(BaseModel):
44
- statuses:BaseTypes.OptionalListOfStatuses = Field(None, description="Data's status")
44
+ statuses: BaseTypes.OptionalListOfStatuses = Field(None, description="Data's status")
45
45
 
46
46
  class OptionalListOfCodes(BaseModel):
47
- codes:BaseTypes.OptionalListOfStrings = Field(None, description="Specific Codes")
47
+ codes: BaseTypes.OptionalListOfStrings = Field(None, description="Specific Codes")
48
48
 
49
49
  class OptionalListOfKeys(BaseModel):
50
- keys:BaseTypes.OptionalListOfStrings = Field(None, description="Specific Keys")
50
+ keys: BaseTypes.OptionalListOfStrings = Field(None, description="Specific Keys")
51
51
 
52
52
  class OptionalListOfNames(BaseModel):
53
- names:BaseTypes.OptionalListOfStrings = Field(None, description="Specific Names")
53
+ names: BaseTypes.OptionalListOfStrings = Field(None, description="Specific Names")
54
54
 
55
55
  class Search(BaseModel):
56
- search:BaseTypes.OptionalString = Field(None, description="Search string.")
56
+ search: BaseTypes.OptionalString = Field(None, description="Search string.")
57
57
 
58
58
  class Sorts(BaseModel):
59
- sorts:BaseTypes.ListOfStrings = Field(["id.asc"], description="Sorting columns in 'column_name.asc' or 'column_name.desc' format.")
59
+ sorts: BaseTypes.ListOfStrings = Field(["id.asc"], description="Sorting columns in 'column_name.asc' or 'column_name.desc' format.")
60
60
 
61
61
  @field_validator("sorts")
62
62
  @classmethod
@@ -64,10 +64,10 @@ class BaseParameterSchemas:
64
64
  return [value for value in values if SORT_COLUMN_PATTERN.match(value)]
65
65
 
66
66
  class SortColumns(BaseModel):
67
- sort_columns:ExtendedTypes.ListOfSortColumns = Field([BaseGeneralSchemas.SortColumn(name="id", order=BaseEnums.SortOrder.ASC)], description="List of columns to be sorted")
67
+ sort_columns: ExtendedTypes.ListOfSortColumns = Field([BaseGeneralSchemas.SortColumn(name="id", order=BaseEnums.SortOrder.ASC)], description="List of columns to be sorted")
68
68
 
69
69
  class Expand(BaseModel):
70
- expand:BaseTypes.OptionalListOfStrings = Field(None, description="Expanded field(s)")
70
+ expand: BaseTypes.OptionalListOfStrings = Field(None, description="Expanded field(s)")
71
71
 
72
72
  class Data(BaseModel):
73
- data:BaseTypes.StringToAnyDict = Field(..., description="Data")
73
+ data: BaseTypes.StringToAnyDict = Field(..., description="Data")
@@ -4,79 +4,79 @@ from maleo_foundation.models.schemas.general import BaseGeneralSchemas
4
4
  from maleo_foundation.types import BaseTypes
5
5
 
6
6
  class FieldExpansionMetadata(BaseModel):
7
- success:bool = Field(..., description="Field expansion's success status")
8
- code:BaseTypes.OptionalString = Field(None, description="Optional result code")
9
- message:BaseTypes.OptionalString = Field(None, description="Optional message")
10
- description:BaseTypes.OptionalString = Field(None, description="Optional description")
11
- other:BaseTypes.OptionalAny = Field(None, description="Optional other information")
7
+ success: bool = Field(..., description="Field expansion's success status")
8
+ code: BaseTypes.OptionalString = Field(None, description="Optional result code")
9
+ message: BaseTypes.OptionalString = Field(None, description="Optional message")
10
+ description: BaseTypes.OptionalString = Field(None, description="Optional description")
11
+ other: BaseTypes.OptionalAny = Field(None, description="Optional other information")
12
12
 
13
13
  class ResultMetadata(BaseModel):
14
- field_expansion:Optional[Union[str, Dict[str, FieldExpansionMetadata]]] = Field(None, description="Field expansion metadata")
14
+ field_expansion: Optional[Union[str, Dict[str, FieldExpansionMetadata]]] = Field(None, description="Field expansion metadata")
15
15
 
16
16
  class BaseResultSchemas:
17
17
  class ExtendedPagination(BaseGeneralSchemas.SimplePagination):
18
- data_count:int = Field(..., description="Fetched data count")
19
- total_data:int = Field(..., description="Total data count")
20
- total_pages:int = Field(..., description="Total pages count")
18
+ data_count: int = Field(..., description="Fetched data count")
19
+ total_data: int = Field(..., description="Total data count")
20
+ total_pages: int = Field(..., description="Total pages count")
21
21
 
22
22
  #* ----- ----- ----- Base ----- ----- ----- *#
23
23
  class Base(BaseModel):
24
- success:bool = Field(..., description="Success status")
25
- code:BaseTypes.OptionalString = Field(None, description="Optional result code")
26
- message:BaseTypes.OptionalString = Field(None, description="Optional message")
27
- description:BaseTypes.OptionalString = Field(None, description="Optional description")
28
- data:Any = Field(..., description="Data")
29
- metadata:Optional[ResultMetadata] = Field(None, description="Optional metadata")
30
- other:BaseTypes.OptionalAny = Field(None, description="Optional other information")
24
+ success: bool = Field(..., description="Success status")
25
+ code: BaseTypes.OptionalString = Field(None, description="Optional result code")
26
+ message: BaseTypes.OptionalString = Field(None, description="Optional message")
27
+ description: BaseTypes.OptionalString = Field(None, description="Optional description")
28
+ data: Any = Field(..., description="Data")
29
+ metadata: Optional[ResultMetadata] = Field(None, description="Optional metadata")
30
+ other: BaseTypes.OptionalAny = Field(None, description="Optional other information")
31
31
 
32
32
  #* ----- ----- ----- Intermediary ----- ----- ----- *#
33
33
  class Fail(Base):
34
- code:str = "MAL-FAI-001"
35
- message:str = "Fail result"
36
- description:str = "Operation failed."
37
- success:BaseTypes.LiteralFalse = Field(False, description="Success status")
38
- data:None = Field(None, description="No data")
34
+ code: str = "MAL-FAI-001"
35
+ message: str = "Fail result"
36
+ description: str = "Operation failed."
37
+ success: BaseTypes.LiteralFalse = Field(False, description="Success status")
38
+ data: None = Field(None, description="No data")
39
39
 
40
40
  class Success(Base):
41
- success:BaseTypes.LiteralTrue = Field(True, description="Success status")
42
- code:str = "MAL-SCS-001"
43
- message:str = "Success result"
44
- description:str = "Operation succeeded."
45
- data:Any = Field(..., description="Data")
41
+ success: BaseTypes.LiteralTrue = Field(True, description="Success status")
42
+ code: str = "MAL-SCS-001"
43
+ message: str = "Success result"
44
+ description: str = "Operation succeeded."
45
+ data: Any = Field(..., description="Data")
46
46
 
47
47
  #* ----- ----- ----- Derived ----- ----- ----- *#
48
48
  class NotFound(Fail):
49
- code:str = "MAL-NTF-001"
50
- message:str = "Resource not found"
51
- description:str = "The requested resource can not be found."
52
- data:None = Field(None, description="No data")
49
+ code: str = "MAL-NTF-001"
50
+ message: str = "Resource not found"
51
+ description: str = "The requested resource can not be found."
52
+ data: None = Field(None, description="No data")
53
53
 
54
54
  class NoData(Success):
55
- code:str = "MAL-NDT-001"
56
- message:str = "No data found"
57
- description:str = "No data found in the requested resource."
58
- data:None = Field(None, description="No data")
55
+ code: str = "MAL-NDT-001"
56
+ message: str = "No data found"
57
+ description: str = "No data found in the requested resource."
58
+ data: None = Field(None, description="No data")
59
59
 
60
60
  class SingleData(Success):
61
- code:str = "MAL-SGD-001"
62
- message:str = "Single data found"
63
- description:str = "Requested data found in database."
64
- data:Any = Field(..., description="Fetched single data")
61
+ code: str = "MAL-SGD-001"
62
+ message: str = "Single data found"
63
+ description: str = "Requested data found in database."
64
+ data: Any = Field(..., description="Fetched single data")
65
65
 
66
66
  class UnpaginatedMultipleData(Success):
67
- code:str = "MAL-MTD-001"
68
- message:str = "Multiple unpaginated data found"
69
- description:str = "Requested unpaginated data found in database."
70
- data:BaseTypes.ListOfAny = Field(..., description="Unpaginated multiple data")
67
+ code: str = "MAL-MTD-001"
68
+ message: str = "Multiple unpaginated data found"
69
+ description: str = "Requested unpaginated data found in database."
70
+ data: BaseTypes.ListOfAny = Field(..., description="Unpaginated multiple data")
71
71
 
72
72
  class PaginatedMultipleData(
73
73
  UnpaginatedMultipleData,
74
74
  BaseGeneralSchemas.SimplePagination
75
75
  ):
76
- code:str = "MAL-MTD-002"
77
- message:str = "Multiple paginated data found"
78
- description:str = "Requested paginated data found in database."
79
- total_data:int = Field(..., ge=0, description="Total data count")
80
- pagination:"BaseResultSchemas.ExtendedPagination" = Field(..., description="Pagination metadata")
76
+ code: str = "MAL-MTD-002"
77
+ message: str = "Multiple paginated data found"
78
+ description: str = "Requested paginated data found in database."
79
+ total_data: int = Field(..., ge=0, description="Total data count")
80
+ pagination: "BaseResultSchemas.ExtendedPagination" = Field(..., description="Pagination metadata")
81
81
 
82
82
  BaseResultSchemas.PaginatedMultipleData.model_rebuild()
@@ -3,16 +3,16 @@ from maleo_foundation.types import BaseTypes
3
3
 
4
4
  class MaleoFoundationSignatureSchemas:
5
5
  class Key(BaseModel):
6
- key:str = Field(..., description="Key")
6
+ key: str = Field(..., description="Key")
7
7
 
8
8
  class Password(BaseModel):
9
- password:BaseTypes.OptionalString = Field(None, min_length=32, max_length=1024, description="password")
9
+ password: BaseTypes.OptionalString = Field(None, min_length=32, max_length=1024, description="password")
10
10
 
11
11
  class Message(BaseModel):
12
- message:str = Field(..., description="Message")
12
+ message: str = Field(..., description="Message")
13
13
 
14
14
  class Signature(BaseModel):
15
- signature:str = Field(..., description="Signature")
15
+ signature: str = Field(..., description="Signature")
16
16
 
17
17
  class IsValid(BaseModel):
18
- is_valid:bool = Field(..., description="Is valid signature")
18
+ is_valid: bool = Field(..., description="Is valid signature")
@@ -4,13 +4,13 @@ from maleo_foundation.types import BaseTypes
4
4
 
5
5
  class MaleoFoundationTokenSchemas:
6
6
  class Key(BaseModel):
7
- key:str = Field(..., description="Key")
7
+ key: str = Field(..., description="Key")
8
8
 
9
9
  class Password(BaseModel):
10
- password:BaseTypes.OptionalString = Field(None, min_length=32, max_length=1024, description="password")
10
+ password: BaseTypes.OptionalString = Field(None, min_length=32, max_length=1024, description="password")
11
11
 
12
12
  class Token(BaseModel):
13
- token:str = Field(..., description="Token")
13
+ token: str = Field(..., description="Token")
14
14
 
15
15
  class ExpIn(BaseModel):
16
- exp_in:int = Field(15, ge=1, description="Expires in (integer, minutes)")
16
+ exp_in: int = Field(15, ge=1, description="Expires in (integer, minutes)")
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
  from datetime import datetime, timezone
3
3
  from pydantic import BaseModel, Field
4
- from typing import Dict
4
+ from typing import Dict, Any
5
5
  from uuid import UUID
6
6
  from maleo_foundation.models.schemas.general import BaseGeneralSchemas
7
7
  from maleo_foundation.types import BaseTypes
@@ -16,20 +16,65 @@ class AccessTransfers(
16
16
  ): pass
17
17
 
18
18
  class RequestContextTransfers(BaseModel):
19
- request_id:UUID = Field(..., description="Unique identifier for tracing the request")
20
- requested_at:datetime = Field(datetime.now(tz=timezone.utc), description="Request timestamp")
21
- method:str = Field(..., description="Request's method")
22
- url:str = Field(..., description="Request's URL")
23
- path_params:Dict = Field(..., description="Request's path parameters")
24
- query_params:Dict = Field(..., description="Request's query parameters")
25
- ip_address:str = Field("unknown", description="Client's IP address")
26
- is_internal:BaseTypes.OptionalBoolean = Field(None, description="True if IP is internal")
27
- user_agent:BaseTypes.OptionalString = Field(None, description="User-Agent string")
28
- ua_browser:BaseTypes.OptionalString = Field(None, description="Browser info from sec-ch-ua")
29
- ua_mobile:BaseTypes.OptionalString = Field(None, description="Is mobile device?")
30
- platform:BaseTypes.OptionalString = Field(None, description="Client platform or OS")
31
- referer:BaseTypes.OptionalString = Field(None, description="Referrer URL")
32
- origin:BaseTypes.OptionalString = Field(None, description="Origin of the request")
33
- host:BaseTypes.OptionalString = Field(None, description="Host header from request")
34
- forwarded_proto:BaseTypes.OptionalString = Field(None, description="Forwarded protocol (http/https)")
35
- language:BaseTypes.OptionalString = Field(None, description="Accepted languages from client")
19
+ request_id: UUID = Field(..., description="Unique identifier for tracing the request")
20
+ requested_at: datetime = Field(datetime.now(tz=timezone.utc), description="Request timestamp")
21
+ method: str = Field(..., description="Request's method")
22
+ url: str = Field(..., description="Request's URL")
23
+ path_params: Dict = Field(..., description="Request's path parameters")
24
+ query_params: Dict = Field(..., description="Request's query parameters")
25
+ ip_address: str = Field("unknown", description="Client's IP address")
26
+ is_internal: BaseTypes.OptionalBoolean = Field(None, description="True if IP is internal")
27
+ user_agent: BaseTypes.OptionalString = Field(None, description="User-Agent string")
28
+ ua_browser: BaseTypes.OptionalString = Field(None, description="Browser info from sec-ch-ua")
29
+ ua_mobile: BaseTypes.OptionalString = Field(None, description="Is mobile device?")
30
+ platform: BaseTypes.OptionalString = Field(None, description="Client platform or OS")
31
+ referer: BaseTypes.OptionalString = Field(None, description="Referrer URL")
32
+ origin: BaseTypes.OptionalString = Field(None, description="Origin of the request")
33
+ host: BaseTypes.OptionalString = Field(None, description="Host header from request")
34
+ forwarded_proto: BaseTypes.OptionalString = Field(None, description="Forwarded protocol (http/https)")
35
+ language: BaseTypes.OptionalString = Field(None, description="Accepted languages from client")
36
+
37
+ def to_google_pubsub_object(self) -> Dict[str, Any]:
38
+ result = {
39
+ "request_id": str(self.request_id),
40
+ "requested_at": self.requested_at.isoformat(),
41
+ "method": self.method,
42
+ "url": self.url,
43
+ "path_params": {"map": self.path_params},
44
+ "query_params": {"map": self.query_params},
45
+ "ip_address": self.ip_address,
46
+ "is_internal": None if self.is_internal is None else {"boolean": self.is_internal},
47
+ "user_agent": None if self.user_agent is None else {"string": self.user_agent},
48
+ "ua_browser": None if self.ua_browser is None else {"string": self.ua_browser},
49
+ "ua_mobile": None if self.ua_mobile is None else {"string": self.ua_mobile},
50
+ "platform": None if self.platform is None else {"string": self.platform},
51
+ "referer": None if self.referer is None else {"array": self.referer},
52
+ "origin": None if self.origin is None else {"array": self.origin},
53
+ "host": None if self.host is None else {"array": self.host},
54
+ "forwarded_proto": None if self.forwarded_proto is None else {"array": self.forwarded_proto},
55
+ "language": None if self.language is None else {"array": self.language}
56
+ }
57
+
58
+ return result
59
+
60
+ @classmethod
61
+ def from_google_pubsub_object(cls, obj:Dict[str, Any]):
62
+ return cls(
63
+ request_id = UUID(obj["request_id"]),
64
+ requested_at = datetime.fromisoformat(obj["requested_at"]),
65
+ method = obj["method"],
66
+ url = obj["url"],
67
+ path_params = obj["path_params"]["map"] or {},
68
+ query_params = obj["query_params"]["map"] or {},
69
+ ip_address = obj["ip_address"],
70
+ is_internal = None if obj["is_internal"] is None else bool(obj["is_internal"]["boolean"]),
71
+ user_agent = None if obj["user_agent"] is None else obj["user_agent"]["string"],
72
+ ua_browser = None if obj["ua_browser"] is None else obj["ua_browser"]["string"],
73
+ ua_mobile = None if obj["ua_mobile"] is None else obj["ua_mobile"]["string"],
74
+ platform = None if obj["platform"] is None else obj["platform"]["string"],
75
+ referer = None if obj["referer"] is None else obj["referer"]["string"],
76
+ origin = None if obj["origin"] is None else obj["origin"]["string"],
77
+ host = None if obj["host"] is None else obj["host"]["string"],
78
+ forwarded_proto = None if obj["forwarded_proto"] is None else obj["forwarded_proto"]["string"],
79
+ language = None if obj["language"] is None else obj["language"]["string"],
80
+ )
@@ -5,11 +5,11 @@ from maleo_foundation.models.schemas.key import BaseKeySchemas
5
5
 
6
6
  class MaleoFoundationKeyGeneralTransfers:
7
7
  class PrivateKey(BaseKeySchemas.Key):
8
- type:BaseEnums.KeyType = Field(BaseEnums.KeyType.PRIVATE, description="Private key's type")
8
+ type: BaseEnums.KeyType = Field(BaseEnums.KeyType.PRIVATE, description="Private key's type")
9
9
 
10
10
  class PublicKey(BaseKeySchemas.Key):
11
- type:BaseEnums.KeyType = Field(BaseEnums.KeyType.PUBLIC, description="Public key's type")
11
+ type: BaseEnums.KeyType = Field(BaseEnums.KeyType.PUBLIC, description="Public key's type")
12
12
 
13
13
  class KeyPair(BaseModel):
14
- private:MaleoFoundationKeyGeneralTransfers.PrivateKey = Field(..., description="Private key's data")
15
- public:MaleoFoundationKeyGeneralTransfers.PublicKey = Field(..., description="Public key's data")
14
+ private: MaleoFoundationKeyGeneralTransfers.PrivateKey = Field(..., description="Private key's data")
15
+ public: MaleoFoundationKeyGeneralTransfers.PublicKey = Field(..., description="Public key's data")
@@ -1,37 +1,83 @@
1
1
  from __future__ import annotations
2
2
  from datetime import datetime, timedelta, timezone
3
3
  from pydantic import BaseModel, Field, model_validator
4
+ from typing import Dict, Any
4
5
  from uuid import UUID
5
6
  from maleo_foundation.types import BaseTypes
6
7
  from maleo_foundation.models.schemas.token import MaleoFoundationTokenSchemas
7
8
 
8
9
  class MaleoFoundationTokenGeneralTransfers:
9
10
  class BasePayload(BaseModel):
10
- iss:BaseTypes.OptionalString = Field(None, description="Token's issuer")
11
- sub:str = Field(..., description="Token's subject")
12
- sr:str = Field(..., description="System role")
13
- u_i:int = Field(..., description="user's id")
14
- u_uu:UUID = Field(..., description="user's uuid")
15
- u_u:str = Field(..., description="user's username")
16
- u_e:str = Field(..., description="user's email")
17
- u_ut:str = Field(..., description="user's type")
18
- o_i:BaseTypes.OptionalInteger = Field(None, description="Organization's id")
19
- o_uu:BaseTypes.OptionalUUID = Field(None, description="Organization's uuid")
20
- o_k:BaseTypes.OptionalString = Field(None, description="Organization's key")
21
- o_ot:BaseTypes.OptionalString = Field(None, description="Organization's type")
22
- uor:BaseTypes.OptionalListOfStrings = Field(None, description="User Organization Role")
11
+ iss: BaseTypes.OptionalString = Field(None, description="Token's issuer")
12
+ sub: str = Field(..., description="Token's subject")
13
+ sr: str = Field(..., description="System role")
14
+ u_i: int = Field(..., description="user's id")
15
+ u_uu: UUID = Field(..., description="user's uuid")
16
+ u_u: str = Field(..., description="user's username")
17
+ u_e: str = Field(..., description="user's email")
18
+ u_ut: str = Field(..., description="user's type")
19
+ o_i: BaseTypes.OptionalInteger = Field(None, description="Organization's id")
20
+ o_uu: BaseTypes.OptionalUUID = Field(None, description="Organization's uuid")
21
+ o_k: BaseTypes.OptionalString = Field(None, description="Organization's key")
22
+ o_ot: BaseTypes.OptionalString = Field(None, description="Organization's type")
23
+ uor: BaseTypes.OptionalListOfStrings = Field(None, description="User Organization Role")
23
24
 
24
25
  class DecodePayload(BasePayload):
25
- iat_dt:datetime = Field(..., description="Issued at (datetime)")
26
- iat:int = Field(..., description="Issued at (integer)")
27
- exp_dt:datetime = Field(..., description="Expired at (datetime)")
28
- exp:int = Field(..., description="Expired at (integer)")
26
+ iat_dt: datetime = Field(..., description="Issued at (datetime)")
27
+ iat: int = Field(..., description="Issued at (integer)")
28
+ exp_dt: datetime = Field(..., description="Expired at (datetime)")
29
+ exp: int = Field(..., description="Expired at (integer)")
30
+
31
+ def to_google_pubsub_object(self) -> Dict[str, Any]:
32
+ result = {
33
+ "iss": None if self.iss is None else {"string": self.iss},
34
+ "sub": self.sub,
35
+ "sr": self.sr,
36
+ "u_i": self.u_i,
37
+ "u_uu": str(self.u_uu),
38
+ "u_u": self.u_u,
39
+ "u_e": self.u_e,
40
+ "u_ut": self.u_ut,
41
+ "o_i": None if self.o_i is None else {"int": self.o_i},
42
+ "o_uu": None if self.o_uu is None else {"string": str(self.o_uu)},
43
+ "o_k": None if self.o_k is None else {"string": self.o_k},
44
+ "o_ot": None if self.o_ot is None else {"string": self.o_ot},
45
+ "uor": None if self.uor is None else {"array": self.uor},
46
+ "iat_dt": self.iat_dt.isoformat(),
47
+ "iat": self.iat,
48
+ "exp_dt": self.iat_dt.isoformat(),
49
+ "exp": self.exp
50
+ }
51
+
52
+ return result
53
+
54
+ @classmethod
55
+ def from_google_pubsub_object(cls, obj:Dict[str, Any]):
56
+ return cls(
57
+ iss = None if obj["iss"] is None else obj["iss"]["string"],
58
+ sub = obj["sub"],
59
+ sr = obj["sr"],
60
+ u_i = obj["u_i"],
61
+ u_uu = UUID(obj["u_uu"]),
62
+ u_u = obj["u_u"],
63
+ u_e = obj["u_e"],
64
+ u_ut = obj["u_ut"],
65
+ o_i = None if obj["o_i"] is None else obj["o_i"]["int"],
66
+ o_uu = None if obj["o_uu"] is None else UUID(obj["o_uu"]["string"]),
67
+ o_k = None if obj["o_k"] is None else obj["o_k"]["string"],
68
+ o_ot = None if obj["o_ot"] is None else obj["o_ot"]["string"],
69
+ uor = None if obj["uor"] is None else obj["uor"]["array"],
70
+ iat_dt = datetime.fromisoformat(obj["iat_dt"]),
71
+ iat = int(obj["iat"]),
72
+ exp_dt = datetime.fromisoformat(obj["exp_dt"]),
73
+ exp = int(obj["exp"])
74
+ )
29
75
 
30
76
  class BaseEncodePayload(MaleoFoundationTokenSchemas.ExpIn, BasePayload): pass
31
77
 
32
78
  class EncodePayload(DecodePayload):
33
- iat_dt:datetime = Field(datetime.now(timezone.utc), description="Issued at (datetime)")
34
- exp_in:int = Field(15, ge=1, description="Expires in (integer, minutes)", exclude=True)
79
+ iat_dt: datetime = Field(datetime.now(timezone.utc), description="Issued at (datetime)")
80
+ exp_in: int = Field(15, ge=1, description="Expires in (integer, minutes)", exclude=True)
35
81
 
36
82
  @model_validator(mode="before")
37
83
  @classmethod
@@ -55,4 +101,5 @@ class MaleoFoundationTokenGeneralTransfers:
55
101
  values["exp_dt"] = exp_dt
56
102
  #* Convert `exp_dt` to timestamp (int)
57
103
  values["exp"] = int(exp_dt.timestamp())
58
- return values
104
+ return values
105
+
@@ -8,7 +8,7 @@ class MaleoFoundationTokenParametersTransfers:
8
8
  MaleoFoundationTokenSchemas.Password,
9
9
  MaleoFoundationTokenSchemas.Key
10
10
  ):
11
- payload:MaleoFoundationTokenGeneralTransfers.BaseEncodePayload = Field(..., description="Encode payload")
11
+ payload: MaleoFoundationTokenGeneralTransfers.BaseEncodePayload = Field(..., description="Encode payload")
12
12
 
13
13
  class Decode(
14
14
  MaleoFoundationTokenSchemas.Token,