Skip to content

Commit

Permalink
checkpoint
Browse files Browse the repository at this point in the history
Signed-off-by: Jeff Ortel <[email protected]>
  • Loading branch information
jortel committed Aug 9, 2024
1 parent cd29930 commit be6e567
Show file tree
Hide file tree
Showing 7 changed files with 110 additions and 94 deletions.
3 changes: 3 additions & 0 deletions api/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ func (h FileHandler) Create(ctx *gin.Context) {
}
m := &model.File{}
m.Name = ctx.Param(ID)
m.Encoding = input.Header.Get(ContentType)
m.CreateUser = h.BaseHandler.CurrentUser(ctx)
result := h.DB(ctx).Create(&m)
if result.Error != nil {
Expand Down Expand Up @@ -245,6 +246,7 @@ type File struct {
Resource `yaml:",inline"`
Name string `json:"name"`
Path string `json:"path"`
Encoding string `yaml:"encoding"`
Expiration *time.Time `json:"expiration,omitempty"`
}

Expand All @@ -253,5 +255,6 @@ func (r *File) With(m *model.File) {
r.Resource.With(&m.Model)
r.Name = m.Name
r.Path = m.Path
r.Encoding = m.Encoding
r.Expiration = m.Expiration
}
6 changes: 3 additions & 3 deletions binding/application.go
Original file line number Diff line number Diff line change
Expand Up @@ -333,15 +333,15 @@ func (h *Analysis) Create(commit, encoding, issues, deps string) (err error) {
}
r := api.AnalysisManifest{Commit: commit}
file := File{client: h.client}
f, err := file.Post(issues)
f, err := file.PostEncoded(issues, encoding)
if err != nil {
return
}
r.Issues = api.Ref{ID: f.ID}
defer func() {
_ = file.Delete(f.ID)
}()
f, err = file.Post(deps)
f, err = file.PostEncoded(deps, encoding)
if err != nil {
return
}
Expand All @@ -350,7 +350,7 @@ func (h *Analysis) Create(commit, encoding, issues, deps string) (err error) {
_ = file.Delete(f.ID)
}()
path := Path(api.AppAnalysesRoot).Inject(Params{api.ID: h.appId})
err = h.client.Encoding(encoding).Post(path, r)
err = h.client.Post(path, r)
if err != nil {
return
}
Expand Down
173 changes: 86 additions & 87 deletions binding/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import (
"github.com/konveyor/tackle2-hub/api"
qf "github.com/konveyor/tackle2-hub/binding/filter"
"github.com/konveyor/tackle2-hub/tar"
"gopkg.in/yaml.v2"
)

const (
Expand Down Expand Up @@ -72,17 +71,14 @@ func (s Path) Inject(p Params) (out string) {
// NewClient Constructs a new client
func NewClient(baseURL string) (client *Client) {
client = &Client{
encoding: binding.MIMEJSON,
BaseURL: baseURL,
BaseURL: baseURL,
}
client.Retry = RetryLimit
return
}

// Client provides a REST client.
type Client struct {
// encoding
encoding string
// transport
transport http.RoundTripper
// baseURL for the nub.
Expand All @@ -100,17 +96,6 @@ func (r *Client) Reset() {
r.Error = nil
}

// Encoding returns a client with the specified encoding.
func (r *Client) Encoding(encoding string) (r2 *Client) {
r2 = &Client{
encoding: encoding,
transport: r.transport,
BaseURL: r.BaseURL,
Login: r.Login,
}
return
}

// Get a resource.
func (r *Client) Get(path string, object any, params ...Param) (err error) {
request := func() (request *http.Request, err error) {
Expand All @@ -119,6 +104,7 @@ func (r *Client) Get(path string, object any, params ...Param) (err error) {
Method: http.MethodGet,
URL: r.join(path),
}
request.Header.Set(api.Accept, binding.MIMEJSON)
if len(params) > 0 {
q := request.URL.Query()
for _, p := range params {
Expand All @@ -138,7 +124,17 @@ func (r *Client) Get(path string, object any, params ...Param) (err error) {
status := response.StatusCode
switch status {
case http.StatusOK:
err = r.decode(object, response)
var body []byte
body, err = io.ReadAll(response.Body)
if err != nil {
err = liberr.Wrap(err)
return
}
err = json.Unmarshal(body, object)
if err != nil {
err = liberr.Wrap(err)
return
}
default:
err = r.restError(response)
}
Expand All @@ -149,16 +145,19 @@ func (r *Client) Get(path string, object any, params ...Param) (err error) {
// Post a resource.
func (r *Client) Post(path string, object any) (err error) {
request := func() (request *http.Request, err error) {
body, err := r.encode(object)
bfr, err := json.Marshal(object)
if err != nil {
err = liberr.Wrap(err)
return
}
reader := bytes.NewReader(bfr)
request = &http.Request{
Header: http.Header{},
Method: http.MethodPost,
Body: io.NopCloser(body),
Body: io.NopCloser(reader),
URL: r.join(path),
}
request.Header.Set(api.Accept, binding.MIMEJSON)
return
}
response, err := r.send(request)
Expand All @@ -171,7 +170,17 @@ func (r *Client) Post(path string, object any) (err error) {
case http.StatusNoContent:
case http.StatusOK,
http.StatusCreated:
err = r.decode(object, response)
var body []byte
body, err = io.ReadAll(response.Body)
if err != nil {
err = liberr.Wrap(err)
return
}
err = json.Unmarshal(body, object)
if err != nil {
err = liberr.Wrap(err)
return
}
default:
err = r.restError(response)
}
Expand All @@ -181,16 +190,19 @@ func (r *Client) Post(path string, object any) (err error) {
// Put a resource.
func (r *Client) Put(path string, object any, params ...Param) (err error) {
request := func() (request *http.Request, err error) {
body, err := r.encode(object)
bfr, err := json.Marshal(object)
if err != nil {
err = liberr.Wrap(err)
return
}
reader := bytes.NewReader(bfr)
request = &http.Request{
Header: http.Header{},
Method: http.MethodPut,
Body: io.NopCloser(body),
Body: io.NopCloser(reader),
URL: r.join(path),
}
request.Header.Set(api.Accept, binding.MIMEJSON)
if len(params) > 0 {
q := request.URL.Query()
for _, p := range params {
Expand All @@ -210,7 +222,17 @@ func (r *Client) Put(path string, object any, params ...Param) (err error) {
case http.StatusNoContent:
case http.StatusOK,
http.StatusCreated:
err = r.decode(object, response)
var body []byte
body, err = io.ReadAll(response.Body)
if err != nil {
err = liberr.Wrap(err)
return
}
err = json.Unmarshal(body, object)
if err != nil {
err = liberr.Wrap(err)
return
}
default:
err = r.restError(response)
}
Expand All @@ -221,16 +243,19 @@ func (r *Client) Put(path string, object any, params ...Param) (err error) {
// Patch a resource.
func (r *Client) Patch(path string, object any, params ...Param) (err error) {
request := func() (request *http.Request, err error) {
body, err := r.encode(object)
bfr, err := json.Marshal(object)
if err != nil {
err = liberr.Wrap(err)
return
}
reader := bytes.NewReader(bfr)
request = &http.Request{
Header: http.Header{},
Method: http.MethodPatch,
Body: io.NopCloser(body),
Body: io.NopCloser(reader),
URL: r.join(path),
}
request.Header.Set(api.Accept, binding.MIMEJSON)
if len(params) > 0 {
q := request.URL.Query()
for _, p := range params {
Expand All @@ -250,7 +275,17 @@ func (r *Client) Patch(path string, object any, params ...Param) (err error) {
case http.StatusNoContent:
case http.StatusOK,
http.StatusCreated:
err = r.decode(object, response)
var body []byte
body, err = io.ReadAll(response.Body)
if err != nil {
err = liberr.Wrap(err)
return
}
err = json.Unmarshal(body, object)
if err != nil {
err = liberr.Wrap(err)
return
}
default:
err = r.restError(response)
}
Expand All @@ -266,6 +301,7 @@ func (r *Client) Delete(path string, params ...Param) (err error) {
Method: http.MethodDelete,
URL: r.join(path),
}
request.Header.Set(api.Accept, binding.MIMEJSON)
if len(params) > 0 {
q := request.URL.Query()
for _, p := range params {
Expand Down Expand Up @@ -421,11 +457,19 @@ func (r *Client) FileGet(path, destination string) (err error) {
// FilePost uploads a file.
// Returns the created File resource.
func (r *Client) FilePost(path, source string, object any) (err error) {
err = r.FilePostEncoded(path, source, object, "")
return
}

// FilePostEncoded uploads a file.
// Returns the created File resource.
func (r *Client) FilePostEncoded(path, source string, object any, encoding string) (err error) {
if source == "" {
fields := []Field{
{
Name: api.FileField,
Reader: bytes.NewReader([]byte{}),
Name: api.FileField,
Reader: bytes.NewReader([]byte{}),
Encoding: encoding,
},
}
err = r.FileSend(path, http.MethodPost, fields, object)
Expand All @@ -442,8 +486,9 @@ func (r *Client) FilePost(path, source string, object any) (err error) {
}
fields := []Field{
{
Name: api.FileField,
Path: source,
Name: api.FileField,
Path: source,
Encoding: encoding,
},
}
err = r.FileSend(path, http.MethodPost, fields, object)
Expand All @@ -453,11 +498,19 @@ func (r *Client) FilePost(path, source string, object any) (err error) {
// FilePut uploads a file.
// Returns the created File resource.
func (r *Client) FilePut(path, source string, object any) (err error) {
err = r.FilePutEncoded(path, source, object, "")
return
}

// FilePutEncoded uploads a file.
// Returns the created File resource.
func (r *Client) FilePutEncoded(path, source string, object any, encoding string) (err error) {
if source == "" {
fields := []Field{
{
Name: api.FileField,
Reader: bytes.NewReader([]byte{}),
Name: api.FileField,
Reader: bytes.NewReader([]byte{}),
Encoding: encoding,
},
}
err = r.FileSend(path, http.MethodPut, fields, object)
Expand Down Expand Up @@ -506,6 +559,7 @@ func (r *Client) FileSend(path, method string, fields []Field, object any) (err
URL: r.join(path),
}
mp := multipart.NewWriter(pw)
request.Header.Set(api.Accept, binding.MIMEJSON)
request.Header.Add(api.ContentType, mp.FormDataContentType())
go func() {
var err error
Expand Down Expand Up @@ -648,24 +702,6 @@ func (r *Client) send(rb func() (*http.Request, error)) (response *http.Response
if err != nil {
return
}
switch r.encoding {
case "":
fallthrough
case binding.MIMEJSON,
binding.MIMEYAML:
h := request.Header
if h.Get(api.ContentType) == "" {
h.Set(api.ContentType, r.encoding)
}
if h.Get(api.Accept) == "" {
h.Set(api.Accept, r.encoding)
}
default:
err = liberr.New(
"Encoding: %s not supported.",
r.Encoding)
return
}
request.Header.Set(api.Authorization, "Bearer "+r.Login.Token)
client := http.Client{Transport: r.transport}
response, err = client.Do(request)
Expand Down Expand Up @@ -758,43 +794,6 @@ func (r *Client) restError(response *http.Response) (err error) {
return
}

// decode body into object.
func (r *Client) decode(object any, response *http.Response) (err error) {
encoding := response.Header.Get(api.ContentType)
encoding = strings.Split(encoding, ";")[0]
encoding = strings.TrimSpace(encoding)
switch encoding {
case "", binding.MIMEJSON:
d := json.NewDecoder(response.Body)
err = d.Decode(object)
err = liberr.Wrap(err)
case binding.MIMEYAML:
d := yaml.NewDecoder(response.Body)
err = d.Decode(object)
err = liberr.Wrap(err)
default:
err = liberr.New("Encoding: %s not supported.", encoding)
}
return
}

// bind response.
func (r *Client) encode(object any) (reader io.Reader, err error) {
var b []byte
switch r.encoding {
case "", binding.MIMEJSON:
b, err = json.Marshal(object)
case binding.MIMEYAML:
b, err = yaml.Marshal(object)
default:
err = liberr.New("Encoding: %s not supported.", r.Encoding)
}
if err == nil {
reader = bytes.NewReader(b)
}
return
}

// Field file upload form field.
type Field struct {
Name string
Expand Down
Loading

0 comments on commit be6e567

Please sign in to comment.