From a24e81585f01f44e80639ef3bb2f52c7413d23c9 Mon Sep 17 00:00:00 2001 From: Ayuhito Date: Mon, 2 Sep 2024 12:44:00 +0300 Subject: [PATCH] fix(core): serve new scripts with correct paths --- core/.ogen.yml | 9 +- core/api/oas_response_encoders_gen.go | 160 -------------------------- core/db/duckdb/event_test.go | 2 +- core/db/duckdb/helpers_test.go | 2 +- core/openapi.yaml | 5 +- core/services/assets.go | 33 +++--- core/services/event.go | 5 - core/services/oas.go | 33 +++--- tracker/Taskfile.yaml | 7 +- 9 files changed, 45 insertions(+), 211 deletions(-) diff --git a/core/.ogen.yml b/core/.ogen.yml index c7c16e12..b7745786 100644 --- a/core/.ogen.yml +++ b/core/.ogen.yml @@ -3,12 +3,5 @@ generator: enable: - "paths/server" - "webhooks/server" - - "server/response/validation" - disable: - - "paths/client" - - "webhooks/client" - - "client/request/validation" - - "ogen/otel" - - "ogen/unimplemented" - - "debug/example_tests" + disable_all: true convenient_errors: false diff --git a/core/api/oas_response_encoders_gen.go b/core/api/oas_response_encoders_gen.go index f1e45188..a5e3c261 100644 --- a/core/api/oas_response_encoders_gen.go +++ b/core/api/oas_response_encoders_gen.go @@ -230,14 +230,6 @@ func encodeGetEventPingResponse(response GetEventPingRes, w http.ResponseWriter) func encodeGetUserResponse(response GetUserRes, w http.ResponseWriter) error { switch response := response.(type) { case *UserGet: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -305,14 +297,6 @@ func encodeGetUserResponse(response GetUserRes, w http.ResponseWriter) error { func encodeGetUserUsageResponse(response GetUserUsageRes, w http.ResponseWriter) error { switch response := response.(type) { case *UserUsageGet: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -356,14 +340,6 @@ func encodeGetUserUsageResponse(response GetUserUsageRes, w http.ResponseWriter) func encodeGetWebsiteIDBrowsersResponse(response GetWebsiteIDBrowsersRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsBrowsers: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -443,14 +419,6 @@ func encodeGetWebsiteIDBrowsersResponse(response GetWebsiteIDBrowsersRes, w http func encodeGetWebsiteIDCampaignsResponse(response GetWebsiteIDCampaignsRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsUTMCampaigns: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -530,14 +498,6 @@ func encodeGetWebsiteIDCampaignsResponse(response GetWebsiteIDCampaignsRes, w ht func encodeGetWebsiteIDCountryResponse(response GetWebsiteIDCountryRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsCountries: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -617,14 +577,6 @@ func encodeGetWebsiteIDCountryResponse(response GetWebsiteIDCountryRes, w http.R func encodeGetWebsiteIDDeviceResponse(response GetWebsiteIDDeviceRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsDevices: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -704,14 +656,6 @@ func encodeGetWebsiteIDDeviceResponse(response GetWebsiteIDDeviceRes, w http.Res func encodeGetWebsiteIDLanguageResponse(response GetWebsiteIDLanguageRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsLanguages: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -791,14 +735,6 @@ func encodeGetWebsiteIDLanguageResponse(response GetWebsiteIDLanguageRes, w http func encodeGetWebsiteIDMediumsResponse(response GetWebsiteIDMediumsRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsUTMMediums: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -878,14 +814,6 @@ func encodeGetWebsiteIDMediumsResponse(response GetWebsiteIDMediumsRes, w http.R func encodeGetWebsiteIDOsResponse(response GetWebsiteIDOsRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsOS: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -965,14 +893,6 @@ func encodeGetWebsiteIDOsResponse(response GetWebsiteIDOsRes, w http.ResponseWri func encodeGetWebsiteIDPagesResponse(response GetWebsiteIDPagesRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsPages: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -1040,14 +960,6 @@ func encodeGetWebsiteIDPagesResponse(response GetWebsiteIDPagesRes, w http.Respo func encodeGetWebsiteIDPropertiesResponse(response GetWebsiteIDPropertiesRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsProperties: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -1127,14 +1039,6 @@ func encodeGetWebsiteIDPropertiesResponse(response GetWebsiteIDPropertiesRes, w func encodeGetWebsiteIDReferrersResponse(response GetWebsiteIDReferrersRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsReferrers: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -1214,14 +1118,6 @@ func encodeGetWebsiteIDReferrersResponse(response GetWebsiteIDReferrersRes, w ht func encodeGetWebsiteIDSourcesResponse(response GetWebsiteIDSourcesRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsUTMSources: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -1301,14 +1197,6 @@ func encodeGetWebsiteIDSourcesResponse(response GetWebsiteIDSourcesRes, w http.R func encodeGetWebsiteIDSummaryResponse(response GetWebsiteIDSummaryRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsSummary: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -1376,14 +1264,6 @@ func encodeGetWebsiteIDSummaryResponse(response GetWebsiteIDSummaryRes, w http.R func encodeGetWebsiteIDTimeResponse(response GetWebsiteIDTimeRes, w http.ResponseWriter) error { switch response := response.(type) { case *StatsTime: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -1451,14 +1331,6 @@ func encodeGetWebsiteIDTimeResponse(response GetWebsiteIDTimeRes, w http.Respons func encodeGetWebsitesResponse(response GetWebsitesRes, w http.ResponseWriter) error { switch response := response.(type) { case *GetWebsitesOKApplicationJSON: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -1526,14 +1398,6 @@ func encodeGetWebsitesResponse(response GetWebsitesRes, w http.ResponseWriter) e func encodeGetWebsitesIDResponse(response GetWebsitesIDRes, w http.ResponseWriter) error { switch response := response.(type) { case *WebsiteGet: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -1601,14 +1465,6 @@ func encodeGetWebsitesIDResponse(response GetWebsitesIDRes, w http.ResponseWrite func encodePatchUserResponse(response PatchUserRes, w http.ResponseWriter) error { switch response := response.(type) { case *UserGet: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -1700,14 +1556,6 @@ func encodePatchUserResponse(response PatchUserRes, w http.ResponseWriter) error func encodePatchWebsitesIDResponse(response PatchWebsitesIDRes, w http.ResponseWriter) error { switch response := response.(type) { case *WebsiteGet: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -1951,14 +1799,6 @@ func encodePostEventHitResponse(response PostEventHitRes, w http.ResponseWriter) func encodePostWebsitesResponse(response PostWebsitesRes, w http.ResponseWriter) error { switch response := response.(type) { case *WebsiteGet: - if err := func() error { - if err := response.Validate(); err != nil { - return err - } - return nil - }(); err != nil { - return errors.Wrap(err, "validate") - } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(201) diff --git a/core/db/duckdb/event_test.go b/core/db/duckdb/event_test.go index b287c335..aaec474d 100644 --- a/core/db/duckdb/event_test.go +++ b/core/db/duckdb/event_test.go @@ -95,6 +95,6 @@ func TestUpdatePageView(t *testing.T) { DurationMs: 100, } - err = client.UpdatePageView(ctx, event2, nil) + err = client.UpdatePageView(ctx, event2) assert.NoError(err) } diff --git a/core/db/duckdb/helpers_test.go b/core/db/duckdb/helpers_test.go index 69265ce9..9bc961f8 100644 --- a/core/db/duckdb/helpers_test.go +++ b/core/db/duckdb/helpers_test.go @@ -217,7 +217,7 @@ func generateFilterAll(hostname string) []TestCase { return filters } -func getBaseTestCases(_hostname string) []TestCase { +func getBaseTestCases(_ string) []TestCase { hostname := MediumHostname // For now we only have one hostname. tc := []TestCase{ { diff --git a/core/openapi.yaml b/core/openapi.yaml index 94c6f59b..d244934d 100644 --- a/core/openapi.yaml +++ b/core/openapi.yaml @@ -1510,7 +1510,10 @@ components: type: array items: type: string - enum: [default, click-events, page-events] + enum: + - default + - click-events + - page-events uniqueItems: true UserGet: type: object diff --git a/core/services/assets.go b/core/services/assets.go index cdff9551..93ca1ff8 100644 --- a/core/services/assets.go +++ b/core/services/assets.go @@ -21,10 +21,10 @@ type SPAHandler struct { indexETag string fileETags map[string]string - runtimeConfig RuntimeConfig + runtimeConfig *RuntimeConfig } -func SetupAssetHandler(mux *http.ServeMux, runtimeConfig RuntimeConfig) error { +func SetupAssetHandler(mux *http.ServeMux, runtimeConfig *RuntimeConfig) error { client, err := generate.SPAClient() if err != nil { return errors.Wrap(err, "failed to create spa client") @@ -39,7 +39,7 @@ func SetupAssetHandler(mux *http.ServeMux, runtimeConfig RuntimeConfig) error { return nil } -func NewSPAHandler(client fs.FS, runtimeConfig RuntimeConfig) (*SPAHandler, error) { +func NewSPAHandler(client fs.FS, runtimeConfig *RuntimeConfig) (*SPAHandler, error) { clientServer := http.FileServer(http.FS(client)) indexFile, err := readFile(client, "index.html") @@ -113,27 +113,30 @@ func (h *SPAHandler) serveFile(w http.ResponseWriter, r *http.Request, filePath func (h *SPAHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { uPath := path.Clean(r.URL.Path) - // Check if the request is for script.js or any file in the /scripts/ directory - if uPath == "/script.js" || strings.HasPrefix(uPath, "/scripts/") { - scriptFile := h.runtimeConfig.ScriptFileName - - if uPath != "/script.js" { - scriptFile = uPath - } + // Check if the request is for script.js + if uPath == "/script.js" { + // Update the request URL to match the actual file being served. + r.URL.Path = h.runtimeConfig.ScriptFileName + h.serveFile(w, r, h.runtimeConfig.ScriptFileName) + return + } - // Update the request URL to match the actual file being served - r.URL.Path = scriptFile - h.serveFile(w, r, scriptFile) + // The path can also check for a file in the /scripts/ directory. + // This isn't typically used for normally serving files. + if strings.HasPrefix(uPath, "/scripts/") { + // Update the request URL to match the actual file being served. + r.URL.Path = uPath + h.serveFile(w, r, uPath) return } - // Check if the file exists in our precomputed ETags + // Check if the file exists in our precomputed ETags. if _, exists := h.fileETags[uPath]; exists { h.serveFile(w, r, uPath) return } - // Serve index.html for all other routes that are not /api + // Serve index.html for all other routes that are not /api. h.serveIndexHTML(w, r) } diff --git a/core/services/event.go b/core/services/event.go index 43bd966d..c7af5365 100644 --- a/core/services/event.go +++ b/core/services/event.go @@ -381,11 +381,6 @@ func (h *Handler) PostEventHit(ctx context.Context, req api.EventHit, _params ap }) } - if err != nil { - log.Error().Msg("hit: " + err.Error()) - return ErrBadRequest(model.ErrInvalidTrackerEvent), nil - } - log = log.With(). Str("event_type", string(req.Type)). Str("group", group). diff --git a/core/services/oas.go b/core/services/oas.go index 0e1f78d0..5e3e36ef 100644 --- a/core/services/oas.go +++ b/core/services/oas.go @@ -38,7 +38,7 @@ type Handler struct { hostnames *util.CacheStore // Runtime config - RuntimeConfig RuntimeConfig + RuntimeConfig *RuntimeConfig } // NewService returns a new instance of the ogen service handler. @@ -82,7 +82,7 @@ func NewService(ctx context.Context, auth *util.AuthService, sqlite *sqlite.Clie timezoneMap: &tzMap, codeCountryMap: &codeCountryMap, hostnames: &hostnameCache, - RuntimeConfig: runtimeConfig, + RuntimeConfig: &runtimeConfig, }, nil } @@ -114,33 +114,30 @@ func (r *RuntimeConfig) UpdateConfig(ctx context.Context, meta *sqlite.Client, s return nil } -// Convert array of script type features split by comma to a ScriptType struct. +// Convert array of script type features split by comma to a script file name. func convertScriptType(scriptType string) string { features := strings.Split(scriptType, ",") // Hot path for basic script. if scriptType == "default" || len(features) == 0 { - return "/default.js" + return "/scripts/default.js" } - // Alphabetically sort the features as script files are named alphabetically. - slices.Sort(features) - - var sb strings.Builder - sb.WriteString("/scripts/") - for idx, feature := range features { - if idx > 0 { - sb.WriteString(".") - } + filteredFeatures := make([]string, 0, len(features)) - switch feature { - case "click-events": - sb.WriteString("click-events") - case "page-events": - sb.WriteString("page-events") + // Filter out the default feature. + for _, feature := range features { + if feature != "default" { + filteredFeatures = append(filteredFeatures, feature) } } + // Alphabetically sort the features as script files are named alphabetically. + slices.Sort(filteredFeatures) + + var sb strings.Builder + sb.WriteString("/scripts/") + sb.WriteString(strings.Join(filteredFeatures, ".")) sb.WriteString(".js") return sb.String() diff --git a/tracker/Taskfile.yaml b/tracker/Taskfile.yaml index 31c2f24b..bcce2985 100644 --- a/tracker/Taskfile.yaml +++ b/tracker/Taskfile.yaml @@ -23,8 +23,11 @@ tasks: deps: [build:default] cmds: - mkdir -p ../core/client/scripts - - cp ./dist/default.min.js ../core/client/scripts/default.js - - cp ./dist/click-events.min.js ../core/client/scripts/click-events.js + - | + files=("default" "click-events" "page-events" "click-events.page-events") + for file in "${files[@]}"; do + cp ./dist/$file.min.js ../core/client/scripts/$file.js + done sources: - ./dist/*.min.js generates: