influxdb/http
Lyon Hill a31b651057
feat(task): Add new permission lookup pattern for executor ()
* feat(task): Add new permission lookup pattern for executor

We can now use the user service to populate task owners permissions.
This should improve the task lookup time and decouple the task system
from the URM system. In the future we will have the ability to better isolate
tenant pieces from the rest of the service.

* feat: add feature flagging
2020-07-13 14:47:58 -06:00
..
influxdb Merge branch 'master' into chore/merge-master 2020-04-06 12:17:47 -05:00
metric refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
mock refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
Makefile fix(http): silence echo command () 2020-06-11 11:04:50 -07:00
README.md chore(http): update error handling example in readme () 2019-05-13 12:50:25 -07:00
api_handler.go feat: switch to use the new tenant bucket service () 2020-06-30 14:48:42 -06:00
api_handler_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
assets.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
auth_service.go chore: update staticcheck and fix newly identified lint checks () 2020-06-26 18:54:09 -05:00
auth_test.go refactor: migrator and introduce Store.(Create|Delete)Bucket () 2020-07-01 12:08:20 +01:00
authentication_middleware.go feat(tracing): add userID to lookup traces 2020-04-08 14:19:05 +02:00
authentication_test.go chore: update staticcheck and fix newly identified lint checks () 2020-06-26 18:54:09 -05:00
backup_service.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
bucket_service.go fix: remove operation log system () 2020-06-11 16:04:23 -06:00
bucket_service_test.go fix(swagger): PostBucketRequest.orgID is required 2020-07-02 10:01:15 -06:00
check_service.go Merge branch 'master' into feat/use-algo-w 2020-05-18 13:25:26 -05:00
check_test.go Merge branch 'master' into chore/merge-master 2020-04-06 12:17:47 -05:00
chronograf_handler.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
client.go fix(http): Use shared http.Transport 2020-06-05 09:52:45 -07:00
dashboard_service.go refactor: remove org service from kv dashboard service () 2020-06-16 14:03:42 -07:00
dashboard_test.go refactor: migrator and introduce Store.(Create|Delete)Bucket () 2020-07-01 12:08:20 +01:00
debug.go add spans to multiple services 2019-03-07 12:12:31 -07:00
delete_handler.go refactor!: replace authorizer.Allowed method with PermissionSet () 2020-05-13 12:27:46 +01:00
delete_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
document_service.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
document_service_test.go refactor: migrator and introduce Store.(Create|Delete)Bucket () 2020-07-01 12:08:20 +01:00
document_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
duration.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
duration_test.go feat(http) add microsecond and nanosecond durations 2018-09-25 15:15:06 -05:00
errors.go chore(errors): interpret more cases as influxdb error type in http.CheckError () 2020-04-30 17:55:17 +01:00
errors_test.go chore(errors): interpret more cases as influxdb error type in http.CheckError () 2020-04-30 17:55:17 +01:00
handler.go chore(http): stop tracing system related api paths () 2020-04-30 16:33:23 +01:00
handler_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
health.go feat(api/health): report commit 2020-05-26 14:03:52 +02:00
health_test.go feat(api/health): report commit 2020-05-26 14:03:52 +02:00
helpers.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
label_service.go chore: update staticcheck and fix newly identified lint checks () 2020-06-26 18:54:09 -05:00
label_test.go refactor: migrator and introduce Store.(Create|Delete)Bucket () 2020-07-01 12:08:20 +01:00
middleware.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
middleware_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
no_assets.go feat(http): host swagger docs at /docs and /api/v2/swagger.json 2019-01-22 11:16:27 -06:00
notification_endpoint.go feat(http): Add ability to proxy specific API handlers for Algo-W rollout. 2020-05-06 12:30:05 -04:00
notification_endpoint_test.go refactor: migrator and introduce Store.(Create|Delete)Bucket () 2020-07-01 12:08:20 +01:00
notification_rule.go chore(http): Let the callers convert these to http.Handler. 2020-05-08 09:02:06 -04:00
notification_rule_test.go feat(query): implement window count aggregate pushdown () 2020-05-28 13:42:38 -05:00
onboarding.go feat(tenant): Build out the onboarding system in tenant and integrate it into launcher () 2020-04-06 15:58:15 -06:00
onboarding_test.go refactor: migrator and introduce Store.(Create|Delete)Bucket () 2020-07-01 12:08:20 +01:00
org_service.go fix: remove operation log system () 2020-06-11 16:04:23 -06:00
org_service_test.go refactor: migrator and introduce Store.(Create|Delete)Bucket () 2020-07-01 12:08:20 +01:00
paging_test.go chore: update staticcheck and fix newly identified lint checks () 2020-06-26 18:54:09 -05:00
platform_handler.go feat(kit/feature): add feature flag package () 2020-04-30 11:29:43 -04:00
proxy_handler.go chore(http): Let the callers convert these to http.Handler. 2020-05-08 09:02:06 -04:00
query.go fix: include Now when making a flux query request from a proxy request () 2020-06-18 19:10:44 +03:00
query_handler.go feat: annotate context with feature flags when handling flux queries () 2020-06-17 16:55:29 +03:00
query_handler_test.go chore: update staticcheck and fix newly identified lint checks () 2020-06-26 18:54:09 -05:00
query_test.go fix: include Now when making a flux query request from a proxy request () 2020-06-18 19:10:44 +03:00
ready.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
redoc.go feat(http): host swagger docs at /docs and /api/v2/swagger.json 2019-01-22 11:16:27 -06:00
requests.go refactor(http): Refactor write endpoint to enable 1.x write code reuse. 2020-06-17 13:13:58 -04:00
requests_test.go fix(delete): fix delete handler to add org filter for bucket lookup () 2020-04-23 08:32:50 -06:00
router.go chore(http): fixup the chi base router using API type 2020-06-15 17:16:05 -07:00
router_test.go chore(http): add route path to panic log message 2020-06-09 18:00:11 -07:00
scraper_service.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
scraper_service_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
server.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
service_test.go refactor: migrator and introduce Store.(Create|Delete)Bucket () 2020-07-01 12:08:20 +01:00
session_handler.go feat: integrate the new session system behind a feature flag () 2020-05-18 11:50:22 -06:00
session_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
source_proxy_service.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
source_service.go Merge branch 'master' into chore/merge-master 2020-04-06 12:17:47 -05:00
source_service_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
swagger.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
swagger.yml feat(pkger): extend stacks API with uninstall ability 2020-07-09 17:05:53 -07:00
swagger_assets.go chore: serve swagger.json in development builds 2019-03-09 12:42:44 -08:00
swagger_noassets.go chore: Remove several instances of WithLogger () 2019-12-04 15:10:23 -08:00
swagger_test.go feat(influxdb): Add labels create endpoints 2019-10-23 09:53:50 -07:00
task_service.go chore(http): Let the callers convert these to http.Handler. 2020-05-08 09:02:06 -04:00
task_service_test.go feat(query): implement window count aggregate pushdown () 2020-05-28 13:42:38 -05:00
telegraf.go chore: update staticcheck and fix newly identified lint checks () 2020-06-26 18:54:09 -05:00
telegraf_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
tokens.go Ensure error strings not capitalised ST1005 2018-11-30 10:54:24 +00:00
tokens_test.go chore(bolt,http,mock,query,testing): fix megacheck errors 2018-11-01 12:54:46 -07:00
ua.go refactor(http): normalize user-agent names 2019-12-04 15:02:00 -06:00
ua_test.go refactor(http): normalize user-agent names 2019-12-04 15:02:00 -06:00
usage_service.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
user_resource_mapping_service.go fix: improve the http urm client to allow specific path options () 2020-06-25 12:13:05 -06:00
user_resource_mapping_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
user_service.go feat(task): Add new permission lookup pattern for executor () 2020-07-13 14:47:58 -06:00
user_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
variable_service.go refactor: create new token package () 2020-04-30 07:52:21 -07:00
variable_test.go refactor: rewrite imports to include the /v2 suffix for version 2 2020-04-03 12:39:20 -05:00
write_handler.go fix(http): Make sure we are using the proper response writer. 2020-06-17 13:13:59 -04:00
write_handler_test.go refactor(http): Refactor write endpoint to enable 1.x write code reuse. 2020-06-17 13:13:58 -04:00
write_usage_recorder.go refactor(http): Refactor write endpoint to enable 1.x write code reuse. 2020-06-17 13:13:58 -04:00

