First release of open core

This commit is contained in:
t
2026-04-02 10:57:36 -04:00
parent 1c94f12d1c
commit 084c1321fc
101 changed files with 8812 additions and 17 deletions

View File

@@ -0,0 +1,17 @@
package analytics
import (
"encoding/json"
"net/http"
)
func (h *Handler) HandleGetAnalyticsSummary(w http.ResponseWriter, r *http.Request) {
summary, err := h.Store.GetAnalyticsSummary(r.Context())
if err != nil {
http.Error(w, "Failed to generate analytics", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(summary)
}

View File

@@ -0,0 +1,60 @@
package analytics
import (
"context"
"database/sql"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
)
func setupTestAnalytics(t *testing.T) (*Handler, *sql.DB) {
db := datastore.InitDB(":memory:")
store := datastore.NewSQLiteStore(db)
return NewHandler(store), db
}
func GetVIPCookie(store domain.Store) *http.Cookie {
user, _ := store.CreateUser(context.Background(), "vip@RiskRancher.com", "Test VIP", "hash", "Sheriff")
store.CreateSession(context.Background(), "vip_token_999", user.ID, time.Now().Add(1*time.Hour))
return &http.Cookie{Name: "session_token", Value: "vip_token_999"}
}
func TestAnalyticsSummary(t *testing.T) {
h, db := setupTestAnalytics(t)
defer db.Close()
_, err := db.Exec(`INSERT INTO tickets (source, title, severity, status, dedupe_hash) VALUES
('Trivy', 'Container CVE', 'Critical', 'Waiting to be Triaged', 'hash1'),
('Trivy', 'Old Lib', 'High', 'Waiting to be Triaged', 'hash2'),
('Trivy', 'Patched Lib', 'Critical', 'Patched', 'hash3'),
('Manual Pentest', 'SQLi', 'Critical', 'Waiting to be Triaged', 'hash4')
`)
if err != nil {
t.Fatalf("Failed to insert dummy data: %v", err)
}
req := httptest.NewRequest(http.MethodGet, "/api/analytics/summary", nil)
req.AddCookie(GetVIPCookie(h.Store))
rr := httptest.NewRecorder()
h.HandleGetAnalyticsSummary(rr, req)
if rr.Code != http.StatusOK {
t.Fatalf("Expected 200 OK, got %d. Body: %s", rr.Code, rr.Body.String())
}
var summary map[string]int
if err := json.NewDecoder(rr.Body).Decode(&summary); err != nil {
t.Fatalf("Failed to decode JSON: %v", err)
}
if summary["Total_Open"] != 3 {
t.Errorf("Expected 3 total open tickets, got %d", summary["Total_Open"])
}
}

13
pkg/analytics/handler.go Normal file
View File

@@ -0,0 +1,13 @@
package analytics
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
)
type Handler struct {
Store domain.Store
}
func NewHandler(store domain.Store) *Handler {
return &Handler{Store: store}
}