@@ -10,6 +10,7 @@ import (
1010 "github.com/google/uuid"
1111 "gorm.io/driver/sqlite"
1212 "gorm.io/gorm"
13+ "gorm.io/gorm/clause"
1314)
1415
1516// I will most likely need to store auth tokens in a database, as I can only really get one auth related value from the user, and I can't change that value.
@@ -42,19 +43,19 @@ import (
4243
4344// Token represents the schema for the tokens table
4445type Token struct {
45- UserDID string `gorm:"column:user_did "`
46- TokenUUID string `gorm:"column:token_uuid "`
47- EncryptedAccessToken string `gorm:"column:encrypted_access_token "`
48- EncryptedRefreshToken string `gorm:"column:encrypted_refresh_token "`
49- AccessExpiry float64 `gorm:"column:access_expiry "`
50- RefreshExpiry float64 `gorm:"column:refresh_expiry "`
46+ UserDid string `gorm:"type:string;primaryKey;not null "`
47+ TokenUUID string `gorm:"type:string;primaryKey;not null "`
48+ EncryptedAccessToken string `gorm:"type:string;not null "`
49+ EncryptedRefreshToken string `gorm:"type:string;not null "`
50+ AccessExpiry float64 `gorm:"type:float;not null "`
51+ RefreshExpiry float64 `gorm:"type:float;not null "`
5152}
5253
5354type MessageContext struct {
54- UserDID string `gorm:"column:user_did "`
55- TokenUUID string `gorm:"column:token_uuid "`
56- LastMessageId string `gorm:"column:message_id "`
57- TimelineContext string `gorm:"column:timeline_context "`
55+ UserDid string `gorm:"type:string;primaryKey;not null "`
56+ TokenUUID string `gorm:"type:string;primaryKey;not null "`
57+ LastMessageId string `gorm:"type:string;not null "`
58+ TimelineContext string `gorm:"type:string;not null "`
5859}
5960
6061var db * gorm.DB
@@ -121,29 +122,35 @@ func StoreToken(did string, accessToken string, refreshToken string, encryptionK
121122}
122123
123124func UpdateToken (uuid string , did string , accessToken string , refreshToken string , encryptionKey string , accessExpiry float64 , refreshExpiry float64 ) (* string , error ) {
125+ encryptedAccess , err := bridge .Encrypt (accessToken , encryptionKey )
126+ if err != nil {
127+ return nil , fmt .Errorf ("failed to encrypt access token: %v" , err )
128+ }
129+
130+ encryptedRefresh , err := bridge .Encrypt (refreshToken , encryptionKey )
131+ if err != nil {
132+ return nil , fmt .Errorf ("failed to encrypt refresh token: %v" , err )
133+ }
134+
124135 token := Token {
125- UserDID : did ,
126- TokenUUID : uuid ,
127- EncryptedAccessToken : func () string {
128- encryptedToken , err := bridge .Encrypt (accessToken , encryptionKey )
129- if err != nil {
130- panic ("failed to encrypt access token" )
131- }
132- return encryptedToken
133- }(),
134- EncryptedRefreshToken : func () string {
135- encryptedToken , err := bridge .Encrypt (refreshToken , encryptionKey )
136- if err != nil {
137- panic ("failed to encrypt refresh token" )
138- }
139- return encryptedToken
140- }(),
141- AccessExpiry : accessExpiry ,
142- RefreshExpiry : refreshExpiry ,
143- }
144-
145- if err := db .Where ("user_did = ? AND token_uuid = ?" , did , uuid ).Assign (& token ).FirstOrCreate (& token ).Error ; err != nil {
146- return nil , err
136+ UserDid : did ,
137+ TokenUUID : uuid ,
138+ EncryptedAccessToken : encryptedAccess ,
139+ EncryptedRefreshToken : encryptedRefresh ,
140+ AccessExpiry : accessExpiry ,
141+ RefreshExpiry : refreshExpiry ,
142+ }
143+
144+ result := db .Clauses (clause.OnConflict {
145+ Columns : []clause.Column {
146+ {Name : "user_did" },
147+ {Name : "token_uuid" },
148+ },
149+ UpdateAll : true ,
150+ }).Create (& token )
151+
152+ if result .Error != nil {
153+ return nil , result .Error
147154 }
148155
149156 return & token .TokenUUID , nil
@@ -189,7 +196,7 @@ func SetTimelineContext(did string, tokenUUID string, lastMessageId big.Int, tim
189196 }
190197
191198 messageContext := MessageContext {
192- UserDID : did ,
199+ UserDid : did ,
193200 TokenUUID : tokenUUID ,
194201 LastMessageId : encryptedLastMessageId ,
195202 TimelineContext : encryptedTimelineContext ,
0 commit comments