quickshare/src/client/files.go

250 lines
6.3 KiB
Go

package client
import (
"encoding/json"
"fmt"
"net/http"
"github.com/ihexxa/quickshare/src/handlers/fileshdr"
"github.com/parnurzeal/gorequest"
)
type FilesClient struct {
addr string
r *gorequest.SuperAgent
token *http.Cookie
}
func NewFilesClient(addr string, token *http.Cookie) *FilesClient {
gr := gorequest.New()
return &FilesClient{
addr: addr,
r: gr,
token: token,
}
}
func (cl *FilesClient) url(urlpath string) string {
return fmt.Sprintf("%s%s", cl.addr, urlpath)
}
func (cl *FilesClient) Create(filepath string, size int64) (*http.Response, string, []error) {
return cl.r.Post(cl.url("/v1/fs/files")).
AddCookie(cl.token).
Send(fileshdr.CreateReq{
Path: filepath,
FileSize: size,
}).
End()
}
func (cl *FilesClient) Delete(filepath string) (*http.Response, string, []error) {
return cl.r.Delete(cl.url("/v1/fs/files")).
AddCookie(cl.token).
Param(fileshdr.FilePathQuery, filepath).
End()
}
func (cl *FilesClient) Metadata(filepath string) (*http.Response, *fileshdr.MetadataResp, []error) {
resp, body, errs := cl.r.Get(cl.url("/v1/fs/metadata")).
AddCookie(cl.token).
Param(fileshdr.FilePathQuery, filepath).
End()
mResp := &fileshdr.MetadataResp{}
err := json.Unmarshal([]byte(body), mResp)
if err != nil {
errs = append(errs, err)
return nil, nil, errs
}
return resp, mResp, nil
}
func (cl *FilesClient) Mkdir(dirpath string) (*http.Response, string, []error) {
return cl.r.Post(cl.url("/v1/fs/dirs")).
AddCookie(cl.token).
Send(fileshdr.MkdirReq{Path: dirpath}).
End()
}
func (cl *FilesClient) Move(oldpath, newpath string) (*http.Response, string, []error) {
return cl.r.Patch(cl.url("/v1/fs/files/move")).
AddCookie(cl.token).
Send(fileshdr.MoveReq{
OldPath: oldpath,
NewPath: newpath,
}).
End()
}
func (cl *FilesClient) UploadChunk(filepath string, content string, offset int64) (*http.Response, string, []error) {
return cl.r.Patch(cl.url("/v1/fs/files/chunks")).
AddCookie(cl.token).
Send(fileshdr.UploadChunkReq{
Path: filepath,
Content: content,
Offset: offset,
}).
End()
}
func (cl *FilesClient) UploadStatus(filepath string) (*http.Response, *fileshdr.UploadStatusResp, []error) {
resp, body, errs := cl.r.Get(cl.url("/v1/fs/files/chunks")).
AddCookie(cl.token).
Param(fileshdr.FilePathQuery, filepath).
End()
uResp := &fileshdr.UploadStatusResp{}
err := json.Unmarshal([]byte(body), uResp)
if err != nil {
errs = append(errs, err)
return nil, nil, errs
}
return resp, uResp, nil
}
func (cl *FilesClient) Download(filepath string, headers map[string]string) (*http.Response, string, []error) {
r := cl.r.Get(cl.url("/v1/fs/files")).
AddCookie(cl.token).
Param(fileshdr.FilePathQuery, filepath)
for key, val := range headers {
r = r.Set(key, val)
}
return r.End()
}
func (cl *FilesClient) List(dirPath string) (*http.Response, *fileshdr.ListResp, []error) {
resp, body, errs := cl.r.Get(cl.url("/v1/fs/dirs")).
AddCookie(cl.token).
Param(fileshdr.ListDirQuery, dirPath).
End()
if len(errs) > 0 {
return nil, nil, errs
}
lResp := &fileshdr.ListResp{}
err := json.Unmarshal([]byte(body), lResp)
if err != nil {
return nil, nil, append(errs, err)
}
return resp, lResp, nil
}
func (cl *FilesClient) ListHome() (*http.Response, *fileshdr.ListResp, []error) {
resp, body, errs := cl.r.Get(cl.url("/v1/fs/dirs/home")).
AddCookie(cl.token).
End()
if len(errs) > 0 {
return nil, nil, errs
}
lResp := &fileshdr.ListResp{}
err := json.Unmarshal([]byte(body), lResp)
if err != nil {
return nil, nil, append(errs, err)
}
return resp, lResp, nil
}
func (cl *FilesClient) ListUploadings() (*http.Response, *fileshdr.ListUploadingsResp, []error) {
resp, body, errs := cl.r.Get(cl.url("/v1/fs/uploadings")).
AddCookie(cl.token).
End()
if len(errs) > 0 {
return nil, nil, errs
}
lResp := &fileshdr.ListUploadingsResp{}
err := json.Unmarshal([]byte(body), lResp)
if err != nil {
return nil, nil, append(errs, err)
}
return resp, lResp, nil
}
func (cl *FilesClient) DelUploading(filepath string) (*http.Response, string, []error) {
return cl.r.Delete(cl.url("/v1/fs/uploadings")).
AddCookie(cl.token).
Param(fileshdr.FilePathQuery, filepath).
End()
}
func (cl *FilesClient) AddSharing(dirpath string) (*http.Response, string, []error) {
return cl.r.Post(cl.url("/v1/fs/sharings")).
AddCookie(cl.token).
Send(fileshdr.SharingReq{SharingPath: dirpath}).
End()
}
func (cl *FilesClient) DelSharing(dirpath string) (*http.Response, string, []error) {
return cl.r.Delete(cl.url("/v1/fs/sharings")).
AddCookie(cl.token).
Param(fileshdr.FilePathQuery, dirpath).
End()
}
func (cl *FilesClient) IsSharing(dirpath string) (*http.Response, string, []error) {
return cl.r.Get(cl.url("/v1/fs/sharings/exist")).
AddCookie(cl.token).
Param(fileshdr.FilePathQuery, dirpath).
End()
}
// Deprecated: use ListSharingIDs intead
func (cl *FilesClient) ListSharings() (*http.Response, *fileshdr.SharingResp, []error) {
resp, body, errs := cl.r.Get(cl.url("/v1/fs/sharings")).
AddCookie(cl.token).
End()
if len(errs) > 0 {
return nil, nil, errs
}
shResp := &fileshdr.SharingResp{}
err := json.Unmarshal([]byte(body), shResp)
if err != nil {
return nil, nil, append(errs, err)
}
return resp, shResp, nil
}
func (cl *FilesClient) ListSharingIDs() (*http.Response, *fileshdr.SharingIDsResp, []error) {
resp, body, errs := cl.r.Get(cl.url("/v1/fs/sharings/ids")).
AddCookie(cl.token).
End()
if len(errs) > 0 {
return nil, nil, errs
}
shResp := &fileshdr.SharingIDsResp{}
err := json.Unmarshal([]byte(body), shResp)
if err != nil {
return nil, nil, append(errs, err)
}
return resp, shResp, nil
}
func (cl *FilesClient) GenerateHash(filepath string) (*http.Response, string, []error) {
return cl.r.Post(cl.url("/v1/fs/hashes/sha1")).
AddCookie(cl.token).
Send(fileshdr.GenerateHashReq{
FilePath: filepath,
}).
End()
}
func (cl *FilesClient) GetSharingDir(shareID string) (*http.Response, string, []error) {
resp, body, errs := cl.r.Get(cl.url("/v1/fs/sharings/dirs")).
AddCookie(cl.token).
Param(fileshdr.ShareIDQuery, shareID).
End()
if len(errs) > 0 {
return nil, "", errs
}
sdResp := &fileshdr.GetSharingDirResp{}
err := json.Unmarshal([]byte(body), sdResp)
if err != nil {
return nil, "", append(errs, err)
}
return resp, sdResp.SharingDir, nil
}