influxdb/http
Michael Desa a3541b22d4 feat(http): allow user id to be specified explicitly on authorization
test(http): get user off of session in create authz test

fix(http): allow user id to be specified explicitly on authorization

create authorization now allows specifying user id explicitly. If no
user id is specified then we use the user id from the authorizer.

fix(http): use influxdb import

fix(http): use platform error in http auth tests

feat(cmd/influx): allow create auth command to specify user explicitly

feat(http): add org id to permissions
2019-01-14 10:20:20 -05:00
..
influxdb chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
Makefile Make client generation optional via ENV variable 2019-01-03 11:33:23 -08:00
README.md Convert everything to /api/v2 2018-09-28 14:23:21 +02:00
api_handler.go feat(http): add bucket and org name in response 2019-01-11 13:09:19 -05:00
api_handler_test.go chore(http): make test diffs more readable (#2203) 2019-01-03 14:29:22 -08:00
assets.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
auth_service.go feat(http): allow user id to be specified explicitly on authorization 2019-01-14 10:20:20 -05:00
auth_test.go feat(http): allow user id to be specified explicitly on authorization 2019-01-14 10:20:20 -05:00
authentication_middleware.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
authentication_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
bucket_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
bucket_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
chronograf_handler.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
client.go feat(http): add MacroService client 2018-09-20 09:32:04 -07:00
cur_swagger.yml trailing slashes and code review 2019-01-10 10:05:58 -08:00
dashboard_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
dashboard_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
duration.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
duration_test.go feat(http) add microsecond and nanosecond durations 2018-09-25 15:15:06 -05:00
errors.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
errors_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
handler.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
health.go fix(http): health endpoint now returns pass 2018-12-20 21:53:54 -06:00
health_test.go chore(http): make test diffs more readable (#2203) 2019-01-03 14:29:22 -08:00
label_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
macro_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
macro_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
onboarding.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
onboarding_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
org_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
org_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
paging.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
paging_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
platform_handler.go fix(http): Fix developer mode default 2018-12-21 16:33:04 -05:00
proto.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
proto_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
proxy_query_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
query.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
query_handler.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
query_handler_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
query_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
query_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
ready.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
requests.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
requests_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
router.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
router_test.go chore(http): make test diffs more readable (#2203) 2019-01-03 14:29:22 -08:00
scraper_service.go feat(http): add bucket and org name in response 2019-01-11 13:09:19 -05:00
scraper_service_test.go feat(http): add bucket and org name in response 2019-01-11 13:09:19 -05:00
server.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
session_handler.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
session_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
source_proxy_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
source_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
source_service_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
status.go feat: Add optional http logging to handler 2018-07-30 16:16:37 -06:00
swagger.yml feat(http): add scraper target swagger 2019-01-11 11:03:42 -05:00
swagger_test.go Update telegraf config schema to match cur swagger 2018-12-12 15:11:18 -08:00
task_service.go feat(tasks): update task options from api 2019-01-11 11:55:46 -06:00
task_service_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
task_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
telegraf.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
telegraf_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08: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
usage_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
user_resource_mapping_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
user_resource_mapping_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
user_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
user_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
view_service.go fix(http): add labels to view links responses 2019-01-10 11:41:17 -08:00
view_test.go fix(http): add labels to view links responses 2019-01-10 11:41:17 -08:00
write_handler.go fix(influxdb): add org id to permissions 2019-01-11 12:23:28 -05:00
write_handler_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08: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 {
		errors.EncodeHTTP(ctx, err, w)
		return
	}

	// Do stuff here
	if err := h.ThingService.CreateThing(ctx, req.Thing); err != nil {
		errors.EncodeHTTP(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