1- from typing import Literal , Optional , Union
1+ from typing import Literal , Optional
22
33from pydantic import BaseModel , Field , field_validator
44
55from .enums import Region
66from .errors import ApplicationError
77
88
9- class Url (BaseModel ):
9+ class ApplicationUrl (BaseModel ):
1010 address : str
1111 http_method : Optional [Literal ['GET' , 'POST' ]] = None
1212
1313
14- class VoiceUrl (Url ):
15- connection_timeout : Optional [int ] = Field (None , ge = 300 , le = 1000 )
16- socket_timeout : Optional [int ] = Field (None , ge = 1000 , le = 5000 )
14+ class VoiceUrl (ApplicationUrl ):
15+ connect_timeout : Optional [int ] = Field (None , ge = 300 , le = 1000 )
16+ socket_timeout : Optional [int ] = Field (None , ge = 1000 , le = 10000 )
1717
1818
1919class VoiceWebhooks (BaseModel ):
20- answer_url : Optional [Url ] = None
21- fallback_answer_url : Optional [Url ] = None
22- event_url : Optional [Url ] = None
20+ answer_url : Optional [VoiceUrl ] = None
21+ fallback_answer_url : Optional [VoiceUrl ] = None
22+ event_url : Optional [VoiceUrl ] = None
2323
2424
2525class Voice (BaseModel ):
26+ """Voice application capabilities."""
27+
2628 webhooks : Optional [VoiceWebhooks ] = None
2729 signed_callbacks : Optional [bool ] = None
2830 conversations_ttl : Optional [int ] = Field (None , ge = 1 , le = 9000 )
@@ -31,40 +33,60 @@ class Voice(BaseModel):
3133
3234
3335class RtcWebhooks (BaseModel ):
34- event_url : Optional [Url ] = None
36+ event_url : Optional [ApplicationUrl ] = None
3537
3638
3739class Rtc (BaseModel ):
40+ """Real-Time Communications application capabilities."""
41+
3842 webhooks : Optional [RtcWebhooks ] = None
3943 signed_callbacks : Optional [bool ] = None
4044
4145
4246class MessagesWebhooks (BaseModel ):
43- inbound_url : Optional [Url ] = None
44- status_url : Optional [Url ] = None
47+ inbound_url : Optional [ApplicationUrl ] = None
48+ status_url : Optional [ApplicationUrl ] = None
49+
50+ @field_validator ('inbound_url' , 'status_url' )
51+ @classmethod
52+ def check_http_method (cls , v : ApplicationUrl ):
53+ if v .http_method is not None and v .http_method != 'POST' :
54+ raise ApplicationError ('HTTP method must be POST' )
55+ return v
4556
4657
4758class Messages (BaseModel ):
48- version : Optional [str ] = None
59+ """Messages application capabilities."""
60+
4961 webhooks : Optional [MessagesWebhooks ] = None
62+ version : Optional [str ] = None
63+ authenticate_inbound_media : Optional [bool ] = None
5064
5165
5266class Vbc (BaseModel ):
53- pass
67+ """VBC capabilities.
68+
69+ This object should be empty when creating or updating an application.
70+ """
5471
5572
5673class VerifyWebhooks (BaseModel ):
57- status_url : Optional [Url ] = None
74+ status_url : Optional [ApplicationUrl ] = None
5875
5976 @field_validator ('status_url' )
6077 @classmethod
61- def check_http_method (cls , v : Url ):
78+ def check_http_method (cls , v : ApplicationUrl ):
6279 if v .http_method is not None and v .http_method != 'POST' :
6380 raise ApplicationError ('HTTP method must be POST' )
6481 return v
6582
6683
6784class Verify (BaseModel ):
85+ """Verify application capabilities.
86+
87+ Don't set the `version` field when creating or updating an application.
88+ """
89+
6890 webhooks : Optional [VerifyWebhooks ] = None
6991 version : Optional [str ] = None
7092
@@ -73,7 +95,18 @@ class Privacy(BaseModel):
7395 improve_ai : Optional [bool ] = None
7496
7597
98+ class Capabilities (BaseModel ):
99+ voice : Optional [Voice ] = None
100+ rtc : Optional [Rtc ] = None
101+ messages : Optional [Messages ] = None
102+ vbc : Optional [Vbc ] = None
103+ verify : Optional [Verify ] = None
104+
105+
76106class ApplicationBase (BaseModel ):
107+ """Base application object used in requests and responses when communicating with the Vonage
108+ Application API."""
109+
77110 name : str
78- capabilities : Optional [Union [ Voice , Rtc , Messages , Vbc , Verify ] ] = None
111+ capabilities : Optional [Capabilities ] = None
79112 privacy : Optional [Privacy ] = None
0 commit comments