package gonextcloud import ( "fmt" req "github.com/levigross/grequests" "gitlab.adphi.fr/partitio/Nextcloud-Partitio/gonextcloud/types" "net/http" "strconv" "sync" ) //SharesList list all shares of the logged in user func (c *Client) SharesList() ([]types.Share, error) { res, err := 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 } //Shares return shares from a specific file or folder func (c *Client) Shares(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 := 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 } //Share Get information about a known Share func (c *Client) Share(shareID string) (types.Share, error) { res, err := 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 } //ShareCreate create a share func (c *Client) ShareCreate( 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 := 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 } //ShareDelete Remove the given share. func (c *Client) ShareDelete(shareID int) error { _, err := c.baseRequest(http.MethodDelete, routes.shares, nil, strconv.Itoa(shareID)) return err } // ShareUpdate update share details // expireDate expireDate expects a well formatted date string, e.g. ‘YYYY-MM-DD’ func (c *Client) ShareUpdate(shareUpdate types.ShareUpdate) error { errs := make(chan types.UpdateError) var wg sync.WaitGroup wg.Add(4) go func() { defer wg.Done() if err := c.ShareUpdatePassword(shareUpdate.ShareID, shareUpdate.Password); err != nil { errs <- types.UpdateError{ Field: "password", Error: err, } } }() go func() { defer wg.Done() if err := c.ShareUpdateExpireDate(shareUpdate.ShareID, shareUpdate.ExpireDate); err != nil { errs <- types.UpdateError{ Field: "expireDate", Error: err, } } }() go func() { defer wg.Done() if err := c.ShareUpdatePermissions(shareUpdate.ShareID, shareUpdate.Permissions); err != nil { errs <- types.UpdateError{ Field: "permissions", Error: err, } } }() go func() { defer wg.Done() if err := c.ShareUpdatePublicUpload(shareUpdate.ShareID, shareUpdate.PublicUpload); err != nil { errs <- types.UpdateError{ Field: "publicUpload", Error: err, } } }() go func() { wg.Wait() close(errs) }() return types.NewUpdateError(errs) } // ShareUpdateExpireDate updates the share's expire date // expireDate expects a well formatted date string, e.g. ‘YYYY-MM-DD’ func (c *Client) ShareUpdateExpireDate(shareID int, expireDate string) error { return c.baseShareUpdate(strconv.Itoa(shareID), "expireDate", expireDate) } //ShareUpdatePublicUpload enable or disable public upload func (c *Client) ShareUpdatePublicUpload(shareID int, public bool) error { return c.baseShareUpdate(strconv.Itoa(shareID), "publicUpload", strconv.FormatBool(public)) } //ShareUpdatePassword updates share password func (c *Client) ShareUpdatePassword(shareID int, password string) error { return c.baseShareUpdate(strconv.Itoa(shareID), "password", password) } //ShareUpdatePermissions update permissions func (c *Client) ShareUpdatePermissions(shareID int, permissions types.SharePermission) error { return c.baseShareUpdate(strconv.Itoa(shareID), "permissions", strconv.Itoa(int(permissions))) } func (c *Client) baseShareUpdate(shareID string, key string, value string) error { ro := &req.RequestOptions{ Data: map[string]string{key: value}, } _, err := c.baseRequest(http.MethodPut, routes.shares, ro, shareID) return err }