mirror of
				https://gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud
				synced 2025-11-04 06:21:45 +00:00 
			
		
		
		
	code restructuration: private implementation
This commit is contained in:
		@@ -1,4 +1,4 @@
 | 
				
			|||||||
package types
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//App
 | 
					//App
 | 
				
			||||||
type App struct {
 | 
					type App struct {
 | 
				
			||||||
@@ -1,29 +1,29 @@
 | 
				
			|||||||
package gonextcloud
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	req "github.com/levigross/grequests"
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req "github.com/levigross/grequests"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Apps contains all Apps available actions
 | 
					//apps contains all apps available actions
 | 
				
			||||||
type Apps struct {
 | 
					type apps struct {
 | 
				
			||||||
	c *Client
 | 
						c *client
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//List return the list of the Nextcloud Apps
 | 
					//List return the list of the Nextcloud apps
 | 
				
			||||||
func (a *Apps) List() ([]string, error) {
 | 
					func (a *apps) List() ([]string, error) {
 | 
				
			||||||
	res, err := a.c.baseRequest(http.MethodGet, routes.apps, nil)
 | 
						res, err := a.c.baseRequest(http.MethodGet, routes.apps, nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.AppListResponse
 | 
						var r AppListResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Apps, nil
 | 
						return r.Ocs.Data.Apps, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//ListEnabled lists the enabled apps
 | 
					//ListEnabled lists the enabled apps
 | 
				
			||||||
func (a *Apps) ListEnabled() ([]string, error) {
 | 
					func (a *apps) ListEnabled() ([]string, error) {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Params: map[string]string{"filter": "enabled"},
 | 
							Params: map[string]string{"filter": "enabled"},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -31,13 +31,13 @@ func (a *Apps) ListEnabled() ([]string, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.AppListResponse
 | 
						var r AppListResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Apps, nil
 | 
						return r.Ocs.Data.Apps, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//ListDisabled lists the disabled apps
 | 
					//ListDisabled lists the disabled apps
 | 
				
			||||||
func (a *Apps) ListDisabled() ([]string, error) {
 | 
					func (a *apps) ListDisabled() ([]string, error) {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Params: map[string]string{"filter": "disabled"},
 | 
							Params: map[string]string{"filter": "disabled"},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -45,30 +45,30 @@ func (a *Apps) ListDisabled() ([]string, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.AppListResponse
 | 
						var r AppListResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Apps, nil
 | 
						return r.Ocs.Data.Apps, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Infos return the app's details
 | 
					//Infos return the app's details
 | 
				
			||||||
func (a *Apps) Infos(name string) (types.App, error) {
 | 
					func (a *apps) Infos(name string) (App, error) {
 | 
				
			||||||
	res, err := a.c.baseRequest(http.MethodGet, routes.apps, nil, name)
 | 
						res, err := a.c.baseRequest(http.MethodGet, routes.apps, nil, name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return types.App{}, err
 | 
							return App{}, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.AppResponse
 | 
						var r AppResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data, nil
 | 
						return r.Ocs.Data, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Enable enables an app
 | 
					//Enable enables an app
 | 
				
			||||||
func (a *Apps) Enable(name string) error {
 | 
					func (a *apps) Enable(name string) error {
 | 
				
			||||||
	_, err := a.c.baseRequest(http.MethodPost, routes.apps, nil, name)
 | 
						_, err := a.c.baseRequest(http.MethodPost, routes.apps, nil, name)
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Disable disables an app
 | 
					//Disable disables an app
 | 
				
			||||||
func (a *Apps) Disable(name string) error {
 | 
					func (a *apps) Disable(name string) error {
 | 
				
			||||||
	_, err := a.c.baseRequest(http.MethodDelete, routes.apps, nil, name)
 | 
						_, err := a.c.baseRequest(http.MethodDelete, routes.apps, nil, name)
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1,52 +1,52 @@
 | 
				
			|||||||
package gonextcloud
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	req "github.com/levigross/grequests"
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req "github.com/levigross/grequests"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//AppsConfig contains all Apps Configuration available actions
 | 
					//appsConfig contains all apps Configuration available actions
 | 
				
			||||||
type AppsConfig struct {
 | 
					type appsConfig struct {
 | 
				
			||||||
	c *Client
 | 
						c *client
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//List lists all the available apps
 | 
					//List lists all the available apps
 | 
				
			||||||
func (a *AppsConfig) List() (apps []string, err error) {
 | 
					func (a *appsConfig) List() (apps []string, err error) {
 | 
				
			||||||
	res, err := a.c.baseRequest(http.MethodGet, routes.appsConfig, nil)
 | 
						res, err := a.c.baseRequest(http.MethodGet, routes.appsConfig, nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.AppConfigResponse
 | 
						var r AppConfigResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Data, nil
 | 
						return r.Ocs.Data.Data, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Keys returns the app's config keys
 | 
					//Keys returns the app's config keys
 | 
				
			||||||
func (a *AppsConfig) Keys(id string) (keys []string, err error) {
 | 
					func (a *appsConfig) Keys(id string) (keys []string, err error) {
 | 
				
			||||||
	res, err := a.c.baseRequest(http.MethodGet, routes.appsConfig, nil, id)
 | 
						res, err := a.c.baseRequest(http.MethodGet, routes.appsConfig, nil, id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.AppConfigResponse
 | 
						var r AppConfigResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Data, nil
 | 
						return r.Ocs.Data.Data, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Value get the config value for the given app's key
 | 
					//Value get the config value for the given app's key
 | 
				
			||||||
func (a *AppsConfig) Value(id, key string) (string, error) {
 | 
					func (a *appsConfig) Value(id, key string) (string, error) {
 | 
				
			||||||
	res, err := a.c.baseRequest(http.MethodGet, routes.appsConfig, nil, id, key)
 | 
						res, err := a.c.baseRequest(http.MethodGet, routes.appsConfig, nil, id, key)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", err
 | 
							return "", err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.AppcConfigValueResponse
 | 
						var r AppcConfigValueResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Data, nil
 | 
						return r.Ocs.Data.Data, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//SetValue set the config value for the given app's key
 | 
					//SetValue set the config value for the given app's key
 | 
				
			||||||
func (a *AppsConfig) SetValue(id, key, value string) error {
 | 
					func (a *appsConfig) SetValue(id, key, value string) error {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Data: map[string]string{
 | 
							Data: map[string]string{
 | 
				
			||||||
			"value": value,
 | 
								"value": value,
 | 
				
			||||||
@@ -57,13 +57,13 @@ func (a *AppsConfig) SetValue(id, key, value string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//DeleteValue delete the config value and (!! be careful !!) the key
 | 
					//DeleteValue delete the config value and (!! be careful !!) the key
 | 
				
			||||||
func (a *AppsConfig) DeleteValue(id, key, value string) error {
 | 
					func (a *appsConfig) DeleteValue(id, key, value string) error {
 | 
				
			||||||
	_, err := a.c.baseRequest(http.MethodDelete, routes.appsConfig, nil, id, key)
 | 
						_, err := a.c.baseRequest(http.MethodDelete, routes.appsConfig, nil, id, key)
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Get returns all apps AppConfigDetails
 | 
					//Get returns all apps AppConfigDetails
 | 
				
			||||||
func (a *AppsConfig) Get() (map[string]map[string]string, error) {
 | 
					func (a *appsConfig) Get() (map[string]map[string]string, error) {
 | 
				
			||||||
	config := map[string]map[string]string{}
 | 
						config := map[string]map[string]string{}
 | 
				
			||||||
	m := sync.Mutex{}
 | 
						m := sync.Mutex{}
 | 
				
			||||||
	appsIDs, err := a.List()
 | 
						appsIDs, err := a.List()
 | 
				
			||||||
@@ -88,7 +88,7 @@ func (a *AppsConfig) Get() (map[string]map[string]string, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Details returns all the config's key, values pair of the app
 | 
					//Details returns all the config's key, values pair of the app
 | 
				
			||||||
func (a *AppsConfig) Details(appID string) (map[string]string, error) {
 | 
					func (a *appsConfig) Details(appID string) (map[string]string, error) {
 | 
				
			||||||
	config := map[string]string{}
 | 
						config := map[string]string{}
 | 
				
			||||||
	m := sync.Mutex{}
 | 
						m := sync.Mutex{}
 | 
				
			||||||
	var err error
 | 
						var err error
 | 
				
			||||||
@@ -4,14 +4,12 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	req "github.com/levigross/grequests"
 | 
						req "github.com/levigross/grequests"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var errUnauthorized = fmt.Errorf("login first")
 | 
					var errUnauthorized = fmt.Errorf("login first")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Login perform login and create a session with the Nextcloud API.
 | 
					// Login perform login and create a session with the Nextcloud API.
 | 
				
			||||||
func (c *Client) Login(username string, password string) error {
 | 
					func (c *client) Login(username string, password string) error {
 | 
				
			||||||
	c.username = username
 | 
						c.username = username
 | 
				
			||||||
	c.password = password
 | 
						c.password = password
 | 
				
			||||||
	options := req.RequestOptions{
 | 
						options := req.RequestOptions{
 | 
				
			||||||
@@ -25,14 +23,14 @@ func (c *Client) Login(username string, password string) error {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.CapabilitiesResponse
 | 
						var r CapabilitiesResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	// No need to check for Ocs.Meta.StatusCode as capabilities are always returned
 | 
						// No need to check for Ocs.Meta.StatusCode as capabilities are always returned
 | 
				
			||||||
	c.capabilities = &r.Ocs.Data.Capabilities
 | 
						c.capabilities = &r.Ocs.Data.Capabilities
 | 
				
			||||||
	c.version = &r.Ocs.Data.Version
 | 
						c.version = &r.Ocs.Data.Version
 | 
				
			||||||
	// Check if authentication failed
 | 
						// Check if authentication failed
 | 
				
			||||||
	if !c.loggedIn() {
 | 
						if !c.loggedIn() {
 | 
				
			||||||
		e := types.APIError{Message: "authentication failed"}
 | 
							e := APIError{Message: "authentication failed"}
 | 
				
			||||||
		return &e
 | 
							return &e
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Create webdav client
 | 
						// Create webdav client
 | 
				
			||||||
@@ -41,7 +39,7 @@ func (c *Client) Login(username string, password string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Logout logs out from the Nextcloud API, close the session and delete session's cookie
 | 
					// Logout logs out from the Nextcloud API, close the session and delete session's cookie
 | 
				
			||||||
func (c *Client) Logout() error {
 | 
					func (c *client) Logout() error {
 | 
				
			||||||
	c.session.CloseIdleConnections()
 | 
						c.session.CloseIdleConnections()
 | 
				
			||||||
	c.session.HTTPClient.Jar = nil
 | 
						c.session.HTTPClient.Jar = nil
 | 
				
			||||||
	// Clear capabilities as it is used to check for valid authentication
 | 
						// Clear capabilities as it is used to check for valid authentication
 | 
				
			||||||
@@ -49,7 +47,7 @@ func (c *Client) Logout() error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Client) loggedIn() bool {
 | 
					func (c *client) loggedIn() bool {
 | 
				
			||||||
	// When authentication failed, capabilities doesn't contains core information
 | 
						// When authentication failed, capabilities doesn't contains core information
 | 
				
			||||||
	if c.capabilities == nil {
 | 
						if c.capabilities == nil {
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package types
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Capabilities
 | 
					//Capabilities
 | 
				
			||||||
type Capabilities struct {
 | 
					type Capabilities struct {
 | 
				
			||||||
							
								
								
									
										101
									
								
								client.go
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								client.go
									
									
									
									
									
								
							@@ -1,101 +0,0 @@
 | 
				
			|||||||
package gonextcloud
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"net/url"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	req "github.com/levigross/grequests"
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/adphi/gowebdav"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Client is the API client that performs all operations against a Nextcloud server.
 | 
					 | 
				
			||||||
type Client struct {
 | 
					 | 
				
			||||||
	baseURL      *url.URL
 | 
					 | 
				
			||||||
	username     string
 | 
					 | 
				
			||||||
	password     string
 | 
					 | 
				
			||||||
	session      *req.Session
 | 
					 | 
				
			||||||
	headers      map[string]string
 | 
					 | 
				
			||||||
	capabilities *types.Capabilities
 | 
					 | 
				
			||||||
	version      *types.Version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	apps          *Apps
 | 
					 | 
				
			||||||
	appsConfig    *AppsConfig
 | 
					 | 
				
			||||||
	groupFolders  *GroupFolders
 | 
					 | 
				
			||||||
	notifications *Notifications
 | 
					 | 
				
			||||||
	shares        *Shares
 | 
					 | 
				
			||||||
	users         *Users
 | 
					 | 
				
			||||||
	groups        *Groups
 | 
					 | 
				
			||||||
	webdav        *webDav
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewClient create a new Client from the Nextcloud Instance URL
 | 
					 | 
				
			||||||
func NewClient(hostname string) (*Client, error) {
 | 
					 | 
				
			||||||
	baseURL, err := url.ParseRequestURI(hostname)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		baseURL, err = url.ParseRequestURI("https://" + hostname)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	c := &Client{
 | 
					 | 
				
			||||||
		baseURL: baseURL,
 | 
					 | 
				
			||||||
		headers: map[string]string{
 | 
					 | 
				
			||||||
			"OCS-APIREQUEST": "true",
 | 
					 | 
				
			||||||
			"Accept":         "application/json",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	c.apps = &Apps{c}
 | 
					 | 
				
			||||||
	c.appsConfig = &AppsConfig{c}
 | 
					 | 
				
			||||||
	c.groupFolders = &GroupFolders{c}
 | 
					 | 
				
			||||||
	c.notifications = &Notifications{c}
 | 
					 | 
				
			||||||
	c.shares = &Shares{c}
 | 
					 | 
				
			||||||
	c.users = &Users{c}
 | 
					 | 
				
			||||||
	c.groups = &Groups{c}
 | 
					 | 
				
			||||||
	// Create empty webdav client
 | 
					 | 
				
			||||||
	// It will be replaced after login
 | 
					 | 
				
			||||||
	c.webdav = &webDav{Client: &gowebdav.Client{}}
 | 
					 | 
				
			||||||
	return c, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Apps return the Apps client Interface
 | 
					 | 
				
			||||||
func (c *Client) Apps() types.Apps {
 | 
					 | 
				
			||||||
	return c.apps
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// AppsConfig return the AppsConfig client Interface
 | 
					 | 
				
			||||||
func (c *Client) AppsConfig() types.AppsConfig {
 | 
					 | 
				
			||||||
	return c.appsConfig
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GroupFolders return the GroupFolders client Interface
 | 
					 | 
				
			||||||
func (c *Client) GroupFolders() types.GroupFolders {
 | 
					 | 
				
			||||||
	return c.groupFolders
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Notifications return the Notifications client Interface
 | 
					 | 
				
			||||||
func (c *Client) Notifications() types.Notifications {
 | 
					 | 
				
			||||||
	return c.notifications
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Shares return the Shares client Interface
 | 
					 | 
				
			||||||
func (c *Client) Shares() types.Shares {
 | 
					 | 
				
			||||||
	return c.shares
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Users return the Users client Interface
 | 
					 | 
				
			||||||
func (c *Client) Users() types.Users {
 | 
					 | 
				
			||||||
	return c.users
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Groups return the Groups client Interface
 | 
					 | 
				
			||||||
func (c *Client) Groups() types.Groups {
 | 
					 | 
				
			||||||
	return c.groups
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WebDav return the WebDav client Interface
 | 
					 | 
				
			||||||
func (c *Client) WebDav() types.WebDav {
 | 
					 | 
				
			||||||
	return c.webdav
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										99
									
								
								client_impl.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								client_impl.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
				
			|||||||
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"net/url"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req "github.com/levigross/grequests"
 | 
				
			||||||
 | 
						"gitlab.bertha.cloud/adphi/gowebdav"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// client is the API client that performs all operations against a Nextcloud server.
 | 
				
			||||||
 | 
					type client struct {
 | 
				
			||||||
 | 
						baseURL      *url.URL
 | 
				
			||||||
 | 
						username     string
 | 
				
			||||||
 | 
						password     string
 | 
				
			||||||
 | 
						session      *req.Session
 | 
				
			||||||
 | 
						headers      map[string]string
 | 
				
			||||||
 | 
						capabilities *Capabilities
 | 
				
			||||||
 | 
						version      *Version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						apps          *apps
 | 
				
			||||||
 | 
						appsConfig    *appsConfig
 | 
				
			||||||
 | 
						groupFolders  *groupFolders
 | 
				
			||||||
 | 
						notifications *notifications
 | 
				
			||||||
 | 
						shares        *shares
 | 
				
			||||||
 | 
						users         *users
 | 
				
			||||||
 | 
						groups        *groups
 | 
				
			||||||
 | 
						webdav        *webDav
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// newClient create a new client from the Nextcloud Instance URL
 | 
				
			||||||
 | 
					func newClient(hostname string) (*client, error) {
 | 
				
			||||||
 | 
						baseURL, err := url.ParseRequestURI(hostname)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							baseURL, err = url.ParseRequestURI("https://" + hostname)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						c := &client{
 | 
				
			||||||
 | 
							baseURL: baseURL,
 | 
				
			||||||
 | 
							headers: map[string]string{
 | 
				
			||||||
 | 
								"OCS-APIREQUEST": "true",
 | 
				
			||||||
 | 
								"Accept":         "application/json",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						c.apps = &apps{c}
 | 
				
			||||||
 | 
						c.appsConfig = &appsConfig{c}
 | 
				
			||||||
 | 
						c.groupFolders = &groupFolders{c}
 | 
				
			||||||
 | 
						c.notifications = ¬ifications{c}
 | 
				
			||||||
 | 
						c.shares = &shares{c}
 | 
				
			||||||
 | 
						c.users = &users{c}
 | 
				
			||||||
 | 
						c.groups = &groups{c}
 | 
				
			||||||
 | 
						// Create empty webdav client
 | 
				
			||||||
 | 
						// It will be replaced after login
 | 
				
			||||||
 | 
						c.webdav = &webDav{Client: &gowebdav.Client{}}
 | 
				
			||||||
 | 
						return c, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// apps return the apps client Interface
 | 
				
			||||||
 | 
					func (c *client) Apps() Apps {
 | 
				
			||||||
 | 
						return c.apps
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// appsConfig return the appsConfig client Interface
 | 
				
			||||||
 | 
					func (c *client) AppsConfig() AppsConfig {
 | 
				
			||||||
 | 
						return c.appsConfig
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// groupFolders return the groupFolders client Interface
 | 
				
			||||||
 | 
					func (c *client) GroupFolders() GroupFolders {
 | 
				
			||||||
 | 
						return c.groupFolders
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// notifications return the notifications client Interface
 | 
				
			||||||
 | 
					func (c *client) Notifications() Notifications {
 | 
				
			||||||
 | 
						return c.notifications
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// shares return the shares client Interface
 | 
				
			||||||
 | 
					func (c *client) Shares() Shares {
 | 
				
			||||||
 | 
						return c.shares
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// users return the users client Interface
 | 
				
			||||||
 | 
					func (c *client) Users() Users {
 | 
				
			||||||
 | 
						return c.users
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// groups return the groups client Interface
 | 
				
			||||||
 | 
					func (c *client) Groups() Groups {
 | 
				
			||||||
 | 
						return c.groups
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WebDav return the WebDav client Interface
 | 
				
			||||||
 | 
					func (c *client) WebDav() WebDav {
 | 
				
			||||||
 | 
						return c.webdav
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										6
									
								
								doc.go
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								doc.go
									
									
									
									
									
								
							@@ -21,7 +21,7 @@ For example, to list all the Nextcloud's instance users:
 | 
				
			|||||||
		url := "https://www.mynextcloud.com"
 | 
							url := "https://www.mynextcloud.com"
 | 
				
			||||||
		username := "admin"
 | 
							username := "admin"
 | 
				
			||||||
		password := "password"
 | 
							password := "password"
 | 
				
			||||||
		c, err := gonextcloud.NewClient(url)
 | 
							c, err := gonextcloud.newClient(url)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			panic(err)
 | 
								panic(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -30,11 +30,11 @@ For example, to list all the Nextcloud's instance users:
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		defer c.Logout()
 | 
							defer c.Logout()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		users, err := c.Users().List()
 | 
							users, err := c.users().List()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			panic(err)
 | 
								panic(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		fmt.Println("Users :", users)
 | 
							fmt.Println("users :", users)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
package gonextcloud
 | 
					package gonextcloud
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package types
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -1,11 +1,12 @@
 | 
				
			|||||||
package types
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
					 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestUserUpdateErrors(t *testing.T) {
 | 
					func TestUserUpdateErrors(t *testing.T) {
 | 
				
			||||||
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							@@ -10,7 +10,6 @@ require (
 | 
				
			|||||||
	github.com/pkg/errors v0.0.0-20181023235946-059132a15dd0
 | 
						github.com/pkg/errors v0.0.0-20181023235946-059132a15dd0
 | 
				
			||||||
	github.com/sirupsen/logrus v1.4.2
 | 
						github.com/sirupsen/logrus v1.4.2
 | 
				
			||||||
	github.com/stretchr/testify v1.2.2
 | 
						github.com/stretchr/testify v1.2.2
 | 
				
			||||||
	github.com/studio-b12/gowebdav v0.0.0-20190103184047-38f79aeaf1ac
 | 
					 | 
				
			||||||
	gitlab.bertha.cloud/adphi/gowebdav v0.0.0-20190720232020-771eec6e76d0
 | 
						gitlab.bertha.cloud/adphi/gowebdav v0.0.0-20190720232020-771eec6e76d0
 | 
				
			||||||
	golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect
 | 
						golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect
 | 
				
			||||||
	golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect
 | 
						golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							@@ -23,8 +23,6 @@ github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
 | 
				
			|||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
 | 
					github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
 | 
				
			||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
				
			||||||
github.com/studio-b12/gowebdav v0.0.0-20190103184047-38f79aeaf1ac h1:xQ9gCVzqb939vjhxuES4IXYe4AlHB4Q71/K06aazQmQ=
 | 
					 | 
				
			||||||
github.com/studio-b12/gowebdav v0.0.0-20190103184047-38f79aeaf1ac/go.mod h1:gCcfDlA1Y7GqOaeEKw5l9dOGx1VLdc/HuQSlQAaZ30s=
 | 
					 | 
				
			||||||
gitlab.bertha.cloud/adphi/gowebdav v0.0.0-20190720232020-771eec6e76d0 h1:kjJ5Xn+FgD+QvWP670A2hmdMqxWkOuffMukEA1JSGo4=
 | 
					gitlab.bertha.cloud/adphi/gowebdav v0.0.0-20190720232020-771eec6e76d0 h1:kjJ5Xn+FgD+QvWP670A2hmdMqxWkOuffMukEA1JSGo4=
 | 
				
			||||||
gitlab.bertha.cloud/adphi/gowebdav v0.0.0-20190720232020-771eec6e76d0/go.mod h1:Nr6YgM/ZBLPOlAAjcER6HSAXF64AAlal6AJ2CEKg2Fc=
 | 
					gitlab.bertha.cloud/adphi/gowebdav v0.0.0-20190720232020-771eec6e76d0/go.mod h1:Nr6YgM/ZBLPOlAAjcER6HSAXF64AAlal6AJ2CEKg2Fc=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,11 @@
 | 
				
			|||||||
package types
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Client is the main client interface
 | 
					// NewClient create a new client
 | 
				
			||||||
 | 
					func NewClient(hostname string) (Client, error) {
 | 
				
			||||||
 | 
						return newClient(hostname)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Client is the main client interface
 | 
				
			||||||
type Client interface {
 | 
					type Client interface {
 | 
				
			||||||
	Apps() Apps
 | 
						Apps() Apps
 | 
				
			||||||
	AppsConfig() AppsConfig
 | 
						AppsConfig() AppsConfig
 | 
				
			||||||
@@ -10,6 +15,7 @@ type Client interface {
 | 
				
			|||||||
	Users() Users
 | 
						Users() Users
 | 
				
			||||||
	Groups() Groups
 | 
						Groups() Groups
 | 
				
			||||||
	WebDav() WebDav
 | 
						WebDav() WebDav
 | 
				
			||||||
 | 
						Monitoring() (*Monitoring, error)
 | 
				
			||||||
	Login(username string, password string) error
 | 
						Login(username string, password string) error
 | 
				
			||||||
	Logout() error
 | 
						Logout() error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -19,7 +25,7 @@ type Auth interface {
 | 
				
			|||||||
	Logout() error
 | 
						Logout() error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Apps available methods
 | 
					// Apps available methods
 | 
				
			||||||
type Apps interface {
 | 
					type Apps interface {
 | 
				
			||||||
	List() ([]string, error)
 | 
						List() ([]string, error)
 | 
				
			||||||
	ListEnabled() ([]string, error)
 | 
						ListEnabled() ([]string, error)
 | 
				
			||||||
@@ -29,7 +35,7 @@ type Apps interface {
 | 
				
			|||||||
	Disable(name string) error
 | 
						Disable(name string) error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//AppsConfig available methods
 | 
					// AppsConfig available methods
 | 
				
			||||||
type AppsConfig interface {
 | 
					type AppsConfig interface {
 | 
				
			||||||
	List() (apps []string, err error)
 | 
						List() (apps []string, err error)
 | 
				
			||||||
	Keys(id string) (keys []string, err error)
 | 
						Keys(id string) (keys []string, err error)
 | 
				
			||||||
@@ -40,7 +46,7 @@ type AppsConfig interface {
 | 
				
			|||||||
	Details(appID string) (map[string]string, error)
 | 
						Details(appID string) (map[string]string, error)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Groups available methods
 | 
					// Groups available methods
 | 
				
			||||||
type Groups interface {
 | 
					type Groups interface {
 | 
				
			||||||
	List() ([]string, error)
 | 
						List() ([]string, error)
 | 
				
			||||||
	ListDetails(search string) ([]Group, error)
 | 
						ListDetails(search string) ([]Group, error)
 | 
				
			||||||
@@ -51,7 +57,7 @@ type Groups interface {
 | 
				
			|||||||
	SubAdminList(name string) ([]string, error)
 | 
						SubAdminList(name string) ([]string, error)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//GroupFolders available methods
 | 
					// GroupFolders available methods
 | 
				
			||||||
type GroupFolders interface {
 | 
					type GroupFolders interface {
 | 
				
			||||||
	List() (map[int]GroupFolder, error)
 | 
						List() (map[int]GroupFolder, error)
 | 
				
			||||||
	Get(id int) (GroupFolder, error)
 | 
						Get(id int) (GroupFolder, error)
 | 
				
			||||||
@@ -63,7 +69,7 @@ type GroupFolders interface {
 | 
				
			|||||||
	SetQuota(folderID int, quota int) error
 | 
						SetQuota(folderID int, quota int) error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Notifications available methods
 | 
					// Notifications available methods
 | 
				
			||||||
type Notifications interface {
 | 
					type Notifications interface {
 | 
				
			||||||
	List() ([]Notification, error)
 | 
						List() ([]Notification, error)
 | 
				
			||||||
	Get(id int) (Notification, error)
 | 
						Get(id int) (Notification, error)
 | 
				
			||||||
@@ -74,7 +80,7 @@ type Notifications interface {
 | 
				
			|||||||
	Available() error
 | 
						Available() error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Shares available methods
 | 
					// Shares available methods
 | 
				
			||||||
type Shares interface {
 | 
					type Shares interface {
 | 
				
			||||||
	List() ([]Share, error)
 | 
						List() ([]Share, error)
 | 
				
			||||||
	GetFromPath(path string, reshares bool, subfiles bool) ([]Share, error)
 | 
						GetFromPath(path string, reshares bool, subfiles bool) ([]Share, error)
 | 
				
			||||||
@@ -95,7 +101,7 @@ type Shares interface {
 | 
				
			|||||||
	UpdatePermissions(shareID int, permissions SharePermission) error
 | 
						UpdatePermissions(shareID int, permissions SharePermission) error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Users available methods
 | 
					// Users available methods
 | 
				
			||||||
type Users interface {
 | 
					type Users interface {
 | 
				
			||||||
	List() ([]string, error)
 | 
						List() ([]string, error)
 | 
				
			||||||
	ListDetails() (map[string]UserDetails, error)
 | 
						ListDetails() (map[string]UserDetails, error)
 | 
				
			||||||
@@ -2,9 +2,6 @@ package gonextcloud
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
	"gopkg.in/yaml.v2"
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"math/rand"
 | 
						"math/rand"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
@@ -15,6 +12,9 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
						"gopkg.in/yaml.v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Config struct {
 | 
					type Config struct {
 | 
				
			||||||
@@ -35,7 +35,7 @@ type test = func(t *testing.T)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	config             = Config{}
 | 
						config             = Config{}
 | 
				
			||||||
	c                  *Client
 | 
						c                  *client
 | 
				
			||||||
	groupID            = 37
 | 
						groupID            = 37
 | 
				
			||||||
	provisionningTests = []struct {
 | 
						provisionningTests = []struct {
 | 
				
			||||||
		string
 | 
							string
 | 
				
			||||||
@@ -52,7 +52,7 @@ var (
 | 
				
			|||||||
			"create client",
 | 
								"create client",
 | 
				
			||||||
			func(t *testing.T) {
 | 
								func(t *testing.T) {
 | 
				
			||||||
				var err error
 | 
									var err error
 | 
				
			||||||
				c, err = NewClient(config.URL)
 | 
									c, err = newClient(config.URL)
 | 
				
			||||||
				assert.NoError(t, err, "aie")
 | 
									assert.NoError(t, err, "aie")
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -131,7 +131,7 @@ var (
 | 
				
			|||||||
		//			return
 | 
							//			return
 | 
				
			||||||
		//		}
 | 
							//		}
 | 
				
			||||||
		//		username := fmt.Sprintf("%s-2", config.NotExistingUser)
 | 
							//		username := fmt.Sprintf("%s-2", config.NotExistingUser)
 | 
				
			||||||
		//		user := &types.Users{
 | 
							//		user := &types.users{
 | 
				
			||||||
		//			ID:          username,
 | 
							//			ID:          username,
 | 
				
			||||||
		//			Displayname: strings.ToUpper(username),
 | 
							//			Displayname: strings.ToUpper(username),
 | 
				
			||||||
		//			Email:       "some@address.com",
 | 
							//			Email:       "some@address.com",
 | 
				
			||||||
@@ -140,9 +140,9 @@ var (
 | 
				
			|||||||
		//			Phone:       "42 42 242 424",
 | 
							//			Phone:       "42 42 242 424",
 | 
				
			||||||
		//			Website:     "my.site.com",
 | 
							//			Website:     "my.site.com",
 | 
				
			||||||
		//		}
 | 
							//		}
 | 
				
			||||||
		//		err := c.Users().Create(username, password, user)
 | 
							//		err := c.users().Create(username, password, user)
 | 
				
			||||||
		//		assert.NoError(t, err)
 | 
							//		assert.NoError(t, err)
 | 
				
			||||||
		//		u, err := c.Users().Get(username)
 | 
							//		u, err := c.users().Get(username)
 | 
				
			||||||
		//		assert.NoError(t, err)
 | 
							//		assert.NoError(t, err)
 | 
				
			||||||
		//		o := structs.Map(user)
 | 
							//		o := structs.Map(user)
 | 
				
			||||||
		//		r := structs.Map(u)
 | 
							//		r := structs.Map(u)
 | 
				
			||||||
@@ -153,7 +153,7 @@ var (
 | 
				
			|||||||
		//			assert.Equal(t, o[k], r[k])
 | 
							//			assert.Equal(t, o[k], r[k])
 | 
				
			||||||
		//		}
 | 
							//		}
 | 
				
			||||||
		//		// Clean up
 | 
							//		// Clean up
 | 
				
			||||||
		//		err = c.Users().Delete(u.ID)
 | 
							//		err = c.users().Delete(u.ID)
 | 
				
			||||||
		//		assert.NoError(t, err)
 | 
							//		assert.NoError(t, err)
 | 
				
			||||||
		//	},
 | 
							//	},
 | 
				
			||||||
		//},
 | 
							//},
 | 
				
			||||||
@@ -283,8 +283,8 @@ var (
 | 
				
			|||||||
				quota := int64(1024 * 1024 * 1024)
 | 
									quota := int64(1024 * 1024 * 1024)
 | 
				
			||||||
				err := c.Users().UpdateQuota(config.NotExistingUser, quota)
 | 
									err := c.Users().UpdateQuota(config.NotExistingUser, quota)
 | 
				
			||||||
				assert.NoError(t, err)
 | 
									assert.NoError(t, err)
 | 
				
			||||||
				// TODO : Find better verification : A never connected Users does not have quota available
 | 
									// TODO : Find better verification : A never connected users does not have quota available
 | 
				
			||||||
				//u, err := c.Users(config.NotExistingUser)
 | 
									//u, err := c.users(config.NotExistingUser)
 | 
				
			||||||
				//assert.NoError(t, err)
 | 
									//assert.NoError(t, err)
 | 
				
			||||||
				//assert.Equal(t, quota, u.Quota.Quota)
 | 
									//assert.Equal(t, quota, u.Quota.Quota)
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -407,15 +407,15 @@ var (
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			"TestLoggedIn",
 | 
								"TestLoggedIn",
 | 
				
			||||||
			func(t *testing.T) {
 | 
								func(t *testing.T) {
 | 
				
			||||||
				c := &Client{}
 | 
									c := &client{}
 | 
				
			||||||
				c.capabilities = &types.Capabilities{}
 | 
									c.capabilities = &Capabilities{}
 | 
				
			||||||
				assert.False(t, c.loggedIn())
 | 
									assert.False(t, c.loggedIn())
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"TestLoginInvalidURL",
 | 
								"TestLoginInvalidURL",
 | 
				
			||||||
			func(t *testing.T) {
 | 
								func(t *testing.T) {
 | 
				
			||||||
				c, _ = NewClient("")
 | 
									c, _ = newClient("")
 | 
				
			||||||
				err := c.Login("", "")
 | 
									err := c.Login("", "")
 | 
				
			||||||
				assert.Error(t, err)
 | 
									assert.Error(t, err)
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -423,7 +423,7 @@ var (
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			"TestBaseRequest",
 | 
								"TestBaseRequest",
 | 
				
			||||||
			func(t *testing.T) {
 | 
								func(t *testing.T) {
 | 
				
			||||||
				c, _ = NewClient("")
 | 
									c, _ = newClient("")
 | 
				
			||||||
				_, err := c.baseRequest(http.MethodGet, routes.capabilities, nil, "admin", "invalid")
 | 
									_, err := c.baseRequest(http.MethodGet, routes.capabilities, nil, "admin", "invalid")
 | 
				
			||||||
				assert.Error(t, err)
 | 
									assert.Error(t, err)
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -463,10 +463,10 @@ func TestUserCreateBatchWithoutPassword(t *testing.T) {
 | 
				
			|||||||
	if c.version.Major < 14 {
 | 
						if c.version.Major < 14 {
 | 
				
			||||||
		t.SkipNow()
 | 
							t.SkipNow()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var us []types.User
 | 
						var us []User
 | 
				
			||||||
	for i := 0; i < 5; i++ {
 | 
						for i := 0; i < 5; i++ {
 | 
				
			||||||
		u := fmt.Sprintf(config.NotExistingUser+"_%d", i)
 | 
							u := fmt.Sprintf(config.NotExistingUser+"_%d", i)
 | 
				
			||||||
		us = append(us, types.User{
 | 
							us = append(us, User{
 | 
				
			||||||
			Username:    u,
 | 
								Username:    u,
 | 
				
			||||||
			DisplayName: strings.Title(u),
 | 
								DisplayName: strings.Title(u),
 | 
				
			||||||
			Groups:      []string{"admin"},
 | 
								Groups:      []string{"admin"},
 | 
				
			||||||
@@ -547,7 +547,7 @@ func initClient() error {
 | 
				
			|||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		var err error
 | 
							var err error
 | 
				
			||||||
		c, err = NewClient(config.URL)
 | 
							c, err = newClient(config.URL)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package types
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Group
 | 
					//Group
 | 
				
			||||||
type Group struct {
 | 
					type Group struct {
 | 
				
			||||||
							
								
								
									
										169
									
								
								groupfolders.go
									
									
									
									
									
								
							
							
						
						
									
										169
									
								
								groupfolders.go
									
									
									
									
									
								
							@@ -1,140 +1,57 @@
 | 
				
			|||||||
package gonextcloud
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import "strconv"
 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	req "github.com/levigross/grequests"
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"strconv"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
//GroupFolders contains all Groups Folders available actions
 | 
					type GroupFolderBadFormatIDAndGroups struct {
 | 
				
			||||||
type GroupFolders struct {
 | 
						ID         string            `json:"id"`
 | 
				
			||||||
	c *Client
 | 
						MountPoint string            `json:"mount_point"`
 | 
				
			||||||
 | 
						Groups     map[string]string `json:"groups"`
 | 
				
			||||||
 | 
						Quota      string            `json:"quota"`
 | 
				
			||||||
 | 
						Size       int               `json:"size"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//List returns the groups folders
 | 
					type GroupFolderBadFormatGroups struct {
 | 
				
			||||||
func (g *GroupFolders) List() (map[int]types.GroupFolder, error) {
 | 
						ID         int               `json:"id"`
 | 
				
			||||||
	res, err := g.c.baseRequest(http.MethodGet, routes.groupfolders, nil)
 | 
						MountPoint string            `json:"mount_point"`
 | 
				
			||||||
	if err != nil {
 | 
						Groups     map[string]string `json:"groups"`
 | 
				
			||||||
		return nil, err
 | 
						Quota      string            `json:"quota"`
 | 
				
			||||||
	}
 | 
						Size       int               `json:"size"`
 | 
				
			||||||
	var r types.GroupFoldersListResponse
 | 
					 | 
				
			||||||
	res.JSON(&r)
 | 
					 | 
				
			||||||
	gfs := formatBadIDAndGroups(r.Ocs.Data)
 | 
					 | 
				
			||||||
	return gfs, nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Get returns the group folder details
 | 
					type GroupFolder struct {
 | 
				
			||||||
func (g *GroupFolders) Get(id int) (types.GroupFolder, error) {
 | 
						ID         int                        `json:"id"`
 | 
				
			||||||
	res, err := g.c.baseRequest(http.MethodGet, routes.groupfolders, nil, strconv.Itoa(id))
 | 
						MountPoint string                     `json:"mount_point"`
 | 
				
			||||||
	if err != nil {
 | 
						Groups     map[string]SharePermission `json:"groups"`
 | 
				
			||||||
		return types.GroupFolder{}, err
 | 
						Quota      int                        `json:"quota"`
 | 
				
			||||||
	}
 | 
						Size       int                        `json:"size"`
 | 
				
			||||||
	var r types.GroupFoldersResponse
 | 
					 | 
				
			||||||
	res.JSON(&r)
 | 
					 | 
				
			||||||
	if r.Ocs.Data.ID == 0 {
 | 
					 | 
				
			||||||
		return types.GroupFolder{}, fmt.Errorf("%d is not a valid groupfolder's id", id)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return r.Ocs.Data.FormatGroupFolder(), nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Create creates a group folder
 | 
					func (gf *GroupFolderBadFormatGroups) FormatGroupFolder() GroupFolder {
 | 
				
			||||||
func (g *GroupFolders) Create(name string) (id int, err error) {
 | 
						g := GroupFolder{}
 | 
				
			||||||
	// TODO: Validate Folder name
 | 
						g.ID = gf.ID
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						g.MountPoint = gf.MountPoint
 | 
				
			||||||
		Data: map[string]string{
 | 
						g.Groups = map[string]SharePermission{}
 | 
				
			||||||
			"mountpoint": name,
 | 
						for k, v := range gf.Groups {
 | 
				
			||||||
		},
 | 
							p, _ := strconv.Atoi(v)
 | 
				
			||||||
 | 
							g.Groups[k] = SharePermission(p)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res, err := g.c.baseRequest(http.MethodPost, routes.groupfolders, ro)
 | 
						q, _ := strconv.Atoi(gf.Quota)
 | 
				
			||||||
	if err != nil {
 | 
						g.Quota = q
 | 
				
			||||||
		return 0, err
 | 
						g.Size = gf.Size
 | 
				
			||||||
	}
 | 
						return g
 | 
				
			||||||
	var r types.GroupFoldersCreateResponse
 | 
					 | 
				
			||||||
	res.JSON(&r)
 | 
					 | 
				
			||||||
	id, _ = strconv.Atoi(r.Ocs.Data.ID)
 | 
					 | 
				
			||||||
	return id, nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Rename renames the group folder
 | 
					func (gf *GroupFolderBadFormatIDAndGroups) FormatGroupFolder() GroupFolder {
 | 
				
			||||||
func (g *GroupFolders) Rename(groupID int, name string) error {
 | 
						g := GroupFolder{}
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						g.ID, _ = strconv.Atoi(gf.ID)
 | 
				
			||||||
		Data: map[string]string{
 | 
						g.MountPoint = gf.MountPoint
 | 
				
			||||||
			"mountpoint": name,
 | 
						g.Groups = map[string]SharePermission{}
 | 
				
			||||||
		},
 | 
						for k, v := range gf.Groups {
 | 
				
			||||||
 | 
							p, _ := strconv.Atoi(v)
 | 
				
			||||||
 | 
							g.Groups[k] = SharePermission(p)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// GroupFolders's response does not give any clues about success or failure
 | 
						q, _ := strconv.Atoi(gf.Quota)
 | 
				
			||||||
	_, err := g.c.baseRequest(http.MethodPost, routes.groupfolders, ro, strconv.Itoa(groupID), "mountpoint")
 | 
						g.Quota = q
 | 
				
			||||||
	if err != nil {
 | 
						g.Size = gf.Size
 | 
				
			||||||
		return err
 | 
						return g
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//TODO func (c *Client) GroupFoldersDelete(id int) error {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//AddGroup adds group to folder
 | 
					 | 
				
			||||||
func (g *GroupFolders) AddGroup(folderID int, groupName string) error {
 | 
					 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
					 | 
				
			||||||
		Data: map[string]string{
 | 
					 | 
				
			||||||
			"group": groupName,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// GroupFolders's response does not give any clues about success or failure
 | 
					 | 
				
			||||||
	_, err := g.c.baseRequest(http.MethodPost, routes.groupfolders, ro, strconv.Itoa(folderID), "groups")
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//RemoveGroup remove a group from the group folder
 | 
					 | 
				
			||||||
func (g *GroupFolders) RemoveGroup(folderID int, groupName string) error {
 | 
					 | 
				
			||||||
	// GroupFolders's response does not give any clues about success or failure
 | 
					 | 
				
			||||||
	_, err := g.c.baseRequest(http.MethodDelete, routes.groupfolders, nil, strconv.Itoa(folderID), "groups", groupName)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//SetGroupPermissions set groups permissions
 | 
					 | 
				
			||||||
func (g *GroupFolders) SetGroupPermissions(folderID int, groupName string, permission types.SharePermission) error {
 | 
					 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
					 | 
				
			||||||
		Data: map[string]string{
 | 
					 | 
				
			||||||
			"permissions": strconv.Itoa(int(permission)),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// GroupFolders's response does not give any clues about success or failure
 | 
					 | 
				
			||||||
	_, err := g.c.baseRequest(http.MethodPost, routes.groupfolders, ro, strconv.Itoa(folderID), "groups", groupName)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//SetQuota set quota on the group folder. quota in bytes, use -3 for unlimited
 | 
					 | 
				
			||||||
func (g *GroupFolders) SetQuota(folderID int, quota int) error {
 | 
					 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
					 | 
				
			||||||
		Data: map[string]string{
 | 
					 | 
				
			||||||
			"quota": strconv.Itoa(int(quota)),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// GroupFolders's response does not give any clues about success or failure
 | 
					 | 
				
			||||||
	_, err := g.c.baseRequest(http.MethodPost, routes.groupfolders, ro, strconv.Itoa(folderID), "quota")
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func formatBadIDAndGroups(g map[string]types.GroupFolderBadFormatIDAndGroups) map[int]types.GroupFolder {
 | 
					 | 
				
			||||||
	var gfs = map[int]types.GroupFolder{}
 | 
					 | 
				
			||||||
	for k := range g {
 | 
					 | 
				
			||||||
		i, _ := strconv.Atoi(k)
 | 
					 | 
				
			||||||
		d := g[k]
 | 
					 | 
				
			||||||
		gfs[i] = d.FormatGroupFolder()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return gfs
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										140
									
								
								groupfolders_impl.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								groupfolders_impl.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,140 @@
 | 
				
			|||||||
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req "github.com/levigross/grequests"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//groupFolders contains all groups Folders available actions
 | 
				
			||||||
 | 
					type groupFolders struct {
 | 
				
			||||||
 | 
						c *client
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//List returns the groups folders
 | 
				
			||||||
 | 
					func (g *groupFolders) List() (map[int]GroupFolder, error) {
 | 
				
			||||||
 | 
						res, err := g.c.baseRequest(http.MethodGet, routes.groupfolders, nil)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var r GroupFoldersListResponse
 | 
				
			||||||
 | 
						res.JSON(&r)
 | 
				
			||||||
 | 
						gfs := formatBadIDAndGroups(r.Ocs.Data)
 | 
				
			||||||
 | 
						return gfs, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Get returns the group folder details
 | 
				
			||||||
 | 
					func (g *groupFolders) Get(id int) (GroupFolder, error) {
 | 
				
			||||||
 | 
						res, err := g.c.baseRequest(http.MethodGet, routes.groupfolders, nil, strconv.Itoa(id))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return GroupFolder{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var r GroupFoldersResponse
 | 
				
			||||||
 | 
						res.JSON(&r)
 | 
				
			||||||
 | 
						if r.Ocs.Data.ID == 0 {
 | 
				
			||||||
 | 
							return GroupFolder{}, fmt.Errorf("%d is not a valid groupfolder's id", id)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return r.Ocs.Data.FormatGroupFolder(), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Create creates a group folder
 | 
				
			||||||
 | 
					func (g *groupFolders) Create(name string) (id int, err error) {
 | 
				
			||||||
 | 
						// TODO: Validate Folder name
 | 
				
			||||||
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
 | 
							Data: map[string]string{
 | 
				
			||||||
 | 
								"mountpoint": name,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						res, err := g.c.baseRequest(http.MethodPost, routes.groupfolders, ro)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var r GroupFoldersCreateResponse
 | 
				
			||||||
 | 
						res.JSON(&r)
 | 
				
			||||||
 | 
						id, _ = strconv.Atoi(r.Ocs.Data.ID)
 | 
				
			||||||
 | 
						return id, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Rename renames the group folder
 | 
				
			||||||
 | 
					func (g *groupFolders) Rename(groupID int, name string) error {
 | 
				
			||||||
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
 | 
							Data: map[string]string{
 | 
				
			||||||
 | 
								"mountpoint": name,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// groupFolders's response does not give any clues about success or failure
 | 
				
			||||||
 | 
						_, err := g.c.baseRequest(http.MethodPost, routes.groupfolders, ro, strconv.Itoa(groupID), "mountpoint")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//TODO func (c *client) GroupFoldersDelete(id int) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//AddGroup adds group to folder
 | 
				
			||||||
 | 
					func (g *groupFolders) AddGroup(folderID int, groupName string) error {
 | 
				
			||||||
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
 | 
							Data: map[string]string{
 | 
				
			||||||
 | 
								"group": groupName,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// groupFolders's response does not give any clues about success or failure
 | 
				
			||||||
 | 
						_, err := g.c.baseRequest(http.MethodPost, routes.groupfolders, ro, strconv.Itoa(folderID), "groups")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//RemoveGroup remove a group from the group folder
 | 
				
			||||||
 | 
					func (g *groupFolders) RemoveGroup(folderID int, groupName string) error {
 | 
				
			||||||
 | 
						// groupFolders's response does not give any clues about success or failure
 | 
				
			||||||
 | 
						_, err := g.c.baseRequest(http.MethodDelete, routes.groupfolders, nil, strconv.Itoa(folderID), "groups", groupName)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//SetGroupPermissions set groups permissions
 | 
				
			||||||
 | 
					func (g *groupFolders) SetGroupPermissions(folderID int, groupName string, permission SharePermission) error {
 | 
				
			||||||
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
 | 
							Data: map[string]string{
 | 
				
			||||||
 | 
								"permissions": strconv.Itoa(int(permission)),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// groupFolders's response does not give any clues about success or failure
 | 
				
			||||||
 | 
						_, err := g.c.baseRequest(http.MethodPost, routes.groupfolders, ro, strconv.Itoa(folderID), "groups", groupName)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//SetQuota set quota on the group folder. quota in bytes, use -3 for unlimited
 | 
				
			||||||
 | 
					func (g *groupFolders) SetQuota(folderID int, quota int) error {
 | 
				
			||||||
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
 | 
							Data: map[string]string{
 | 
				
			||||||
 | 
								"quota": strconv.Itoa(int(quota)),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// groupFolders's response does not give any clues about success or failure
 | 
				
			||||||
 | 
						_, err := g.c.baseRequest(http.MethodPost, routes.groupfolders, ro, strconv.Itoa(folderID), "quota")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func formatBadIDAndGroups(g map[string]GroupFolderBadFormatIDAndGroups) map[int]GroupFolder {
 | 
				
			||||||
 | 
						var gfs = map[int]GroupFolder{}
 | 
				
			||||||
 | 
						for k := range g {
 | 
				
			||||||
 | 
							i, _ := strconv.Atoi(k)
 | 
				
			||||||
 | 
							d := g[k]
 | 
				
			||||||
 | 
							gfs[i] = d.FormatGroupFolder()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return gfs
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,9 +1,9 @@
 | 
				
			|||||||
package gonextcloud
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
@@ -53,7 +53,7 @@ var (
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			"TestGroupFoldersSetGroupPermissions",
 | 
								"TestGroupFoldersSetGroupPermissions",
 | 
				
			||||||
			func(t *testing.T) {
 | 
								func(t *testing.T) {
 | 
				
			||||||
				err := c.GroupFolders().SetGroupPermissions(groupID, "admin", types.ReadPermission)
 | 
									err := c.GroupFolders().SetGroupPermissions(groupID, "admin", ReadPermission)
 | 
				
			||||||
				assert.NoError(t, err)
 | 
									assert.NoError(t, err)
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -1,29 +1,29 @@
 | 
				
			|||||||
package gonextcloud
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	req "github.com/levigross/grequests"
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req "github.com/levigross/grequests"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Groups contains all Groups available actions
 | 
					//groups contains all groups available actions
 | 
				
			||||||
type Groups struct {
 | 
					type groups struct {
 | 
				
			||||||
	c *Client
 | 
						c *client
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//List lists the Nextcloud groups
 | 
					//List lists the Nextcloud groups
 | 
				
			||||||
func (g *Groups) List() ([]string, error) {
 | 
					func (g *groups) List() ([]string, error) {
 | 
				
			||||||
	res, err := g.c.baseRequest(http.MethodGet, routes.groups, nil)
 | 
						res, err := g.c.baseRequest(http.MethodGet, routes.groups, nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.GroupListResponse
 | 
						var r GroupListResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Groups, nil
 | 
						return r.Ocs.Data.Groups, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//ListDetails lists the Nextcloud groups
 | 
					//ListDetails lists the Nextcloud groups
 | 
				
			||||||
func (g *Groups) ListDetails(search string) ([]types.Group, error) {
 | 
					func (g *groups) ListDetails(search string) ([]Group, error) {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Params: map[string]string{
 | 
							Params: map[string]string{
 | 
				
			||||||
			"search": search,
 | 
								"search": search,
 | 
				
			||||||
@@ -33,24 +33,24 @@ func (g *Groups) ListDetails(search string) ([]types.Group, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.GroupListDetailsResponse
 | 
						var r GroupListDetailsResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Groups, nil
 | 
						return r.Ocs.Data.Groups, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Users list the group's users
 | 
					//users list the group's users
 | 
				
			||||||
func (g *Groups) Users(name string) ([]string, error) {
 | 
					func (g *groups) Users(name string) ([]string, error) {
 | 
				
			||||||
	res, err := g.c.baseRequest(http.MethodGet, routes.groups, nil, name)
 | 
						res, err := g.c.baseRequest(http.MethodGet, routes.groups, nil, name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.UserListResponse
 | 
						var r UserListResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Users, nil
 | 
						return r.Ocs.Data.Users, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Search return the list of groups matching the search string
 | 
					//Search return the list of groups matching the search string
 | 
				
			||||||
func (g *Groups) Search(search string) ([]string, error) {
 | 
					func (g *groups) Search(search string) ([]string, error) {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Params: map[string]string{"search": search},
 | 
							Params: map[string]string{"search": search},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -58,13 +58,13 @@ func (g *Groups) Search(search string) ([]string, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.GroupListResponse
 | 
						var r GroupListResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Groups, nil
 | 
						return r.Ocs.Data.Groups, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Create creates a group
 | 
					//Create creates a group
 | 
				
			||||||
func (g *Groups) Create(name string) error {
 | 
					func (g *groups) Create(name string) error {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Data: map[string]string{
 | 
							Data: map[string]string{
 | 
				
			||||||
			"groupid": name,
 | 
								"groupid": name,
 | 
				
			||||||
@@ -74,22 +74,22 @@ func (g *Groups) Create(name string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Delete deletes the group
 | 
					//Delete deletes the group
 | 
				
			||||||
func (g *Groups) Delete(name string) error {
 | 
					func (g *groups) Delete(name string) error {
 | 
				
			||||||
	return g.baseRequest(http.MethodDelete, nil, name)
 | 
						return g.baseRequest(http.MethodDelete, nil, name)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//SubAdminList lists the group's subadmins
 | 
					//SubAdminList lists the group's subadmins
 | 
				
			||||||
func (g *Groups) SubAdminList(name string) ([]string, error) {
 | 
					func (g *groups) SubAdminList(name string) ([]string, error) {
 | 
				
			||||||
	res, err := g.c.baseRequest(http.MethodGet, routes.groups, nil, name, "subadmins")
 | 
						res, err := g.c.baseRequest(http.MethodGet, routes.groups, nil, name, "subadmins")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.UserListResponse
 | 
						var r UserListResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Users, nil
 | 
						return r.Ocs.Data.Users, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (g *Groups) baseRequest(method string, ro *req.RequestOptions, subRoute ...string) error {
 | 
					func (g *groups) baseRequest(method string, ro *req.RequestOptions, subRoute ...string) error {
 | 
				
			||||||
	_, err := g.c.baseRequest(method, routes.groups, ro, subRoute...)
 | 
						_, err := g.c.baseRequest(method, routes.groups, ro, subRoute...)
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -2,8 +2,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package mocks
 | 
					package mocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import mock "github.com/stretchr/testify/mock"
 | 
					import (
 | 
				
			||||||
import types "gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
						"github.com/stretchr/testify/mock"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Apps is an autogenerated mock type for the Apps type
 | 
					// Apps is an autogenerated mock type for the Apps type
 | 
				
			||||||
type Apps struct {
 | 
					type Apps struct {
 | 
				
			||||||
@@ -39,14 +42,14 @@ func (_m *Apps) Enable(name string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Infos provides a mock function with given fields: name
 | 
					// Infos provides a mock function with given fields: name
 | 
				
			||||||
func (_m *Apps) Infos(name string) (types.App, error) {
 | 
					func (_m *Apps) Infos(name string) (gonextcloud.App, error) {
 | 
				
			||||||
	ret := _m.Called(name)
 | 
						ret := _m.Called(name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.App
 | 
						var r0 gonextcloud.App
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(string) types.App); ok {
 | 
						if rf, ok := ret.Get(0).(func(string) gonextcloud.App); ok {
 | 
				
			||||||
		r0 = rf(name)
 | 
							r0 = rf(name)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r0 = ret.Get(0).(types.App)
 | 
							r0 = ret.Get(0).(gonextcloud.App)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r1 error
 | 
						var r1 error
 | 
				
			||||||
@@ -2,8 +2,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package mocks
 | 
					package mocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import mock "github.com/stretchr/testify/mock"
 | 
					import (
 | 
				
			||||||
import types "gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
						"github.com/stretchr/testify/mock"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Client is an autogenerated mock type for the Client type
 | 
					// Client is an autogenerated mock type for the Client type
 | 
				
			||||||
type Client struct {
 | 
					type Client struct {
 | 
				
			||||||
@@ -11,15 +14,15 @@ type Client struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Apps provides a mock function with given fields:
 | 
					// Apps provides a mock function with given fields:
 | 
				
			||||||
func (_m *Client) Apps() types.Apps {
 | 
					func (_m *Client) Apps() gonextcloud.Apps {
 | 
				
			||||||
	ret := _m.Called()
 | 
						ret := _m.Called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.Apps
 | 
						var r0 gonextcloud.Apps
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func() types.Apps); ok {
 | 
						if rf, ok := ret.Get(0).(func() gonextcloud.Apps); ok {
 | 
				
			||||||
		r0 = rf()
 | 
							r0 = rf()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).(types.Apps)
 | 
								r0 = ret.Get(0).(gonextcloud.Apps)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -27,15 +30,15 @@ func (_m *Client) Apps() types.Apps {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AppsConfig provides a mock function with given fields:
 | 
					// AppsConfig provides a mock function with given fields:
 | 
				
			||||||
func (_m *Client) AppsConfig() types.AppsConfig {
 | 
					func (_m *Client) AppsConfig() gonextcloud.AppsConfig {
 | 
				
			||||||
	ret := _m.Called()
 | 
						ret := _m.Called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.AppsConfig
 | 
						var r0 gonextcloud.AppsConfig
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func() types.AppsConfig); ok {
 | 
						if rf, ok := ret.Get(0).(func() gonextcloud.AppsConfig); ok {
 | 
				
			||||||
		r0 = rf()
 | 
							r0 = rf()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).(types.AppsConfig)
 | 
								r0 = ret.Get(0).(gonextcloud.AppsConfig)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -43,15 +46,15 @@ func (_m *Client) AppsConfig() types.AppsConfig {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GroupFolders provides a mock function with given fields:
 | 
					// GroupFolders provides a mock function with given fields:
 | 
				
			||||||
func (_m *Client) GroupFolders() types.GroupFolders {
 | 
					func (_m *Client) GroupFolders() gonextcloud.GroupFolders {
 | 
				
			||||||
	ret := _m.Called()
 | 
						ret := _m.Called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.GroupFolders
 | 
						var r0 gonextcloud.GroupFolders
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func() types.GroupFolders); ok {
 | 
						if rf, ok := ret.Get(0).(func() gonextcloud.GroupFolders); ok {
 | 
				
			||||||
		r0 = rf()
 | 
							r0 = rf()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).(types.GroupFolders)
 | 
								r0 = ret.Get(0).(gonextcloud.GroupFolders)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -59,15 +62,15 @@ func (_m *Client) GroupFolders() types.GroupFolders {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Groups provides a mock function with given fields:
 | 
					// Groups provides a mock function with given fields:
 | 
				
			||||||
func (_m *Client) Groups() types.Groups {
 | 
					func (_m *Client) Groups() gonextcloud.Groups {
 | 
				
			||||||
	ret := _m.Called()
 | 
						ret := _m.Called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.Groups
 | 
						var r0 gonextcloud.Groups
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func() types.Groups); ok {
 | 
						if rf, ok := ret.Get(0).(func() gonextcloud.Groups); ok {
 | 
				
			||||||
		r0 = rf()
 | 
							r0 = rf()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).(types.Groups)
 | 
								r0 = ret.Get(0).(gonextcloud.Groups)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -103,15 +106,15 @@ func (_m *Client) Logout() error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Notifications provides a mock function with given fields:
 | 
					// Notifications provides a mock function with given fields:
 | 
				
			||||||
func (_m *Client) Notifications() types.Notifications {
 | 
					func (_m *Client) Notifications() gonextcloud.Notifications {
 | 
				
			||||||
	ret := _m.Called()
 | 
						ret := _m.Called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.Notifications
 | 
						var r0 gonextcloud.Notifications
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func() types.Notifications); ok {
 | 
						if rf, ok := ret.Get(0).(func() gonextcloud.Notifications); ok {
 | 
				
			||||||
		r0 = rf()
 | 
							r0 = rf()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).(types.Notifications)
 | 
								r0 = ret.Get(0).(gonextcloud.Notifications)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -119,15 +122,15 @@ func (_m *Client) Notifications() types.Notifications {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Shares provides a mock function with given fields:
 | 
					// Shares provides a mock function with given fields:
 | 
				
			||||||
func (_m *Client) Shares() types.Shares {
 | 
					func (_m *Client) Shares() gonextcloud.Shares {
 | 
				
			||||||
	ret := _m.Called()
 | 
						ret := _m.Called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.Shares
 | 
						var r0 gonextcloud.Shares
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func() types.Shares); ok {
 | 
						if rf, ok := ret.Get(0).(func() gonextcloud.Shares); ok {
 | 
				
			||||||
		r0 = rf()
 | 
							r0 = rf()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).(types.Shares)
 | 
								r0 = ret.Get(0).(gonextcloud.Shares)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -135,15 +138,15 @@ func (_m *Client) Shares() types.Shares {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Users provides a mock function with given fields:
 | 
					// Users provides a mock function with given fields:
 | 
				
			||||||
func (_m *Client) Users() types.Users {
 | 
					func (_m *Client) Users() gonextcloud.Users {
 | 
				
			||||||
	ret := _m.Called()
 | 
						ret := _m.Called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.Users
 | 
						var r0 gonextcloud.Users
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func() types.Users); ok {
 | 
						if rf, ok := ret.Get(0).(func() gonextcloud.Users); ok {
 | 
				
			||||||
		r0 = rf()
 | 
							r0 = rf()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).(types.Users)
 | 
								r0 = ret.Get(0).(gonextcloud.Users)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2,8 +2,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package mocks
 | 
					package mocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import mock "github.com/stretchr/testify/mock"
 | 
					import (
 | 
				
			||||||
import types "gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
						"github.com/stretchr/testify/mock"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GroupFolders is an autogenerated mock type for the GroupFolders type
 | 
					// GroupFolders is an autogenerated mock type for the GroupFolders type
 | 
				
			||||||
type GroupFolders struct {
 | 
					type GroupFolders struct {
 | 
				
			||||||
@@ -46,14 +49,14 @@ func (_m *GroupFolders) Create(name string) (int, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get provides a mock function with given fields: id
 | 
					// Get provides a mock function with given fields: id
 | 
				
			||||||
func (_m *GroupFolders) Get(id int) (types.GroupFolder, error) {
 | 
					func (_m *GroupFolders) Get(id int) (gonextcloud.GroupFolder, error) {
 | 
				
			||||||
	ret := _m.Called(id)
 | 
						ret := _m.Called(id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.GroupFolder
 | 
						var r0 gonextcloud.GroupFolder
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(int) types.GroupFolder); ok {
 | 
						if rf, ok := ret.Get(0).(func(int) gonextcloud.GroupFolder); ok {
 | 
				
			||||||
		r0 = rf(id)
 | 
							r0 = rf(id)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r0 = ret.Get(0).(types.GroupFolder)
 | 
							r0 = ret.Get(0).(gonextcloud.GroupFolder)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r1 error
 | 
						var r1 error
 | 
				
			||||||
@@ -67,15 +70,15 @@ func (_m *GroupFolders) Get(id int) (types.GroupFolder, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// List provides a mock function with given fields:
 | 
					// List provides a mock function with given fields:
 | 
				
			||||||
func (_m *GroupFolders) List() (map[int]types.GroupFolder, error) {
 | 
					func (_m *GroupFolders) List() (map[int]gonextcloud.GroupFolder, error) {
 | 
				
			||||||
	ret := _m.Called()
 | 
						ret := _m.Called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 map[int]types.GroupFolder
 | 
						var r0 map[int]gonextcloud.GroupFolder
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func() map[int]types.GroupFolder); ok {
 | 
						if rf, ok := ret.Get(0).(func() map[int]gonextcloud.GroupFolder); ok {
 | 
				
			||||||
		r0 = rf()
 | 
							r0 = rf()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).(map[int]types.GroupFolder)
 | 
								r0 = ret.Get(0).(map[int]gonextcloud.GroupFolder)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -118,11 +121,11 @@ func (_m *GroupFolders) Rename(groupID int, name string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetGroupPermissions provides a mock function with given fields: folderID, groupName, permission
 | 
					// SetGroupPermissions provides a mock function with given fields: folderID, groupName, permission
 | 
				
			||||||
func (_m *GroupFolders) SetGroupPermissions(folderID int, groupName string, permission types.SharePermission) error {
 | 
					func (_m *GroupFolders) SetGroupPermissions(folderID int, groupName string, permission gonextcloud.SharePermission) error {
 | 
				
			||||||
	ret := _m.Called(folderID, groupName, permission)
 | 
						ret := _m.Called(folderID, groupName, permission)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 error
 | 
						var r0 error
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(int, string, types.SharePermission) error); ok {
 | 
						if rf, ok := ret.Get(0).(func(int, string, gonextcloud.SharePermission) error); ok {
 | 
				
			||||||
		r0 = rf(folderID, groupName, permission)
 | 
							r0 = rf(folderID, groupName, permission)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r0 = ret.Error(0)
 | 
							r0 = ret.Error(0)
 | 
				
			||||||
@@ -2,8 +2,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package mocks
 | 
					package mocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import mock "github.com/stretchr/testify/mock"
 | 
					import (
 | 
				
			||||||
import types "gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
						"github.com/stretchr/testify/mock"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Groups is an autogenerated mock type for the Groups type
 | 
					// Groups is an autogenerated mock type for the Groups type
 | 
				
			||||||
type Groups struct {
 | 
					type Groups struct {
 | 
				
			||||||
@@ -62,15 +65,15 @@ func (_m *Groups) List() ([]string, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ListDetails provides a mock function with given fields: search
 | 
					// ListDetails provides a mock function with given fields: search
 | 
				
			||||||
func (_m *Groups) ListDetails(search string) ([]types.Group, error) {
 | 
					func (_m *Groups) ListDetails(search string) ([]gonextcloud.Group, error) {
 | 
				
			||||||
	ret := _m.Called(search)
 | 
						ret := _m.Called(search)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 []types.Group
 | 
						var r0 []gonextcloud.Group
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(string) []types.Group); ok {
 | 
						if rf, ok := ret.Get(0).(func(string) []gonextcloud.Group); ok {
 | 
				
			||||||
		r0 = rf(search)
 | 
							r0 = rf(search)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).([]types.Group)
 | 
								r0 = ret.Get(0).([]gonextcloud.Group)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2,8 +2,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package mocks
 | 
					package mocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import mock "github.com/stretchr/testify/mock"
 | 
					import (
 | 
				
			||||||
import types "gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
						"github.com/stretchr/testify/mock"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Notifications is an autogenerated mock type for the Notifications type
 | 
					// Notifications is an autogenerated mock type for the Notifications type
 | 
				
			||||||
type Notifications struct {
 | 
					type Notifications struct {
 | 
				
			||||||
@@ -81,14 +84,14 @@ func (_m *Notifications) DeleteAll() error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get provides a mock function with given fields: id
 | 
					// Get provides a mock function with given fields: id
 | 
				
			||||||
func (_m *Notifications) Get(id int) (types.Notification, error) {
 | 
					func (_m *Notifications) Get(id int) (gonextcloud.Notification, error) {
 | 
				
			||||||
	ret := _m.Called(id)
 | 
						ret := _m.Called(id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.Notification
 | 
						var r0 gonextcloud.Notification
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(int) types.Notification); ok {
 | 
						if rf, ok := ret.Get(0).(func(int) gonextcloud.Notification); ok {
 | 
				
			||||||
		r0 = rf(id)
 | 
							r0 = rf(id)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r0 = ret.Get(0).(types.Notification)
 | 
							r0 = ret.Get(0).(gonextcloud.Notification)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r1 error
 | 
						var r1 error
 | 
				
			||||||
@@ -102,15 +105,15 @@ func (_m *Notifications) Get(id int) (types.Notification, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// List provides a mock function with given fields:
 | 
					// List provides a mock function with given fields:
 | 
				
			||||||
func (_m *Notifications) List() ([]types.Notification, error) {
 | 
					func (_m *Notifications) List() ([]gonextcloud.Notification, error) {
 | 
				
			||||||
	ret := _m.Called()
 | 
						ret := _m.Called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 []types.Notification
 | 
						var r0 []gonextcloud.Notification
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func() []types.Notification); ok {
 | 
						if rf, ok := ret.Get(0).(func() []gonextcloud.Notification); ok {
 | 
				
			||||||
		r0 = rf()
 | 
							r0 = rf()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).([]types.Notification)
 | 
								r0 = ret.Get(0).([]gonextcloud.Notification)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2,8 +2,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package mocks
 | 
					package mocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import mock "github.com/stretchr/testify/mock"
 | 
					import (
 | 
				
			||||||
import types "gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
						"github.com/stretchr/testify/mock"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Shares is an autogenerated mock type for the Shares type
 | 
					// Shares is an autogenerated mock type for the Shares type
 | 
				
			||||||
type Shares struct {
 | 
					type Shares struct {
 | 
				
			||||||
@@ -11,18 +14,18 @@ type Shares struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Create provides a mock function with given fields: path, shareType, permission, shareWith, publicUpload, password
 | 
					// Create provides a mock function with given fields: path, shareType, permission, shareWith, publicUpload, password
 | 
				
			||||||
func (_m *Shares) Create(path string, shareType types.ShareType, permission types.SharePermission, shareWith string, publicUpload bool, password string) (types.Share, error) {
 | 
					func (_m *Shares) Create(path string, shareType gonextcloud.ShareType, permission gonextcloud.SharePermission, shareWith string, publicUpload bool, password string) (gonextcloud.Share, error) {
 | 
				
			||||||
	ret := _m.Called(path, shareType, permission, shareWith, publicUpload, password)
 | 
						ret := _m.Called(path, shareType, permission, shareWith, publicUpload, password)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.Share
 | 
						var r0 gonextcloud.Share
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(string, types.ShareType, types.SharePermission, string, bool, string) types.Share); ok {
 | 
						if rf, ok := ret.Get(0).(func(string, gonextcloud.ShareType, gonextcloud.SharePermission, string, bool, string) gonextcloud.Share); ok {
 | 
				
			||||||
		r0 = rf(path, shareType, permission, shareWith, publicUpload, password)
 | 
							r0 = rf(path, shareType, permission, shareWith, publicUpload, password)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r0 = ret.Get(0).(types.Share)
 | 
							r0 = ret.Get(0).(gonextcloud.Share)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r1 error
 | 
						var r1 error
 | 
				
			||||||
	if rf, ok := ret.Get(1).(func(string, types.ShareType, types.SharePermission, string, bool, string) error); ok {
 | 
						if rf, ok := ret.Get(1).(func(string, gonextcloud.ShareType, gonextcloud.SharePermission, string, bool, string) error); ok {
 | 
				
			||||||
		r1 = rf(path, shareType, permission, shareWith, publicUpload, password)
 | 
							r1 = rf(path, shareType, permission, shareWith, publicUpload, password)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r1 = ret.Error(1)
 | 
							r1 = ret.Error(1)
 | 
				
			||||||
@@ -46,14 +49,14 @@ func (_m *Shares) Delete(shareID int) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get provides a mock function with given fields: shareID
 | 
					// Get provides a mock function with given fields: shareID
 | 
				
			||||||
func (_m *Shares) Get(shareID string) (types.Share, error) {
 | 
					func (_m *Shares) Get(shareID string) (gonextcloud.Share, error) {
 | 
				
			||||||
	ret := _m.Called(shareID)
 | 
						ret := _m.Called(shareID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 types.Share
 | 
						var r0 gonextcloud.Share
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(string) types.Share); ok {
 | 
						if rf, ok := ret.Get(0).(func(string) gonextcloud.Share); ok {
 | 
				
			||||||
		r0 = rf(shareID)
 | 
							r0 = rf(shareID)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r0 = ret.Get(0).(types.Share)
 | 
							r0 = ret.Get(0).(gonextcloud.Share)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r1 error
 | 
						var r1 error
 | 
				
			||||||
@@ -67,15 +70,15 @@ func (_m *Shares) Get(shareID string) (types.Share, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetFromPath provides a mock function with given fields: path, reshares, subfiles
 | 
					// GetFromPath provides a mock function with given fields: path, reshares, subfiles
 | 
				
			||||||
func (_m *Shares) GetFromPath(path string, reshares bool, subfiles bool) ([]types.Share, error) {
 | 
					func (_m *Shares) GetFromPath(path string, reshares bool, subfiles bool) ([]gonextcloud.Share, error) {
 | 
				
			||||||
	ret := _m.Called(path, reshares, subfiles)
 | 
						ret := _m.Called(path, reshares, subfiles)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 []types.Share
 | 
						var r0 []gonextcloud.Share
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(string, bool, bool) []types.Share); ok {
 | 
						if rf, ok := ret.Get(0).(func(string, bool, bool) []gonextcloud.Share); ok {
 | 
				
			||||||
		r0 = rf(path, reshares, subfiles)
 | 
							r0 = rf(path, reshares, subfiles)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).([]types.Share)
 | 
								r0 = ret.Get(0).([]gonextcloud.Share)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,15 +93,15 @@ func (_m *Shares) GetFromPath(path string, reshares bool, subfiles bool) ([]type
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// List provides a mock function with given fields:
 | 
					// List provides a mock function with given fields:
 | 
				
			||||||
func (_m *Shares) List() ([]types.Share, error) {
 | 
					func (_m *Shares) List() ([]gonextcloud.Share, error) {
 | 
				
			||||||
	ret := _m.Called()
 | 
						ret := _m.Called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 []types.Share
 | 
						var r0 []gonextcloud.Share
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func() []types.Share); ok {
 | 
						if rf, ok := ret.Get(0).(func() []gonextcloud.Share); ok {
 | 
				
			||||||
		r0 = rf()
 | 
							r0 = rf()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).([]types.Share)
 | 
								r0 = ret.Get(0).([]gonextcloud.Share)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -113,11 +116,11 @@ func (_m *Shares) List() ([]types.Share, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Update provides a mock function with given fields: shareUpdate
 | 
					// Update provides a mock function with given fields: shareUpdate
 | 
				
			||||||
func (_m *Shares) Update(shareUpdate types.ShareUpdate) error {
 | 
					func (_m *Shares) Update(shareUpdate gonextcloud.ShareUpdate) error {
 | 
				
			||||||
	ret := _m.Called(shareUpdate)
 | 
						ret := _m.Called(shareUpdate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 error
 | 
						var r0 error
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(types.ShareUpdate) error); ok {
 | 
						if rf, ok := ret.Get(0).(func(gonextcloud.ShareUpdate) error); ok {
 | 
				
			||||||
		r0 = rf(shareUpdate)
 | 
							r0 = rf(shareUpdate)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r0 = ret.Error(0)
 | 
							r0 = ret.Error(0)
 | 
				
			||||||
@@ -155,11 +158,11 @@ func (_m *Shares) UpdatePassword(shareID int, password string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UpdatePermissions provides a mock function with given fields: shareID, permissions
 | 
					// UpdatePermissions provides a mock function with given fields: shareID, permissions
 | 
				
			||||||
func (_m *Shares) UpdatePermissions(shareID int, permissions types.SharePermission) error {
 | 
					func (_m *Shares) UpdatePermissions(shareID int, permissions gonextcloud.SharePermission) error {
 | 
				
			||||||
	ret := _m.Called(shareID, permissions)
 | 
						ret := _m.Called(shareID, permissions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 error
 | 
						var r0 error
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(int, types.SharePermission) error); ok {
 | 
						if rf, ok := ret.Get(0).(func(int, gonextcloud.SharePermission) error); ok {
 | 
				
			||||||
		r0 = rf(shareID, permissions)
 | 
							r0 = rf(shareID, permissions)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r0 = ret.Error(0)
 | 
							r0 = ret.Error(0)
 | 
				
			||||||
@@ -2,8 +2,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package mocks
 | 
					package mocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import mock "github.com/stretchr/testify/mock"
 | 
					import (
 | 
				
			||||||
import types "gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
						"github.com/stretchr/testify/mock"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Users is an autogenerated mock type for the Users type
 | 
					// Users is an autogenerated mock type for the Users type
 | 
				
			||||||
type Users struct {
 | 
					type Users struct {
 | 
				
			||||||
@@ -11,11 +14,11 @@ type Users struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Create provides a mock function with given fields: username, password, user
 | 
					// Create provides a mock function with given fields: username, password, user
 | 
				
			||||||
func (_m *Users) Create(username string, password string, user *types.UserDetails) error {
 | 
					func (_m *Users) Create(username string, password string, user *gonextcloud.UserDetails) error {
 | 
				
			||||||
	ret := _m.Called(username, password, user)
 | 
						ret := _m.Called(username, password, user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 error
 | 
						var r0 error
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(string, string, *types.UserDetails) error); ok {
 | 
						if rf, ok := ret.Get(0).(func(string, string, *gonextcloud.UserDetails) error); ok {
 | 
				
			||||||
		r0 = rf(username, password, user)
 | 
							r0 = rf(username, password, user)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r0 = ret.Error(0)
 | 
							r0 = ret.Error(0)
 | 
				
			||||||
@@ -25,11 +28,11 @@ func (_m *Users) Create(username string, password string, user *types.UserDetail
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CreateBatchWithoutPassword provides a mock function with given fields: users
 | 
					// CreateBatchWithoutPassword provides a mock function with given fields: users
 | 
				
			||||||
func (_m *Users) CreateBatchWithoutPassword(users []types.User) error {
 | 
					func (_m *Users) CreateBatchWithoutPassword(users []gonextcloud.User) error {
 | 
				
			||||||
	ret := _m.Called(users)
 | 
						ret := _m.Called(users)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 error
 | 
						var r0 error
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func([]types.User) error); ok {
 | 
						if rf, ok := ret.Get(0).(func([]gonextcloud.User) error); ok {
 | 
				
			||||||
		r0 = rf(users)
 | 
							r0 = rf(users)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r0 = ret.Error(0)
 | 
							r0 = ret.Error(0)
 | 
				
			||||||
@@ -102,15 +105,15 @@ func (_m *Users) Enable(name string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get provides a mock function with given fields: name
 | 
					// Get provides a mock function with given fields: name
 | 
				
			||||||
func (_m *Users) Get(name string) (*types.UserDetails, error) {
 | 
					func (_m *Users) Get(name string) (*gonextcloud.UserDetails, error) {
 | 
				
			||||||
	ret := _m.Called(name)
 | 
						ret := _m.Called(name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 *types.UserDetails
 | 
						var r0 *gonextcloud.UserDetails
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(string) *types.UserDetails); ok {
 | 
						if rf, ok := ret.Get(0).(func(string) *gonextcloud.UserDetails); ok {
 | 
				
			||||||
		r0 = rf(name)
 | 
							r0 = rf(name)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).(*types.UserDetails)
 | 
								r0 = ret.Get(0).(*gonextcloud.UserDetails)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -250,15 +253,15 @@ func (_m *Users) List() ([]string, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ListDetails provides a mock function with given fields:
 | 
					// ListDetails provides a mock function with given fields:
 | 
				
			||||||
func (_m *Users) ListDetails() (map[string]types.UserDetails, error) {
 | 
					func (_m *Users) ListDetails() (map[string]gonextcloud.UserDetails, error) {
 | 
				
			||||||
	ret := _m.Called()
 | 
						ret := _m.Called()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 map[string]types.UserDetails
 | 
						var r0 map[string]gonextcloud.UserDetails
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func() map[string]types.UserDetails); ok {
 | 
						if rf, ok := ret.Get(0).(func() map[string]gonextcloud.UserDetails); ok {
 | 
				
			||||||
		r0 = rf()
 | 
							r0 = rf()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ret.Get(0) != nil {
 | 
							if ret.Get(0) != nil {
 | 
				
			||||||
			r0 = ret.Get(0).(map[string]types.UserDetails)
 | 
								r0 = ret.Get(0).(map[string]gonextcloud.UserDetails)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -310,11 +313,11 @@ func (_m *Users) SendWelcomeEmail(name string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Update provides a mock function with given fields: user
 | 
					// Update provides a mock function with given fields: user
 | 
				
			||||||
func (_m *Users) Update(user *types.UserDetails) error {
 | 
					func (_m *Users) Update(user *gonextcloud.UserDetails) error {
 | 
				
			||||||
	ret := _m.Called(user)
 | 
						ret := _m.Called(user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var r0 error
 | 
						var r0 error
 | 
				
			||||||
	if rf, ok := ret.Get(0).(func(*types.UserDetails) error); ok {
 | 
						if rf, ok := ret.Get(0).(func(*gonextcloud.UserDetails) error); ok {
 | 
				
			||||||
		r0 = rf(user)
 | 
							r0 = rf(user)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		r0 = ret.Error(0)
 | 
							r0 = ret.Error(0)
 | 
				
			||||||
@@ -1,17 +1,65 @@
 | 
				
			|||||||
package gonextcloud
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					type System struct {
 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
						Version             string    `json:"version"`
 | 
				
			||||||
	"net/http"
 | 
						Theme               string    `json:"theme"`
 | 
				
			||||||
)
 | 
						EnableAvatars       string    `json:"enable_avatars"`
 | 
				
			||||||
 | 
						EnablePreviews      string    `json:"enable_previews"`
 | 
				
			||||||
//Monitoring return nextcloud monitoring statistics
 | 
						MemcacheLocal       string    `json:"memcache.local"`
 | 
				
			||||||
func (c *Client) Monitoring() (*types.Monitoring, error) {
 | 
						MemcacheDistributed string    `json:"memcache.distributed"`
 | 
				
			||||||
	res, err := c.baseRequest(http.MethodGet, routes.monitor, nil)
 | 
						FilelockingEnabled  string    `json:"filelocking.enabled"`
 | 
				
			||||||
	if err != nil {
 | 
						MemcacheLocking     string    `json:"memcache.locking"`
 | 
				
			||||||
		return nil, err
 | 
						Debug               string    `json:"debug"`
 | 
				
			||||||
	}
 | 
						Freespace           int64     `json:"freespace"`
 | 
				
			||||||
	var m types.MonitoringResponse
 | 
						Cpuload             []float32 `json:"cpuload"`
 | 
				
			||||||
	res.JSON(&m)
 | 
						MemTotal            int       `json:"mem_total"`
 | 
				
			||||||
	return &m.Ocs.Data, nil
 | 
						MemFree             int       `json:"mem_free"`
 | 
				
			||||||
 | 
						SwapTotal           int       `json:"swap_total"`
 | 
				
			||||||
 | 
						SwapFree            int       `json:"swap_free"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Monitoring struct {
 | 
				
			||||||
 | 
						Nextcloud struct {
 | 
				
			||||||
 | 
							System  System  `json:"system"`
 | 
				
			||||||
 | 
							Storage Storage `json:"storage"`
 | 
				
			||||||
 | 
							Shares  struct {
 | 
				
			||||||
 | 
								NumShares               int `json:"num_shares"`
 | 
				
			||||||
 | 
								NumSharesUser           int `json:"num_shares_user"`
 | 
				
			||||||
 | 
								NumSharesGroups         int `json:"num_shares_groups"`
 | 
				
			||||||
 | 
								NumSharesLink           int `json:"num_shares_link"`
 | 
				
			||||||
 | 
								NumSharesLinkNoPassword int `json:"num_shares_link_no_password"`
 | 
				
			||||||
 | 
								NumFedSharesSent        int `json:"num_fed_shares_sent"`
 | 
				
			||||||
 | 
								NumFedSharesReceived    int `json:"num_fed_shares_received"`
 | 
				
			||||||
 | 
							} `json:"shares"`
 | 
				
			||||||
 | 
						} `json:"nextcloud"`
 | 
				
			||||||
 | 
						Server struct {
 | 
				
			||||||
 | 
							Webserver string `json:"webserver"`
 | 
				
			||||||
 | 
							Php       struct {
 | 
				
			||||||
 | 
								Version           string `json:"version"`
 | 
				
			||||||
 | 
								MemoryLimit       int    `json:"memory_limit"`
 | 
				
			||||||
 | 
								MaxExecutionTime  int    `json:"max_execution_time"`
 | 
				
			||||||
 | 
								UploadMaxFilesize int    `json:"upload_max_filesize"`
 | 
				
			||||||
 | 
							} `json:"php"`
 | 
				
			||||||
 | 
							Database struct {
 | 
				
			||||||
 | 
								Type    string `json:"type"`
 | 
				
			||||||
 | 
								Version string `json:"version"`
 | 
				
			||||||
 | 
								Size    int    `json:"size"`
 | 
				
			||||||
 | 
							} `json:"database"`
 | 
				
			||||||
 | 
						} `json:"server"`
 | 
				
			||||||
 | 
						ActiveUsers ActiveUsers `json:"activeUsers"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ActiveUsers struct {
 | 
				
			||||||
 | 
						Last5Minutes int `json:"last5minutes"`
 | 
				
			||||||
 | 
						Last1Hour    int `json:"last1hour"`
 | 
				
			||||||
 | 
						Last24Hours  int `json:"last24hours"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Storage struct {
 | 
				
			||||||
 | 
						NumUsers         int `json:"num_users"`
 | 
				
			||||||
 | 
						NumFiles         int `json:"num_files"`
 | 
				
			||||||
 | 
						NumStorages      int `json:"num_storages"`
 | 
				
			||||||
 | 
						NumStoragesLocal int `json:"num_storages_local"`
 | 
				
			||||||
 | 
						NumStoragesHome  int `json:"num_storages_home"`
 | 
				
			||||||
 | 
						NumStoragesOther int `json:"num_storages_other"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								monitoring_impl.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								monitoring_impl.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Monitoring return nextcloud monitoring statistics
 | 
				
			||||||
 | 
					func (c *client) Monitoring() (*Monitoring, error) {
 | 
				
			||||||
 | 
						res, err := c.baseRequest(http.MethodGet, routes.monitor, nil)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var m MonitoringResponse
 | 
				
			||||||
 | 
						res.JSON(&m)
 | 
				
			||||||
 | 
						return &m.Ocs.Data, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package types
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "time"
 | 
					import "time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2,19 +2,19 @@ package gonextcloud
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	req "github.com/levigross/grequests"
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req "github.com/levigross/grequests"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Notifications contains all Notifications available actions
 | 
					//notifications contains all notifications available actions
 | 
				
			||||||
type Notifications struct {
 | 
					type notifications struct {
 | 
				
			||||||
	c *Client
 | 
						c *client
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//List returns all the notifications
 | 
					//List returns all the notifications
 | 
				
			||||||
func (n *Notifications) List() ([]types.Notification, error) {
 | 
					func (n *notifications) List() ([]Notification, error) {
 | 
				
			||||||
	if err := n.Available(); err != nil {
 | 
						if err := n.Available(); err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -22,27 +22,27 @@ func (n *Notifications) List() ([]types.Notification, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.NotificationsListResponse
 | 
						var r NotificationsListResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data, nil
 | 
						return r.Ocs.Data, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Get returns the notification corresponding to the id
 | 
					//Get returns the notification corresponding to the id
 | 
				
			||||||
func (n *Notifications) Get(id int) (types.Notification, error) {
 | 
					func (n *notifications) Get(id int) (Notification, error) {
 | 
				
			||||||
	if err := n.Available(); err != nil {
 | 
						if err := n.Available(); err != nil {
 | 
				
			||||||
		return types.Notification{}, err
 | 
							return Notification{}, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res, err := n.c.baseRequest(http.MethodGet, routes.notifications, nil, strconv.Itoa(id))
 | 
						res, err := n.c.baseRequest(http.MethodGet, routes.notifications, nil, strconv.Itoa(id))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return types.Notification{}, err
 | 
							return Notification{}, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.NotificationResponse
 | 
						var r NotificationResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data, nil
 | 
						return r.Ocs.Data, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Delete deletes the notification corresponding to the id
 | 
					//Delete deletes the notification corresponding to the id
 | 
				
			||||||
func (n *Notifications) Delete(id int) error {
 | 
					func (n *notifications) Delete(id int) error {
 | 
				
			||||||
	if err := n.Available(); err != nil {
 | 
						if err := n.Available(); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -51,7 +51,7 @@ func (n *Notifications) Delete(id int) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//DeleteAll deletes all notifications
 | 
					//DeleteAll deletes all notifications
 | 
				
			||||||
func (n *Notifications) DeleteAll() error {
 | 
					func (n *notifications) DeleteAll() error {
 | 
				
			||||||
	if err := n.Available(); err != nil {
 | 
						if err := n.Available(); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -60,7 +60,7 @@ func (n *Notifications) DeleteAll() error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Create creates a notification (if the user is an admin)
 | 
					//Create creates a notification (if the user is an admin)
 | 
				
			||||||
func (n *Notifications) Create(userID, title, message string) error {
 | 
					func (n *notifications) Create(userID, title, message string) error {
 | 
				
			||||||
	if err := n.AdminAvailable(); err != nil {
 | 
						if err := n.AdminAvailable(); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -75,7 +75,7 @@ func (n *Notifications) Create(userID, title, message string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//AdminAvailable returns an error if the admin-notifications app is not installed
 | 
					//AdminAvailable returns an error if the admin-notifications app is not installed
 | 
				
			||||||
func (n *Notifications) AdminAvailable() error {
 | 
					func (n *notifications) AdminAvailable() error {
 | 
				
			||||||
	if len(n.c.capabilities.Notifications.AdminNotifications) == 0 {
 | 
						if len(n.c.capabilities.Notifications.AdminNotifications) == 0 {
 | 
				
			||||||
		return errors.New("'admin notifications' not available on this instance")
 | 
							return errors.New("'admin notifications' not available on this instance")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -83,7 +83,7 @@ func (n *Notifications) AdminAvailable() error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Available returns an error if the notifications app is not installed
 | 
					//Available returns an error if the notifications app is not installed
 | 
				
			||||||
func (n *Notifications) Available() error {
 | 
					func (n *notifications) Available() error {
 | 
				
			||||||
	if len(n.c.capabilities.Notifications.OcsEndpoints) == 0 {
 | 
						if len(n.c.capabilities.Notifications.OcsEndpoints) == 0 {
 | 
				
			||||||
		return errors.New("notifications not available on this instance")
 | 
							return errors.New("notifications not available on this instance")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package types
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Meta
 | 
					//Meta
 | 
				
			||||||
type Meta struct {
 | 
					type Meta struct {
 | 
				
			||||||
							
								
								
									
										213
									
								
								shares.go
									
									
									
									
									
								
							
							
						
						
									
										213
									
								
								shares.go
									
									
									
									
									
								
							@@ -1,174 +1,53 @@
 | 
				
			|||||||
package gonextcloud
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					type ShareType int
 | 
				
			||||||
	"fmt"
 | 
					type SharePermission int
 | 
				
			||||||
	req "github.com/levigross/grequests"
 | 
					
 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					const (
 | 
				
			||||||
	"net/http"
 | 
						UserShare           ShareType = 0
 | 
				
			||||||
	"strconv"
 | 
						GroupShare          ShareType = 1
 | 
				
			||||||
	"sync"
 | 
						PublicLinkShare     ShareType = 3
 | 
				
			||||||
 | 
						FederatedCloudShare ShareType = 6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ReadPermission    SharePermission = 1
 | 
				
			||||||
 | 
						UpdatePermission  SharePermission = 2
 | 
				
			||||||
 | 
						CreatePermission  SharePermission = 4
 | 
				
			||||||
 | 
						DeletePermission  SharePermission = 8
 | 
				
			||||||
 | 
						ReSharePermission SharePermission = 16
 | 
				
			||||||
 | 
						AllPermissions    SharePermission = 31
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Shares contains all Shares available actions
 | 
					type ShareUpdate struct {
 | 
				
			||||||
type Shares struct {
 | 
						ShareID      int
 | 
				
			||||||
	c *Client
 | 
						Permissions  SharePermission
 | 
				
			||||||
 | 
						Password     string
 | 
				
			||||||
 | 
						PublicUpload bool
 | 
				
			||||||
 | 
						ExpireDate   string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//List list all shares of the logged in user
 | 
					type Share struct {
 | 
				
			||||||
func (s *Shares) List() ([]types.Share, error) {
 | 
						ID                   string      `json:"id"`
 | 
				
			||||||
	res, err := s.c.baseRequest(http.MethodGet, routes.shares, nil)
 | 
						ShareType            int         `json:"share_type"`
 | 
				
			||||||
	if err != nil {
 | 
						UIDOwner             string      `json:"uid_owner"`
 | 
				
			||||||
		return nil, err
 | 
						DisplaynameOwner     string      `json:"displayname_owner"`
 | 
				
			||||||
	}
 | 
						Permissions          int         `json:"permissions"`
 | 
				
			||||||
	var r types.SharesListResponse
 | 
						Stime                int         `json:"stime"`
 | 
				
			||||||
	res.JSON(&r)
 | 
						Parent               interface{} `json:"parent"`
 | 
				
			||||||
	return r.Ocs.Data, nil
 | 
						Expiration           string      `json:"expiration"`
 | 
				
			||||||
}
 | 
						Token                string      `json:"token"`
 | 
				
			||||||
 | 
						UIDFileOwner         string      `json:"uid_file_owner"`
 | 
				
			||||||
//GetFromPath return shares from a specific file or folder
 | 
						DisplaynameFileOwner string      `json:"displayname_file_owner"`
 | 
				
			||||||
func (s *Shares) GetFromPath(path string, reshares bool, subfiles bool) ([]types.Share, error) {
 | 
						Path                 string      `json:"path"`
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ItemType             string      `json:"item_type"`
 | 
				
			||||||
		Params: map[string]string{
 | 
						Mimetype             string      `json:"mimetype"`
 | 
				
			||||||
			"path":     path,
 | 
						StorageID            string      `json:"storage_id"`
 | 
				
			||||||
			"reshares": strconv.FormatBool(reshares),
 | 
						Storage              int         `json:"storage"`
 | 
				
			||||||
			"subfiles": strconv.FormatBool(subfiles),
 | 
						ItemSource           int         `json:"item_source"`
 | 
				
			||||||
		},
 | 
						FileSource           int         `json:"file_source"`
 | 
				
			||||||
	}
 | 
						FileParent           int         `json:"file_parent"`
 | 
				
			||||||
	res, err := s.c.baseRequest(http.MethodGet, routes.shares, ro)
 | 
						FileTarget           string      `json:"file_target"`
 | 
				
			||||||
	if err != nil {
 | 
						ShareWith            string      `json:"share_with"`
 | 
				
			||||||
		return nil, err
 | 
						ShareWithDisplayname string      `json:"share_with_displayname"`
 | 
				
			||||||
	}
 | 
						MailSend             int         `json:"mail_send"`
 | 
				
			||||||
	var r types.SharesListResponse
 | 
						Tags                 []string    `json:"tags"`
 | 
				
			||||||
	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)
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
	if err := types.NewUpdateError(errs); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//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
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										174
									
								
								shares_impl.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								shares_impl.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,174 @@
 | 
				
			|||||||
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req "github.com/levigross/grequests"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//shares contains all shares available actions
 | 
				
			||||||
 | 
					type shares struct {
 | 
				
			||||||
 | 
						c *client
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//List list all shares of the logged in user
 | 
				
			||||||
 | 
					func (s *shares) List() ([]Share, error) {
 | 
				
			||||||
 | 
						res, err := s.c.baseRequest(http.MethodGet, routes.shares, nil)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var r 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) ([]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 SharesListResponse
 | 
				
			||||||
 | 
						res.JSON(&r)
 | 
				
			||||||
 | 
						return r.Ocs.Data, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Get information about a known Share
 | 
				
			||||||
 | 
					func (s *shares) Get(shareID string) (Share, error) {
 | 
				
			||||||
 | 
						res, err := s.c.baseRequest(http.MethodGet, routes.shares, nil, shareID)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return Share{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var r SharesListResponse
 | 
				
			||||||
 | 
						res.JSON(&r)
 | 
				
			||||||
 | 
						return r.Ocs.Data[0], nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Create create a share
 | 
				
			||||||
 | 
					func (s *shares) Create(
 | 
				
			||||||
 | 
						path string,
 | 
				
			||||||
 | 
						shareType ShareType,
 | 
				
			||||||
 | 
						permission SharePermission,
 | 
				
			||||||
 | 
						shareWith string,
 | 
				
			||||||
 | 
						publicUpload bool,
 | 
				
			||||||
 | 
						password string,
 | 
				
			||||||
 | 
					) (Share, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (shareType == UserShare || shareType == GroupShare) && shareWith == "" {
 | 
				
			||||||
 | 
							return 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 Share{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var r 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 ShareUpdate) error {
 | 
				
			||||||
 | 
						errs := make(chan *UpdateError)
 | 
				
			||||||
 | 
						var wg sync.WaitGroup
 | 
				
			||||||
 | 
						wg.Add(4)
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							defer wg.Done()
 | 
				
			||||||
 | 
							if err := s.UpdatePassword(shareUpdate.ShareID, shareUpdate.Password); err != nil {
 | 
				
			||||||
 | 
								errs <- &UpdateError{
 | 
				
			||||||
 | 
									Field: "password",
 | 
				
			||||||
 | 
									Error: err,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							defer wg.Done()
 | 
				
			||||||
 | 
							if err := s.UpdateExpireDate(shareUpdate.ShareID, shareUpdate.ExpireDate); err != nil {
 | 
				
			||||||
 | 
								errs <- &UpdateError{
 | 
				
			||||||
 | 
									Field: "expireDate",
 | 
				
			||||||
 | 
									Error: err,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							defer wg.Done()
 | 
				
			||||||
 | 
							if err := s.UpdatePermissions(shareUpdate.ShareID, shareUpdate.Permissions); err != nil {
 | 
				
			||||||
 | 
								errs <- &UpdateError{
 | 
				
			||||||
 | 
									Field: "permissions",
 | 
				
			||||||
 | 
									Error: err,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							defer wg.Done()
 | 
				
			||||||
 | 
							if err := s.UpdatePublicUpload(shareUpdate.ShareID, shareUpdate.PublicUpload); err != nil {
 | 
				
			||||||
 | 
								errs <- &UpdateError{
 | 
				
			||||||
 | 
									Field: "publicUpload",
 | 
				
			||||||
 | 
									Error: err,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							wg.Wait()
 | 
				
			||||||
 | 
							close(errs)
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						if err := NewUpdateError(errs); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//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 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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,57 +0,0 @@
 | 
				
			|||||||
package types
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "strconv"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type GroupFolderBadFormatIDAndGroups struct {
 | 
					 | 
				
			||||||
	ID         string            `json:"id"`
 | 
					 | 
				
			||||||
	MountPoint string            `json:"mount_point"`
 | 
					 | 
				
			||||||
	Groups     map[string]string `json:"groups"`
 | 
					 | 
				
			||||||
	Quota      string            `json:"quota"`
 | 
					 | 
				
			||||||
	Size       int               `json:"size"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type GroupFolderBadFormatGroups struct {
 | 
					 | 
				
			||||||
	ID         int               `json:"id"`
 | 
					 | 
				
			||||||
	MountPoint string            `json:"mount_point"`
 | 
					 | 
				
			||||||
	Groups     map[string]string `json:"groups"`
 | 
					 | 
				
			||||||
	Quota      string            `json:"quota"`
 | 
					 | 
				
			||||||
	Size       int               `json:"size"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type GroupFolder struct {
 | 
					 | 
				
			||||||
	ID         int                        `json:"id"`
 | 
					 | 
				
			||||||
	MountPoint string                     `json:"mount_point"`
 | 
					 | 
				
			||||||
	Groups     map[string]SharePermission `json:"groups"`
 | 
					 | 
				
			||||||
	Quota      int                        `json:"quota"`
 | 
					 | 
				
			||||||
	Size       int                        `json:"size"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (gf *GroupFolderBadFormatGroups) FormatGroupFolder() GroupFolder {
 | 
					 | 
				
			||||||
	g := GroupFolder{}
 | 
					 | 
				
			||||||
	g.ID = gf.ID
 | 
					 | 
				
			||||||
	g.MountPoint = gf.MountPoint
 | 
					 | 
				
			||||||
	g.Groups = map[string]SharePermission{}
 | 
					 | 
				
			||||||
	for k, v := range gf.Groups {
 | 
					 | 
				
			||||||
		p, _ := strconv.Atoi(v)
 | 
					 | 
				
			||||||
		g.Groups[k] = SharePermission(p)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	q, _ := strconv.Atoi(gf.Quota)
 | 
					 | 
				
			||||||
	g.Quota = q
 | 
					 | 
				
			||||||
	g.Size = gf.Size
 | 
					 | 
				
			||||||
	return g
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (gf *GroupFolderBadFormatIDAndGroups) FormatGroupFolder() GroupFolder {
 | 
					 | 
				
			||||||
	g := GroupFolder{}
 | 
					 | 
				
			||||||
	g.ID, _ = strconv.Atoi(gf.ID)
 | 
					 | 
				
			||||||
	g.MountPoint = gf.MountPoint
 | 
					 | 
				
			||||||
	g.Groups = map[string]SharePermission{}
 | 
					 | 
				
			||||||
	for k, v := range gf.Groups {
 | 
					 | 
				
			||||||
		p, _ := strconv.Atoi(v)
 | 
					 | 
				
			||||||
		g.Groups[k] = SharePermission(p)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	q, _ := strconv.Atoi(gf.Quota)
 | 
					 | 
				
			||||||
	g.Quota = q
 | 
					 | 
				
			||||||
	g.Size = gf.Size
 | 
					 | 
				
			||||||
	return g
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,65 +0,0 @@
 | 
				
			|||||||
package types
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type System struct {
 | 
					 | 
				
			||||||
	Version             string    `json:"version"`
 | 
					 | 
				
			||||||
	Theme               string    `json:"theme"`
 | 
					 | 
				
			||||||
	EnableAvatars       string    `json:"enable_avatars"`
 | 
					 | 
				
			||||||
	EnablePreviews      string    `json:"enable_previews"`
 | 
					 | 
				
			||||||
	MemcacheLocal       string    `json:"memcache.local"`
 | 
					 | 
				
			||||||
	MemcacheDistributed string    `json:"memcache.distributed"`
 | 
					 | 
				
			||||||
	FilelockingEnabled  string    `json:"filelocking.enabled"`
 | 
					 | 
				
			||||||
	MemcacheLocking     string    `json:"memcache.locking"`
 | 
					 | 
				
			||||||
	Debug               string    `json:"debug"`
 | 
					 | 
				
			||||||
	Freespace           int64     `json:"freespace"`
 | 
					 | 
				
			||||||
	Cpuload             []float32 `json:"cpuload"`
 | 
					 | 
				
			||||||
	MemTotal            int       `json:"mem_total"`
 | 
					 | 
				
			||||||
	MemFree             int       `json:"mem_free"`
 | 
					 | 
				
			||||||
	SwapTotal           int       `json:"swap_total"`
 | 
					 | 
				
			||||||
	SwapFree            int       `json:"swap_free"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type Monitoring struct {
 | 
					 | 
				
			||||||
	Nextcloud struct {
 | 
					 | 
				
			||||||
		System  System  `json:"system"`
 | 
					 | 
				
			||||||
		Storage Storage `json:"storage"`
 | 
					 | 
				
			||||||
		Shares  struct {
 | 
					 | 
				
			||||||
			NumShares               int `json:"num_shares"`
 | 
					 | 
				
			||||||
			NumSharesUser           int `json:"num_shares_user"`
 | 
					 | 
				
			||||||
			NumSharesGroups         int `json:"num_shares_groups"`
 | 
					 | 
				
			||||||
			NumSharesLink           int `json:"num_shares_link"`
 | 
					 | 
				
			||||||
			NumSharesLinkNoPassword int `json:"num_shares_link_no_password"`
 | 
					 | 
				
			||||||
			NumFedSharesSent        int `json:"num_fed_shares_sent"`
 | 
					 | 
				
			||||||
			NumFedSharesReceived    int `json:"num_fed_shares_received"`
 | 
					 | 
				
			||||||
		} `json:"shares"`
 | 
					 | 
				
			||||||
	} `json:"nextcloud"`
 | 
					 | 
				
			||||||
	Server struct {
 | 
					 | 
				
			||||||
		Webserver string `json:"webserver"`
 | 
					 | 
				
			||||||
		Php       struct {
 | 
					 | 
				
			||||||
			Version           string `json:"version"`
 | 
					 | 
				
			||||||
			MemoryLimit       int    `json:"memory_limit"`
 | 
					 | 
				
			||||||
			MaxExecutionTime  int    `json:"max_execution_time"`
 | 
					 | 
				
			||||||
			UploadMaxFilesize int    `json:"upload_max_filesize"`
 | 
					 | 
				
			||||||
		} `json:"php"`
 | 
					 | 
				
			||||||
		Database struct {
 | 
					 | 
				
			||||||
			Type    string `json:"type"`
 | 
					 | 
				
			||||||
			Version string `json:"version"`
 | 
					 | 
				
			||||||
			Size    int    `json:"size"`
 | 
					 | 
				
			||||||
		} `json:"database"`
 | 
					 | 
				
			||||||
	} `json:"server"`
 | 
					 | 
				
			||||||
	ActiveUsers ActiveUsers `json:"activeUsers"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type ActiveUsers struct {
 | 
					 | 
				
			||||||
	Last5Minutes int `json:"last5minutes"`
 | 
					 | 
				
			||||||
	Last1Hour    int `json:"last1hour"`
 | 
					 | 
				
			||||||
	Last24Hours  int `json:"last24hours"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type Storage struct {
 | 
					 | 
				
			||||||
	NumUsers         int `json:"num_users"`
 | 
					 | 
				
			||||||
	NumFiles         int `json:"num_files"`
 | 
					 | 
				
			||||||
	NumStorages      int `json:"num_storages"`
 | 
					 | 
				
			||||||
	NumStoragesLocal int `json:"num_storages_local"`
 | 
					 | 
				
			||||||
	NumStoragesHome  int `json:"num_storages_home"`
 | 
					 | 
				
			||||||
	NumStoragesOther int `json:"num_storages_other"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,53 +0,0 @@
 | 
				
			|||||||
package types
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type ShareType int
 | 
					 | 
				
			||||||
type SharePermission int
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	UserShare           ShareType = 0
 | 
					 | 
				
			||||||
	GroupShare          ShareType = 1
 | 
					 | 
				
			||||||
	PublicLinkShare     ShareType = 3
 | 
					 | 
				
			||||||
	FederatedCloudShare ShareType = 6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ReadPermission    SharePermission = 1
 | 
					 | 
				
			||||||
	UpdatePermission  SharePermission = 2
 | 
					 | 
				
			||||||
	CreatePermission  SharePermission = 4
 | 
					 | 
				
			||||||
	DeletePermission  SharePermission = 8
 | 
					 | 
				
			||||||
	ReSharePermission SharePermission = 16
 | 
					 | 
				
			||||||
	AllPermissions    SharePermission = 31
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type ShareUpdate struct {
 | 
					 | 
				
			||||||
	ShareID      int
 | 
					 | 
				
			||||||
	Permissions  SharePermission
 | 
					 | 
				
			||||||
	Password     string
 | 
					 | 
				
			||||||
	PublicUpload bool
 | 
					 | 
				
			||||||
	ExpireDate   string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type Share struct {
 | 
					 | 
				
			||||||
	ID                   string      `json:"id"`
 | 
					 | 
				
			||||||
	ShareType            int         `json:"share_type"`
 | 
					 | 
				
			||||||
	UIDOwner             string      `json:"uid_owner"`
 | 
					 | 
				
			||||||
	DisplaynameOwner     string      `json:"displayname_owner"`
 | 
					 | 
				
			||||||
	Permissions          int         `json:"permissions"`
 | 
					 | 
				
			||||||
	Stime                int         `json:"stime"`
 | 
					 | 
				
			||||||
	Parent               interface{} `json:"parent"`
 | 
					 | 
				
			||||||
	Expiration           string      `json:"expiration"`
 | 
					 | 
				
			||||||
	Token                string      `json:"token"`
 | 
					 | 
				
			||||||
	UIDFileOwner         string      `json:"uid_file_owner"`
 | 
					 | 
				
			||||||
	DisplaynameFileOwner string      `json:"displayname_file_owner"`
 | 
					 | 
				
			||||||
	Path                 string      `json:"path"`
 | 
					 | 
				
			||||||
	ItemType             string      `json:"item_type"`
 | 
					 | 
				
			||||||
	Mimetype             string      `json:"mimetype"`
 | 
					 | 
				
			||||||
	StorageID            string      `json:"storage_id"`
 | 
					 | 
				
			||||||
	Storage              int         `json:"storage"`
 | 
					 | 
				
			||||||
	ItemSource           int         `json:"item_source"`
 | 
					 | 
				
			||||||
	FileSource           int         `json:"file_source"`
 | 
					 | 
				
			||||||
	FileParent           int         `json:"file_parent"`
 | 
					 | 
				
			||||||
	FileTarget           string      `json:"file_target"`
 | 
					 | 
				
			||||||
	ShareWith            string      `json:"share_with"`
 | 
					 | 
				
			||||||
	ShareWithDisplayname string      `json:"share_with_displayname"`
 | 
					 | 
				
			||||||
	MailSend             int         `json:"mail_send"`
 | 
					 | 
				
			||||||
	Tags                 []string    `json:"tags"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,39 +0,0 @@
 | 
				
			|||||||
package types
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"io"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"path/filepath"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WebDav available methods
 | 
					 | 
				
			||||||
type WebDav interface {
 | 
					 | 
				
			||||||
	// ReadDir reads the contents of a remote directory
 | 
					 | 
				
			||||||
	ReadDir(path string) ([]os.FileInfo, error)
 | 
					 | 
				
			||||||
	// Stat returns the file stats for a specified path
 | 
					 | 
				
			||||||
	Stat(path string) (os.FileInfo, error)
 | 
					 | 
				
			||||||
	// Remove removes a remote file
 | 
					 | 
				
			||||||
	Remove(path string) error
 | 
					 | 
				
			||||||
	// RemoveAll removes remote files
 | 
					 | 
				
			||||||
	RemoveAll(path string) error
 | 
					 | 
				
			||||||
	// Mkdir makes a directory
 | 
					 | 
				
			||||||
	Mkdir(path string, _ os.FileMode) error
 | 
					 | 
				
			||||||
	// MkdirAll like mkdir -p, but for webdav
 | 
					 | 
				
			||||||
	MkdirAll(path string, _ os.FileMode) error
 | 
					 | 
				
			||||||
	// Rename moves a file from A to B
 | 
					 | 
				
			||||||
	Rename(oldpath, newpath string, overwrite bool) error
 | 
					 | 
				
			||||||
	// Copy copies a file from A to B
 | 
					 | 
				
			||||||
	Copy(oldpath, newpath string, overwrite bool) error
 | 
					 | 
				
			||||||
	// Read reads the contents of a remote file
 | 
					 | 
				
			||||||
	Read(path string) ([]byte, error)
 | 
					 | 
				
			||||||
	// ReadStream reads the stream for a given path
 | 
					 | 
				
			||||||
	ReadStream(path string) (io.ReadCloser, error)
 | 
					 | 
				
			||||||
	// Write writes data to a given path
 | 
					 | 
				
			||||||
	Write(path string, data []byte, _ os.FileMode) error
 | 
					 | 
				
			||||||
	// WriteStream writes a stream
 | 
					 | 
				
			||||||
	WriteStream(path string, stream io.Reader, _ os.FileMode) error
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Walk walks the file tree rooted at root, calling walkFn for each file or
 | 
					 | 
				
			||||||
	// directory in the tree, including root.
 | 
					 | 
				
			||||||
	Walk(path string, walkFunc filepath.WalkFunc) error
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -2,12 +2,12 @@ package gonextcloud
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"github.com/fatih/structs"
 | 
					 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/fatih/structs"
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestUserUpdate(t *testing.T) {
 | 
					func TestUserUpdate(t *testing.T) {
 | 
				
			||||||
@@ -23,11 +23,11 @@ func TestUserUpdate(t *testing.T) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.FailNow()
 | 
							t.FailNow()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	user := &types.UserDetails{
 | 
						user := &UserDetails{
 | 
				
			||||||
		ID:          username,
 | 
							ID:          username,
 | 
				
			||||||
		Displayname: strings.ToUpper(username),
 | 
							Displayname: strings.ToUpper(username),
 | 
				
			||||||
		Email:       "some@mail.com",
 | 
							Email:       "some@mail.com",
 | 
				
			||||||
		Quota: types.Quota{
 | 
							Quota: Quota{
 | 
				
			||||||
			// Unlimited
 | 
								// Unlimited
 | 
				
			||||||
			Quota: -3,
 | 
								Quota: -3,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package types
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "strconv"
 | 
					import "strconv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2,56 +2,56 @@ package gonextcloud
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	req "github.com/levigross/grequests"
 | 
					 | 
				
			||||||
	"github.com/pkg/errors"
 | 
					 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"net/url"
 | 
						"net/url"
 | 
				
			||||||
	"path"
 | 
						"path"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req "github.com/levigross/grequests"
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Users contains all Users available actions
 | 
					//users contains all users available actions
 | 
				
			||||||
type Users struct {
 | 
					type users struct {
 | 
				
			||||||
	c *Client
 | 
						c *client
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// List return the Nextcloud'user list
 | 
					// List return the Nextcloud'user list
 | 
				
			||||||
func (u *Users) List() ([]string, error) {
 | 
					func (u *users) List() ([]string, error) {
 | 
				
			||||||
	res, err := u.c.baseRequest(http.MethodGet, routes.users, nil)
 | 
						res, err := u.c.baseRequest(http.MethodGet, routes.users, nil)
 | 
				
			||||||
	//res, err := c.session.Get(u.String(), nil)
 | 
						//res, err := c.session.Get(u.String(), nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.UserListResponse
 | 
						var r UserListResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Users, nil
 | 
						return r.Ocs.Data.Users, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//ListDetails return a map of user with details
 | 
					//ListDetails return a map of user with details
 | 
				
			||||||
func (u *Users) ListDetails() (map[string]types.UserDetails, error) {
 | 
					func (u *users) ListDetails() (map[string]UserDetails, error) {
 | 
				
			||||||
	res, err := u.c.baseRequest(http.MethodGet, routes.users, nil, "details")
 | 
						res, err := u.c.baseRequest(http.MethodGet, routes.users, nil, "details")
 | 
				
			||||||
	//res, err := c.session.Get(u.String(), nil)
 | 
						//res, err := c.session.Get(u.String(), nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.UserListDetailsResponse
 | 
						var r UserListDetailsResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Users, nil
 | 
						return r.Ocs.Data.Users, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get return the details about the specified user
 | 
					// Get return the details about the specified user
 | 
				
			||||||
func (u *Users) Get(name string) (*types.UserDetails, error) {
 | 
					func (u *users) Get(name string) (*UserDetails, error) {
 | 
				
			||||||
	if name == "" {
 | 
						if name == "" {
 | 
				
			||||||
		return nil, &types.APIError{Message: "name cannot be empty"}
 | 
							return nil, &APIError{Message: "name cannot be empty"}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res, err := u.c.baseRequest(http.MethodGet, routes.users, nil, name)
 | 
						res, err := u.c.baseRequest(http.MethodGet, routes.users, nil, name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.UserResponse
 | 
						var r UserResponse
 | 
				
			||||||
	js := res.String()
 | 
						js := res.String()
 | 
				
			||||||
	// Nextcloud does not encode JSON properly
 | 
						// Nextcloud does not encode JSON properly
 | 
				
			||||||
	js = reformatJSON(js)
 | 
						js = reformatJSON(js)
 | 
				
			||||||
@@ -62,7 +62,7 @@ func (u *Users) Get(name string) (*types.UserDetails, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Search returns the users whose name match the search string
 | 
					// Search returns the users whose name match the search string
 | 
				
			||||||
func (u *Users) Search(search string) ([]string, error) {
 | 
					func (u *users) Search(search string) ([]string, error) {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Params: map[string]string{"search": search},
 | 
							Params: map[string]string{"search": search},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -70,14 +70,14 @@ func (u *Users) Search(search string) ([]string, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.UserListResponse
 | 
						var r UserListResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Users, nil
 | 
						return r.Ocs.Data.Users, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Create create a new user
 | 
					// Create create a new user
 | 
				
			||||||
func (u *Users) Create(username string, password string, user *types.UserDetails) error {
 | 
					func (u *users) Create(username string, password string, user *UserDetails) error {
 | 
				
			||||||
	// Create base Users
 | 
						// Create base users
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Data: map[string]string{
 | 
							Data: map[string]string{
 | 
				
			||||||
			"userid":   username,
 | 
								"userid":   username,
 | 
				
			||||||
@@ -97,7 +97,7 @@ func (u *Users) Create(username string, password string, user *types.UserDetails
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// CreateWithoutPassword create a user without provisioning a password, the email address must be provided to send
 | 
					// CreateWithoutPassword create a user without provisioning a password, the email address must be provided to send
 | 
				
			||||||
// an init password email
 | 
					// an init password email
 | 
				
			||||||
func (u *Users) CreateWithoutPassword(username, email, displayName, quota, language string, groups ...string) error {
 | 
					func (u *users) CreateWithoutPassword(username, email, displayName, quota, language string, groups ...string) error {
 | 
				
			||||||
	if u.c.version.Major < 14 {
 | 
						if u.c.version.Major < 14 {
 | 
				
			||||||
		return errors.New("unsupported method: requires Nextcloud 14+")
 | 
							return errors.New("unsupported method: requires Nextcloud 14+")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -132,12 +132,12 @@ func (u *Users) CreateWithoutPassword(username, email, displayName, quota, langu
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//CreateBatchWithoutPassword create multiple users and send them the init password email
 | 
					//CreateBatchWithoutPassword create multiple users and send them the init password email
 | 
				
			||||||
func (u *Users) CreateBatchWithoutPassword(users []types.User) error {
 | 
					func (u *users) CreateBatchWithoutPassword(users []User) error {
 | 
				
			||||||
	var wg sync.WaitGroup
 | 
						var wg sync.WaitGroup
 | 
				
			||||||
	errs := make(chan error)
 | 
						errs := make(chan error)
 | 
				
			||||||
	for _, us := range users {
 | 
						for _, us := range users {
 | 
				
			||||||
		wg.Add(1)
 | 
							wg.Add(1)
 | 
				
			||||||
		go func(user types.User) {
 | 
							go func(user User) {
 | 
				
			||||||
			logrus.Debugf("creating user %s", user.Username)
 | 
								logrus.Debugf("creating user %s", user.Username)
 | 
				
			||||||
			defer wg.Done()
 | 
								defer wg.Done()
 | 
				
			||||||
			if err := u.CreateWithoutPassword(
 | 
								if err := u.CreateWithoutPassword(
 | 
				
			||||||
@@ -162,12 +162,12 @@ func (u *Users) CreateBatchWithoutPassword(users []types.User) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Delete delete the user
 | 
					//Delete delete the user
 | 
				
			||||||
func (u *Users) Delete(name string) error {
 | 
					func (u *users) Delete(name string) error {
 | 
				
			||||||
	return u.baseRequest(http.MethodDelete, nil, name)
 | 
						return u.baseRequest(http.MethodDelete, nil, name)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Enable enables the user
 | 
					//Enable enables the user
 | 
				
			||||||
func (u *Users) Enable(name string) error {
 | 
					func (u *users) Enable(name string) error {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Data: map[string]string{},
 | 
							Data: map[string]string{},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -175,7 +175,7 @@ func (u *Users) Enable(name string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Disable disables the user
 | 
					//Disable disables the user
 | 
				
			||||||
func (u *Users) Disable(name string) error {
 | 
					func (u *users) Disable(name string) error {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Data: map[string]string{},
 | 
							Data: map[string]string{},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -183,25 +183,25 @@ func (u *Users) Disable(name string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//SendWelcomeEmail (re)send the welcome mail to the user (return an error if the user has not configured his email)
 | 
					//SendWelcomeEmail (re)send the welcome mail to the user (return an error if the user has not configured his email)
 | 
				
			||||||
func (u *Users) SendWelcomeEmail(name string) error {
 | 
					func (u *users) SendWelcomeEmail(name string) error {
 | 
				
			||||||
	return u.baseRequest(http.MethodPost, nil, name, "welcome")
 | 
						return u.baseRequest(http.MethodPost, nil, name, "welcome")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Update takes a *types.Users struct to update the user's information
 | 
					//Update takes a *types.users struct to update the user's information
 | 
				
			||||||
// Updatable fields: Email, Displayname, Phone, Address, Website, Twitter, Quota, Groups
 | 
					// Updatable fields: Email, Displayname, Phone, Address, Website, Twitter, Quota, groups
 | 
				
			||||||
func (u *Users) Update(user *types.UserDetails) error {
 | 
					func (u *users) Update(user *UserDetails) error {
 | 
				
			||||||
	// Get user to update only modified fields
 | 
						// Get user to update only modified fields
 | 
				
			||||||
	original, err := u.Get(user.ID)
 | 
						original, err := u.Get(user.ID)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	errs := make(chan *types.UpdateError)
 | 
						errs := make(chan *UpdateError)
 | 
				
			||||||
	var wg sync.WaitGroup
 | 
						var wg sync.WaitGroup
 | 
				
			||||||
	update := func(key string, value string) {
 | 
						update := func(key string, value string) {
 | 
				
			||||||
		defer wg.Done()
 | 
							defer wg.Done()
 | 
				
			||||||
		if err := u.updateAttribute(user.ID, strings.ToLower(key), value); err != nil {
 | 
							if err := u.updateAttribute(user.ID, strings.ToLower(key), value); err != nil {
 | 
				
			||||||
			errs <- &types.UpdateError{
 | 
								errs <- &UpdateError{
 | 
				
			||||||
				Field: key,
 | 
									Field: key,
 | 
				
			||||||
				Error: err,
 | 
									Error: err,
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -242,7 +242,7 @@ func (u *Users) Update(user *types.UserDetails) error {
 | 
				
			|||||||
	if user.Quota.Quota != original.Quota.Quota {
 | 
						if user.Quota.Quota != original.Quota.Quota {
 | 
				
			||||||
		var value string
 | 
							var value string
 | 
				
			||||||
		// If empty
 | 
							// If empty
 | 
				
			||||||
		if user.Quota == (types.Quota{}) {
 | 
							if user.Quota == (Quota{}) {
 | 
				
			||||||
			value = "default"
 | 
								value = "default"
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			value = user.Quota.String()
 | 
								value = user.Quota.String()
 | 
				
			||||||
@@ -250,7 +250,7 @@ func (u *Users) Update(user *types.UserDetails) error {
 | 
				
			|||||||
		wg.Add(1)
 | 
							wg.Add(1)
 | 
				
			||||||
		go update("Quota", value)
 | 
							go update("Quota", value)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Groups
 | 
						// groups
 | 
				
			||||||
	// Group removed
 | 
						// Group removed
 | 
				
			||||||
	for _, g := range original.Groups {
 | 
						for _, g := range original.Groups {
 | 
				
			||||||
		if !contains(user.Groups, g) {
 | 
							if !contains(user.Groups, g) {
 | 
				
			||||||
@@ -258,8 +258,8 @@ func (u *Users) Update(user *types.UserDetails) error {
 | 
				
			|||||||
			go func(gr string) {
 | 
								go func(gr string) {
 | 
				
			||||||
				defer wg.Done()
 | 
									defer wg.Done()
 | 
				
			||||||
				if err := u.GroupRemove(user.ID, gr); err != nil {
 | 
									if err := u.GroupRemove(user.ID, gr); err != nil {
 | 
				
			||||||
					errs <- &types.UpdateError{
 | 
										errs <- &UpdateError{
 | 
				
			||||||
						Field: "Groups/" + gr,
 | 
											Field: "groups/" + gr,
 | 
				
			||||||
						Error: err,
 | 
											Error: err,
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -275,8 +275,8 @@ func (u *Users) Update(user *types.UserDetails) error {
 | 
				
			|||||||
			go func(gr string) {
 | 
								go func(gr string) {
 | 
				
			||||||
				defer wg.Done()
 | 
									defer wg.Done()
 | 
				
			||||||
				if err := u.GroupAdd(user.ID, gr); err != nil {
 | 
									if err := u.GroupAdd(user.ID, gr); err != nil {
 | 
				
			||||||
					errs <- &types.UpdateError{
 | 
										errs <- &UpdateError{
 | 
				
			||||||
						Field: "Groups/" + gr,
 | 
											Field: "groups/" + gr,
 | 
				
			||||||
						Error: err,
 | 
											Error: err,
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -290,66 +290,66 @@ func (u *Users) Update(user *types.UserDetails) error {
 | 
				
			|||||||
		close(errs)
 | 
							close(errs)
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
	// Warning : we actually need to check the *err
 | 
						// Warning : we actually need to check the *err
 | 
				
			||||||
	if err := types.NewUpdateError(errs); err != nil {
 | 
						if err := NewUpdateError(errs); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//UpdateEmail update the user's email
 | 
					//UpdateEmail update the user's email
 | 
				
			||||||
func (u *Users) UpdateEmail(name string, email string) error {
 | 
					func (u *users) UpdateEmail(name string, email string) error {
 | 
				
			||||||
	return u.updateAttribute(name, "email", email)
 | 
						return u.updateAttribute(name, "email", email)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//UpdateDisplayName update the user's display name
 | 
					//UpdateDisplayName update the user's display name
 | 
				
			||||||
func (u *Users) UpdateDisplayName(name string, displayName string) error {
 | 
					func (u *users) UpdateDisplayName(name string, displayName string) error {
 | 
				
			||||||
	return u.updateAttribute(name, "displayname", displayName)
 | 
						return u.updateAttribute(name, "displayname", displayName)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//UpdatePhone update the user's phone
 | 
					//UpdatePhone update the user's phone
 | 
				
			||||||
func (u *Users) UpdatePhone(name string, phone string) error {
 | 
					func (u *users) UpdatePhone(name string, phone string) error {
 | 
				
			||||||
	return u.updateAttribute(name, "phone", phone)
 | 
						return u.updateAttribute(name, "phone", phone)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//UpdateAddress update the user's address
 | 
					//UpdateAddress update the user's address
 | 
				
			||||||
func (u *Users) UpdateAddress(name string, address string) error {
 | 
					func (u *users) UpdateAddress(name string, address string) error {
 | 
				
			||||||
	return u.updateAttribute(name, "address", address)
 | 
						return u.updateAttribute(name, "address", address)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//UpdateWebSite update the user's website
 | 
					//UpdateWebSite update the user's website
 | 
				
			||||||
func (u *Users) UpdateWebSite(name string, website string) error {
 | 
					func (u *users) UpdateWebSite(name string, website string) error {
 | 
				
			||||||
	return u.updateAttribute(name, "website", website)
 | 
						return u.updateAttribute(name, "website", website)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//UpdateTwitter update the user's twitter
 | 
					//UpdateTwitter update the user's twitter
 | 
				
			||||||
func (u *Users) UpdateTwitter(name string, twitter string) error {
 | 
					func (u *users) UpdateTwitter(name string, twitter string) error {
 | 
				
			||||||
	return u.updateAttribute(name, "twitter", twitter)
 | 
						return u.updateAttribute(name, "twitter", twitter)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//UpdatePassword update the user's password
 | 
					//UpdatePassword update the user's password
 | 
				
			||||||
func (u *Users) UpdatePassword(name string, password string) error {
 | 
					func (u *users) UpdatePassword(name string, password string) error {
 | 
				
			||||||
	return u.updateAttribute(name, "password", password)
 | 
						return u.updateAttribute(name, "password", password)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//UpdateQuota update the user's quota (bytes). Set negative quota for unlimited
 | 
					//UpdateQuota update the user's quota (bytes). Set negative quota for unlimited
 | 
				
			||||||
func (u *Users) UpdateQuota(name string, quota int64) error {
 | 
					func (u *users) UpdateQuota(name string, quota int64) error {
 | 
				
			||||||
	q := types.Quota{Quota: quota}
 | 
						q := Quota{Quota: quota}
 | 
				
			||||||
	return u.updateAttribute(name, "quota", q.String())
 | 
						return u.updateAttribute(name, "quota", q.String())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//GroupList lists the user's groups
 | 
					//GroupList lists the user's groups
 | 
				
			||||||
func (u *Users) GroupList(name string) ([]string, error) {
 | 
					func (u *users) GroupList(name string) ([]string, error) {
 | 
				
			||||||
	res, err := u.c.baseRequest(http.MethodGet, routes.users, nil, name, "groups")
 | 
						res, err := u.c.baseRequest(http.MethodGet, routes.users, nil, name, "groups")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.GroupListResponse
 | 
						var r GroupListResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data.Groups, nil
 | 
						return r.Ocs.Data.Groups, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//GroupAdd adds a the user to the group
 | 
					//GroupAdd adds a the user to the group
 | 
				
			||||||
func (u *Users) GroupAdd(name string, group string) error {
 | 
					func (u *users) GroupAdd(name string, group string) error {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Data: map[string]string{
 | 
							Data: map[string]string{
 | 
				
			||||||
			"groupid": group,
 | 
								"groupid": group,
 | 
				
			||||||
@@ -359,7 +359,7 @@ func (u *Users) GroupAdd(name string, group string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//GroupRemove removes the user from the group
 | 
					//GroupRemove removes the user from the group
 | 
				
			||||||
func (u *Users) GroupRemove(name string, group string) error {
 | 
					func (u *users) GroupRemove(name string, group string) error {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Data: map[string]string{
 | 
							Data: map[string]string{
 | 
				
			||||||
			"groupid": group,
 | 
								"groupid": group,
 | 
				
			||||||
@@ -369,7 +369,7 @@ func (u *Users) GroupRemove(name string, group string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//GroupPromote promotes the user as group admin
 | 
					//GroupPromote promotes the user as group admin
 | 
				
			||||||
func (u *Users) GroupPromote(name string, group string) error {
 | 
					func (u *users) GroupPromote(name string, group string) error {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Data: map[string]string{
 | 
							Data: map[string]string{
 | 
				
			||||||
			"groupid": group,
 | 
								"groupid": group,
 | 
				
			||||||
@@ -379,7 +379,7 @@ func (u *Users) GroupPromote(name string, group string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//GroupDemote demotes the user
 | 
					//GroupDemote demotes the user
 | 
				
			||||||
func (u *Users) GroupDemote(name string, group string) error {
 | 
					func (u *users) GroupDemote(name string, group string) error {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Data: map[string]string{
 | 
							Data: map[string]string{
 | 
				
			||||||
			"groupid": group,
 | 
								"groupid": group,
 | 
				
			||||||
@@ -389,7 +389,7 @@ func (u *Users) GroupDemote(name string, group string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//GroupSubAdminList lists the groups where he is subadmin
 | 
					//GroupSubAdminList lists the groups where he is subadmin
 | 
				
			||||||
func (u *Users) GroupSubAdminList(name string) ([]string, error) {
 | 
					func (u *users) GroupSubAdminList(name string) ([]string, error) {
 | 
				
			||||||
	if !u.c.loggedIn() {
 | 
						if !u.c.loggedIn() {
 | 
				
			||||||
		return nil, errUnauthorized
 | 
							return nil, errUnauthorized
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -399,12 +399,12 @@ func (u *Users) GroupSubAdminList(name string) ([]string, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var r types.BaseResponse
 | 
						var r BaseResponse
 | 
				
			||||||
	res.JSON(&r)
 | 
						res.JSON(&r)
 | 
				
			||||||
	return r.Ocs.Data, nil
 | 
						return r.Ocs.Data, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (u *Users) updateAttribute(name string, key string, value string) error {
 | 
					func (u *users) updateAttribute(name string, key string, value string) error {
 | 
				
			||||||
	ro := &req.RequestOptions{
 | 
						ro := &req.RequestOptions{
 | 
				
			||||||
		Data: map[string]string{
 | 
							Data: map[string]string{
 | 
				
			||||||
			"key":   key,
 | 
								"key":   key,
 | 
				
			||||||
@@ -414,13 +414,13 @@ func (u *Users) updateAttribute(name string, key string, value string) error {
 | 
				
			|||||||
	return u.baseRequest(http.MethodPut, ro, name)
 | 
						return u.baseRequest(http.MethodPut, ro, name)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (u *Users) baseRequest(method string, ro *req.RequestOptions, subRoutes ...string) error {
 | 
					func (u *users) baseRequest(method string, ro *req.RequestOptions, subRoutes ...string) error {
 | 
				
			||||||
	_, err := u.c.baseRequest(method, routes.users, ro, subRoutes...)
 | 
						_, err := u.c.baseRequest(method, routes.users, ro, subRoutes...)
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ignoredUserField(key string) bool {
 | 
					func ignoredUserField(key string) bool {
 | 
				
			||||||
	keys := []string{"Email", "Displayname", "Phone", "Address", "Website", "Twitter", "Quota", "Groups"}
 | 
						keys := []string{"Email", "Displayname", "Phone", "Address", "Website", "Twitter", "Quota", "groups"}
 | 
				
			||||||
	for _, k := range keys {
 | 
						for _, k := range keys {
 | 
				
			||||||
		if key == k {
 | 
							if key == k {
 | 
				
			||||||
			return false
 | 
								return false
 | 
				
			||||||
							
								
								
									
										10
									
								
								utils.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								utils.go
									
									
									
									
									
								
							@@ -2,15 +2,15 @@ package gonextcloud
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	req "github.com/levigross/grequests"
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"net/url"
 | 
						"net/url"
 | 
				
			||||||
	"path"
 | 
						"path"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req "github.com/levigross/grequests"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Client) baseRequest(method string, route *url.URL, ro *req.RequestOptions, subRoutes ...string) (*req.Response, error) {
 | 
					func (c *client) baseRequest(method string, route *url.URL, ro *req.RequestOptions, subRoutes ...string) (*req.Response, error) {
 | 
				
			||||||
	if !c.loggedIn() {
 | 
						if !c.loggedIn() {
 | 
				
			||||||
		return nil, errUnauthorized
 | 
							return nil, errUnauthorized
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -40,12 +40,12 @@ func (c *Client) baseRequest(method string, route *url.URL, ro *req.RequestOptio
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	// As we cannot read the ReaderCloser twice, we use the string content
 | 
						// As we cannot read the ReaderCloser twice, we use the string content
 | 
				
			||||||
	js := res.String()
 | 
						js := res.String()
 | 
				
			||||||
	var r types.BaseResponse
 | 
						var r BaseResponse
 | 
				
			||||||
	json.Unmarshal([]byte(js), &r)
 | 
						json.Unmarshal([]byte(js), &r)
 | 
				
			||||||
	if r.Ocs.Meta.Statuscode == 200 || r.Ocs.Meta.Statuscode == 100 {
 | 
						if r.Ocs.Meta.Statuscode == 200 || r.Ocs.Meta.Statuscode == 100 {
 | 
				
			||||||
		return res, nil
 | 
							return res, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	err = types.ErrorFromMeta(r.Ocs.Meta)
 | 
						err = ErrorFromMeta(r.Ocs.Meta)
 | 
				
			||||||
	return nil, err
 | 
						return nil, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										105
									
								
								webdav.go
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								webdav.go
									
									
									
									
									
								
							@@ -1,82 +1,39 @@
 | 
				
			|||||||
package gonextcloud
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
	"sort"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/adphi/gowebdav"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type webDav struct {
 | 
					// WebDav available methods
 | 
				
			||||||
	*gowebdav.Client
 | 
					type WebDav interface {
 | 
				
			||||||
}
 | 
						// ReadDir reads the contents of a remote directory
 | 
				
			||||||
 | 
						ReadDir(path string) ([]os.FileInfo, error)
 | 
				
			||||||
func newWebDav(url string, user string, password string) *webDav {
 | 
						// Stat returns the file stats for a specified path
 | 
				
			||||||
	wb := gowebdav.NewClient(url, user, password)
 | 
						Stat(path string) (os.FileInfo, error)
 | 
				
			||||||
	return &webDav{Client: wb}
 | 
						// Remove removes a remote file
 | 
				
			||||||
}
 | 
						Remove(path string) error
 | 
				
			||||||
 | 
						// RemoveAll removes remote files
 | 
				
			||||||
// Implementation adapted from filepath.Walk
 | 
						RemoveAll(path string) error
 | 
				
			||||||
 | 
						// Mkdir makes a directory
 | 
				
			||||||
// Walk walks the file tree rooted at root, calling walkFn for each file or
 | 
						Mkdir(path string, _ os.FileMode) error
 | 
				
			||||||
// directory in the tree, including root. All errors that arise visiting files
 | 
						// MkdirAll like mkdir -p, but for webdav
 | 
				
			||||||
// and directories are filtered by walkFn. The files are walked in lexical
 | 
						MkdirAll(path string, _ os.FileMode) error
 | 
				
			||||||
// order, which makes the output deterministic but means that for very
 | 
						// Rename moves a file from A to B
 | 
				
			||||||
// large directories Walk can be inefficient.
 | 
						Rename(oldpath, newpath string, overwrite bool) error
 | 
				
			||||||
// Walk does not follow symbolic links.
 | 
						// Copy copies a file from A to B
 | 
				
			||||||
func (wd *webDav) Walk(root string, walkFn filepath.WalkFunc) error {
 | 
						Copy(oldpath, newpath string, overwrite bool) error
 | 
				
			||||||
	info, err := wd.Stat(root)
 | 
						// Read reads the contents of a remote file
 | 
				
			||||||
	if err != nil {
 | 
						Read(path string) ([]byte, error)
 | 
				
			||||||
		err = walkFn(root, nil, err)
 | 
						// ReadStream reads the stream for a given path
 | 
				
			||||||
	} else {
 | 
						ReadStream(path string) (io.ReadCloser, error)
 | 
				
			||||||
		err = wd.walk(root, info, walkFn)
 | 
						// Write writes data to a given path
 | 
				
			||||||
	}
 | 
						Write(path string, data []byte, _ os.FileMode) error
 | 
				
			||||||
	if err == filepath.SkipDir {
 | 
						// WriteStream writes a stream
 | 
				
			||||||
		return nil
 | 
						WriteStream(path string, stream io.Reader, _ os.FileMode) error
 | 
				
			||||||
	}
 | 
					
 | 
				
			||||||
	return err
 | 
						// Walk walks the file tree rooted at root, calling walkFn for each file or
 | 
				
			||||||
}
 | 
						// directory in the tree, including root.
 | 
				
			||||||
 | 
						Walk(path string, walkFunc filepath.WalkFunc) error
 | 
				
			||||||
// walk recursively descends path, calling walkFn.
 | 
					 | 
				
			||||||
func (wd *webDav) walk(path string, info os.FileInfo, walkFn filepath.WalkFunc) error {
 | 
					 | 
				
			||||||
	if !info.IsDir() {
 | 
					 | 
				
			||||||
		return walkFn(path, info, nil)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	fis, err := wd.readDir(path)
 | 
					 | 
				
			||||||
	err1 := walkFn(path, info, err)
 | 
					 | 
				
			||||||
	// If err != nil, walk can't walk into this directory.
 | 
					 | 
				
			||||||
	// err1 != nil means walkFn want walk to skip this directory or stop walking.
 | 
					 | 
				
			||||||
	// Therefore, if one of err and err1 isn't nil, walk will return.
 | 
					 | 
				
			||||||
	if err != nil || err1 != nil {
 | 
					 | 
				
			||||||
		// The caller's behavior is controlled by the return value, which is decided
 | 
					 | 
				
			||||||
		// by walkFn. walkFn may ignore err and return nil.
 | 
					 | 
				
			||||||
		// If walkFn returns SkipDir, it will be handled by the caller.
 | 
					 | 
				
			||||||
		// So walk should return whatever walkFn returns.
 | 
					 | 
				
			||||||
		return err1
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, fi := range fis {
 | 
					 | 
				
			||||||
		filename := filepath.Join(path, fi.Name())
 | 
					 | 
				
			||||||
		err = wd.walk(filename, fi, walkFn)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			if !fi.IsDir() || err != filepath.SkipDir {
 | 
					 | 
				
			||||||
				return err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// readDir reads the directory and returns
 | 
					 | 
				
			||||||
// a sorted list of directory entries.
 | 
					 | 
				
			||||||
func (wd *webDav) readDir(dirname string) ([]os.FileInfo, error) {
 | 
					 | 
				
			||||||
	fs, err := wd.ReadDir(dirname)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	sort.Slice(fs, func(i, j int) bool {
 | 
					 | 
				
			||||||
		return sort.StringsAreSorted([]string{fs[i].Name(), fs[j].Name()})
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	return fs, nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										82
									
								
								webdav_impl.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								webdav_impl.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
				
			|||||||
 | 
					package gonextcloud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"sort"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"gitlab.bertha.cloud/adphi/gowebdav"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type webDav struct {
 | 
				
			||||||
 | 
						*gowebdav.Client
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func newWebDav(url string, user string, password string) *webDav {
 | 
				
			||||||
 | 
						wb := gowebdav.NewClient(url, user, password)
 | 
				
			||||||
 | 
						return &webDav{Client: wb}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Implementation adapted from filepath.Walk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Walk walks the file tree rooted at root, calling walkFn for each file or
 | 
				
			||||||
 | 
					// directory in the tree, including root. All errors that arise visiting files
 | 
				
			||||||
 | 
					// and directories are filtered by walkFn. The files are walked in lexical
 | 
				
			||||||
 | 
					// order, which makes the output deterministic but means that for very
 | 
				
			||||||
 | 
					// large directories Walk can be inefficient.
 | 
				
			||||||
 | 
					// Walk does not follow symbolic links.
 | 
				
			||||||
 | 
					func (wd *webDav) Walk(root string, walkFn filepath.WalkFunc) error {
 | 
				
			||||||
 | 
						info, err := wd.Stat(root)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = walkFn(root, nil, err)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							err = wd.walk(root, info, walkFn)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err == filepath.SkipDir {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// walk recursively descends path, calling walkFn.
 | 
				
			||||||
 | 
					func (wd *webDav) walk(path string, info os.FileInfo, walkFn filepath.WalkFunc) error {
 | 
				
			||||||
 | 
						if !info.IsDir() {
 | 
				
			||||||
 | 
							return walkFn(path, info, nil)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fis, err := wd.readDir(path)
 | 
				
			||||||
 | 
						err1 := walkFn(path, info, err)
 | 
				
			||||||
 | 
						// If err != nil, walk can't walk into this directory.
 | 
				
			||||||
 | 
						// err1 != nil means walkFn want walk to skip this directory or stop walking.
 | 
				
			||||||
 | 
						// Therefore, if one of err and err1 isn't nil, walk will return.
 | 
				
			||||||
 | 
						if err != nil || err1 != nil {
 | 
				
			||||||
 | 
							// The caller's behavior is controlled by the return value, which is decided
 | 
				
			||||||
 | 
							// by walkFn. walkFn may ignore err and return nil.
 | 
				
			||||||
 | 
							// If walkFn returns SkipDir, it will be handled by the caller.
 | 
				
			||||||
 | 
							// So walk should return whatever walkFn returns.
 | 
				
			||||||
 | 
							return err1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, fi := range fis {
 | 
				
			||||||
 | 
							filename := filepath.Join(path, fi.Name())
 | 
				
			||||||
 | 
							err = wd.walk(filename, fi, walkFn)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								if !fi.IsDir() || err != filepath.SkipDir {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// readDir reads the directory and returns
 | 
				
			||||||
 | 
					// a sorted list of directory entries.
 | 
				
			||||||
 | 
					func (wd *webDav) readDir(dirname string) ([]os.FileInfo, error) {
 | 
				
			||||||
 | 
						fs, err := wd.ReadDir(dirname)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sort.Slice(fs, func(i, j int) bool {
 | 
				
			||||||
 | 
							return sort.StringsAreSorted([]string{fs[i].Name(), fs[j].Name()})
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						return fs, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -9,13 +9,11 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"gitlab.bertha.cloud/partitio/Nextcloud-Partitio/gonextcloud/types"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	dir     string
 | 
						dir     string
 | 
				
			||||||
	wd      types.WebDav
 | 
						wd      WebDav
 | 
				
			||||||
	folders  = []string{
 | 
						folders  = []string{
 | 
				
			||||||
		"folder1",
 | 
							"folder1",
 | 
				
			||||||
		"folder1/sub1",
 | 
							"folder1/sub1",
 | 
				
			||||||
		Reference in New Issue
	
	Block a user