mirror of
https://gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud
synced 2024-11-06 03:36:25 +00:00
193 lines
5.3 KiB
Go
193 lines
5.3 KiB
Go
package gonextcloud
|
||
|
||
import (
|
||
"fmt"
|
||
req "github.com/levigross/grequests"
|
||
"gitlab.adphi.fr/partitio/Nextcloud-Partitio/gonextcloud/types"
|
||
"net/http"
|
||
"strconv"
|
||
"sync"
|
||
)
|
||
|
||
//SharesI available methods
|
||
type SharesI interface {
|
||
List() ([]types.Share, error)
|
||
GetFromPath(path string, reshares bool, subfiles bool) ([]types.Share, error)
|
||
Get(shareID string) (types.Share, error)
|
||
Create(
|
||
path string,
|
||
shareType types.ShareType,
|
||
permission types.SharePermission,
|
||
shareWith string,
|
||
publicUpload bool,
|
||
password string,
|
||
) (types.Share, error)
|
||
Delete(shareID int) error
|
||
Update(shareUpdate types.ShareUpdate) error
|
||
UpdateExpireDate(shareID int, expireDate string) error
|
||
UpdatePublicUpload(shareID int, public bool) error
|
||
UpdatePassword(shareID int, password string) error
|
||
UpdatePermissions(shareID int, permissions types.SharePermission) error
|
||
}
|
||
|
||
//Shares contains all Shares available actions
|
||
type Shares struct {
|
||
c *Client
|
||
}
|
||
|
||
//List list all shares of the logged in user
|
||
func (s *Shares) List() ([]types.Share, error) {
|
||
res, err := s.c.baseRequest(http.MethodGet, routes.shares, nil)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
var r types.SharesListResponse
|
||
res.JSON(&r)
|
||
return r.Ocs.Data, nil
|
||
}
|
||
|
||
//GetFromPath return shares from a specific file or folder
|
||
func (s *Shares) GetFromPath(path string, reshares bool, subfiles bool) ([]types.Share, error) {
|
||
ro := &req.RequestOptions{
|
||
Params: map[string]string{
|
||
"path": path,
|
||
"reshares": strconv.FormatBool(reshares),
|
||
"subfiles": strconv.FormatBool(subfiles),
|
||
},
|
||
}
|
||
res, err := s.c.baseRequest(http.MethodGet, routes.shares, ro)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
var r types.SharesListResponse
|
||
res.JSON(&r)
|
||
return r.Ocs.Data, nil
|
||
}
|
||
|
||
//Get information about a known Share
|
||
func (s *Shares) Get(shareID string) (types.Share, error) {
|
||
res, err := s.c.baseRequest(http.MethodGet, routes.shares, nil, shareID)
|
||
if err != nil {
|
||
return types.Share{}, err
|
||
}
|
||
var r types.SharesListResponse
|
||
res.JSON(&r)
|
||
return r.Ocs.Data[0], nil
|
||
}
|
||
|
||
//Create create a share
|
||
func (s *Shares) Create(
|
||
path string,
|
||
shareType types.ShareType,
|
||
permission types.SharePermission,
|
||
shareWith string,
|
||
publicUpload bool,
|
||
password string,
|
||
) (types.Share, error) {
|
||
|
||
if (shareType == types.UserShare || shareType == types.GroupShare) && shareWith == "" {
|
||
return types.Share{}, fmt.Errorf("shareWith cannot be empty for ShareType UserShare or GroupShare")
|
||
}
|
||
ro := &req.RequestOptions{
|
||
Data: map[string]string{
|
||
"path": path,
|
||
"shareType": strconv.Itoa(int(shareType)),
|
||
"shareWith": shareWith,
|
||
"publicUpload": strconv.FormatBool(publicUpload),
|
||
"password": password,
|
||
"permissions": strconv.Itoa(int(permission)),
|
||
},
|
||
}
|
||
res, err := s.c.baseRequest(http.MethodPost, routes.shares, ro)
|
||
if err != nil {
|
||
return types.Share{}, err
|
||
}
|
||
var r types.SharesResponse
|
||
res.JSON(&r)
|
||
return r.Ocs.Data, nil
|
||
}
|
||
|
||
//Delete Remove the given share.
|
||
func (s *Shares) Delete(shareID int) error {
|
||
_, err := s.c.baseRequest(http.MethodDelete, routes.shares, nil, strconv.Itoa(shareID))
|
||
return err
|
||
}
|
||
|
||
// Update update share details
|
||
// expireDate expireDate expects a well formatted date string, e.g. ‘YYYY-MM-DD’
|
||
func (s *Shares) Update(shareUpdate types.ShareUpdate) error {
|
||
errs := make(chan types.UpdateError)
|
||
var wg sync.WaitGroup
|
||
wg.Add(4)
|
||
go func() {
|
||
defer wg.Done()
|
||
if err := s.UpdatePassword(shareUpdate.ShareID, shareUpdate.Password); err != nil {
|
||
errs <- types.UpdateError{
|
||
Field: "password",
|
||
Error: err,
|
||
}
|
||
}
|
||
}()
|
||
go func() {
|
||
defer wg.Done()
|
||
if err := s.UpdateExpireDate(shareUpdate.ShareID, shareUpdate.ExpireDate); err != nil {
|
||
errs <- types.UpdateError{
|
||
Field: "expireDate",
|
||
Error: err,
|
||
}
|
||
}
|
||
}()
|
||
go func() {
|
||
defer wg.Done()
|
||
if err := s.UpdatePermissions(shareUpdate.ShareID, shareUpdate.Permissions); err != nil {
|
||
errs <- types.UpdateError{
|
||
Field: "permissions",
|
||
Error: err,
|
||
}
|
||
}
|
||
}()
|
||
go func() {
|
||
defer wg.Done()
|
||
if err := s.UpdatePublicUpload(shareUpdate.ShareID, shareUpdate.PublicUpload); err != nil {
|
||
errs <- types.UpdateError{
|
||
Field: "publicUpload",
|
||
Error: err,
|
||
}
|
||
}
|
||
}()
|
||
go func() {
|
||
wg.Wait()
|
||
close(errs)
|
||
}()
|
||
return types.NewUpdateError(errs)
|
||
}
|
||
|
||
//UpdateExpireDate updates the share's expire date
|
||
// expireDate expects a well formatted date string, e.g. ‘YYYY-MM-DD’
|
||
func (s *Shares) UpdateExpireDate(shareID int, expireDate string) error {
|
||
return s.baseShareUpdate(strconv.Itoa(shareID), "expireDate", expireDate)
|
||
}
|
||
|
||
//UpdatePublicUpload enable or disable public upload
|
||
func (s *Shares) UpdatePublicUpload(shareID int, public bool) error {
|
||
return s.baseShareUpdate(strconv.Itoa(shareID), "publicUpload", strconv.FormatBool(public))
|
||
}
|
||
|
||
//UpdatePassword updates share password
|
||
func (s *Shares) UpdatePassword(shareID int, password string) error {
|
||
return s.baseShareUpdate(strconv.Itoa(shareID), "password", password)
|
||
}
|
||
|
||
//UpdatePermissions update permissions
|
||
func (s *Shares) UpdatePermissions(shareID int, permissions types.SharePermission) error {
|
||
return s.baseShareUpdate(strconv.Itoa(shareID), "permissions", strconv.Itoa(int(permissions)))
|
||
}
|
||
|
||
func (s *Shares) baseShareUpdate(shareID string, key string, value string) error {
|
||
ro := &req.RequestOptions{
|
||
Data: map[string]string{key: value},
|
||
}
|
||
_, err := s.c.baseRequest(http.MethodPut, routes.shares, ro, shareID)
|
||
return err
|
||
}
|