···64 }
65 apiKeyID := base64.URLEncoding.EncodeToString(b)
6667- now := time.Now()
68 expiresAt := now.AddDate(0, 0, validityDays) // Default to validityDays days validity
6970 apiKey := &ApiKey{
···100101 if exists {
102 // Check if API key is expired
103- if time.Now().After(apiKey.ExpiresAt) {
104 am.DeleteApiKey(apiKeyID)
105 return nil, false
106 }
···118 return nil, false
119 }
120121- if time.Now().After(apiKey.ExpiresAt) {
122 am.DeleteApiKey(apiKeyID)
123 return nil, false
124 }
···64 }
65 apiKeyID := base64.URLEncoding.EncodeToString(b)
6667+ now := time.Now().UTC()
68 expiresAt := now.AddDate(0, 0, validityDays) // Default to validityDays days validity
6970 apiKey := &ApiKey{
···100101 if exists {
102 // Check if API key is expired
103+ if time.Now().UTC().After(apiKey.ExpiresAt) {
104 am.DeleteApiKey(apiKeyID)
105 return nil, false
106 }
···118 return nil, false
119 }
120121+ if time.Now().UTC().After(apiKey.ExpiresAt) {
122 am.DeleteApiKey(apiKeyID)
123 return nil, false
124 }
+6-6
db/atproto.go
···80 did).Scan(&user.ID, &user.ATProtoDID, &user.CreatedAt, &user.UpdatedAt)
8182 if err == sql.ErrNoRows {
83- now := time.Now()
84 // create user!
85 result, insertErr := db.Exec(`
86 INSERT INTO users (atproto_did, created_at, updated_at)
···111// create or update the current user's ATproto session data.
112func (db *DB) SaveATprotoSession(tokenResp *oauth.TokenResponse, authserverIss string, dpopPrivateJWK jwk.Key, pdsUrl string) error {
113 fmt.Printf("Saving session with PDS url %s", pdsUrl)
114- expiryTime := time.Now().Add(time.Second * time.Duration(tokenResp.ExpiresIn))
115- now := time.Now()
116117 dpopPrivateJWKBytes, err := json.Marshal(dpopPrivateJWK)
118 if err != nil {
···213 }
214215 // printout the session details
216- fmt.Printf("Session details from DB: %+v\n", oauthSession)
217218 // if token is expired, refresh it
219- if time.Now().After(oauthSession.TokenExpiry) {
220221 resp, err := oauthClient.RefreshTokenRequest(ctx, oauthSession.RefreshToken, authserverIss, oauthSession.DpopAuthServerNonce, privateJwk)
222 if err != nil {
···237 DpopPdsNonce: oauthSession.DpopPdsNonce,
238 DpopAuthServerNonce: resp.DpopAuthserverNonce,
239 DpopPrivateJWK: privateJwk,
240- TokenExpiry: time.Now().Add(time.Duration(resp.ExpiresIn) * time.Second),
241 }
242243 }
···80 did).Scan(&user.ID, &user.ATProtoDID, &user.CreatedAt, &user.UpdatedAt)
8182 if err == sql.ErrNoRows {
83+ now := time.Now().UTC()
84 // create user!
85 result, insertErr := db.Exec(`
86 INSERT INTO users (atproto_did, created_at, updated_at)
···111// create or update the current user's ATproto session data.
112func (db *DB) SaveATprotoSession(tokenResp *oauth.TokenResponse, authserverIss string, dpopPrivateJWK jwk.Key, pdsUrl string) error {
113 fmt.Printf("Saving session with PDS url %s", pdsUrl)
114+ expiryTime := time.Now().UTC().Add(time.Second * time.Duration(tokenResp.ExpiresIn))
115+ now := time.Now().UTC()
116117 dpopPrivateJWKBytes, err := json.Marshal(dpopPrivateJWK)
118 if err != nil {
···213 }
214215 // printout the session details
216+ fmt.Printf("Getting session details for the did: %+v\n", oauthSession.DID)
217218 // if token is expired, refresh it
219+ if time.Now().UTC().After(oauthSession.TokenExpiry) {
220221 resp, err := oauthClient.RefreshTokenRequest(ctx, oauthSession.RefreshToken, authserverIss, oauthSession.DpopAuthServerNonce, privateJwk)
222 if err != nil {
···237 DpopPdsNonce: oauthSession.DpopPdsNonce,
238 DpopAuthServerNonce: resp.DpopAuthserverNonce,
239 DpopPrivateJWK: privateJwk,
240+ TokenExpiry: time.Now().UTC().Add(time.Duration(resp.ExpiresIn) * time.Second),
241 }
242243 }
+5-5
db/db.go
···120121// create user without spotify id
122func (db *DB) CreateUser(user *models.User) (int64, error) {
123- now := time.Now()
124125 result, err := db.Exec(`
126 INSERT INTO users (username, email, created_at, updated_at)
···136137// add spotify session to user, returning the updated user
138func (db *DB) AddSpotifySession(userID int64, username, email, spotifyId, accessToken, refreshToken string, tokenExpiry time.Time) (*models.User, error) {
139- now := time.Now()
140141 _, err := db.Exec(`
142 UPDATE users SET username = ?, email = ?, spotify_id = ?, access_token = ?, refresh_token = ?, token_expiry = ?, created_at = ?, updated_at = ?
···200}
201202func (db *DB) UpdateUserToken(userID int64, accessToken, refreshToken string, expiry time.Time) error {
203- now := time.Now()
204205 _, err := db.Exec(`
206 UPDATE users
···326 SELECT id, username, email, spotify_id, access_token, refresh_token, token_expiry, created_at, updated_at
327 FROM users
328 WHERE refresh_token IS NOT NULL AND token_expiry < ?
329- ORDER BY id`, time.Now())
330331 if err != nil {
332 return nil, err
···355 SELECT id, username, email, spotify_id, access_token, refresh_token, token_expiry, created_at, updated_at
356 FROM users
357 WHERE access_token IS NOT NULL AND token_expiry > ?
358- ORDER BY id`, time.Now())
359360 if err != nil {
361 return nil, err
···120121// create user without spotify id
122func (db *DB) CreateUser(user *models.User) (int64, error) {
123+ now := time.Now().UTC()
124125 result, err := db.Exec(`
126 INSERT INTO users (username, email, created_at, updated_at)
···136137// add spotify session to user, returning the updated user
138func (db *DB) AddSpotifySession(userID int64, username, email, spotifyId, accessToken, refreshToken string, tokenExpiry time.Time) (*models.User, error) {
139+ now := time.Now().UTC()
140141 _, err := db.Exec(`
142 UPDATE users SET username = ?, email = ?, spotify_id = ?, access_token = ?, refresh_token = ?, token_expiry = ?, created_at = ?, updated_at = ?
···200}
201202func (db *DB) UpdateUserToken(userID int64, accessToken, refreshToken string, expiry time.Time) error {
203+ now := time.Now().UTC()
204205 _, err := db.Exec(`
206 UPDATE users
···326 SELECT id, username, email, spotify_id, access_token, refresh_token, token_expiry, created_at, updated_at
327 FROM users
328 WHERE refresh_token IS NOT NULL AND token_expiry < ?
329+ ORDER BY id`, time.Now().UTC())
330331 if err != nil {
332 return nil, err
···355 SELECT id, username, email, spotify_id, access_token, refresh_token, token_expiry, created_at, updated_at
356 FROM users
357 WHERE access_token IS NOT NULL AND token_expiry > ?
358+ ORDER BY id`, time.Now().UTC())
359360 if err != nil {
361 return nil, err
+2-2
service/apikey/apikey.go
···79 }
80 keyName := reqBody.Name
81 if keyName == "" {
82- keyName = fmt.Sprintf("API Key (via API) - %s", time.Now().Format(time.RFC3339))
83 }
84 validityDays := 30 // Default, could be made configurable via request body
85···133134 keyName := r.FormValue("name")
135 if keyName == "" {
136- keyName = fmt.Sprintf("API Key - %s", time.Now().Format(time.RFC3339))
137 }
138 validityDays := 1024
139
···79 }
80 keyName := reqBody.Name
81 if keyName == "" {
82+ keyName = fmt.Sprintf("API Key (via API) - %s", time.Now().UTC().Format(time.RFC3339))
83 }
84 validityDays := 30 // Default, could be made configurable via request body
85···133134 keyName := r.FormValue("name")
135 if keyName == "" {
136+ keyName = fmt.Sprintf("API Key - %s", time.Now().UTC().Format(time.RFC3339))
137 }
138 validityDays := 1024
139
+1-1
service/lastfm/lastfm.go
···407 }
408409 // printout the session details
410- fmt.Printf("Session details: %+v\n", sess)
411412 // horrible no good very bad for now
413 artistArr := []string{}
···407 }
408409 // printout the session details
410+ fmt.Printf("Submitting track for the did: %+v\n", sess.DID)
411412 // horrible no good very bad for now
413 artistArr := []string{}
···142 return 0, err
143 }
144145- tokenExpiryTime := time.Now().Add(1 * time.Hour) // Spotify tokens last ~1 hour
146147 // We don't intend users to log in via spotify!
148 if user == nil {
···195 count := 0
196 for _, user := range users {
197 // load users with valid tokens
198- if user.AccessToken != nil && user.TokenExpiry.After(time.Now()) {
199 s.userTokens[user.ID] = *user.AccessToken
200 count++
201 }
···262 delete(s.userTokens, userID)
263 s.mu.Unlock()
264 // Also clear the bad refresh token from the DB
265- updateErr := s.DB.UpdateUserToken(userID, "", "", time.Now()) // Clear tokens
266 if updateErr != nil {
267 log.Printf("Failed to clear bad refresh token for user %d: %v", userID, updateErr)
268 }
···281 return "", fmt.Errorf("failed to decode refresh response: %w", err)
282 }
283284- newExpiry := time.Now().Add(time.Duration(tokenResponse.ExpiresIn) * time.Second)
285 newRefreshToken := *user.RefreshToken // Default to old one
286 if tokenResponse.RefreshToken != "" {
287 newRefreshToken = tokenResponse.RefreshToken // Use new one if provided
···142 return 0, err
143 }
144145+ tokenExpiryTime := time.Now().UTC().Add(1 * time.Hour) // Spotify tokens last ~1 hour
146147 // We don't intend users to log in via spotify!
148 if user == nil {
···195 count := 0
196 for _, user := range users {
197 // load users with valid tokens
198+ if user.AccessToken != nil && user.TokenExpiry.After(time.Now().UTC()) {
199 s.userTokens[user.ID] = *user.AccessToken
200 count++
201 }
···262 delete(s.userTokens, userID)
263 s.mu.Unlock()
264 // Also clear the bad refresh token from the DB
265+ updateErr := s.DB.UpdateUserToken(userID, "", "", time.Now().UTC()) // Clear tokens
266 if updateErr != nil {
267 log.Printf("Failed to clear bad refresh token for user %d: %v", userID, updateErr)
268 }
···281 return "", fmt.Errorf("failed to decode refresh response: %w", err)
282 }
283284+ newExpiry := time.Now().UTC().Add(time.Duration(tokenResponse.ExpiresIn) * time.Second)
285 newRefreshToken := *user.RefreshToken // Default to old one
286 if tokenResponse.RefreshToken != "" {
287 newRefreshToken = tokenResponse.RefreshToken // Use new one if provided