diff --git a/http/api.go b/http/api.go index ca9f3c5..37a43f6 100644 --- a/http/api.go +++ b/http/api.go @@ -42,8 +42,10 @@ func init() { } func (cfg *Config) PostSkin(resp http.ResponseWriter, req *http.Request) { + cfg.Logger.IncCounter("api.skins.post.request", 1) validationErrors := validatePostSkinRequest(req) if validationErrors != nil { + cfg.Logger.IncCounter("api.skins.post.validation_failed", 1) apiBadRequest(resp, validationErrors) return } @@ -78,13 +80,16 @@ func (cfg *Config) PostSkin(resp http.ResponseWriter, req *http.Request) { return } + cfg.Logger.IncCounter("api.skins.post.success", 1) resp.WriteHeader(http.StatusCreated) } func (cfg *Config) DeleteSkinByUserId(resp http.ResponseWriter, req *http.Request) { + cfg.Logger.IncCounter("api.skins.delete.request", 1) id, _ := strconv.Atoi(mux.Vars(req)["id"]) skin, err := cfg.SkinsRepo.FindByUserId(id) if err != nil { + cfg.Logger.IncCounter("api.skins.delete.not_found", 1) apiNotFound(resp, "Cannot find record for requested user id") return } @@ -93,9 +98,11 @@ func (cfg *Config) DeleteSkinByUserId(resp http.ResponseWriter, req *http.Reques } func (cfg *Config) DeleteSkinByUsername(resp http.ResponseWriter, req *http.Request) { + cfg.Logger.IncCounter("api.skins.delete.request", 1) username := mux.Vars(req)["username"] skin, err := cfg.SkinsRepo.FindByUsername(username) if err != nil { + cfg.Logger.IncCounter("api.skins.delete.not_found", 1) apiNotFound(resp, "Cannot find record for requested username") return } @@ -105,9 +112,11 @@ func (cfg *Config) DeleteSkinByUsername(resp http.ResponseWriter, req *http.Requ func (cfg *Config) Authenticate(handler http.Handler) http.Handler { return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { + cfg.Logger.IncCounter("authentication.challenge", 1) err := cfg.Auth.Check(req) if err != nil { if _, ok := err.(*auth.Unauthorized); ok { + cfg.Logger.IncCounter("authentication.failed", 1) apiForbidden(resp, err.Error()) } else { cfg.Logger.Error("Unknown error on validating api request: :err", wd.ErrParam(err)) @@ -117,6 +126,7 @@ func (cfg *Config) Authenticate(handler http.Handler) http.Handler { return } + cfg.Logger.IncCounter("authentication.success", 1) handler.ServeHTTP(resp, req) }) } @@ -129,6 +139,7 @@ func (cfg *Config) deleteSkin(skin *model.Skin, resp http.ResponseWriter) { return } + cfg.Logger.IncCounter("api.skins.delete.success", 1) resp.WriteHeader(http.StatusNoContent) } diff --git a/http/api_test.go b/http/api_test.go index 9e979ec..a2a9fde 100644 --- a/http/api_test.go +++ b/http/api_test.go @@ -35,6 +35,10 @@ func TestConfig_PostSkin_Valid(t *testing.T) { mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil) mocks.Skins.EXPECT().FindByUserId(1).Return(createSkinModel("mock_user", false), nil) mocks.Skins.EXPECT().Save(resultModel).Return(nil) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) + mocks.Log.EXPECT().IncCounter("authentication.success", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.request", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.success", int64(1)) form := url.Values{ "identityId": {"1"}, @@ -96,6 +100,10 @@ func TestConfig_PostSkin_ChangedIdentityId(t *testing.T) { mocks.Skins.EXPECT().FindByUsername("mock_user").Return(createSkinModel("mock_user", false), nil) mocks.Skins.EXPECT().RemoveByUsername("mock_user").Return(nil) mocks.Skins.EXPECT().Save(resultModel).Return(nil) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) + mocks.Log.EXPECT().IncCounter("authentication.success", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.request", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.success", int64(1)) config.CreateHandler().ServeHTTP(w, req) @@ -140,6 +148,10 @@ func TestConfig_PostSkin_ChangedUsername(t *testing.T) { mocks.Skins.EXPECT().FindByUserId(1).Return(createSkinModel("mock_user", false), nil) mocks.Skins.EXPECT().RemoveByUserId(1).Return(nil) mocks.Skins.EXPECT().Save(resultModel).Return(nil) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) + mocks.Log.EXPECT().IncCounter("authentication.success", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.request", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.success", int64(1)) config.CreateHandler().ServeHTTP(w, req) @@ -184,6 +196,10 @@ func TestConfig_PostSkin_CompletelyNewIdentity(t *testing.T) { mocks.Skins.EXPECT().FindByUserId(1).Return(nil, &db.SkinNotFoundError{"unknown"}) mocks.Skins.EXPECT().FindByUsername("mock_user").Return(nil, &db.SkinNotFoundError{"mock_user"}) mocks.Skins.EXPECT().Save(resultModel).Return(nil) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) + mocks.Log.EXPECT().IncCounter("authentication.success", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.request", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.success", int64(1)) config.CreateHandler().ServeHTTP(w, req) @@ -223,6 +239,10 @@ func TestConfig_PostSkin_UploadSkin(t *testing.T) { w := httptest.NewRecorder() mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) + mocks.Log.EXPECT().IncCounter("authentication.success", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.request", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.validation_failed", int64(1)) config.CreateHandler().ServeHTTP(w, req) @@ -257,6 +277,10 @@ func TestConfig_PostSkin_RequiredFields(t *testing.T) { w := httptest.NewRecorder() mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) + mocks.Log.EXPECT().IncCounter("authentication.success", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.request", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.post.validation_failed", int64(1)) config.CreateHandler().ServeHTTP(w, req) @@ -312,6 +336,8 @@ func TestConfig_PostSkin_Unauthorized(t *testing.T) { w := httptest.NewRecorder() mocks.Auth.EXPECT().Check(gomock.Any()).Return(&auth.Unauthorized{"Cannot parse passed JWT token"}) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) + mocks.Log.EXPECT().IncCounter("authentication.failed", int64(1)) config.CreateHandler().ServeHTTP(w, req) @@ -338,6 +364,10 @@ func TestConfig_DeleteSkinByUserId_Success(t *testing.T) { mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil) mocks.Skins.EXPECT().FindByUserId(1).Return(createSkinModel("mock_user", false), nil) mocks.Skins.EXPECT().RemoveByUserId(1).Return(nil) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) + mocks.Log.EXPECT().IncCounter("authentication.success", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.delete.request", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.delete.success", int64(1)) config.CreateHandler().ServeHTTP(w, req) @@ -361,6 +391,10 @@ func TestConfig_DeleteSkinByUserId_NotFound(t *testing.T) { mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil) mocks.Skins.EXPECT().FindByUserId(2).Return(nil, &db.SkinNotFoundError{"unknown"}) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) + mocks.Log.EXPECT().IncCounter("authentication.success", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.delete.request", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.delete.not_found", int64(1)) config.CreateHandler().ServeHTTP(w, req) @@ -387,6 +421,10 @@ func TestConfig_DeleteSkinByUsername_Success(t *testing.T) { mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil) mocks.Skins.EXPECT().FindByUsername("mock_user").Return(createSkinModel("mock_user", false), nil) mocks.Skins.EXPECT().RemoveByUserId(1).Return(nil) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) + mocks.Log.EXPECT().IncCounter("authentication.success", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.delete.request", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.delete.success", int64(1)) config.CreateHandler().ServeHTTP(w, req) @@ -410,6 +448,10 @@ func TestConfig_DeleteSkinByUsername_NotFound(t *testing.T) { mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil) mocks.Skins.EXPECT().FindByUsername("mock_user_2").Return(nil, &db.SkinNotFoundError{"mock_user_2"}) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) + mocks.Log.EXPECT().IncCounter("authentication.success", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.delete.request", int64(1)) + mocks.Log.EXPECT().IncCounter("api.skins.delete.not_found", int64(1)) config.CreateHandler().ServeHTTP(w, req) @@ -435,6 +477,7 @@ func TestConfig_Authenticate_SignatureKeyNotSet(t *testing.T) { mocks.Auth.EXPECT().Check(gomock.Any()).Return(&auth.SigningKeyNotAvailable{}) mocks.Log.EXPECT().Error("Unknown error on validating api request: :err", gomock.Any()) + mocks.Log.EXPECT().IncCounter("authentication.challenge", int64(1)) res := config.Authenticate(http.HandlerFunc(func (resp http.ResponseWriter, req *http.Request) {})) res.ServeHTTP(w, req)