add json response for invite facade (fixes #188)

This commit is contained in:
User Cryptix 2021-04-22 17:21:23 +00:00 committed by Henry
parent c991e0831f
commit fc5d3e440e
4 changed files with 78 additions and 9 deletions

View File

@ -33,6 +33,8 @@ func (eh *ErrorHandler) SetRenderer(r *render.Renderer) {
}
func (eh *ErrorHandler) Handle(rw http.ResponseWriter, req *http.Request, code int, err error) {
log := logging.FromContext(req.Context())
level.Error(log).Log("event", "handling error","path", req.URL.Path, "err",err)
var redirectErr ErrRedirect
if errors.As(err, &redirectErr) {
if redirectErr.Reason != nil {

View File

@ -367,7 +367,7 @@ func New(
invites: dbs.Invites,
deniedKeys: dbs.DeniedKeys,
}
m.Get(router.CompleteInviteFacade).Handler(r.HTML("invite/facade.tmpl", ih.presentFacade))
m.Get(router.CompleteInviteFacade).HandlerFunc(ih.presentFacade)
m.Get(router.CompleteInviteFacadeFallback).Handler(r.HTML("invite/facade-fallback.tmpl", ih.presentFacadeFallback))
m.Get(router.CompleteInviteInsertID).Handler(r.HTML("invite/insert-id.tmpl", ih.presentInsert))
m.Get(router.CompleteInviteConsume).HandlerFunc(ih.consume)

View File

@ -52,7 +52,53 @@ func (h inviteHandler) buildJoinRoomURI(token string) template.URL {
return template.URL(joinRoomURI.String())
}
func (h inviteHandler) presentFacade(rw http.ResponseWriter, req *http.Request) (interface{}, error) {
// switch between JSON and HTML responses
func (h inviteHandler) presentFacade(rw http.ResponseWriter, req *http.Request) {
enc := req.URL.Query().Get("encoding")
if enc == "json" {
h.presentFacadeAsJSON(rw, req)
return
}
h.render.HTML("invite/facade.tmpl", h.presentFacadeAsHTML)(rw, req)
}
func (h inviteHandler) presentFacadeAsJSON(rw http.ResponseWriter, req *http.Request) {
logger := logging.FromContext(req.Context())
rw.Header().Set("Content-Type", "application/json")
rw.WriteHeader(http.StatusOK)
enc := json.NewEncoder(rw)
// make sure token is still valid
token := req.URL.Query().Get("token")
_, err := h.invites.GetByToken(req.Context(), token)
if err != nil {
// send a json error back
data := struct {
Status string `json:"status"`
Error string `json:"error"`
}{"failed", err.Error()}
if err := enc.Encode(data); err != nil {
level.Warn(logger).Log("event", "sending json error failed", "err", err)
}
return
}
// send them on to the next step
postTo := h.urlTo(router.CompleteInviteConsume)
data := struct {
Status string `json:"status"`
Invite string `json:"invite"`
PostTo string `json:"postTo"`
}{"success", token, postTo.String()}
if err := enc.Encode(data); err != nil {
level.Warn(logger).Log("event", "sending json response failed", "err", err)
}
}
func (h inviteHandler) presentFacadeAsHTML(rw http.ResponseWriter, req *http.Request) (interface{}, error) {
token := req.URL.Query().Get("token")
_, err := h.invites.GetByToken(req.Context(), token)

View File

@ -181,25 +181,46 @@ func TestInviteConsumeInviteJSON(t *testing.T) {
testInvite := roomdb.Invite{ID: 4321}
ts.InvitesDB.GetByTokenReturns(testInvite, nil)
// check if the token is still valid
checkInviteURL := ts.URLTo(router.CompleteInviteFacade)
qvals := url.Values{
"token": []string{testToken},
"encoding": []string{"json"},
}
checkInviteURL.RawQuery = qvals.Encode()
// send the request and check the json
resp := ts.Client.GetBody(checkInviteURL)
result := resp.Result()
a.Equal(http.StatusOK, result.StatusCode)
var reply struct {
Invite string
PostTo string
}
err := json.NewDecoder(result.Body).Decode(&reply)
r.NoError(err)
// construct the consume endpoint url
consumeInviteURL := ts.URLTo(router.CompleteInviteConsume)
a.Equal(consumeInviteURL.String(), reply.PostTo, "wrong postTo in JSON body")
a.Equal(testToken, reply.Invite, "wrong invite token")
// create the consume request
testNewMember := refs.FeedRef{
ID: bytes.Repeat([]byte{1}, 32),
Algo: refs.RefAlgoFeedSSB1,
}
var consume inviteConsumePayload
consume.Invite = testToken
consume.ID = testNewMember
// construct the consume endpoint url
consumeInviteURL := ts.URLTo(router.CompleteInviteConsume)
r.NotNil(consumeInviteURL)
// prepare the mock
ts.InvitesDB.ConsumeReturns(testInvite, nil)
// send the POST
resp := ts.Client.SendJSON(consumeInviteURL, consume)
resp = ts.Client.SendJSON(consumeInviteURL, consume)
a.Equal(http.StatusOK, resp.Code, "wrong HTTP status code for sign in")
// check how consume was called
@ -209,7 +230,7 @@ func TestInviteConsumeInviteJSON(t *testing.T) {
a.True(newMemberRef.Equal(&testNewMember))
var jsonConsumeResp inviteConsumeJSONResponse
err := json.NewDecoder(resp.Body).Decode(&jsonConsumeResp)
err = json.NewDecoder(resp.Body).Decode(&jsonConsumeResp)
r.NoError(err)
a.Equal("successful", jsonConsumeResp.Status)