package repository import ( "context" "database/sql" "errors" "time" ) type TokenData struct { UUID string Decsription string TokenHash string UserID string CreatedAt time.Time GeneratedAt time.Time ExpiresAt time.Time RevokedAt time.Time LastUsedAt time.Time Scope string } // CreateTokens adds a new token to a database func CreateToken(ctx context.Context, db *sql.DB, data *TokenData) error { query := ` INSERT INTO tokens (uuid, description, token_hash, user_id, scopes, created_at, generated_at, expires_at) VALUES ($1, $2, $3, $4, $5, $6, $7, $8);` if _, err := db.QueryContext( ctx, query, data.UUID, data.Decsription, data.TokenHash, data.UserID, data.Scope, data.CreatedAt, data.GeneratedAt, data.ExpiresAt, ); err != nil { return err } return nil } // UpdateToken updates token description and scope func UpdateToken(ctx context.Context, db *sql.DB, data *TokenData) error { query := "UPDATE tokens SET description = $1, scopes = $2 WHERE uuid = $3;" if _, err := db.QueryContext(ctx, query, data.Decsription, data.Scope, data.UUID); err != nil { return err } return nil } func GetToken(ctx context.Context, db *sql.DB, tokenID, userID string) (*TokenData, error) { query := ` SELECT uuid, description, generated_at, expires_at, last_used_at, revoked_at, created_at, scopes FROM tokens WHERE uuid = $1 AND user_id = $2;` var generatedAt sql.NullTime var expiresAt sql.NullTime var revokedAt sql.NullTime var lastUsedAt sql.NullTime var createdAt sql.NullTime result := &TokenData{} if err := db.QueryRowContext(ctx, query, tokenID, userID).Scan( &result.UUID, &result.Decsription, &generatedAt, &expiresAt, &lastUsedAt, &revokedAt, &createdAt, &result.Scope, ); err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, ErrNotFound } return nil, err } result.GeneratedAt = generatedAt.Time result.ExpiresAt = expiresAt.Time result.RevokedAt = revokedAt.Time result.LastUsedAt = lastUsedAt.Time result.CreatedAt = createdAt.Time return result, nil }