Sobes.tech
Middle — Senior

Hoe implementeer je de logica voor automatische afwijzing van oproepen bij meer dan 10 oproepen in 15 minuten van een gebruiker?

sobes.tech AI

Antwoord van AI

Om de logica voor automatische afwijzing van oproepen te implementeren wanneer er meer dan 10 oproepen binnen 15 minuten van één gebruiker plaatsvinden, kan een glijdend venster en een oproepenteller worden gebruikt. Het belangrijkste idee is om de tijdstempels van de oproepen van de gebruiker op te slaan en bij een nieuwe oproep te controleren hoeveel oproepen er in de afgelopen 15 minuten zijn geweest.

Voorbeeld in Go:

package main

import (
    "fmt"
    "sync"
    "time"
)

type CallTracker struct {
    mu       sync.Mutex
    callsMap map[string][]time.Time // sleutel — gebruikers-ID, waarde — reeks tijdstempels van oproepen
}

func NewCallTracker() *CallTracker {
    return &CallTracker{
        callsMap: make(map[string][]time.Time),
    }
}

func (ct *CallTracker) RegisterCall(userID string) bool {
    ct.mu.Lock()
    defer ct.mu.Unlock()

    now := time.Now()
    windowStart := now.Add(-15 * time.Minute)

    calls := ct.callsMap[userID]
    // Alleen oproepen binnen het venster van 15 minuten bewaren
    var recentCalls []time.Time
    for _, t := range calls {
        if t.After(windowStart) {
            recentCalls = append(recentCalls, t)
        }
    }

    if len(recentCalls) >= 10 {
        // Automatische afwijzing
        return false
    }

    // Voeg de huidige oproep toe
    recentCalls = append(recentCalls, now)
    ct.callsMap[userID] = recentCalls
    return true
}

func main() {
    tracker := NewCallTracker()
    userID := "user123"

    for i := 0; i < 12; i++ {
        allowed := tracker.RegisterCall(userID)
        if allowed {
            fmt.Println("Oproep geaccepteerd")
        } else {
            fmt.Println("Oproep geweigerd")
        }
        time.Sleep(1 * time.Minute)
    }
}