Coverage for src/integrify/azericard/schemas/request/transfer.py: 100%

34 statements  

« prev     ^ index     » next       coverage.py v7.9.2, created at 2025-12-29 00:57 +0000

1from decimal import Decimal 

2from hashlib import md5 

3from typing import ClassVar 

4 

5from pydantic import AliasGenerator, ConfigDict, Field, computed_field 

6from pydantic.alias_generators import to_pascal 

7 

8from integrify.azericard import env 

9from integrify.azericard.utils import TimeStampOut 

10from integrify.schemas import PayloadBaseModel 

11 

12 

13class BaseTransferRequestSchema(PayloadBaseModel): 

14 SIGNATURE_FIELDS: ClassVar[list[str]] 

15 """Signature hesablanılması üçün lazım olan field adları""" 

16 

17 model_config = ConfigDict(alias_generator=AliasGenerator(serialization_alias=to_pascal)) 

18 

19 merchant: str = Field(min_length=1, max_length=16) 

20 """Şirkət adı""" 

21 

22 srn: str = Field(min_length=1, max_length=12, serialization_alias='SRN') 

23 """Tərəfinizdən unikal əməliyyat nömrəsi""" 

24 

25 amount: Decimal 

26 """Ödəniş məbləği""" 

27 

28 cur: str = Field(min_length=3, max_length=3) 

29 """Ödəniş valyutasının 3 rəqəmli kodu (AZN - 944)""" 

30 

31 @computed_field # type: ignore[prop-decorator] 

32 @property 

33 def signature(self) -> str: 

34 """Yaradılmış data üçün signature generasiyası""" 

35 assert self.SIGNATURE_FIELDS 

36 

37 with open(env.AZERICARD_KEY_FILE_PATH, encoding='utf-8') as key_file: 

38 key = key_file.read().replace('\n', '') 

39 

40 source = '' 

41 for field in self.SIGNATURE_FIELDS: 

42 source += str(getattr(self, field)) 

43 

44 source += key 

45 

46 return md5(source.encode('utf-8'), usedforsecurity=False).hexdigest() 

47 

48 

49class TransferStartRequestSchema(BaseTransferRequestSchema): 

50 SIGNATURE_FIELDS: ClassVar[list[str]] = [ 

51 'merchant', 

52 'srn', 

53 'amount', 

54 'cur', 

55 'receiver_credentials', 

56 'redirect_link', 

57 ] 

58 

59 receiver_credentials: str = Field(max_length=151) 

60 """İstifadəçinin tam adı""" 

61 

62 redirect_link: str = Field(max_length=12) 

63 """Əməliyyatın sonunda müştərini yönləndirmək istədiyiniz keçid""" 

64 

65 

66class TransferConfirmDeclineRequestSchema(BaseTransferRequestSchema): 

67 SIGNATURE_FIELDS: ClassVar[list[str]] = ['merchant', 'srn', 'amount', 'cur', 'timestamp'] 

68 

69 timestamp: TimeStampOut