Skip to content

Commit

Permalink
refactor backend call for signup/report
Browse files Browse the repository at this point in the history
Move url definition to the single place.

Make the code tells the stroy what is hapening.
Before:
reportEndpoint.Call(confirmUploadEndpoint, &confirmReq, nil)
Now:
backend.Report().Confirm(confirmReq)
  • Loading branch information
ianic committed Nov 25, 2021
1 parent 25bb743 commit a8c5807
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 86 deletions.
101 changes: 101 additions & 0 deletions cli/controller/cli_backend.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package controller

import (
"bytes"
"encoding/json"
"io/ioutil"
"net/http"

"github.com/mantil-io/mantil/backend/dto"
"github.com/mantil-io/mantil/cli/log"
"github.com/mantil-io/mantil/domain/signup"
)

const cliBackendURL = "https://ytg5gfkg5k.execute-api.eu-central-1.amazonaws.com"

var backend cliBackend

type cliBackend struct{}

func (b cliBackend) Signup() cliBackendSignup {
return cliBackendSignup{
endpoint: apiEndpoint{url: cliBackendURL + "/signup"},
}
}

func (b cliBackend) Report() cliBackendReport {
return cliBackendReport{
endpoint: apiEndpoint{url: cliBackendURL + "/report"},
}
}

type cliBackendSignup struct {
endpoint apiEndpoint
}

func (s cliBackendSignup) Activate(req signup.ActivateRequest) (string, error) {
var jwt string
return jwt, s.endpoint.Call("activate", req, &jwt)
}

func (s cliBackendSignup) Register(req signup.RegisterRequest) error {
return s.endpoint.Call("register", req, nil)
}

type cliBackendReport struct {
endpoint apiEndpoint
}

func (r cliBackendReport) URL(req dto.UploadURLRequest) (dto.UploadURLResponse, error) {
var rsp dto.UploadURLResponse
return rsp, r.endpoint.Call("url", req, &rsp)
}

func (r cliBackendReport) Confirm(req dto.ConfirmRequest) error {
return r.endpoint.Call("confirm", req, nil)
}

type apiEndpoint struct {
url string
}

func (a apiEndpoint) Call(method string, req, rsp interface{}) error {
buf, _ := json.Marshal(req)
url := a.url
url = a.url + "/" + method
httpRsp, err := http.Post(url, "application/json", bytes.NewBuffer(buf))
if err != nil {
return log.Wrap(err)
}
if err != nil {
return log.Wrap(err)
}
defer httpRsp.Body.Close()
if httpRsp.StatusCode == http.StatusNoContent {
return nil
}
if httpRsp.StatusCode != http.StatusOK {
if apiErr := httpRsp.Header.Get("X-Api-Error"); apiErr != "" {
return log.Wrapf(apiErr)
}
return log.Wrapf("request failed with status code %d", httpRsp.StatusCode)
}
if rsp != nil {
buf, err := ioutil.ReadAll(httpRsp.Body)
if err != nil {
return log.Wrap(err)
}

switch v := rsp.(type) {
case []byte:
rsp = buf
case *string:
*v = string(buf)
default:
if err := json.Unmarshal(buf, rsp); err != nil {
return log.Wrap(err)
}
}
}
return nil
}
46 changes: 0 additions & 46 deletions cli/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
Expand Down Expand Up @@ -179,48 +178,3 @@ func timerFn() func() int {
return dur
}
}

type apiEndpoint struct {
url string
}

func (a *apiEndpoint) Call(method string, req, rsp interface{}) error {
buf, _ := json.Marshal(req)
url := a.url
url = a.url + "/" + method
httpRsp, err := http.Post(url, "application/json", bytes.NewBuffer(buf))
if err != nil {
return log.Wrap(err)
}
if err != nil {
return log.Wrap(err)
}
defer httpRsp.Body.Close()
if httpRsp.StatusCode == http.StatusNoContent {
return nil
}
if httpRsp.StatusCode != http.StatusOK {
if apiErr := httpRsp.Header.Get("X-Api-Error"); apiErr != "" {
return log.Wrapf(apiErr)
}
return log.Wrapf("request failed with status code %d", httpRsp.StatusCode)
}
if rsp != nil {
buf, err := ioutil.ReadAll(httpRsp.Body)
if err != nil {
return log.Wrap(err)
}

switch v := rsp.(type) {
case []byte:
rsp = buf
case *string:
*v = string(buf)
default:
if err := json.Unmarshal(buf, rsp); err != nil {
return log.Wrap(err)
}
}
}
return nil
}
42 changes: 9 additions & 33 deletions cli/controller/report.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,36 +12,28 @@ import (
"github.com/manifoldco/promptui"
"github.com/mantil-io/mantil/backend/dto"
"github.com/mantil-io/mantil/cli/log"
"github.com/mantil-io/mantil/cli/secret"
"github.com/mantil-io/mantil/cli/ui"
"github.com/mantil-io/mantil/domain"
"github.com/mantil-io/mantil/domain/signup"
)

