From 9897a6e1864c34ed2e3523241f025a239ce45224 Mon Sep 17 00:00:00 2001 From: Till Faelligen Date: Wed, 2 Mar 2022 16:13:00 +0100 Subject: [PATCH] userapi interface and internal api --- userapi/api/api.go | 16 +++++++++ userapi/api/api_trace.go | 35 ++++++++++++++++++++ userapi/internal/api.go | 63 +++++++++++++++++++++++++++++++++++ userapi/inthttp/client.go | 64 +++++++++++++++++++++++++++++++++++ userapi/inthttp/server.go | 70 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 248 insertions(+) diff --git a/userapi/api/api.go b/userapi/api/api.go index cd872d3c9..aeb50df52 100644 --- a/userapi/api/api.go +++ b/userapi/api/api.go @@ -45,6 +45,22 @@ type UserInternalAPI interface { QueryDeviceInfos(ctx context.Context, req *QueryDeviceInfosRequest, res *QueryDeviceInfosResponse) error QuerySearchProfiles(ctx context.Context, req *QuerySearchProfilesRequest, res *QuerySearchProfilesResponse) error QueryOpenIDToken(ctx context.Context, req *QueryOpenIDTokenRequest, res *QueryOpenIDTokenResponse) error + + AllUsers(ctx context.Context, res *IntegerResponse) error + NonBridgedUsers(ctx context.Context, res *IntegerResponse) error + RegisteredUserByType(ctx context.Context, res *MapResponse) error + DailyUsers(ctx context.Context, res *IntegerResponse) error + MonthlyUsers(ctx context.Context, res *IntegerResponse) error + R30Users(ctx context.Context, res *MapResponse) error + R30UsersV2(ctx context.Context, res *MapResponse) error +} + +type IntegerResponse struct { + Count int64 +} + +type MapResponse struct { + Result map[string]int64 } type PerformKeyBackupRequest struct { diff --git a/userapi/api/api_trace.go b/userapi/api/api_trace.go index aa069f40b..291bb812d 100644 --- a/userapi/api/api_trace.go +++ b/userapi/api/api_trace.go @@ -119,6 +119,41 @@ func (t *UserInternalAPITrace) QueryOpenIDToken(ctx context.Context, req *QueryO return err } +func (t *UserInternalAPITrace) AllUsers(ctx context.Context, res *IntegerResponse) error { + //TODO implement me + panic("implement me") +} + +func (t *UserInternalAPITrace) NonBridgedUsers(ctx context.Context, res *IntegerResponse) error { + //TODO implement me + panic("implement me") +} + +func (t *UserInternalAPITrace) RegisteredUserByType(ctx context.Context, res *MapResponse) error { + //TODO implement me + panic("implement me") +} + +func (t *UserInternalAPITrace) DailyUsers(ctx context.Context, res *IntegerResponse) error { + //TODO implement me + panic("implement me") +} + +func (t *UserInternalAPITrace) MonthlyUsers(ctx context.Context, res *IntegerResponse) error { + //TODO implement me + panic("implement me") +} + +func (t *UserInternalAPITrace) R30Users(ctx context.Context, res *MapResponse) error { + //TODO implement me + panic("implement me") +} + +func (t *UserInternalAPITrace) R30UsersV2(ctx context.Context, res *MapResponse) error { + //TODO implement me + panic("implement me") +} + func js(thing interface{}) string { b, err := json.Marshal(thing) if err != nil { diff --git a/userapi/internal/api.go b/userapi/internal/api.go index d818c3fb6..10d2b1b27 100644 --- a/userapi/internal/api.go +++ b/userapi/internal/api.go @@ -595,3 +595,66 @@ func (a *UserInternalAPI) QueryKeyBackup(ctx context.Context, req *api.QueryKeyB } res.Keys = result } + +func (a *UserInternalAPI) AllUsers(ctx context.Context, res *api.IntegerResponse) error { + count, err := a.DB.AllUsers(ctx) + if err != nil { + return err + } + res.Count = count + return nil +} + +func (a *UserInternalAPI) NonBridgedUsers(ctx context.Context, res *api.IntegerResponse) error { + count, err := a.DB.NonBridgedUsers(ctx) + if err != nil { + return err + } + res.Count = count + return nil +} + +func (a *UserInternalAPI) RegisteredUserByType(ctx context.Context, res *api.MapResponse) error { + data, err := a.DB.RegisteredUserByType(ctx) + if err != nil { + return err + } + res.Result = data + return nil +} + +func (a *UserInternalAPI) DailyUsers(ctx context.Context, res *api.IntegerResponse) error { + count, err := a.DB.DailyUsers(ctx) + if err != nil { + return err + } + res.Count = count + return nil +} + +func (a *UserInternalAPI) MonthlyUsers(ctx context.Context, res *api.IntegerResponse) error { + count, err := a.DB.MonthlyUsers(ctx) + if err != nil { + return err + } + res.Count = count + return nil +} + +func (a *UserInternalAPI) R30Users(ctx context.Context, res *api.MapResponse) error { + data, err := a.DB.R30Users(ctx) + if err != nil { + return err + } + res.Result = data + return nil +} + +func (a *UserInternalAPI) R30UsersV2(ctx context.Context, res *api.MapResponse) error { + data, err := a.DB.R30UsersV2(ctx) + if err != nil { + return err + } + res.Result = data + return nil +} \ No newline at end of file diff --git a/userapi/inthttp/client.go b/userapi/inthttp/client.go index 1599d4639..5ae1f9abf 100644 --- a/userapi/inthttp/client.go +++ b/userapi/inthttp/client.go @@ -46,6 +46,14 @@ const ( QueryDeviceInfosPath = "/userapi/queryDeviceInfos" QuerySearchProfilesPath = "/userapi/querySearchProfiles" QueryOpenIDTokenPath = "/userapi/queryOpenIDToken" + + StatsAllUsers = "/userapi/stats/allUsers" + StatsNonBridgedUsers = "/userapi/stats/nonBridgedUsers" + StatsRegisteredUserByType = "/userapi/stats/registeredUserByType" + StatsDailyUsers = "/userapi/stats/dailyUsers" + StatsMonthlyUsers = "/userapi/stats/monthlyUsers" + StatsR30Users = "/userapi/stats/r30Users" + StatsR30UsersV2 = "/userapi/stats/r30UsersV2" ) // NewUserAPIClient creates a UserInternalAPI implemented by talking to a HTTP POST API. @@ -249,3 +257,59 @@ func (h *httpUserInternalAPI) QueryKeyBackup(ctx context.Context, req *api.Query res.Error = err.Error() } } + +func (h *httpUserInternalAPI) AllUsers(ctx context.Context, res *api.IntegerResponse) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "AllUsers") + defer span.Finish() + + apiURL := h.apiURL + StatsAllUsers + return httputil.PostJSON(ctx, span, h.httpClient, apiURL, nil, res) +} + +func (h *httpUserInternalAPI) NonBridgedUsers(ctx context.Context, res *api.IntegerResponse) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "NonBridgedUsers") + defer span.Finish() + + apiURL := h.apiURL + StatsNonBridgedUsers + return httputil.PostJSON(ctx, span, h.httpClient, apiURL, nil, res) +} + +func (h *httpUserInternalAPI) RegisteredUserByType(ctx context.Context, res *api.MapResponse) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "RegisteredUserByType") + defer span.Finish() + + apiURL := h.apiURL + StatsRegisteredUserByType + return httputil.PostJSON(ctx, span, h.httpClient, apiURL, nil, res) +} + +func (h *httpUserInternalAPI) DailyUsers(ctx context.Context, res *api.IntegerResponse) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "DailyUsers") + defer span.Finish() + + apiURL := h.apiURL + StatsDailyUsers + return httputil.PostJSON(ctx, span, h.httpClient, apiURL, nil, res) +} + +func (h *httpUserInternalAPI) MonthlyUsers(ctx context.Context, res *api.IntegerResponse) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "MonthlyUsers") + defer span.Finish() + + apiURL := h.apiURL + StatsMonthlyUsers + return httputil.PostJSON(ctx, span, h.httpClient, apiURL, nil, res) +} + +func (h *httpUserInternalAPI) R30Users(ctx context.Context, res *api.MapResponse) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "R30Users") + defer span.Finish() + + apiURL := h.apiURL + StatsR30Users + return httputil.PostJSON(ctx, span, h.httpClient, apiURL, nil, res) +} + +func (h *httpUserInternalAPI) R30UsersV2(ctx context.Context, res *api.MapResponse) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "R30UsersV2") + defer span.Finish() + + apiURL := h.apiURL + StatsR30UsersV2 + return httputil.PostJSON(ctx, span, h.httpClient, apiURL, nil, res) +} \ No newline at end of file diff --git a/userapi/inthttp/server.go b/userapi/inthttp/server.go index d00ee042c..39b815499 100644 --- a/userapi/inthttp/server.go +++ b/userapi/inthttp/server.go @@ -265,4 +265,74 @@ func AddRoutes(internalAPIMux *mux.Router, s api.UserInternalAPI) { return util.JSONResponse{Code: http.StatusOK, JSON: &response} }), ) + internalAPIMux.Handle(StatsAllUsers, + httputil.MakeInternalAPI("statsAllUsers", func(req *http.Request) util.JSONResponse { + response := api.IntegerResponse{} + err := s.AllUsers(req.Context(), &response) + if err != nil { + return util.JSONResponse{Code: http.StatusBadRequest, JSON: &response} + } + return util.JSONResponse{Code: http.StatusOK, JSON: &response} + }), + ) + internalAPIMux.Handle(StatsNonBridgedUsers, + httputil.MakeInternalAPI("statsNonBridgedUsers", func(req *http.Request) util.JSONResponse { + response := api.IntegerResponse{} + err := s.NonBridgedUsers(req.Context(), &response) + if err != nil { + return util.JSONResponse{Code: http.StatusBadRequest, JSON: &response} + } + return util.JSONResponse{Code: http.StatusOK, JSON: &response} + }), + ) + internalAPIMux.Handle(StatsDailyUsers, + httputil.MakeInternalAPI("statsDailyUsers", func(req *http.Request) util.JSONResponse { + response := api.IntegerResponse{} + err := s.DailyUsers(req.Context(), &response) + if err != nil { + return util.JSONResponse{Code: http.StatusBadRequest, JSON: &response} + } + return util.JSONResponse{Code: http.StatusOK, JSON: &response} + }), + ) + internalAPIMux.Handle(StatsMonthlyUsers, + httputil.MakeInternalAPI("statsMonthlyUsers", func(req *http.Request) util.JSONResponse { + response := api.IntegerResponse{} + err := s.MonthlyUsers(req.Context(), &response) + if err != nil { + return util.JSONResponse{Code: http.StatusBadRequest, JSON: &response} + } + return util.JSONResponse{Code: http.StatusOK, JSON: &response} + }), + ) + internalAPIMux.Handle(StatsRegisteredUserByType, + httputil.MakeInternalAPI("statsRegisteredUserByType", func(req *http.Request) util.JSONResponse { + response := api.MapResponse{} + err := s.RegisteredUserByType(req.Context(), &response) + if err != nil { + return util.JSONResponse{Code: http.StatusBadRequest, JSON: &response} + } + return util.JSONResponse{Code: http.StatusOK, JSON: &response} + }), + ) + internalAPIMux.Handle(StatsR30Users, + httputil.MakeInternalAPI("statsR30Users", func(req *http.Request) util.JSONResponse { + response := api.MapResponse{} + err := s.R30Users(req.Context(), &response) + if err != nil { + return util.JSONResponse{Code: http.StatusBadRequest, JSON: &response} + } + return util.JSONResponse{Code: http.StatusOK, JSON: &response} + }), + ) + internalAPIMux.Handle(StatsR30UsersV2, + httputil.MakeInternalAPI("statsR30UsersV2", func(req *http.Request) util.JSONResponse { + response := api.MapResponse{} + err := s.R30Users(req.Context(), &response) + if err != nil { + return util.JSONResponse{Code: http.StatusBadRequest, JSON: &response} + } + return util.JSONResponse{Code: http.StatusOK, JSON: &response} + }), + ) }