mirror of
https://codeberg.org/scip/ephemerup.git
synced 2025-12-17 04:30:57 +01:00
changes:
- added cleaner goroutine - added delete cmd - added list cmd - refactoring
This commit is contained in:
47
upctl/cmd/delete.go
Normal file
47
upctl/cmd/delete.go
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
Copyright © 2023 Thomas von Dein
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/tlinden/up/upctl/cfg"
|
||||
"github.com/tlinden/up/upctl/lib"
|
||||
)
|
||||
|
||||
func DeleteCommand(conf *cfg.Config) *cobra.Command {
|
||||
var deleteCmd = &cobra.Command{
|
||||
Use: "delete [options] <id>",
|
||||
Short: "delete an upload",
|
||||
Long: `Delete an upload identified by its id`,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if len(args) == 0 {
|
||||
return errors.New("No id specified to delete!")
|
||||
}
|
||||
|
||||
// errors at this stage do not cause the usage to be shown
|
||||
cmd.SilenceUsage = true
|
||||
|
||||
return lib.Delete(conf, args)
|
||||
},
|
||||
}
|
||||
|
||||
deleteCmd.Aliases = append(deleteCmd.Aliases, "rm")
|
||||
deleteCmd.Aliases = append(deleteCmd.Aliases, "d")
|
||||
|
||||
return deleteCmd
|
||||
}
|
||||
@@ -38,5 +38,8 @@ func ListCommand(conf *cfg.Config) *cobra.Command {
|
||||
// options
|
||||
listCmd.PersistentFlags().StringVarP(&conf.Apicontext, "apicontext", "", "", "Filter by given API context")
|
||||
|
||||
listCmd.Aliases = append(listCmd.Aliases, "ls")
|
||||
listCmd.Aliases = append(listCmd.Aliases, "l")
|
||||
|
||||
return listCmd
|
||||
}
|
||||
|
||||
@@ -88,6 +88,7 @@ func Execute() {
|
||||
|
||||
rootCmd.AddCommand(UploadCommand(&conf))
|
||||
rootCmd.AddCommand(ListCommand(&conf))
|
||||
rootCmd.AddCommand(DeleteCommand(&conf))
|
||||
|
||||
err := rootCmd.Execute()
|
||||
if err != nil {
|
||||
|
||||
@@ -36,12 +36,15 @@ func UploadCommand(conf *cfg.Config) *cobra.Command {
|
||||
// errors at this stage do not cause the usage to be shown
|
||||
cmd.SilenceUsage = true
|
||||
|
||||
return lib.Upload(conf, args)
|
||||
return lib.UploadFiles(conf, args)
|
||||
},
|
||||
}
|
||||
|
||||
// options
|
||||
uploadCmd.PersistentFlags().StringVarP(&conf.Expire, "expire", "e", "", "Expire setting: asap or duration (accepted shortcuts: dmh)")
|
||||
|
||||
uploadCmd.Aliases = append(uploadCmd.Aliases, "up")
|
||||
uploadCmd.Aliases = append(uploadCmd.Aliases, "u")
|
||||
|
||||
return uploadCmd
|
||||
}
|
||||
|
||||
@@ -19,7 +19,9 @@ require (
|
||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.1 // indirect
|
||||
github.com/magiconair/properties v1.8.7 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.9 // indirect
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.2.0 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
|
||||
github.com/quic-go/qpack v0.4.0 // indirect
|
||||
|
||||
@@ -150,8 +150,12 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
|
||||
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
||||
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
|
||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
|
||||
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
|
||||
github.com/onsi/ginkgo/v2 v2.2.0 h1:3ZNA3L1c5FYDFTTxbFeVGGD8jYvjYauHD30YgLxVsNI=
|
||||
github.com/onsi/ginkgo/v2 v2.2.0/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk=
|
||||
github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q=
|
||||
|
||||
@@ -43,6 +43,22 @@ type ListParams struct {
|
||||
Apicontext string `json:"apicontext"`
|
||||
}
|
||||
|
||||
type Upload struct {
|
||||
Id string `json:"id"`
|
||||
Expire string `json:"expire"`
|
||||
File string `json:"file"` // final filename (visible to the downloader)
|
||||
Members []string `json:"members"` // contains multiple files, so File is an archive
|
||||
Uploaded Timestamp `json:"uploaded"`
|
||||
Context string `json:"context"`
|
||||
}
|
||||
|
||||
type Uploads struct {
|
||||
Entries []*Upload `json:"uploads"`
|
||||
Success bool `json:"success"`
|
||||
Message string `json:"message"`
|
||||
Code int `json:"code"`
|
||||
}
|
||||
|
||||
func Setup(c *cfg.Config, path string) *Request {
|
||||
client := req.C()
|
||||
if c.Debug {
|
||||
@@ -107,7 +123,7 @@ func GatherFiles(rq *Request, args []string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func Upload(c *cfg.Config, args []string) error {
|
||||
func UploadFiles(c *cfg.Config, args []string) error {
|
||||
// setup url, req.Request, timeout handling etc
|
||||
rq := Setup(c, "/file/")
|
||||
|
||||
@@ -165,7 +181,10 @@ func HandleResponse(c *cfg.Config, resp *req.Response) error {
|
||||
}
|
||||
|
||||
// all right
|
||||
fmt.Println(r.Message)
|
||||
if r.Message != "" {
|
||||
fmt.Println(r.Message)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -177,11 +196,46 @@ func List(c *cfg.Config, args []string) error {
|
||||
SetBodyJsonMarshal(params).
|
||||
Get(rq.Url)
|
||||
|
||||
fmt.Println("")
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return HandleResponse(c, resp)
|
||||
uploads := Uploads{}
|
||||
|
||||
if err := json.Unmarshal([]byte(resp.String()), &uploads); err != nil {
|
||||
return errors.New("Could not unmarshall JSON response: " + err.Error())
|
||||
}
|
||||
|
||||
if !uploads.Success {
|
||||
return errors.New(uploads.Message)
|
||||
}
|
||||
|
||||
// tablewriter
|
||||
data := [][]string{}
|
||||
for _, entry := range uploads.Entries {
|
||||
data = append(data, []string{
|
||||
entry.Id, entry.Expire, entry.Context, entry.Uploaded.Format("2006-01-02 15:04:05"),
|
||||
})
|
||||
}
|
||||
return WriteTable([]string{"ID", "EXPIRE", "CONTEXT", "UPLOADED"}, data)
|
||||
}
|
||||
|
||||
func Delete(c *cfg.Config, args []string) error {
|
||||
for _, id := range args {
|
||||
rq := Setup(c, "/file/"+id+"/")
|
||||
|
||||
resp, err := rq.R.Delete(rq.Url)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := HandleResponse(c, resp); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Printf("Upload %s successfully deleted.\n", id)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
50
upctl/lib/output.go
Normal file
50
upctl/lib/output.go
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
Copyright © 2023 Thomas von Dein
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package lib
|
||||
|
||||
import (
|
||||
"github.com/olekukonko/tablewriter"
|
||||
"os"
|
||||
)
|
||||
|
||||
func WriteTable(headers []string, data [][]string) error {
|
||||
table := tablewriter.NewWriter(os.Stdout)
|
||||
|
||||
table.SetHeader(headers)
|
||||
table.AppendBulk(data)
|
||||
|
||||
// for _, row := range data.entries {
|
||||
// table.Append(trimRow(row))
|
||||
// }
|
||||
|
||||
table.SetAutoWrapText(false)
|
||||
table.SetAutoFormatHeaders(true)
|
||||
table.SetHeaderAlignment(tablewriter.ALIGN_LEFT)
|
||||
table.SetAlignment(tablewriter.ALIGN_LEFT)
|
||||
table.SetCenterSeparator("")
|
||||
table.SetColumnSeparator("")
|
||||
table.SetRowSeparator("")
|
||||
table.SetHeaderLine(false)
|
||||
table.SetBorder(false)
|
||||
table.SetTablePadding("\t")
|
||||
table.SetNoWhiteSpace(true)
|
||||
|
||||
table.Render()
|
||||
|
||||
return nil
|
||||
}
|
||||
65
upctl/lib/timestamp.go
Normal file
65
upctl/lib/timestamp.go
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
Copyright © 2023 Thomas von Dein
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package lib
|
||||
|
||||
// FIXME: import from upd!!!!
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
// https://gist.github.com/rhcarvalho/9338c3ff8850897c68bc74797c5dc25b
|
||||
|
||||
// Timestamp is like time.Time, but knows how to unmarshal from JSON
|
||||
// Unix timestamp numbers or RFC3339 strings, and marshal back into
|
||||
// the same JSON representation.
|
||||
type Timestamp struct {
|
||||
time.Time
|
||||
rfc3339 bool
|
||||
}
|
||||
|
||||
func (t Timestamp) MarshalJSON() ([]byte, error) {
|
||||
if t.rfc3339 {
|
||||
return t.Time.MarshalJSON()
|
||||
}
|
||||
return t.formatUnix()
|
||||
}
|
||||
|
||||
func (t *Timestamp) UnmarshalJSON(data []byte) error {
|
||||
err := t.Time.UnmarshalJSON(data)
|
||||
if err != nil {
|
||||
return t.parseUnix(data)
|
||||
}
|
||||
t.rfc3339 = true
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t Timestamp) formatUnix() ([]byte, error) {
|
||||
sec := float64(t.Time.UnixNano()) * float64(time.Nanosecond) / float64(time.Second)
|
||||
return strconv.AppendFloat(nil, sec, 'f', -1, 64), nil
|
||||
}
|
||||
|
||||
func (t *Timestamp) parseUnix(data []byte) error {
|
||||
f, err := strconv.ParseFloat(string(data), 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
t.Time = time.Unix(0, int64(f*float64(time.Second/time.Nanosecond)))
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user