Change directory

Signed-off-by: 0x6f736f646f <blackd0t@protonmail.com>
This commit is contained in:
0x6f736f646f
2022-02-18 08:45:26 +03:00
parent 5a5ab39337
commit 12a425ac92
12 changed files with 1125 additions and 36 deletions
+4 -4
View File
@@ -17,7 +17,7 @@ func (sdk mfSDK) GetMe() (UserRes, error) {
if err != nil {
return ur, err
}
resp, err := sdk.makeRequest(req)
resp, _, err := sdk.makeRequest(req)
if err != nil {
return ur, err
}
@@ -39,7 +39,7 @@ func (sdk mfSDK) GenerateUserAPIKey() (UserAPIKeyRes, error) {
if err != nil {
return akr, err
}
resp, err := sdk.makeRequest(req)
resp, _, err := sdk.makeRequest(req)
if err != nil {
return akr, err
}
@@ -60,7 +60,7 @@ func (sdk mfSDK) GetUserAPIKey() (UserAPIKeyRes, error) {
if err != nil {
return akr, err
}
resp, err := sdk.makeRequest(req)
resp, _, err := sdk.makeRequest(req)
if err != nil {
return akr, err
}
@@ -81,7 +81,7 @@ func (sdk mfSDK) DeleteUserAPIKey() (string, error) {
if err != nil {
return "", err
}
_, err = sdk.makeRequest(req)
_, _, err = sdk.makeRequest(req)
if err != nil {
return "", err
}
+24
View File
@@ -0,0 +1,24 @@
// The Chunks endpoint works together with the Memfault Firmware SDK.
// It provides a streamlined way of getting arbitrary data (coredumps, events, heartbeats, etc.) out of devices and into Memfault.
package memfault
// // GetMe Return information about the logged in User
// func (sdk mfSDK) UploadChunk(chunk string) (string, error) {
// endpoint := "api/v0/chunks/{{device_serial}}"
// url := fmt.Sprintf("%s/%s", sdk.chunksURL, endpoint)
// payload := strings.NewReader(chunk)
// req, err := http.NewRequest(http.MethodPost, url, payload)
// if err != nil {
// return "", err
// }
// req.Header.Add("Memfault-Project-Key", "")
// req.Header.Add("Content-Type", "application/octet-stream")
// resp, err := sdk.makeRequest(req)
// if err != nil {
// return "", err
// }
// return string(resp), err
// }
+18
View File
@@ -0,0 +1,18 @@
{
"data": {
"bypass_primary_software_type_check": false,
"bypass_version_checks": false,
"count_active_deployments": 0,
"count_devices": 0,
"count_staged_devices": 0,
"created_date": "2022-02-17T19:16:21.692461+00:00",
"id": 164814,
"ignore_traces": false,
"last_deployment": null,
"name": "SmartSdinkamakeabc",
"return_equal_latest_releases": false,
"slug": "smartsdinkmskeabc",
"updated_date": "2022-02-17T19:16:21.692478+00:00",
"updates_enabled": true
}
}
+94
View File
@@ -0,0 +1,94 @@
package memfault
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"strings"
)
var (
ccr CreateCohortRes
lcr ListCohortRes
er ErrorRes
)
// CreateCohort creates a Cohort for the given Project
func (sdk mfSDK) CreateCohort(project Project, cohort Cohort) (CreateCohortRes, error) {
var (
ccr CreateCohortRes
er ErrorRes
)
slug, err := sdk.getProjectSlugByName(project.Name)
if err != nil {
return ccr, err
}
organizationslug, err := sdk.getOrganizationSlug(false)
if err != nil {
return ccr, err
}
data, err := json.Marshal(cohort)
if err != nil {
return ccr, err
}
payload := strings.NewReader(string(data))
endpoint := "api/v0/organizations/" + string(organizationslug) + "/projects/" + string(slug) + "/cohorts"
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
req, err := http.NewRequest(http.MethodPost, url, payload)
if err != nil {
return ccr, err
}
resp, statusCode, err := sdk.makeRequest(req)
if err != nil {
return ccr, err
}
if statusCode != 200 {
if err := json.Unmarshal(resp, &er); err != nil {
return ccr, err
}
return ccr, errors.New(string(er.Error.Message))
}
if err := json.Unmarshal(resp, &ccr); err != nil {
return ccr, err
}
return ccr, nil
}
// ListCohorts List all Cohorts for the given Project
func (sdk mfSDK) ListCohorts(project Project) (ListCohortRes, error) {
slug, err := sdk.getProjectSlugByName(project.Name)
if err != nil {
return lcr, err
}
organizationslug, err := sdk.getOrganizationSlug(false)
if err != nil {
return lcr, err
}
endpoint := "api/v0/organizations/" + string(organizationslug) + "/projects/" + string(slug) + "/cohorts"
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return lcr, err
}
resp, statusCode, err := sdk.makeRequest(req)
if err != nil {
return lcr, err
}
if statusCode != 200 {
if err := json.Unmarshal(resp, &er); err != nil {
return lcr, err
}
return lcr, errors.New(string(er.Error.Message))
}
if err := json.Unmarshal(resp, &lcr); err != nil {
return lcr, err
}
return lcr, nil
}
+637
View File
@@ -0,0 +1,637 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>memfault: Go Coverage Report</title>
<style>
body {
background: black;
color: rgb(80, 80, 80);
}
body, pre, #legend span {
font-family: Menlo, monospace;
font-weight: bold;
}
#topbar {
background: black;
position: fixed;
top: 0; left: 0; right: 0;
height: 42px;
border-bottom: 1px solid rgb(80, 80, 80);
}
#content {
margin-top: 50px;
}
#nav, #legend {
float: left;
margin-left: 10px;
}
#legend {
margin-top: 12px;
}
#nav {
margin-top: 10px;
}
#legend span {
margin: 0 5px;
}
.cov0 { color: rgb(192, 0, 0) }
.cov1 { color: rgb(128, 128, 128) }
.cov2 { color: rgb(116, 140, 131) }
.cov3 { color: rgb(104, 152, 134) }
.cov4 { color: rgb(92, 164, 137) }
.cov5 { color: rgb(80, 176, 140) }
.cov6 { color: rgb(68, 188, 143) }
.cov7 { color: rgb(56, 200, 146) }
.cov8 { color: rgb(44, 212, 149) }
.cov9 { color: rgb(32, 224, 152) }
.cov10 { color: rgb(20, 236, 155) }
</style>
</head>
<body>
<div id="topbar">
<div id="nav">
<select id="files">
<option value="file0">github.com/0x6f736f646f/memfault-go/pkg/memfault/auth.go (0.0%)</option>
<option value="file1">github.com/0x6f736f646f/memfault-go/pkg/memfault/memfault.go (52.4%)</option>
<option value="file2">github.com/0x6f736f646f/memfault-go/pkg/memfault/projects.go (24.8%)</option>
</select>
</div>
<div id="legend">
<span>not tracked</span>
<span class="cov0">no coverage</span>
<span class="cov1">low coverage</span>
<span class="cov2">*</span>
<span class="cov3">*</span>
<span class="cov4">*</span>
<span class="cov5">*</span>
<span class="cov6">*</span>
<span class="cov7">*</span>
<span class="cov8">*</span>
<span class="cov9">*</span>
<span class="cov10">high coverage</span>
</div>
</div>
<div id="content">
<pre class="file" id="file0" style="display: none">package memfault
import (
"encoding/json"
"fmt"
"net/http"
"strings"
)
// GetMe Return information about the logged in User
func (sdk mfSDK) GetMe() (UserRes, error) <span class="cov0" title="0">{
var ur UserRes
endpoint := "auth/me"
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil </span><span class="cov0" title="0">{
return ur, err
}</span>
<span class="cov0" title="0">resp, err := sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return ur, err
}</span>
<span class="cov0" title="0">if err := json.Unmarshal(resp, &amp;ur); err != nil </span><span class="cov0" title="0">{
return ur, err
}</span>
<span class="cov0" title="0">return ur, err</span>
}
// GenerateUserAPIKey generates (or re-generate) an API Key for logged in User.
// To generate this without logging into Memfault, you may use HTTP Basic Auth to call this API.
func (sdk mfSDK) GenerateUserAPIKey() (UserAPIKeyRes, error) <span class="cov0" title="0">{
var akr UserAPIKeyRes
endpoint := "auth/api_key"
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
payload := strings.NewReader(``)
req, err := http.NewRequest(http.MethodPost, url, payload)
if err != nil </span><span class="cov0" title="0">{
return akr, err
}</span>
<span class="cov0" title="0">resp, err := sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return akr, err
}</span>
<span class="cov0" title="0">if err := json.Unmarshal(resp, &amp;akr); err != nil </span><span class="cov0" title="0">{
return akr, err
}</span>
<span class="cov0" title="0">return akr, nil</span>
}
// GetUserAPIKey Get a previously generated API Key for the logged in User
func (sdk mfSDK) GetUserAPIKey() (UserAPIKeyRes, error) <span class="cov0" title="0">{
var akr UserAPIKeyRes
endpoint := "auth/api_key"
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil </span><span class="cov0" title="0">{
return akr, err
}</span>
<span class="cov0" title="0">resp, err := sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return akr, err
}</span>
<span class="cov0" title="0">if err := json.Unmarshal(resp, &amp;akr); err != nil </span><span class="cov0" title="0">{
return akr, err
}</span>
<span class="cov0" title="0">return akr, nil</span>
}
// DeleteUserAPIKey Invalidate the previously generated API Key for the logged in User and do not create another one
func (sdk mfSDK) DeleteUserAPIKey() (string, error) <span class="cov0" title="0">{
endpoint := "auth/api_key"
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
payload := strings.NewReader(``)
req, err := http.NewRequest(http.MethodDelete, url, payload)
if err != nil </span><span class="cov0" title="0">{
return "", err
}</span>
<span class="cov0" title="0">_, err = sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return "", err
}</span>
<span class="cov0" title="0">return "DELETED", nil</span>
}
</pre>
<pre class="file" id="file1" style="display: none">// Copyright (c) Mainflux
// SPDX-License-Identifier: Apache-2.0
package memfault
import (
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"time"
)
// ContentType represents all possible content types.
type ContentType string
var _ SDK = (*mfSDK)(nil)
// SDK contains Mainflux API.
type SDK interface {
// GetMe Return information about the logged in User
GetMe() (UserRes, error)
// Generate a user api key
GenerateUserAPIKey() (UserAPIKeyRes, error)
// Get a previously generated API Key for the logged in User
GetUserAPIKey() (UserAPIKeyRes, error)
// Invalidate the previously generated API Key for the logged in User and do not create another one
DeleteUserAPIKey() (string, error)
// Creates a Project under the given Organization
CreateProject(project Project) (CreateProjectRes, error)
// List the Projects under a given Organization
ListProject() (ListProjectRes, error)
// Retrieves a Project under a given Organization
RetrieveProject(projectSlug string) (CreateProjectRes, error)
// Update a Project under a given Organization
UpdateProject(project Project) (CreateProjectRes, error)
// Delete a Project under a given Organization
DeleteProject(project Project) (string, error)
// Return the Project Client Key
GetProjectClientKey(projectSlug string) (UserAPIKeyRes, error)
// Regenerate the Project Client Key
RefreshProjectClientKey(projectSlug string) (UserAPIKeyRes, error)
}
// Credentials contains the credentials
type Credentials struct {
Email string `json:"email"`
Password string `json:"password"`
APIKey string `json:"api_key"`
OrganisationToken string `json:"organisation_token"`
ProjectKey string `json:"project_key"`
}
type mfSDK struct {
apiURL string
chunksURL string
ingressURL string
filesURL string
credentials Credentials
msgContentType ContentType
client *http.Client
}
// Config contains sdk configuration parameters.
type Config struct {
APIURL string
ChunksURL string
IngressURL string
FilesURL string
Credentials Credentials
MaxIdleConns int
IdleConnTimeout time.Duration
}
// Project struct
type Project struct {
Name string `json:"name"`
Slug string `json:"slug"`
Os string `json:"os"`
Platform string `json:"platform"`
}
// NewSDK returns new mainflux SDK instance.
func NewSDK(conf Config) SDK <span class="cov1" title="1">{
return &amp;mfSDK{
apiURL: conf.APIURL,
chunksURL: conf.ChunksURL,
ingressURL: conf.IngressURL,
filesURL: conf.FilesURL,
credentials: conf.Credentials,
client: &amp;http.Client{
Transport: &amp;http.Transport{
MaxIdleConns: conf.MaxIdleConns,
IdleConnTimeout: conf.IdleConnTimeout,
},
},
}
}</span>
func (sdk mfSDK) makeRequest(req *http.Request) ([]byte, error) <span class="cov10" title="4">{
token, err := sdk.authenticate()
if err != nil </span><span class="cov0" title="0">{
return nil, err
}</span>
<span class="cov10" title="4">resp, err := sdk.sendRequest(req, token)
if err != nil </span><span class="cov0" title="0">{
return nil, err
}</span>
<span class="cov10" title="4">body, err := ioutil.ReadAll(resp.Body)
if err != nil </span><span class="cov0" title="0">{
return nil, err
}</span>
<span class="cov10" title="4">defer resp.Body.Close()
return body, nil</span>
}
func (sdk mfSDK) sendRequest(req *http.Request, token string) (*http.Response, error) <span class="cov10" title="4">{
if token != "" </span><span class="cov10" title="4">{
req.Header.Add("Authorization", "Basic "+token)
}</span>
<span class="cov10" title="4">req.Header.Add("Content-Type", "application/json")
res, err := sdk.client.Do(req)
if err != nil </span><span class="cov0" title="0">{
return res, err
}</span>
<span class="cov10" title="4">return res, nil</span>
}
func (sdk mfSDK) authenticate() (string, error) <span class="cov10" title="4">{
if sdk.credentials.Email != "" &amp;&amp; sdk.credentials.Password != "" </span><span class="cov10" title="4">{
auth := []byte(sdk.credentials.Email + ":" + sdk.credentials.Password)
return base64.StdEncoding.EncodeToString(auth), nil
}</span> else<span class="cov0" title="0"> if sdk.credentials.APIKey != "" &amp;&amp; sdk.credentials.Email != "" </span><span class="cov0" title="0">{
auth := []byte(sdk.credentials.Email + ":" + sdk.credentials.APIKey)
return base64.StdEncoding.EncodeToString(auth), nil
}</span> else<span class="cov0" title="0"> if sdk.credentials.OrganisationToken != "" </span><span class="cov0" title="0">{
auth := []byte(":" + sdk.credentials.OrganisationToken)
return base64.StdEncoding.EncodeToString(auth), nil
}</span>
<span class="cov0" title="0">return "", errors.New("Empty credentials")</span>
}
func (sdk mfSDK) getOrganizationSlug(multiple bool) (string, error) <span class="cov5" title="2">{
endpoint := "auth/me"
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil </span><span class="cov0" title="0">{
return "", err
}</span>
<span class="cov5" title="2">resp, err := sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return "", err
}</span>
<span class="cov5" title="2">var ur UserRes
if err := json.Unmarshal(resp, &amp;ur); err != nil </span><span class="cov0" title="0">{
return "", err
}</span>
<span class="cov5" title="2">if multiple </span><span class="cov0" title="0">{
var list []string
for _, organization := range ur.Organizations </span><span class="cov0" title="0">{
list = append(list, organization.Slug)
}</span>
<span class="cov0" title="0">organizationslug := fmt.Sprint(list)
return organizationslug, nil</span>
}
<span class="cov5" title="2">return ur.Organizations[0].Slug, nil</span>
}
func (sdk mfSDK) getProjectSlugByName(name string) (string, error) <span class="cov1" title="1">{
projects, err := sdk.ListProject()
if err != nil </span><span class="cov0" title="0">{
return "", nil
}</span>
<span class="cov1" title="1">for _, project := range projects.Data </span><span class="cov1" title="1">{
if name == project.Name </span><span class="cov1" title="1">{
return project.Slug, nil
}</span>
<span class="cov0" title="0">return "", nil</span>
}
<span class="cov0" title="0">return "", nil</span>
}
func (sdk mfSDK) getProjectSlugByID(id int) (string, error) <span class="cov0" title="0">{
projects, err := sdk.ListProject()
if err != nil </span><span class="cov0" title="0">{
return "", nil
}</span>
<span class="cov0" title="0">for _, project := range projects.Data </span><span class="cov0" title="0">{
if id == project.ID </span><span class="cov0" title="0">{
return project.Slug, nil
}</span>
<span class="cov0" title="0">return "", nil</span>
}
<span class="cov0" title="0">return "", nil</span>
}
</pre>
<pre class="file" id="file2" style="display: none">package memfault
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"strings"
)
// CreateProject creates a Project under the given Organization
func (sdk mfSDK) CreateProject(project Project) (CreateProjectRes, error) <span class="cov8" title="1">{
var exists bool
var cpr CreateProjectRes
var cpaer CreateProjectAlreadyExistRes
slug, err := sdk.getProjectSlugByName(project.Name)
if err != nil </span><span class="cov0" title="0">{
return cpr, nil
}</span>
<span class="cov8" title="1">if slug == project.Slug </span><span class="cov8" title="1">{
exists = true
}</span>
<span class="cov8" title="1">data, err := json.Marshal(project)
if err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov8" title="1">payload := strings.NewReader(string(data))
organizationslug, err := sdk.getOrganizationSlug(false)
if err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov8" title="1">endpoint := "api/v0/organizations/" + string(organizationslug) + "/projects"
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
req, err := http.NewRequest(http.MethodPost, url, payload)
if err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov8" title="1">resp, err := sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov8" title="1">if exists </span><span class="cov8" title="1">{
if err := json.Unmarshal(resp, &amp;cpaer); err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov8" title="1">return cpr, errors.New(string(cpaer.Error.Message))</span>
}
<span class="cov0" title="0">if err := json.Unmarshal(resp, &amp;cpr); err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov0" title="0">return cpr, nil</span>
}
// ListProject list the Projects under a given Organization
func (sdk mfSDK) ListProject() (ListProjectRes, error) <span class="cov8" title="1">{
var lpr ListProjectRes
organizationslug, err := sdk.getOrganizationSlug(false)
if err != nil </span><span class="cov0" title="0">{
return lpr, err
}</span>
<span class="cov8" title="1">endpoint := "api/v0/organizations/" + string(organizationslug) + "/projects"
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil </span><span class="cov0" title="0">{
return lpr, err
}</span>
<span class="cov8" title="1">resp, err := sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return lpr, err
}</span>
<span class="cov8" title="1">if err := json.Unmarshal(resp, &amp;lpr); err != nil </span><span class="cov0" title="0">{
return lpr, err
}</span>
<span class="cov8" title="1">return lpr, nil</span>
}
// RetrieveProject retrieve a Project under a given Organization
func (sdk mfSDK) RetrieveProject(projectSlug string) (CreateProjectRes, error) <span class="cov0" title="0">{
var cpr CreateProjectRes
organizationslug, err := sdk.getOrganizationSlug(false)
if err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov0" title="0">endpoint := "api/v0/organizations/" + string(organizationslug) + "/projects/" + projectSlug
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov0" title="0">resp, err := sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov0" title="0">if err := json.Unmarshal(resp, &amp;cpr); err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov0" title="0">return cpr, nil</span>
}
// UpdateProject updates a Project under a given Organization
func (sdk mfSDK) UpdateProject(project Project) (CreateProjectRes, error) <span class="cov0" title="0">{
var cpr CreateProjectRes
organizationslug, err := sdk.getOrganizationSlug(false)
if err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov0" title="0">projectSlug, err := sdk.getProjectSlugByName(project.Name)
if err != nil </span><span class="cov0" title="0">{
return cpr, nil
}</span>
<span class="cov0" title="0">data, err := json.Marshal(project)
if err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov0" title="0">payload := strings.NewReader(string(data))
endpoint := "api/v0/organizations/" + string(organizationslug) + "/projects/" + projectSlug
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
req, err := http.NewRequest(http.MethodPatch, url, payload)
if err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov0" title="0">resp, err := sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov0" title="0">if err := json.Unmarshal(resp, &amp;cpr); err != nil </span><span class="cov0" title="0">{
return cpr, err
}</span>
<span class="cov0" title="0">return cpr, nil</span>
}
// DeleteProject Delete a Project under a given Organization
func (sdk mfSDK) DeleteProject(project Project) (string, error) <span class="cov0" title="0">{
organizationslug, err := sdk.getOrganizationSlug(false)
if err != nil </span><span class="cov0" title="0">{
return "", err
}</span>
<span class="cov0" title="0">projectSlug, err := sdk.getProjectSlugByName(project.Name)
if err != nil </span><span class="cov0" title="0">{
return "", nil
}</span>
<span class="cov0" title="0">endpoint := "api/v0/organizations/" + string(organizationslug) + "/projects/" + projectSlug
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
payload := strings.NewReader(``)
req, err := http.NewRequest(http.MethodDelete, url, payload)
if err != nil </span><span class="cov0" title="0">{
return "", err
}</span>
<span class="cov0" title="0">_, err = sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return "", err
}</span>
<span class="cov0" title="0">return "DELETED", nil</span>
}
// GetProjectClientKey Return the Project Client Key
func (sdk mfSDK) GetProjectClientKey(projectSlug string) (UserAPIKeyRes, error) <span class="cov0" title="0">{
var uakr UserAPIKeyRes
organizationslug, err := sdk.getOrganizationSlug(false)
if err != nil </span><span class="cov0" title="0">{
return uakr, err
}</span>
<span class="cov0" title="0">endpoint := "api/v0/organizations/" + string(organizationslug) + "/projects/" + projectSlug + "/api_key"
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil </span><span class="cov0" title="0">{
return uakr, err
}</span>
<span class="cov0" title="0">resp, err := sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return uakr, err
}</span>
<span class="cov0" title="0">if err := json.Unmarshal(resp, &amp;uakr); err != nil </span><span class="cov0" title="0">{
return uakr, err
}</span>
<span class="cov0" title="0">return uakr, nil</span>
}
// RefreshProjectClientKey Regenerate the Project Client Key
func (sdk mfSDK) RefreshProjectClientKey(projectSlug string) (UserAPIKeyRes, error) <span class="cov0" title="0">{
var uakr UserAPIKeyRes
organizationslug, err := sdk.getOrganizationSlug(false)
if err != nil </span><span class="cov0" title="0">{
return uakr, err
}</span>
<span class="cov0" title="0">endpoint := "api/v0/organizations/" + string(organizationslug) + "/projects/" + projectSlug + "/api_key"
url := fmt.Sprintf("%s/%s", sdk.apiURL, endpoint)
payload := strings.NewReader(``)
req, err := http.NewRequest(http.MethodPost, url, payload)
if err != nil </span><span class="cov0" title="0">{
return uakr, err
}</span>
<span class="cov0" title="0">resp, err := sdk.makeRequest(req)
if err != nil </span><span class="cov0" title="0">{
return uakr, err
}</span>
<span class="cov0" title="0">if err := json.Unmarshal(resp, &amp;uakr); err != nil </span><span class="cov0" title="0">{
return uakr, err
}</span>
<span class="cov0" title="0">return uakr, nil</span>
}
</pre>
</div>
</body>
<script>
(function() {
var files = document.getElementById('files');
var visible;
files.addEventListener('change', onChange, false);
function select(part) {
if (visible)
visible.style.display = 'none';
visible = document.getElementById(part);
if (!visible)
return;
files.value = part;
visible.style.display = 'block';
location.hash = part;
}
function onChange() {
select(files.value);
window.scrollTo(0, 0);
}
if (location.hash != "") {
select(location.hash.substr(1));
}
if (!visible) {
select("file0");
}
})();
</script>
</html>
+42
View File
@@ -0,0 +1,42 @@
{
"data": {
"created_date": "2022-02-09T10:37:39.021949+00:00",
"slug": "smartsink",
"legacy_latest_api_enabled": false,
"integrations": [],
"alerts_enabled": true,
"updated_date": "2022-02-09T10:37:39.065456+00:00",
"count_deployments": 0,
"dashboard_enabled": false,
"device_link_strategies": [],
"primary_software_type": null,
"bugreport_export_enabled": true,
"metric_chart_enabled": false,
"chunks_debug_log_length": 0,
"api_key": "3kfvYHivnNzFGtlKnNdUAAhETQU77Ldp",
"multi_component_enabled": false,
"setup_details": {
"operating_system": [],
"compiler_other": null,
"build_toolchain": [],
"build_toolchain_other": null,
"additional_chips": null,
"programming_languages_other": null,
"debugging_toolchain": [],
"connectivity_other": null,
"primary_chip": null,
"compiler": [],
"connectivity": [],
"primary_chip_other": null,
"debugging_toolchain_other": null,
"gms_certification": null,
"operating_system_other": null,
"programming_languages": []
},
"versioning_scheme": "sequence",
"name": "SmartSink",
"os": "FreeRTOS",
"platform": "nRF52",
"id": 2222
}
}
+15 -6
View File
@@ -52,6 +52,10 @@ type SDK interface {
// Regenerate the Project Client Key
RefreshProjectClientKey(projectSlug string) (UserAPIKeyRes, error)
CreateCohort(project Project, cohort Cohort) (CreateCohortRes, error)
ListCohorts(project Project) (ListCohortRes, error)
}
// Credentials contains the credentials
@@ -93,6 +97,11 @@ type Project struct {
Platform string `json:"platform"`
}
type Cohort struct {
Name string `json:"name,omitempty"`
Slug string `json:"slug,omitempty"`
}
// NewSDK returns new mainflux SDK instance.
func NewSDK(conf Config) SDK {
return &mfSDK{
@@ -111,22 +120,22 @@ func NewSDK(conf Config) SDK {
}
}
func (sdk mfSDK) makeRequest(req *http.Request) ([]byte, error) {
func (sdk mfSDK) makeRequest(req *http.Request) ([]byte, int, error) {
token, err := sdk.authenticate()
if err != nil {
return nil, err
return nil, 0, err
}
resp, err := sdk.sendRequest(req, token)
if err != nil {
return nil, err
return nil, 0, err
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
return nil, 0, err
}
defer resp.Body.Close()
return body, nil
return body, resp.StatusCode, nil
}
func (sdk mfSDK) sendRequest(req *http.Request, token string) (*http.Response, error) {
@@ -165,7 +174,7 @@ func (sdk mfSDK) getOrganizationSlug(multiple bool) (string, error) {
if err != nil {
return "", err
}
resp, err := sdk.makeRequest(req)
resp, _, err := sdk.makeRequest(req)
if err != nil {
return "", err
}
+166
View File
@@ -0,0 +1,166 @@
{
"data": [
{
"multi_component_enabled": false,
"chunks_debug_log_length": 0,
"legacy_latest_api_enabled": false,
"metric_chart_enabled": false,
"id": 2227,
"slug": "smartsinko",
"created_date": "2022-02-10T19:04:13.116213+00:00",
"bugreport_export_enabled": true,
"name": "SmartSink1",
"platform": "nRF52",
"os": "FreeRTOS",
"integrations": [],
"event_debug_log_length": 1000,
"setup_details": {
"debugging_toolchain_other": null,
"compiler": [],
"primary_chip": null,
"programming_languages": [],
"connectivity": [],
"operating_system_other": null,
"gms_certification": null,
"programming_languages_other": null,
"build_toolchain": [],
"compiler_other": null,
"operating_system": [],
"connectivity_other": null,
"debugging_toolchain": [],
"additional_chips": null,
"build_toolchain_other": null,
"primary_chip_other": null
},
"updated_date": "2022-02-10T19:04:13.166579+00:00",
"alerts_enabled": true,
"dashboard_enabled": false
},
{
"multi_component_enabled": false,
"chunks_debug_log_length": 0,
"legacy_latest_api_enabled": false,
"metric_chart_enabled": false,
"id": 2222,
"slug": "smartsink",
"created_date": "2022-02-09T10:37:39.021949+00:00",
"bugreport_export_enabled": true,
"name": "SmartSink",
"platform": "nRF52",
"os": "FreeRTOS",
"integrations": [],
"event_debug_log_length": 1000,
"setup_details": {
"debugging_toolchain_other": null,
"compiler": [],
"primary_chip": null,
"programming_languages": [],
"connectivity": [],
"operating_system_other": null,
"gms_certification": null,
"programming_languages_other": null,
"build_toolchain": [],
"compiler_other": null,
"operating_system": [],
"connectivity_other": null,
"debugging_toolchain": [],
"additional_chips": null,
"build_toolchain_other": null,
"primary_chip_other": null
},
"updated_date": "2022-02-09T10:37:39.065456+00:00",
"alerts_enabled": true,
"dashboard_enabled": false
},
{
"multi_component_enabled": false,
"chunks_debug_log_length": 0,
"legacy_latest_api_enabled": false,
"metric_chart_enabled": false,
"id": 2218,
"slug": "smart-sink",
"created_date": "2022-02-06T21:39:27.537466+00:00",
"bugreport_export_enabled": true,
"name": "Smart Sink",
"platform": "nRF52",
"os": "FreeRTOS",
"integrations": [],
"event_debug_log_length": 1000,
"setup_details": {
"debugging_toolchain_other": null,
"compiler": [],
"primary_chip": null,
"programming_languages": [],
"connectivity": [],
"operating_system_other": null,
"gms_certification": null,
"programming_languages_other": null,
"build_toolchain": [],
"compiler_other": null,
"operating_system": [],
"connectivity_other": null,
"debugging_toolchain": [],
"additional_chips": null,
"build_toolchain_other": null,
"primary_chip_other": null
},
"updated_date": "2022-02-06T21:39:27.586353+00:00",
"alerts_enabled": true,
"dashboard_enabled": false
},
{
"multi_component_enabled": false,
"chunks_debug_log_length": 250,
"legacy_latest_api_enabled": false,
"metric_chart_enabled": true,
"id": 2217,
"slug": "demo",
"created_date": "2022-02-05T20:14:53.036589+00:00",
"bugreport_export_enabled": true,
"name": "demo",
"platform": "",
"os": "",
"integrations": [],
"event_debug_log_length": 1000,
"setup_details": {
"debugging_toolchain_other": null,
"compiler": [
"GCC",
"IAR"
],
"primary_chip": "ESP32",
"programming_languages": [],
"connectivity": [
"WiFi"
],
"operating_system_other": null,
"gms_certification": null,
"programming_languages_other": null,
"build_toolchain": [
"Make"
],
"compiler_other": null,
"operating_system": [
"FreeRTOS"
],
"connectivity_other": null,
"debugging_toolchain": [
"GDB"
],
"additional_chips": null,
"build_toolchain_other": null,
"primary_chip_other": null
},
"updated_date": "2022-02-05T20:14:53.082615+00:00",
"alerts_enabled": true,
"dashboard_enabled": false
}
],
"paging": {
"per_page": 100,
"total_count": 4,
"page_count": 1,
"page": 1,
"item_count": 4
}
}
+10 -10
View File
@@ -12,7 +12,7 @@ import (
func (sdk mfSDK) CreateProject(project Project) (CreateProjectRes, error) {
var exists bool
var cpr CreateProjectRes
var cpaer CreateProjectAlreadyExistRes
var er ErrorRes
slug, err := sdk.getProjectSlugByName(project.Name)
if err != nil {
@@ -37,15 +37,15 @@ func (sdk mfSDK) CreateProject(project Project) (CreateProjectRes, error) {
if err != nil {
return cpr, err
}
resp, err := sdk.makeRequest(req)
resp, _, err := sdk.makeRequest(req)
if err != nil {
return cpr, err
}
if exists {
if err := json.Unmarshal(resp, &cpaer); err != nil {
if err := json.Unmarshal(resp, &er); err != nil {
return cpr, err
}
return cpr, errors.New(string(cpaer.Error.Message))
return cpr, errors.New(string(er.Error.Message))
}
if err := json.Unmarshal(resp, &cpr); err != nil {
@@ -68,7 +68,7 @@ func (sdk mfSDK) ListProject() (ListProjectRes, error) {
if err != nil {
return lpr, err
}
resp, err := sdk.makeRequest(req)
resp, _, err := sdk.makeRequest(req)
if err != nil {
return lpr, err
}
@@ -92,7 +92,7 @@ func (sdk mfSDK) RetrieveProject(projectSlug string) (CreateProjectRes, error) {
if err != nil {
return cpr, err
}
resp, err := sdk.makeRequest(req)
resp, _, err := sdk.makeRequest(req)
if err != nil {
return cpr, err
}
@@ -126,7 +126,7 @@ func (sdk mfSDK) UpdateProject(project Project) (CreateProjectRes, error) {
if err != nil {
return cpr, err
}
resp, err := sdk.makeRequest(req)
resp, _, err := sdk.makeRequest(req)
if err != nil {
return cpr, err
}
@@ -156,7 +156,7 @@ func (sdk mfSDK) DeleteProject(project Project) (string, error) {
if err != nil {
return "", err
}
_, err = sdk.makeRequest(req)
_, _, err = sdk.makeRequest(req)
if err != nil {
return "", err
}
@@ -177,7 +177,7 @@ func (sdk mfSDK) GetProjectClientKey(projectSlug string) (UserAPIKeyRes, error)
if err != nil {
return uakr, err
}
resp, err := sdk.makeRequest(req)
resp, _, err := sdk.makeRequest(req)
if err != nil {
return uakr, err
}
@@ -203,7 +203,7 @@ func (sdk mfSDK) RefreshProjectClientKey(projectSlug string) (UserAPIKeyRes, err
if err != nil {
return uakr, err
}
resp, err := sdk.makeRequest(req)
resp, _, err := sdk.makeRequest(req)
if err != nil {
return uakr, err
}
+44
View File
@@ -0,0 +1,44 @@
package memfault
import (
"errors"
"fmt"
"os"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
var (
username = os.Getenv("MEMFAULT_USERNAME")
password = os.Getenv("MEMFAULT_PASSWORD")
)
func TestCreateProject(t *testing.T) {
creds := Credentials{
Email: username,
Password: password,
}
d, _ := time.ParseDuration("30s")
conf := Config{
APIURL: "https://api.memfault.com",
Credentials: creds,
MaxIdleConns: 10,
IdleConnTimeout: d,
}
memfault := NewSDK(conf)
payload := Project{
Name: "SmartSdinkamakeabc",
Slug: "smartsdinkmskeabc",
Os: "FreeRTOS",
Platform: "nRF52",
}
response1, err := memfault.CreateProject(payload)
if err != nil {
fmt.Println(err)
}
fmt.Println(response1.Data.APIKey)
assert.Equal(t, err, errors.New("A project named `SmartSdinkamakeabc` already exists"), fmt.Sprintf("expected error %s, got nil", err))
}
+43 -16
View File
@@ -16,7 +16,7 @@ type UserAPIKeyRes struct {
type organization struct {
ID int `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Slug string `json:"slug"`
Slug string `json:"slug,omitempty"`
}
// provides the organisation access control list
@@ -34,10 +34,10 @@ type UserRes struct {
Name string `json:"name,omitempty"`
Organizations []organization `json:"organizations,omitempty"`
UpdatedDate time.Time `json:"updated_date,omitempty"`
PrivacyNotice bool `json:"has_accepted_privacy_notice"`
TermsOfService bool `json:"has_accepted_terms_of_service"`
Impersonated string `json:"impersonator"`
OrganizationsAcls []organizationACL `json:"organization_acls"`
PrivacyNotice bool `json:"has_accepted_privacy_notice,omitempty"`
TermsOfService bool `json:"has_accepted_terms_of_service,omitempty"`
Impersonated string `json:"impersonator,omitempty"`
OrganizationsAcls []organizationACL `json:"organization_acls,omitempty"`
}
// intergrations of the project
@@ -76,8 +76,8 @@ type projectData struct {
Slug string `json:"slug,omitempty"`
LegacyLatestAPIEnabled bool `json:"legacy_latest_api_enabled,omitempty"`
Integrations []integrations `json:"integrations,omitempty"`
AlertsEnabled bool `json:"alerts_enabled,omitempty,omitempty"`
UpdatedDate time.Time `json:"updated_date,omitempty,omitempty"`
AlertsEnabled bool `json:"alerts_enabled,omitempty"`
UpdatedDate time.Time `json:"updated_date,omitempty"`
CountDeployments int `json:"count_deployments,omitempty"`
DashboardEnabled bool `json:"dashboard_enabled,omitempty"`
DeviceLinkStrategies []deviceLinkStrategies `json:"device_link_strategies,omitempty"`
@@ -89,11 +89,11 @@ type projectData struct {
APIKey string `json:"api_key,omitempty"`
MultiComponentEnabled bool `json:"multi_component_enabled,omitempty"`
SetupDetails setupDetails `json:"setup_details,omitempty"`
VersioningScheme string `json:"versioning_scheme"`
Name string `json:"name"`
Os string `json:"os"`
Platform string `json:"platform"`
ID int `json:"id"`
VersioningScheme string `json:"versioning_scheme,omitempty"`
Name string `json:"name,omitempty"`
Os string `json:"os,omitempty"`
Platform string `json:"platform,omitempty"`
ID int `json:"id,omitempty"`
}
// CreateProjectRes thirs is a new project created
@@ -102,16 +102,16 @@ type CreateProjectRes struct {
}
// project error message
type createProjectError struct {
type errorInformation struct {
Code int `json:"code,omitempty"`
HTTPCode int `json:"http_code,omitempty"`
Message string `json:"message,omitempty"`
ErrorType string `json:"type,omitempty"`
}
// CreateProjectAlreadyExistRes eror message that project already exist
type CreateProjectAlreadyExistRes struct {
Error createProjectError `json:"error,omitempty"`
// ErrorRes eror message that project already exist
type ErrorRes struct {
Error errorInformation `json:"error,omitempty"`
}
type paging struct {
@@ -127,3 +127,30 @@ type ListProjectRes struct {
Data []projectData `json:"data,omitempty"`
Paging paging `json:"paging,omitempty"`
}
type CohortData struct {
ByPassPrimarySoftwareTypeCheck bool `json:"bypass_primary_software_type_check,omitempty"`
ByPassVersionChecks bool `json:"bypass_version_checks,omitempty"`
CountActiveDeployments int `json:"count_active_deployments,omitempty"`
CountDevices int `json:"count_devices,omitempty"`
CountStagedDevices int `json:"count_staged_devices,omitempty"`
CreatedDate time.Time `json:"created_date,omitempty"`
ID int `json:"id,omitempty"`
IgnoreTraces bool `json:"ignore_traces,omitempty"`
LastDeployment time.Time `json:"last_deployment,omitempty"`
Name string `json:"name,omitempty"`
ReturnEqualLatestReleases bool `json:"return_equal_latest_releases,omitempty"`
Slug string `json:"slug,omitempty"`
UpdatedDate time.Time `json:"updated_date,omitempty"`
UpdatesEnabled bool `json:"updates_enabled,omitempty"`
}
// CreateCohortRes struct
type CreateCohortRes struct {
Data CohortData `json:"data,omitempty"`
}
// ListCohortRes struct
type ListCohortRes struct {
Data []CohortData `json:"data,omitempty"`
}
+28
View File
@@ -0,0 +1,28 @@
{
"has_accepted_terms_of_service": true,
"name": "Rodney Osodo",
"organization_acls": [
{
"customer_support": false,
"admin": true,
"organization ": {
"slug": "qualislabs",
"id": 1889,
"name": "Qualislabs"
}
}
],
"created_date": "2022-02-05T20:13:58.791425+00:00",
"updated_date": "2022-02-09T11:45:12.220321+00:00",
"impersonator": null,
"id": 3048,
"email": "rodneydav@gmail.com",
"has_accepted_privacy_notice": true,
"organizations": [
{
"slug": "qualislabs",
"id": 1889,
"name": "Qualislabs"
}
]
}