add json response for invite facade (fixes #188)
This commit is contained in:
parent
c991e0831f
commit
fc5d3e440e
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue