influxdb/http
Mark Rushakoff d73d73c0d4 chore: rename imports from platform to influxdb
I did this with a dumb editor macro, so some comments changed too.

Also rename root package from platform to influxdb.

In interest of minimizing risk, anyone importing the root package has
now aliased it to "platform" so that no changes beyond imports were
necessary in those files.

Lastly, replace the old platform module to local path /dev/null so that
nobody can accidentally reintroduce a platform dependency while
migrating platform code to influxdb.
2019-01-09 20:51:47 -08: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 chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08: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 chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
auth_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08: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 feat(ui/labels): Add the ability to edit labels on a dashboard 2019-01-09 17:41:19 -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 chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
scraper_service_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08: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 Merge pull request #2112 from zhulongcheng/doc-rm-org 2019-01-09 17:06:53 -05:00
swagger_test.go Update telegraf config schema to match cur swagger 2018-12-12 15:11:18 -08:00
task_service.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08: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 chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
view_test.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08:00
write_handler.go chore: rename imports from platform to influxdb 2019-01-09 20:51:47 -08: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