thread-master/backend/internal/model/threads_account/usecase/oauth_debug_log.go

103 lines
2.3 KiB
Go
Raw Permalink Normal View History

package usecase
import (
"log"
"sync"
"haixun-backend/internal/library/clock"
domusecase "haixun-backend/internal/model/threads_account/domain/usecase"
)
const oauthDebugLogCap = 80
// OAuthDebugEntry is a recent OAuth event for Dev Console debugging.
type OAuthDebugEntry struct {
At int64 `json:"at"`
Level string `json:"level"`
Stage string `json:"stage"`
AccountID string `json:"account_id,omitempty"`
Message string `json:"message"`
}
var (
oauthDebugMu sync.Mutex
oauthDebugRing []OAuthDebugEntry
oauthDebugSeq int
)
func recordOAuthDebug(level, stage, accountID, message string) {
at := clock.NowUnixNano()
entry := OAuthDebugEntry{
At: at,
Level: level,
Stage: stage,
AccountID: accountID,
Message: message,
}
log.Printf("threads oauth [%s] %s account=%s %s", stage, level, accountID, message)
oauthDebugMu.Lock()
defer oauthDebugMu.Unlock()
if len(oauthDebugRing) < oauthDebugLogCap {
oauthDebugRing = append(oauthDebugRing, entry)
} else {
oauthDebugRing[oauthDebugSeq%oauthDebugLogCap] = entry
}
oauthDebugSeq++
}
func (u *threadsAccountUseCase) RecordOAuthDebug(level, stage, accountID, message string) {
recordOAuthDebug(level, stage, accountID, message)
}
func (u *threadsAccountUseCase) ListOAuthDebugLogs(limit int) []domusecase.OAuthDebugLogEntry {
raw := listOAuthDebugLogs(limit)
out := make([]domusecase.OAuthDebugLogEntry, 0, len(raw))
for _, item := range raw {
out = append(out, domusecase.OAuthDebugLogEntry{
At: item.At,
Level: item.Level,
Stage: item.Stage,
AccountID: item.AccountID,
Message: item.Message,
})
}
return out
}
func listOAuthDebugLogs(limit int) []OAuthDebugEntry {
if limit <= 0 || limit > oauthDebugLogCap {
limit = oauthDebugLogCap
}
oauthDebugMu.Lock()
defer oauthDebugMu.Unlock()
n := len(oauthDebugRing)
if n == 0 {
return nil
}
out := make([]OAuthDebugEntry, 0, min(n, limit))
if n < oauthDebugLogCap {
start := n - min(n, limit)
if start < 0 {
start = 0
}
out = append(out, oauthDebugRing[start:n]...)
return out
}
start := oauthDebugSeq - min(oauthDebugSeq, limit)
if start < 0 {
start = 0
}
for i := start; i < oauthDebugSeq; i++ {
out = append(out, oauthDebugRing[i%oauthDebugLogCap])
}
return out
}
func min(a, b int) int {
if a < b {
return a
}
return b
}