diff --git a/cmd/ws/eventhandler/event_handler_test.go b/cmd/ws/eventhandler/event_handler_test.go index a9f21be..92bac66 100644 --- a/cmd/ws/eventhandler/event_handler_test.go +++ b/cmd/ws/eventhandler/event_handler_test.go @@ -10,23 +10,25 @@ import ( "github.com/genudine/saerro-go/types" ) -func getEventHandlerTestShim(t *testing.T) (EventHandler, context.Context, *storemock.MockPlayerStore) { +func getEventHandlerTestShim(t *testing.T) (EventHandler, context.Context, *storemock.MockPlayerStore, *storemock.MockVehicleStore) { t.Helper() ctx, cancel := context.WithTimeout(context.Background(), time.Second*15) t.Cleanup(cancel) ps := new(storemock.MockPlayerStore) + vs := new(storemock.MockVehicleStore) return EventHandler{ Ingest: &ingest.Ingest{ - PlayerStore: ps, + PlayerStore: ps, + VehicleStore: vs, }, - }, ctx, ps + }, ctx, ps, vs } func TestHandleDeath(t *testing.T) { - eh, ctx, ps := getEventHandlerTestShim(t) + eh, ctx, ps, _ := getEventHandlerTestShim(t) event := types.ESSEvent{ EventName: "Death", @@ -52,7 +54,7 @@ func TestHandleDeath(t *testing.T) { } func TestHandleExperience(t *testing.T) { - eh, ctx, ps := getEventHandlerTestShim(t) + eh, ctx, ps, vs := getEventHandlerTestShim(t) event := types.ESSEvent{ EventName: "GainExperience", @@ -66,14 +68,17 @@ func TestHandleExperience(t *testing.T) { ExperienceID: 674, } - p := types.PopEventFromESSEvent(event, false).ToPlayer() - ps.On("Insert", ctx, p).Return(nil) + p := types.PopEventFromESSEvent(event, false) + v := p.ToVehicle() + v.VehicleName = "ant" // exp event translation + ps.On("Insert", ctx, p.ToPlayer()).Return(nil) + vs.On("Insert", ctx, v).Return(nil) eh.HandleExperience(ctx, event) } func TestHandleAnalytics(t *testing.T) { - eh, ctx, _ := getEventHandlerTestShim(t) + eh, ctx, _, _ := getEventHandlerTestShim(t) event := types.ESSEvent{ EventName: "GainExperience", WorldID: 17, @@ -90,7 +95,7 @@ func TestHandleAnalytics(t *testing.T) { } func TestHandleEvent(t *testing.T) { - eh, ctx, ps := getEventHandlerTestShim(t) + eh, ctx, ps, vs := getEventHandlerTestShim(t) events := []types.ESSEvent{ { @@ -124,11 +129,18 @@ func TestHandleEvent(t *testing.T) { p1 := types.PopEventFromESSEvent(events[0], false).ToPlayer() ps.On("Insert", ctx, p1).Return(nil).Once() + p2 := types.PopEventFromESSEvent(events[0], true).ToPlayer() ps.On("Insert", ctx, p2).Return(nil).Once() - p3 := types.PopEventFromESSEvent(events[1], false).ToPlayer() + + e3 := types.PopEventFromESSEvent(events[1], false) + p3 := e3.ToPlayer() ps.On("Insert", ctx, p3).Return(nil).Once() + v3 := types.PopEventFromESSEvent(events[1], false).ToVehicle() + v3.VehicleName = "galaxy" // exp event translation + vs.On("Insert", ctx, v3).Return(nil).Once() + for _, event := range events { eh.HandleEvent(ctx, event) } diff --git a/cmd/ws/ingest/ingest_test.go b/cmd/ws/ingest/ingest_test.go index e21e105..70003dc 100644 --- a/cmd/ws/ingest/ingest_test.go +++ b/cmd/ws/ingest/ingest_test.go @@ -39,6 +39,7 @@ func TestTrackPopHappyPath(t *testing.T) { TeamID: types.TR, LoadoutID: 4, ClassName: translators.CombatMedic, + VehicleName: "unknown", CharacterID: "aaaa", } @@ -57,6 +58,7 @@ func TestTrackPopFixup(t *testing.T) { ZoneID: 4, TeamID: 0, ClassName: "unknown", + VehicleName: "unknown", CharacterID: "bbbb", } pastEventPlayer := event.ToPlayer() @@ -77,6 +79,7 @@ func TestTrackPopFixupFailed(t *testing.T) { ZoneID: 4, TeamID: 0, ClassName: "unknown", + VehicleName: "unknown", CharacterID: "bbbb", } diff --git a/docker-compose.yaml b/docker-compose.yaml index 83ddf4f..53039eb 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,6 +1,6 @@ services: - tsdb: - image: docker.io/timescale/timescaledb:latest-pg14 + postgres: + image: docker.io/library/postgres environment: POSTGRES_PASSWORD: saerro321 POSTGRES_USER: saerrouser diff --git a/flake.nix b/flake.nix index b0b6c25..58db685 100644 --- a/flake.nix +++ b/flake.nix @@ -10,6 +10,31 @@ systems = [ "x86_64-linux" "aarch64-linux" ]; perSystem = { config, self', pkgs, lib, system, ... }: { devShells.default = import ./shell.nix { inherit pkgs; }; + + packages = let + vendorHash = "sha256-A5hZxo0zZ3w6qryV24PjYaKQatN2G2heyuee6QaU55M="; + in rec { + default = saerro; + saerro = pkgs.buildGoModule { + inherit vendorHash; + name = "saerro-ws"; + src = ./.; + subPackages = [ + "cmd/ws" + "cmd/pruner" + ]; + }; + ws = pkgs.ociTools.buildContainer { + args = [ + "${saerro}/ws" + ]; + }; + pruner = pkgs.ociTools.buildContainer { + args = [ + "${saerro}/pruner" + ]; + }; + }; }; }; } \ No newline at end of file diff --git a/result b/result new file mode 120000 index 0000000..c01530c --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/aa9byv99dpxncm4pf9baih91ni4x23cw-join \ No newline at end of file diff --git a/store/vehicle.go b/store/vehicle.go index 77e7435..c58567d 100644 --- a/store/vehicle.go +++ b/store/vehicle.go @@ -147,9 +147,12 @@ func (ps *VehicleStore) Prune(ctx context.Context) (int64, error) { // Avoid using sql idioms here for portability // SQLite and PgSQL do now() differently, we don't need to at all. - res, err := ps.DB.ExecContext(ctx, ` - DELETE FROM vehicles WHERE last_updated < $1; - `, time.Now().Add(-time.Minute*15)) + res, err := ps.DB.ExecContext(ctx, + ` + DELETE FROM vehicles WHERE last_updated < $1; + `, + util.TimeToString(time.Now().Add(-time.Minute*15)), + ) if err != nil { return 0, err }