var reportEndpoint = apiEndpoint{url: "https://ytg5gfkg5k.execute-api.eu-central-1.amazonaws.com/report"}

const (
uploadURLEndpoint = "url"
confirmUploadEndpoint = "confirm"
)

func Report(days int) error {
msg, err := reportMessage()
if err != nil {
ui.Info("Submitting report aborted.")
return nil
if err == promptui.ErrInterrupt {
return nil
}
return log.Wrap(err)
}
fs, err := newStore()
if err != nil {
return err
return log.Wrap(err)
}
workspaceID := fs.Workspace().ID
uploadReq := dto.UploadURLRequest{
WorkspaceID: workspaceID,
Message: msg,
}
var uploadRsp dto.UploadURLResponse
if err := reportEndpoint.Call(uploadURLEndpoint, &uploadReq, &uploadRsp); err != nil {
uploadRsp, err := backend.Report().URL(uploadReq)
if err != nil {
return log.Wrap(err)
}
if err := uploadLogs(days, uploadRsp.URL); err != nil {
Expand All @@ -50,7 +42,7 @@ func Report(days int) error {
confirmReq := dto.ConfirmRequest{
ReportID: uploadRsp.ReportID,
}
if err := reportEndpoint.Call(confirmUploadEndpoint, &confirmReq, nil); err != nil {
if err := backend.Report().Confirm(confirmReq); err != nil {
return log.Wrap(err)
}
ui.Info("Bug report was successfully made! We will get in touch as soon as we can on the email address you used during registration.")
Expand All @@ -61,23 +53,7 @@ func reportMessage() (string, error) {
prompt := promptui.Prompt{
Label: "Please include an explanation with your bug report",
}
res, err := prompt.Run()
if err != nil {
return "", err
}
return res, nil
}

func userID() (string, error) {
token, err := domain.ReadActivationToken()
if err != nil {
return "", log.Wrap(err)
}
claims, err := signup.Decode(token, secret.SignupPublicKey)
if err != nil {
return "", log.Wrap(err)
}
return claims.WorkspaceID, nil
return prompt.Run()
}

func uploadLogs(days int, url string) error {
Expand Down
12 changes: 5 additions & 7 deletions cli/controller/signup.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ import (
"github.com/mantil-io/mantil/domain/signup"
)

var signupEndpoint = apiEndpoint{url: "https://ytg5gfkg5k.execute-api.eu-central-1.amazonaws.com/signup"}

func Register() error {
rr, err := survey()
if err != nil {
Expand All @@ -22,7 +20,7 @@ func Register() error {
}
return log.Wrap(err)
}
if err := signupEndpoint.Call("register", rr, nil); err != nil {
if err := backend.Signup().Register(rr); err != nil {
log.Wrap(err)
}
ui.Info("Activation token is sent to %s. Please check your email to finalize registration.", rr.Email)
Expand All @@ -34,8 +32,8 @@ func Activate(activationCode string) error {
if err != nil {
return err
}
var jwt string
if err := signupEndpoint.Call("activate", signup.NewActivateRequest(activationCode, fs.Workspace().ID), &jwt); err != nil {
jwt, err := backend.Signup().Activate(signup.NewActivateRequest(activationCode, fs.Workspace().ID))
if err != nil {
return log.Wrap(err)
}
claims, err := signup.Validate(jwt, secret.SignupPublicKey)
Expand All @@ -53,12 +51,12 @@ func Activate(activationCode string) error {
func IsActivated() bool {
jwt, err := domain.ReadActivationToken()
if err != nil {
log.Error(err)
log.Printf("activation token not found")
return false
}
claims, err := signup.Validate(jwt, secret.SignupPublicKey)
if err != nil {
log.Error(err)
log.Errorf("failed to validate activation token %s", err)
return false
}
log.SetClaims(claims)
Expand Down

0 comments on commit a8c5807

Please sign in to comment.