11from __future__ import annotations
22
33from enum import Enum , auto
4+ from typing import Any , Optional
5+ from uuid import UUID
46
57from sqlalchemy import (
68 JSON ,
79 Index ,
810 String ,
911 Uuid ,
1012)
11- from sqlalchemy .orm import declarative_base
13+ from sqlalchemy .orm import DeclarativeBase , Mapped , mapped_column
1214
1315from diracx .db .sql .utils import (
14- Column ,
15- DateNowColumn ,
16- EnumColumn ,
17- NullColumn ,
16+ datetime_now ,
17+ enum_column ,
18+ str128 ,
19+ str255 ,
20+ str1024 ,
1821)
1922
2023USER_CODE_LENGTH = 8
2124
22- Base = declarative_base ()
25+
26+ class Base (DeclarativeBase ):
27+ type_annotation_map = {
28+ str128 : String (128 ),
29+ str255 : String (255 ),
30+ str1024 : String (1024 ),
31+ dict [str , Any ]: JSON ,
32+ }
2333
2434
2535class FlowStatus (Enum ):
@@ -47,27 +57,35 @@ class FlowStatus(Enum):
4757
4858class DeviceFlows (Base ):
4959 __tablename__ = "DeviceFlows"
50- user_code = Column ("UserCode" , String (USER_CODE_LENGTH ), primary_key = True )
51- status = EnumColumn ("Status" , FlowStatus , server_default = FlowStatus .PENDING .name )
52- creation_time = DateNowColumn ("CreationTime" )
53- client_id = Column ("ClientID" , String (255 ))
54- scope = Column ("Scope" , String (1024 ))
55- device_code = Column ("DeviceCode" , String (128 ), unique = True ) # Should be a hash
56- id_token = NullColumn ("IDToken" , JSON ())
60+ user_code : Mapped [str ] = mapped_column (
61+ "UserCode" , String (USER_CODE_LENGTH ), primary_key = True
62+ )
63+ status : Mapped [FlowStatus ] = enum_column (
64+ "Status" , FlowStatus , server_default = FlowStatus .PENDING .name
65+ )
66+ creation_time : Mapped [datetime_now ] = mapped_column ("CreationTime" )
67+ client_id : Mapped [str255 ] = mapped_column ("ClientID" )
68+ scope : Mapped [str1024 ] = mapped_column ("Scope" )
69+ device_code : Mapped [str128 ] = mapped_column (
70+ "DeviceCode" , unique = True
71+ ) # Should be a hash
72+ id_token : Mapped [Optional [dict [str , Any ]]] = mapped_column ("IDToken" )
5773
5874
5975class AuthorizationFlows (Base ):
6076 __tablename__ = "AuthorizationFlows"
61- uuid = Column ("UUID" , Uuid (as_uuid = False ), primary_key = True )
62- status = EnumColumn ("Status" , FlowStatus , server_default = FlowStatus .PENDING .name )
63- client_id = Column ("ClientID" , String (255 ))
64- creation_time = DateNowColumn ("CreationTime" )
65- scope = Column ("Scope" , String (1024 ))
66- code_challenge = Column ("CodeChallenge" , String (255 ))
67- code_challenge_method = Column ("CodeChallengeMethod" , String (8 ))
68- redirect_uri = Column ("RedirectURI" , String (255 ))
69- code = NullColumn ("Code" , String (255 )) # Should be a hash
70- id_token = NullColumn ("IDToken" , JSON ())
77+ uuid : Mapped [UUID ] = mapped_column ("UUID" , Uuid (as_uuid = False ), primary_key = True )
78+ status : Mapped [FlowStatus ] = enum_column (
79+ "Status" , FlowStatus , server_default = FlowStatus .PENDING .name
80+ )
81+ client_id : Mapped [str255 ] = mapped_column ("ClientID" )
82+ creation_time : Mapped [datetime_now ] = mapped_column ("CreationTime" )
83+ scope : Mapped [str1024 ] = mapped_column ("Scope" )
84+ code_challenge : Mapped [str255 ] = mapped_column ("CodeChallenge" )
85+ code_challenge_method : Mapped [str ] = mapped_column ("CodeChallengeMethod" , String (8 ))
86+ redirect_uri : Mapped [str255 ] = mapped_column ("RedirectURI" )
87+ code : Mapped [Optional [str255 ]] = mapped_column ("Code" ) # Should be a hash
88+ id_token : Mapped [Optional [dict [str , Any ]]] = mapped_column ("IDToken" )
7189
7290
7391class RefreshTokenStatus (Enum ):
@@ -93,13 +111,13 @@ class RefreshTokens(Base):
93111
94112 __tablename__ = "RefreshTokens"
95113 # Refresh token attributes
96- jti = Column ("JTI" , Uuid (as_uuid = False ), primary_key = True )
97- status = EnumColumn (
114+ jti : Mapped [ UUID ] = mapped_column ("JTI" , Uuid (as_uuid = False ), primary_key = True )
115+ status : Mapped [ RefreshTokenStatus ] = enum_column (
98116 "Status" , RefreshTokenStatus , server_default = RefreshTokenStatus .CREATED .name
99117 )
100- scope = Column ("Scope" , String ( 1024 ) )
118+ scope : Mapped [ str1024 ] = mapped_column ("Scope" )
101119
102120 # User attributes bound to the refresh token
103- sub = Column ("Sub" , String (256 ), index = True )
121+ sub : Mapped [ str ] = mapped_column ("Sub" , String (256 ), index = True )
104122
105123 __table_args__ = (Index ("index_status_sub" , status , sub ),)
0 commit comments