From e2e1ebe48f8f232a79c3e2d9df6a6bce03b7ffb5 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Mon, 26 Jan 2026 09:35:12 +0100 Subject: [PATCH] Hallucinate some wires --- api/api.go | 44 +++++++++++++------------- api/api_test.go | 2 +- clickhouse/analytics.go | 41 +++++------------------- clickhouse/analytics_queries.go | 55 +++++++++++++++++++-------------- clickhouse/analytics_test.go | 38 +++++++++++------------ db/db.go | 7 +++-- main.go | 3 +- types/flat_killmail.go | 28 +++++++++++++++++ 8 files changed, 114 insertions(+), 104 deletions(-) diff --git a/api/api.go b/api/api.go index 51ccb37..435d88b 100644 --- a/api/api.go +++ b/api/api.go @@ -1,4 +1,4 @@ -package main +package api import ( "encoding/base64" @@ -22,7 +22,7 @@ type APIStatisticsRequest struct { } type APIAnalyticsRequest struct { - Filters AnalyticsFilters `json:"filters"` + Filters types.AnalyticsFilters `json:"filters"` } type APIModuleCoOccurrenceRequest struct { @@ -64,109 +64,109 @@ type APIImageData struct { // Analytics handlers func handleAnalyticsTimeByHour(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryTimeByHour(r.Context(), req.Filters) }) } func handleAnalyticsTimeByDay(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryTimeByDay(r.Context(), req.Filters) }) } func handleAnalyticsTimeByDate(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryTimeByDate(r.Context(), req.Filters) }) } func handleAnalyticsTimeByMonth(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryTimeByMonth(r.Context(), req.Filters) }) } func handleAnalyticsLocationBySystem(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryLocationBySystem(r.Context(), req.Filters) }) } func handleAnalyticsLocationByRegion(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryLocationByRegion(r.Context(), req.Filters) }) } func handleAnalyticsLocationByConstellation(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryLocationByConstellation(r.Context(), req.Filters) }) } func handleAnalyticsLocationBySecurity(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryLocationBySecurity(r.Context(), req.Filters) }) } func handleAnalyticsShipByVictim(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryShipByVictim(r.Context(), req.Filters) }) } func handleAnalyticsShipByAttacker(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryShipByAttacker(r.Context(), req.Filters) }) } func handleAnalyticsPlayerByVictimCharacter(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryPlayerByVictimCharacter(r.Context(), req.Filters) }) } func handleAnalyticsPlayerByVictimCorporation(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryPlayerByVictimCorporation(r.Context(), req.Filters) }) } func handleAnalyticsPlayerByVictimAlliance(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryPlayerByVictimAlliance(r.Context(), req.Filters) }) } func handleAnalyticsPlayerByAttackerCharacter(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryPlayerByAttackerCharacter(r.Context(), req.Filters) }) } func handleAnalyticsPlayerByAttackerCorporation(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryPlayerByAttackerCorporation(r.Context(), req.Filters) }) } func handleAnalyticsPlayerByAttackerAlliance(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryPlayerByAttackerAlliance(r.Context(), req.Filters) }) } func handleAnalyticsModuleBySlotType(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryModuleBySlotType(r.Context(), req.Filters) }) } func handleAnalyticsModuleByModule(w http.ResponseWriter, r *http.Request) { - handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) { + handleAnalyticsQuery(w, r, func(database db.DB, req APIAnalyticsRequest) (interface{}, error) { return db.QueryModuleByModule(r.Context(), req.Filters) }) } @@ -209,7 +209,7 @@ func handleAnalyticsModuleCoOccurrence(w http.ResponseWriter, r *http.Request) { } type APIKillmailIDsRequest struct { - Filters AnalyticsFilters `json:"filters"` + Filters types.AnalyticsFilters `json:"filters"` Limit int `json:"limit"` Offset int `json:"offset"` } @@ -296,7 +296,7 @@ func handleKillmail(w http.ResponseWriter, r *http.Request) { } } -type analyticsQueryFunc func(db DB, req APIAnalyticsRequest) (interface{}, error) +type analyticsQueryFunc func(database db.DB, req APIAnalyticsRequest) (interface{}, error) func handleAnalyticsQuery(w http.ResponseWriter, r *http.Request, queryFn analyticsQueryFunc) { flog := logger.Default.WithPrefix("handleAnalyticsQuery") diff --git a/api/api_test.go b/api/api_test.go index 2f0da78..d5692d2 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -1,4 +1,4 @@ -package main +package api import ( "bytes" diff --git a/clickhouse/analytics.go b/clickhouse/analytics.go index a4954e7..a1cbb9b 100644 --- a/clickhouse/analytics.go +++ b/clickhouse/analytics.go @@ -3,40 +3,13 @@ package main import ( "fmt" "strings" + + "zkillsusser/types" ) -// AnalyticsFilters represents the filter state for analytics queries -type AnalyticsFilters struct { - KillHour []uint8 - KillDayOfWeek []uint8 - KillDate []string - Month []string - SolarSystemID []int32 - RegionName []string - ConstellationName []string - SecurityStatus []string - VictimShipTypeID []int32 - VictimShipGroupName []string - VictimShipCategory []string - VictimCharacterName []string - VictimCorporation []string - VictimAlliance []string - AttackerShipType []string - AttackerShipGroup []string - AttackerCharacter []string - AttackerCorporation []string - AttackerAlliance []string - SlotType []string - HasModule *ModuleFilter -} - -type ModuleFilter struct { - ModuleID int32 -} - type FlatKillmailComplete struct { - FlatKillmail - Items []FlatKillmailItem `json:"items"` + types.FlatKillmail + Items []types.FlatKillmailItem `json:"items"` } // Time aggregation results @@ -188,7 +161,7 @@ type ModuleCoOccurrence struct { } // buildWhereClause builds a WHERE clause from filters -func buildWhereClause(filters AnalyticsFilters) (string, []interface{}) { +func buildWhereClause(filters types.AnalyticsFilters) (string, []interface{}) { var conditions []string var args []interface{} @@ -367,7 +340,7 @@ func buildWhereClause(filters AnalyticsFilters) (string, []interface{}) { } // buildAttackerWhereClause builds WHERE clause for attacker queries -func buildAttackerWhereClause(filters AnalyticsFilters) (string, []interface{}) { +func buildAttackerWhereClause(filters types.AnalyticsFilters) (string, []interface{}) { var conditions []string var args []interface{} @@ -435,7 +408,7 @@ func buildAttackerWhereClause(filters AnalyticsFilters) (string, []interface{}) } // getKillmailIDSubquery returns a subquery to filter by killmail_id from killmails table -func getKillmailIDSubquery(filters AnalyticsFilters) (string, []interface{}) { +func getKillmailIDSubquery(filters types.AnalyticsFilters) (string, []interface{}) { whereClause, args := buildWhereClause(filters) if whereClause == "" { return "(SELECT killmail_id FROM zkill.killmails)", args diff --git a/clickhouse/analytics_queries.go b/clickhouse/analytics_queries.go index 5942692..1915611 100644 --- a/clickhouse/analytics_queries.go +++ b/clickhouse/analytics_queries.go @@ -5,11 +5,18 @@ import ( "fmt" "strings" + "zkillsusser/types" + + "github.com/ClickHouse/clickhouse-go/v2/lib/driver" logger "git.site.quack-lab.dev/dave/cylogger" ) +type DBWrapper struct { + ch driver.Conn +} + // Time aggregation queries -func (db *DBWrapper) QueryTimeByHour(ctx context.Context, filters AnalyticsFilters) ([]TimeAggregationByHour, error) { +func (db *DBWrapper) QueryTimeByHour(ctx context.Context, filters types.AnalyticsFilters) ([]TimeAggregationByHour, error) { flog := logger.Default.WithPrefix("QueryTimeByHour") whereClause, args := buildWhereClause(filters) @@ -43,7 +50,7 @@ func (db *DBWrapper) QueryTimeByHour(ctx context.Context, filters AnalyticsFilte return results, nil } -func (db *DBWrapper) QueryTimeByDay(ctx context.Context, filters AnalyticsFilters) ([]TimeAggregationByDay, error) { +func (db *DBWrapper) QueryTimeByDay(ctx context.Context, filters types.AnalyticsFilters) ([]TimeAggregationByDay, error) { flog := logger.Default.WithPrefix("QueryTimeByDay") whereClause, args := buildWhereClause(filters) @@ -85,7 +92,7 @@ func (db *DBWrapper) QueryTimeByDay(ctx context.Context, filters AnalyticsFilter return results, nil } -func (db *DBWrapper) QueryTimeByDate(ctx context.Context, filters AnalyticsFilters) ([]TimeAggregationByDate, error) { +func (db *DBWrapper) QueryTimeByDate(ctx context.Context, filters types.AnalyticsFilters) ([]TimeAggregationByDate, error) { flog := logger.Default.WithPrefix("QueryTimeByDate") whereClause, args := buildWhereClause(filters) @@ -119,7 +126,7 @@ func (db *DBWrapper) QueryTimeByDate(ctx context.Context, filters AnalyticsFilte return results, nil } -func (db *DBWrapper) QueryTimeByMonth(ctx context.Context, filters AnalyticsFilters) ([]TimeAggregationByMonth, error) { +func (db *DBWrapper) QueryTimeByMonth(ctx context.Context, filters types.AnalyticsFilters) ([]TimeAggregationByMonth, error) { flog := logger.Default.WithPrefix("QueryTimeByMonth") whereClause, args := buildWhereClause(filters) @@ -153,7 +160,7 @@ func (db *DBWrapper) QueryTimeByMonth(ctx context.Context, filters AnalyticsFilt } // Location aggregation queries -func (db *DBWrapper) QueryLocationBySystem(ctx context.Context, filters AnalyticsFilters) ([]LocationAggregationBySystem, error) { +func (db *DBWrapper) QueryLocationBySystem(ctx context.Context, filters types.AnalyticsFilters) ([]LocationAggregationBySystem, error) { flog := logger.Default.WithPrefix("QueryLocationBySystem") whereClause, args := buildWhereClause(filters) @@ -190,7 +197,7 @@ func (db *DBWrapper) QueryLocationBySystem(ctx context.Context, filters Analytic return results, nil } -func (db *DBWrapper) QueryLocationByRegion(ctx context.Context, filters AnalyticsFilters) ([]LocationAggregationByRegion, error) { +func (db *DBWrapper) QueryLocationByRegion(ctx context.Context, filters types.AnalyticsFilters) ([]LocationAggregationByRegion, error) { flog := logger.Default.WithPrefix("QueryLocationByRegion") whereClause, args := buildWhereClause(filters) @@ -224,7 +231,7 @@ func (db *DBWrapper) QueryLocationByRegion(ctx context.Context, filters Analytic return results, nil } -func (db *DBWrapper) QueryLocationByConstellation(ctx context.Context, filters AnalyticsFilters) ([]LocationAggregationByConstellation, error) { +func (db *DBWrapper) QueryLocationByConstellation(ctx context.Context, filters types.AnalyticsFilters) ([]LocationAggregationByConstellation, error) { flog := logger.Default.WithPrefix("QueryLocationByConstellation") whereClause, args := buildWhereClause(filters) @@ -258,7 +265,7 @@ func (db *DBWrapper) QueryLocationByConstellation(ctx context.Context, filters A return results, nil } -func (db *DBWrapper) QueryLocationBySecurity(ctx context.Context, filters AnalyticsFilters) ([]LocationAggregationBySecurity, error) { +func (db *DBWrapper) QueryLocationBySecurity(ctx context.Context, filters types.AnalyticsFilters) ([]LocationAggregationBySecurity, error) { flog := logger.Default.WithPrefix("QueryLocationBySecurity") whereClause, args := buildWhereClause(filters) @@ -296,7 +303,7 @@ func (db *DBWrapper) QueryLocationBySecurity(ctx context.Context, filters Analyt } // Ship aggregation queries -func (db *DBWrapper) QueryShipByVictim(ctx context.Context, filters AnalyticsFilters) ([]ShipAggregationByVictimShip, error) { +func (db *DBWrapper) QueryShipByVictim(ctx context.Context, filters types.AnalyticsFilters) ([]ShipAggregationByVictimShip, error) { flog := logger.Default.WithPrefix("QueryShipByVictim") whereClause, args := buildWhereClause(filters) @@ -332,7 +339,7 @@ func (db *DBWrapper) QueryShipByVictim(ctx context.Context, filters AnalyticsFil return results, nil } -func (db *DBWrapper) QueryShipByAttacker(ctx context.Context, filters AnalyticsFilters) ([]ShipAggregationByAttackerShip, error) { +func (db *DBWrapper) QueryShipByAttacker(ctx context.Context, filters types.AnalyticsFilters) ([]ShipAggregationByAttackerShip, error) { flog := logger.Default.WithPrefix("QueryShipByAttacker") killmailSubquery, killmailArgs := getKillmailIDSubquery(filters) whereClause, whereArgs := buildAttackerWhereClause(filters) @@ -372,7 +379,7 @@ func (db *DBWrapper) QueryShipByAttacker(ctx context.Context, filters AnalyticsF } // Player aggregation queries -func (db *DBWrapper) QueryPlayerByVictimCharacter(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByVictimCharacter, error) { +func (db *DBWrapper) QueryPlayerByVictimCharacter(ctx context.Context, filters types.AnalyticsFilters) ([]PlayerAggregationByVictimCharacter, error) { flog := logger.Default.WithPrefix("QueryPlayerByVictimCharacter") whereClause, args := buildWhereClause(filters) @@ -407,7 +414,7 @@ func (db *DBWrapper) QueryPlayerByVictimCharacter(ctx context.Context, filters A return results, nil } -func (db *DBWrapper) QueryPlayerByVictimCorporation(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByVictimCorporation, error) { +func (db *DBWrapper) QueryPlayerByVictimCorporation(ctx context.Context, filters types.AnalyticsFilters) ([]PlayerAggregationByVictimCorporation, error) { flog := logger.Default.WithPrefix("QueryPlayerByVictimCorporation") whereClause, args := buildWhereClause(filters) @@ -441,7 +448,7 @@ func (db *DBWrapper) QueryPlayerByVictimCorporation(ctx context.Context, filters return results, nil } -func (db *DBWrapper) QueryPlayerByVictimAlliance(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByVictimAlliance, error) { +func (db *DBWrapper) QueryPlayerByVictimAlliance(ctx context.Context, filters types.AnalyticsFilters) ([]PlayerAggregationByVictimAlliance, error) { flog := logger.Default.WithPrefix("QueryPlayerByVictimAlliance") whereClause, args := buildWhereClause(filters) @@ -482,7 +489,7 @@ func (db *DBWrapper) QueryPlayerByVictimAlliance(ctx context.Context, filters An return results, nil } -func (db *DBWrapper) QueryPlayerByAttackerCharacter(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByAttackerCharacter, error) { +func (db *DBWrapper) QueryPlayerByAttackerCharacter(ctx context.Context, filters types.AnalyticsFilters) ([]PlayerAggregationByAttackerCharacter, error) { flog := logger.Default.WithPrefix("QueryPlayerByAttackerCharacter") killmailSubquery, killmailArgs := getKillmailIDSubquery(filters) whereClause, whereArgs := buildAttackerWhereClause(filters) @@ -521,7 +528,7 @@ func (db *DBWrapper) QueryPlayerByAttackerCharacter(ctx context.Context, filters return results, nil } -func (db *DBWrapper) QueryPlayerByAttackerCorporation(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByAttackerCorporation, error) { +func (db *DBWrapper) QueryPlayerByAttackerCorporation(ctx context.Context, filters types.AnalyticsFilters) ([]PlayerAggregationByAttackerCorporation, error) { flog := logger.Default.WithPrefix("QueryPlayerByAttackerCorporation") killmailSubquery, killmailArgs := getKillmailIDSubquery(filters) whereClause, whereArgs := buildAttackerWhereClause(filters) @@ -558,7 +565,7 @@ func (db *DBWrapper) QueryPlayerByAttackerCorporation(ctx context.Context, filte return results, nil } -func (db *DBWrapper) QueryPlayerByAttackerAlliance(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByAttackerAlliance, error) { +func (db *DBWrapper) QueryPlayerByAttackerAlliance(ctx context.Context, filters types.AnalyticsFilters) ([]PlayerAggregationByAttackerAlliance, error) { flog := logger.Default.WithPrefix("QueryPlayerByAttackerAlliance") killmailSubquery, killmailArgs := getKillmailIDSubquery(filters) whereClause, whereArgs := buildAttackerWhereClause(filters) @@ -596,7 +603,7 @@ func (db *DBWrapper) QueryPlayerByAttackerAlliance(ctx context.Context, filters } // Module aggregation queries -func (db *DBWrapper) QueryModuleBySlotType(ctx context.Context, filters AnalyticsFilters) ([]ModuleAggregationBySlotType, error) { +func (db *DBWrapper) QueryModuleBySlotType(ctx context.Context, filters types.AnalyticsFilters) ([]ModuleAggregationBySlotType, error) { flog := logger.Default.WithPrefix("QueryModuleBySlotType") killmailSubquery, killmailArgs := getKillmailIDSubquery(filters) @@ -645,7 +652,7 @@ func (db *DBWrapper) QueryModuleBySlotType(ctx context.Context, filters Analytic return results, nil } -func (db *DBWrapper) QueryModuleByModule(ctx context.Context, filters AnalyticsFilters) ([]ModuleAggregationByModule, error) { +func (db *DBWrapper) QueryModuleByModule(ctx context.Context, filters types.AnalyticsFilters) ([]ModuleAggregationByModule, error) { flog := logger.Default.WithPrefix("QueryModuleByModule") killmailSubquery, killmailArgs := getKillmailIDSubquery(filters) @@ -696,7 +703,7 @@ func (db *DBWrapper) QueryModuleByModule(ctx context.Context, filters AnalyticsF return results, nil } -func (db *DBWrapper) QueryModuleCoOccurrence(ctx context.Context, filters AnalyticsFilters, selectedModuleID int32, selectedSlot string) ([]ModuleCoOccurrence, error) { +func (db *DBWrapper) QueryModuleCoOccurrence(ctx context.Context, filters types.AnalyticsFilters, selectedModuleID int32, selectedSlot string) ([]ModuleCoOccurrence, error) { flog := logger.Default.WithPrefix("QueryModuleCoOccurrence") killmailSubquery, killmailArgs := getKillmailIDSubquery(filters) @@ -740,7 +747,7 @@ func (db *DBWrapper) QueryModuleCoOccurrence(ctx context.Context, filters Analyt return results, nil } -func (db *DBWrapper) QueryKillmailIDs(ctx context.Context, filters AnalyticsFilters, limit, offset int) ([]int64, error) { +func (db *DBWrapper) QueryKillmailIDs(ctx context.Context, filters types.AnalyticsFilters, limit, offset int) ([]int64, error) { flog := logger.Default.WithPrefix("QueryKillmailIDs") whereClause, args := buildWhereClause(filters) @@ -821,11 +828,11 @@ func (db *DBWrapper) QueryKillmailWithItems(ctx context.Context, killmailID int6 defer rows.Close() var result *FlatKillmailComplete - var items []FlatKillmailItem + var items []types.FlatKillmailItem for rows.Next() { - var km FlatKillmail - var item FlatKillmailItem + var km types.FlatKillmail + var item types.FlatKillmailItem var itemTypeID int32 var itemTypeName string var itemGroupName string @@ -876,7 +883,7 @@ func (db *DBWrapper) QueryKillmailWithItems(ctx context.Context, killmailID int6 if result == nil { result = &FlatKillmailComplete{ FlatKillmail: km, - Items: []FlatKillmailItem{}, + Items: []types.FlatKillmailItem{}, } } diff --git a/clickhouse/analytics_test.go b/clickhouse/analytics_test.go index 611e5df..6870314 100644 --- a/clickhouse/analytics_test.go +++ b/clickhouse/analytics_test.go @@ -12,7 +12,7 @@ func TestQueryTimeByHour(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryTimeByHour(ctx, filters) if err != nil { @@ -40,7 +40,7 @@ func TestQueryTimeByDay(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryTimeByDay(ctx, filters) if err != nil { @@ -68,7 +68,7 @@ func TestQueryTimeByDate(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryTimeByDate(ctx, filters) if err != nil { @@ -96,7 +96,7 @@ func TestQueryTimeByMonth(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryTimeByMonth(ctx, filters) if err != nil { @@ -124,7 +124,7 @@ func TestQueryLocationBySystem(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryLocationBySystem(ctx, filters) if err != nil { @@ -152,7 +152,7 @@ func TestQueryLocationByRegion(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryLocationByRegion(ctx, filters) if err != nil { @@ -180,7 +180,7 @@ func TestQueryLocationByConstellation(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryLocationByConstellation(ctx, filters) if err != nil { @@ -208,7 +208,7 @@ func TestQueryLocationBySecurity(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryLocationBySecurity(ctx, filters) if err != nil { @@ -233,7 +233,7 @@ func TestQueryShipByVictim(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryShipByVictim(ctx, filters) if err != nil { @@ -261,7 +261,7 @@ func TestQueryShipByAttacker(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryShipByAttacker(ctx, filters) if err != nil { @@ -289,7 +289,7 @@ func TestQueryPlayerByVictimCharacter(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryPlayerByVictimCharacter(ctx, filters) if err != nil { @@ -317,7 +317,7 @@ func TestQueryPlayerByVictimCorporation(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryPlayerByVictimCorporation(ctx, filters) if err != nil { @@ -345,7 +345,7 @@ func TestQueryPlayerByVictimAlliance(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryPlayerByVictimAlliance(ctx, filters) if err != nil { @@ -373,7 +373,7 @@ func TestQueryPlayerByAttackerCharacter(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryPlayerByAttackerCharacter(ctx, filters) if err != nil { @@ -401,7 +401,7 @@ func TestQueryPlayerByAttackerCorporation(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryPlayerByAttackerCorporation(ctx, filters) if err != nil { @@ -429,7 +429,7 @@ func TestQueryPlayerByAttackerAlliance(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryPlayerByAttackerAlliance(ctx, filters) if err != nil { @@ -457,7 +457,7 @@ func TestQueryModuleBySlotType(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryModuleBySlotType(ctx, filters) if err != nil { @@ -482,7 +482,7 @@ func TestQueryModuleByModule(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryModuleByModule(ctx, filters) if err != nil { @@ -510,7 +510,7 @@ func TestQueryModuleCoOccurrence(t *testing.T) { } ctx := context.Background() - filters := AnalyticsFilters{} + filters := types.AnalyticsFilters{} results, err := db.QueryModuleCoOccurrence(ctx, filters, 26914, "mid") if err != nil { diff --git a/db/db.go b/db/db.go index f6357ca..9ebc5e4 100644 --- a/db/db.go +++ b/db/db.go @@ -1,4 +1,4 @@ -package main +package db import ( "context" @@ -6,6 +6,7 @@ import ( "strings" "zkillsusser/models" + "zkillsusser/types" utils "git.site.quack-lab.dev/dave/cyutils" @@ -20,7 +21,7 @@ type DB interface { Init() error Get() *gorm.DB - SaveFlatKillmails(killmails []*FlatKillmail, attackers []FlatKillmailAttacker, items []FlatKillmailItem) error + SaveFlatKillmails(killmails []*types.FlatKillmail, attackers []types.FlatKillmailAttacker, items []types.FlatKillmailItem) error SearchShips(query string, limit int) ([]models.InvType, error) SearchSystems(query string, limit int) ([]models.MapSolarSystem, error) SearchModules(query string, limit int) ([]models.InvType, error) @@ -29,7 +30,7 @@ type DB interface { GetItemTypes(itemIDs []int64) ([]models.InvType, error) GetSolarSystems(systemIDs []int64) ([]models.MapSolarSystem, error) ExpandGroupsIntoItemTypeIds(groups []int64) ([]int64, error) - GetModuleSlots(moduleIDs []int64) (map[int64]ModuleSlot, error) + GetModuleSlots(moduleIDs []int64) (map[int64]types.ModuleSlot, error) GetType(ctx context.Context, typeID int32) (*models.InvType, error) GetGroup(ctx context.Context, groupID int32) (*models.InvGroup, error) diff --git a/main.go b/main.go index 3b6578c..5210e19 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "zkillsusser/api" "zkillsusser/config" "zkillsusser/pipeline" @@ -17,7 +18,7 @@ func main() { logger.Info("Starting") if config.ServerMode { - StartAPIServer(config.ServerPort) + api.StartAPIServer(config.ServerPort) return } diff --git a/types/flat_killmail.go b/types/flat_killmail.go index 04461f0..a8cdf7b 100644 --- a/types/flat_killmail.go +++ b/types/flat_killmail.go @@ -120,3 +120,31 @@ func derefInt64(i *int64) int64 { } return *i } + +type ModuleFilter struct { + ModuleID int32 +} + +type AnalyticsFilters struct { + KillHour []uint8 + KillDayOfWeek []uint8 + KillDate []string + Month []string + SolarSystemID []int32 + RegionName []string + ConstellationName []string + SecurityStatus []string + VictimShipTypeID []int32 + VictimShipGroupName []string + VictimShipCategory []string + VictimCharacterName []string + VictimCorporation []string + VictimAlliance []string + AttackerShipType []string + AttackerShipGroup []string + AttackerCharacter []string + AttackerCorporation []string + AttackerAlliance []string + SlotType []string + HasModule *ModuleFilter +}