README.md

HTTP Handler Style Guide

HTTP Handler

  • Each handler should implement http.Handler
    • This can be done by embedding a httprouter.Router (a light weight HTTP router that supports variables in the routing pattern and matches against the request method)
  • Required services should be exported on the struct
// ThingHandler represents an HTTP API handler for things.
type ThingHandler struct {
	// embedded httprouter.Router as a lazy way to implement http.Handler
	*httprouter.Router

	ThingService         platform.ThingService
	AuthorizationService platform.AuthorizationService

	Logger               *zap.Logger
}

HTTP Handler Constructor

  • Routes should be declared in the constructor
// NewThingHandler returns a new instance of ThingHandler.
func NewThingHandler() *ThingHandler {
	h := &ThingHandler{
		Router: httprouter.New(),
		Logger: zap.Nop(),
	}

	h.HandlerFunc("POST", "/api/v2/things", h.handlePostThing)
	h.HandlerFunc("GET", "/api/v2/things", h.handleGetThings)

	return h
}

Route handlers (http.HandlerFuncs)

  • Each route handler should have an associated request struct and decode function
  • The decode function should take a context.Context and an *http.Request and return the associated route request struct
type postThingRequest struct {
	Thing *platform.Thing
}

func decodePostThingRequest(ctx context.Context, r *http.Request) (*postThingRequest, error) {
	t := &platform.Thing{}
	if err := json.NewDecoder(r.Body).Decode(t); err != nil {
		return nil, err
	}

	return &postThingRequest{
		Thing: t,
	}, nil
}
  • Route http.HandlerFuncs should separate the decoding and encoding of HTTP requests/response from actual handler logic
// handlePostThing is the HTTP handler for the POST /api/v2/things route.
func (h *ThingHandler) handlePostThing(w http.ResponseWriter, r *http.Request) {
	ctx := r.Context()

	req, err := decodePostThingRequest(ctx, r)
	if err != nil {
		EncodeError(ctx, err, w)
		return
	}

	// Do stuff here
	if err := h.ThingService.CreateThing(ctx, req.Thing); err != nil {
		EncodeError(ctx, err, w)
		return
	}

	if err := encodeResponse(ctx, w, http.StatusCreated, req.Thing); err != nil {
		h.Logger.Info("encoding response failed", zap.Error(err))
		return
	}
}
  • http.HandlerFunc's that require particular encoding of http responses should implement an encode response function