11import logging
22from typing import Any , Dict , List , Optional , Tuple
33
4- from .calls import make_request
5- from .data import BugoutUser , Method
4+ from .calls import make_request , InvalidUrlSpec
5+ from .data import BugoutUser , BugoutToken , Method , TokenType
66
77logger = logging .getLogger (__name__ )
88
@@ -13,43 +13,55 @@ class UserNotFound(Exception):
1313 """
1414
1515
16+ class TokenInvalidParameters (ValueError ):
17+ """
18+ Raised when operations are applied to a token but invalid parameters are provided with which to
19+ specify that token.
20+ """
21+
22+
1623class User :
1724 """
1825 Represent a user from Bugout.
1926 """
2027
21- def __init__ (self , url ) -> None :
28+ def __init__ (self , url : Optional [str ] = None ) -> None :
29+ if url is None :
30+ raise InvalidUrlSpec ("Invalid brood url specified" )
2231 self .url = url
2332
2433 def _call (self , method : Method , path : str , ** kwargs ):
2534 url = f"{ self .url .rstrip ('/' )} /{ path .rstrip ('/' )} "
2635 result = make_request (method = method , url = url , ** kwargs )
2736 return result
2837
29- def get_user (self , token : str ) -> BugoutUser :
38+ def _user_model_converter (self , user_object : Dict [str , Any ]) -> BugoutUser :
39+ return BugoutUser (
40+ id = user_object .get ("user_id" ),
41+ username = user_object .get ("username" ),
42+ email = user_object .get ("email" ),
43+ normalized_email = user_object .get ("normalized_email" ),
44+ verified = user_object .get ("verified" ),
45+ autogenerated = user_object .get ("autogenerated" ),
46+ created_at = user_object .get ("created_at" ),
47+ updated_at = user_object .get ("updated_at" ),
48+ )
49+
50+ def get_user (self , token : str ) -> Dict [str , Any ]:
3051 get_user_path = "user"
3152 headers = {
3253 "Authorization" : f"Bearer { token } " ,
3354 }
3455 result = self ._call (method = Method .get , path = get_user_path , headers = headers )
35- return BugoutUser (
36- id = result .get ("user_id" ),
37- username = result .get ("username" ),
38- email = result .get ("email" ),
39- normalized_email = result .get ("normalized_email" ),
40- verified = result .get ("verified" ),
41- autogenerated = result .get ("autogenerated" ),
42- created_at = result .get ("created_at" ),
43- updated_at = result .get ("updated_at" ),
44- )
56+ return self ._user_model_converter (result )
4557
4658 def create_user (
4759 self ,
4860 username : str ,
4961 email : str ,
5062 password : str ,
51- autogenerated_token : str = None ,
52- ):
63+ autogenerated_token : Optional [ str ] = None ,
64+ ) -> Dict [ str , Any ] :
5365 create_user_path = "user"
5466 data = {
5567 "username" : username ,
@@ -64,13 +76,50 @@ def create_user(
6476 result = self ._call (
6577 method = Method .post , path = create_user_path , headers = headers , data = data
6678 )
67- return BugoutUser (
68- id = result .get ("user_id" ),
69- username = result .get ("username" ),
70- email = result .get ("email" ),
71- normalized_email = result .get ("normalized_email" ),
72- verified = result .get ("verified" ),
73- autogenerated = result .get ("autogenerated" ),
74- created_at = result .get ("created_at" ),
75- updated_at = result .get ("updated_at" ),
79+ return self ._user_model_converter (result )
80+
81+ def create_token (self , username : str , password : str ) -> BugoutToken :
82+ create_token_path = "token"
83+ data = {
84+ "username" : username ,
85+ "password" : password ,
86+ }
87+ result = self ._call (method = Method .post , path = create_token_path , data = data )
88+ return BugoutToken (
89+ id = result .get ("access_token" ),
90+ token_type = result .get ("token_type" ),
7691 )
92+
93+ def revoke_token (self , token : str ) -> BugoutToken :
94+ create_token_path = "token"
95+ headers = {
96+ "Authorization" : f"Bearer { token } " ,
97+ }
98+ result = self ._call (
99+ method = Method .delete , path = create_token_path , headers = headers
100+ )
101+ return BugoutToken (id = result )
102+
103+ def update_token (
104+ self ,
105+ token : str ,
106+ token_type : Optional [str ] = None ,
107+ token_note : Optional [str ] = None ,
108+ ) -> BugoutToken :
109+ create_token_path = "token"
110+
111+ data = {"access_token" : token }
112+ if token_type is None and token_note is None :
113+ raise TokenInvalidParameters (
114+ "In order to update token, at least one of token_type, or token_note must be specified"
115+ )
116+ if token_type not in TokenType .__members__ :
117+ raise TokenInvalidParameters ("Incorrect token type provided" )
118+
119+ if token_type is not None :
120+ data .update ({"token_type" : token_type })
121+ if token_note is not None :
122+ data .update ({"token_note" : token_note })
123+
124+ result = self ._call (method = Method .put , path = create_token_path , data = data )
125+ return BugoutToken (id = result , token_type = token_type , token_note = token_note )
0 commit comments